|
利用51單片機(jī)設(shè)計(jì)多于40個(gè)LED的流水燈,其中LED靜態(tài)顯示。 本設(shè)計(jì)是以51系單片機(jī)STC89C52作為控制中心的40個(gè)LED流水燈顯示,硬件方面利用鎖存器74HC273、40個(gè)LED流水燈等組件,實(shí)現(xiàn)帶有點(diǎn)陣圖片的LED流水燈顯示,通過(guò)定時(shí)器控制LED燈的刷新頻率。利用數(shù)電知識(shí)進(jìn)行LED顯示擴(kuò)展I/O。軟件程序使用Keil進(jìn)行編程,STC—ISP進(jìn)行寫(xiě)入。程序中使用定時(shí)器0進(jìn)行中斷,并在中斷內(nèi)完成點(diǎn)陣動(dòng)態(tài)刷新,實(shí)現(xiàn)40LED的靜態(tài)顯示的目的。此單片機(jī)LED流水燈有著價(jià)格適中、電路設(shè)計(jì)簡(jiǎn)單的特點(diǎn)。
51hei.png (27.24 KB, 下載次數(shù): 50)
下載附件
2019-12-16 14:00 上傳
74HC273帶鎖存功能,這樣D輸入的信號(hào)可以鎖住保持在輸出端,保持LED的驅(qū)動(dòng)是固定的電平狀態(tài)。脈沖輸出信號(hào)也可以驅(qū)動(dòng)LED,只是亮度與脈沖的脈寬有關(guān)。一般74HC273 的輸入端接在數(shù)據(jù)總線上,74HC273可以起到隔離的作用。動(dòng)LED一般需要5-7mA的電流,負(fù)載比較大,如果接到其他門(mén)電路的輸出上,會(huì)影響這個(gè)輸出驅(qū)動(dòng)其他門(mén)電路輸入的能力。
51hei.png (15.3 KB, 下載次數(shù): 46)
下載附件
2019-12-16 14:01 上傳
在主程序中,先使能全局中斷,然后使能74HC27來(lái)然后使能74HC273來(lái)控制LED點(diǎn)陣。配置定時(shí)器0工作在模式1并設(shè)置定時(shí)初值,清零TF位,使能定時(shí)器0并啟動(dòng)定時(shí)器0。在while(1)循環(huán)中更新鎖存器數(shù)據(jù),進(jìn)入中斷后定時(shí)250ms。主程序流程圖如圖5所示:
51hei.png (11.25 KB, 下載次數(shù): 33)
下載附件
2019-12-16 14:01 上傳
中斷子程序中,定時(shí)器T 0中斷250次,即定時(shí)250ms,flagls 賦值為1。定時(shí)器中斷流程圖如圖6所示:
51hei.png (8.24 KB, 下載次數(shù): 29)
下載附件
2019-12-16 14:02 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- unsigned char code ledchar[]={ //字模表
- 0x00,0x00,0x00,0x00, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0x00,0x00,0x00,0x00, 0x00,0x00
- };
- unsigned char flagls =0; //250ms定時(shí)標(biāo)志
- unsigned char j=1; //判斷i是否變化
- unsigned char cnt =0; //記錄T0中斷次數(shù)
- unsigned char i=0; //數(shù)組刷新索引
- void main()
- {
-
- EA = 1; //使能總中斷
- TMOD = 0X01; //T0 為模式1
- TH0 = 0XFC;//為T(mén)0賦初值0xfc67,定時(shí)1 ms
- TL0 = 0X67;
- ET0 = 1;//使能T0中斷
- TR0 = 1; //啟動(dòng)T0
- while(1)
- {
- if(flagls == 1) //判斷250ms定時(shí)標(biāo)志
- {
- flagls = 0; //250ms定時(shí)標(biāo)志清零
- i++; //圖片索引自加1
- }
- if(i>17) i=0; //圖片索引達(dá)到17后歸零
-
- if(i !=j) //判斷i是否變化
- {
- j=i; //更新備份為當(dāng)前值,以備進(jìn)行下次比較
- P0 = 0X00;P1 = 0X00;P1 = 0X01; //消隱處理
- P0 = ledchar[i];P1 = 0X00;P1 = 0X01; //計(jì)數(shù)值顯示到LED上
- P0 = 0X00;P1 = 0X00;P1 = 0X02;
- P0 = ledchar[i+1];P1 = 0X00;P1 = 0X02;
- P0 = 0X00;P1 = 0X00;P1 = 0X04;
- P0 = ledchar[i+2];P1 = 0X00;P1 = 0X04;
- P0 = 0X00;P1 = 0X00;P1 = 0X08;
- P0 = ledchar[i+3];P1 = 0X00;P1 = 0X08;
- P0 = 0X00;P1 = 0X00;P1 = 0X10;
- P0 = ledchar[i+4];P1 = 0X00;P1 = 0X10;
- }
- }
-
- }
-
- //定時(shí)器0的中斷服務(wù)函數(shù)
- void interrupttimer0() interrupt 1
- {
- TH0 = 0XFC; // 重新加載初值
- TL0 = 0X67;
- cnt++; // 中斷次數(shù)計(jì)數(shù)值加1
- if(cnt>=250) // 中斷250次即250ms
- {
- cnt = 0; // 清零計(jì)數(shù)值以重新開(kāi)始下一250ms計(jì)時(shí)
- flagls = 1; // 設(shè)置250ms定時(shí)標(biāo)志為1
- }
-
- }
復(fù)制代碼
51hei.png (4.29 KB, 下載次數(shù): 41)
下載附件
2019-12-16 13:59 上傳
所有資料51hei提供下載:
拓展IO口40個(gè)LED顯示.zip
(1.5 MB, 下載次數(shù): 56)
2019-12-16 12:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|