日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机使用定时器进行数码管动态扫描程序

發布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机使用定时器进行数码管动态扫描程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數碼管是51單片機學習中比較基礎的一個模塊,為簡化電路連接,提高系統可靠性,降低制造成本,多位數碼管廣泛采用動態掃描的方式進行顯示。如果程序編寫不當,數碼管動態掃描容易出現亮度不均勻、亮度過低、重影等現象。很多初學者會在主函數中使用while(1)循環,結合delay函數不斷掃描,但這樣得不斷調用display掃描,如果單片機還要執行別的程序時,就會由于掃描不及時,導致各種問題。此外,在控制段選位選的先后順序上,如果程序不當,則會造成顯示重影等問題。在此給出一個穩定可靠的程序方案。


電路連接:P1口通過兩個74HC573分別連接到八位數碼管的段選和片選,段選、位選由P3.4和P3.5控制,低電平鎖存

#include <reg52.h>#define DIGI_PORT P1 // 宏定義數碼管端口,如果端口改變,只需修改這一句即可#define DIGI_NUM 8 // 宏定義數碼管個數sbit DULA = P3^4;sbit WELA = P3^5;unsigned char digiBuf[DIGI_NUM]; //數碼管緩沖區unsigned char code DigiTable[] = {0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x00,/* */};/* 初始化定時器0,方式1,11.0592MHz晶振時,每5ms進一次中斷,如果只有4位數碼管,10ms即可,間隔長度根據實際情況調整,在保證不閃爍的情況下,盡可能加長間距以減小對CPU資源的消耗*/void initDigi(){TMOD = 0x01;TH0 = 0xEE;TL0 = 0x00;EA = 1;ET0 = 1;TR0 = 1;}void main(){digiBuf[0] = 10; // 為10則該位不顯示digiBuf[1] = 1;digiBuf[2] = 2;digiBuf[3] = 3;digiBuf[4] = 4;digiBuf[5] = 5;digiBuf[6] = 6;digiBuf[7] = 7;initDigi();while(1);}// 定時器0函數每隔一段時間運行一次void displayTimer0() interrupt 1{static unsigned char digiPos = 0; // 當前需要顯示的數碼管,此處使用靜態局部變量,或者全局變量,不可使用默認局部變量TH0 = 0xEE;TL0 = 0x00;// 位選關閉所有數碼管,否則可能出現重影(下面段選改變之后,位選改變之前,上一次已經位選打開的數碼會顯示錯誤的信息)DIGI_PORT = 0xFF; //這一句如果和下一句位置交換,可能產生重影,具體見http://blog.csdn.net/jzj1993/article/details/8563337WELA = 1;WELA = 0;// 這里進行段選(此時所有數碼管都已關閉,不會顯示錯誤信息)DIGI_PORT = DigiTable[digiBuf[digiPos]];DULA = 1;DULA = 0;// 這里根據digiPos進行位選switch(digiPos) {case 0: DIGI_PORT = ~(1 << 0); break; // 打開第0個數碼管case 1: DIGI_PORT = ~(1 << 1); break; // 打開第1個數碼管case 2: DIGI_PORT = ~(1 << 2); break; // 打開第2個數碼管case 3: DIGI_PORT = ~(1 << 3); break; // 打開第3個數碼管case 4: DIGI_PORT = ~(1 << 4); break; // 打開第4個數碼管case 5: DIGI_PORT = ~(1 << 5); break; // 打開第5個數碼管case 6: DIGI_PORT = ~(1 << 6); break; // 打開第6個數碼管case 7: DIGI_PORT = ~(1 << 7); break; // 打開第7個數碼管}WELA = 1;WELA = 0;// 改變digiPos值,為下一次進入此函數做準備digiPos++;if(digiPos == DIGI_NUM)digiPos = 0;}

Proteus仿真通過



源碼及Proteus仿真文件點此鏈接下載


總結

以上是生活随笔為你收集整理的51单片机使用定时器进行数码管动态扫描程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。