LED點陣顯示屏通過編程控制可以顯示中英文字符、圖形及視頻動態圖形,廣泛用于指示、廣告、宣傳等領域,如車站、機場的運行時刻報告牌;商店的廣告牌;證券、運動場館的指示牌等。 1、項目任務 使用80C51單片機與兩片8x8點陣顯示器,設計一個點陣顯示屏,能顯示漢字及簡單的圖形。 項目要求: 1)顯示穩定無閃爍。 2)程序設計中,要使文字或圖形運動。 2、項目分析 LED點陣顯示器有多個品種可供選擇,按顯示的顏色可分為單色、雙色、三色等;按發光亮度可分為普通亮度、高亮度、超高亮度等。一塊LED點陣塊的LED數量可有4×4(即4列4行)、5×7、5×8、8x8等規格;點陣中單個ILED的直徑常用的有1.9mm3mm、3.7mm、4.8mm、5mm、7.62mm、10mm、20mm等。 圖1為8x8LED點陣顯示器外觀及排列示意圖,共有64個LED發光二極管排列在一起。若需更大規模的LED點陣,只需將多個點陣塊拼在一起即可。 
圖1 8×8LED點陣顯示器外觀及排列示意圖 在LED點陣中,LED發光二極管按照行和列分別將陽極和陰極連接在一起,內部接線及引腳編號如圖1所示,行、列編號中,括號中的內容為引腳編號(圖中LED點陣型號為ZS*11288)。 在圖1中,列輸入引腳(Y1~Y8)接至內部IED的陰極端,行輸入引腳接至8x8LED點陣顯示器內部LED的陽極端,若陽極端輸入為高電平,陰極端輸入低電平,則該LED點亮;如X5為高電平、Y3為低電平,兩條線交又點上的那個LED被點亮。若將8位二進制數送給行輸入端X1~X8;列輸入端只有Y1為低電平,其他為高電平,結果使得圖2中最左側的一列發光二極管按照行輸入端的輸人狀態亮滅,其他列的LED均不亮。如果使列輸入線快速依次變為低電平,同時改變行輸人端的內容,即列掃描,視覺上感覺一幅圖案完整的顯示在LED點陣上。 
圖2 LED點陣內部接線與引腳編號 3、項目硬件設計 1.電路設計 設計的點陣顯示屏的電路如圖3所示。途中除單片機、顯示屏、晶振與復位電路外,還使用了3片串行輸入/輸出的74HC595芯片。 圖3 點陣顯示屏電路圖 2.74HC595介紹 74HC595是8位串行輸入/輸出或者并行移位寄存器,具有高阻關斷狀態。包括一個8位移位寄存器、一個8位D型鎖存器和三態并行輸出。移位寄存器接收串行數據并提供串行輸出,也提供并行數據輸出和8位鎖存器。移位寄存器和鎖存器都有獨立的時鐘輸入,同時還具有異步復位的功能。74HC595的引腳如圖4所示。 
圖4 74HC595的引腳 引腳說明如下: QA-QH:八位并行輸出端,可以直接控制數碼管的8個段。 QH`:(9腳):級聯輸出端。 S(14腳):串行數據輸入端。 (10腳):低電平時將移位寄存器的數據清零,通常將它接Vcc。
SCK(11腳):上升沿時數據寄存器的數據移位,QA→QB→QC→…→QH;下降沿移位寄存器數據不變。 RCK(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常RCK置為低電平,當移位結東后,在RCK端產生一個正脈沖,更新顯示數據。 G(13腳):高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控 制它,可以方便地產生閃爍和熄滅效果,比通過數據端移位控制要省時。 74HC164和74HC595功能相仿,都是8位串行輸入、并行輸出的移位寄存器。74HC164的驅動電流(25mA)比74HC595(35mA)的要小,14腳封裝,體積也小一些。74HC595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。與74HC164只有數據清零端相比,74HC595尚有輸出的使能/禁止控制端,可使輸出為高阻態。 4、項目程序設計 通過單片機的串口向74HC595發送數據到2片8×8點陣顯示屏,滾動顯示,顯示的內容包括一個“→”圖形和“天天向上”四個漢字,通過按鍵控制,顯示可以向左方向移動也可以向右方向移動。 設計的程序如下
- <font color="rgb(0, 0, 0)"><font face="Calibri"><font style="font-size: 12pt">include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RCK_Pin = P3^2;
- sbit k1 = P1^1;
- sbit k2 = P1^3;
- uchar flag=1;
- uchar code DSY_CONTENT_8x8_0[]=
- {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xF7,0xE3,0x81,0x00,0xC3,0xC3,
- 0xC3,0xC3,0xC3,0xC3,0xC3,0xE7,0xE7,0xFF,
- 0xEE,0xAD,0xAB,0x87,0xA3,0xAD,0xEE,0xFF,/*"天"*/
- 0xEE,0xAD,0xAB,0x87,0xA3,0xAD,0xEE,0xFF,/*"天"*/
- 0xFF,0xC0,0xB7,0xD3,0xD3,0xDF,0xC0,0xFF,/*"向"*/
- 0xFF,0xFD,0xFD,0x81,0xED,0xED,0xFD,0xFF,/*"上"*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- };
- uchar code DSY_CONTENT_8x8_1[]=
- {
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xF7,0xE3,0x81,0x00,0xC3,0xC3,
- 0xC3,0xC3,0xC3,0xC3,0xC3,0xE7,0xE7,0xFF,
- 0xEE,0xAD,0xAB,0x87,0xA3,0xAD,0xEE,0xFF,/*"天",0*/
- 0xEE,0xAD,0xAB,0x87,0xA3,0xAD,0xEE,0xFF,/*"天",1*/
- 0xFF,0xC0,0xDF,0xD3,0xD3,0xB7,0xC0,0xFF,/*"向",2*/
- 0xFF,0xFD,0xED,0xED,0x81,0xFD,0xFD,0xFF,/*"上",3*/
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- };
- uchar Scan_BIT = 0x01;
- uchar Scan_BIT1 = 0x80;
- uchar Offset,Data_Index = 0;
- uchar Offset1,Data_Index1 = 0;
- void Delay(uint t)
- {
- uchar i;
- while(t--) for(i=0;i<120;i++);
- }
- void T0_Led_Display_Control() interrupt 1
- {
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)%256;
-
- if(flag==0)
- {
- Scan_BIT1=0x80;
- Data_Index1 = 0;
- Scan_BIT = _cror_(Scan_BIT,1);
- putchar(Scan_BIT);
- while(TI == 0);
- putchar( DSY_CONTENT_8x8_0[Offset + Data_Index + 8]);
- while (TI==0);
- putchar( DSY_CONTENT_8x8_0[Offset + Data_Index ]);
- while(TI == 0);
- Data_Index = (Data_Index + 1) % 8;
- RCK_Pin = 1;
- RCK_Pin = 0;
- }
- if(flag==1)
- {
- Scan_BIT=0x01;
- Data_Index = 0;
- Scan_BIT1 = _crol_(Scan_BIT1,1);
- putchar(Scan_BIT1);
- while(TI == 0);
- putchar( DSY_CONTENT_8x8_1[Offset1 + Data_Index1]);
- while (TI==0);
- putchar( DSY_CONTENT_8x8_1[Offset1 + Data_Index1 + 8 ]);
- while(TI == 0);
- Data_Index1 = (Data_Index1 + 1) % 8;
- RCK_Pin = 1;
- RCK_Pin = 0;
- }
- }
- void main()
- {
- uchar i;
- TMOD = 0x01;
- TH0 = (65536-1000) / 256;
- TL0 = (65536-1000) % 256;
- IE = 0x82;
- TCON =0x00;
- TI = 1;
- while(1)
- {
- for(i=0;i<64;i++)
- {
- if(k1==0) { flag=1; }
- if(k2==0) { flag=0; }
- Offset = i; Offset1 = i;
- TR0 = 1;
- Delay(50);
- TR0 = 0;
- }
- }
- }</font></font></font>
復制代碼
5、仿真結果 設計的點陣顯示屏的Proteus仿真電路與圖5所示。 圖5 點陣顯示屏仿真電路 顯示”天天“與”向上“的仿真與實驗結果如圖6和圖7所示。所涉及的系統滿足項目要求的功能。 圖6顯示”天天“的仿真結果 圖7 顯示”向上“的仿真結果 以上的Word格式文檔51黑下載地址,為了防止白嫖,仿真工程本人已經刪除,請自己畫:
基于51單片機的LED點陣顯示屏設計.docx
(3.09 MB, 下載次數: 30)
2020-6-12 21:39 上傳
點擊文件名下載附件
基于單片機的LED點陣顯示屏設計
|