實驗目的
通過仿真搭建和實物搭建相結合,完成LED大屏幕顯示的單片機系統設計。
一、 實驗內容
(1) 設計一個16*64個LED長方形顯示點陣屏幕,顯示“重慶交通大學歡迎您”,顯示方方式:i.實現固定顯示“重慶交大”;ii.從右到左移動“重慶交通大學歡迎您”字符串。
(2) 用Proteus仿真軟件搭建仿真硬件電路圖。驗證編制軟件。
(3) 用prote199s布原理圖、建PCB板圖。
(4) 實物器件焊接搭建。
二、 電路設計圖
(1) 元件清單
AT89C51 [1]
74HC595 [8]
MATRIX-8X8-GREEN [16]
74HC154 [1]
普通電容 [22pF][2]
電解電容 [10uF][1]
晶振 [12MHZ][1]
電阻 [10K][1]
電源
(2) 元件使用
i. 74HC595
Figure 1 74HC595引腳圖
74HC595是一個8位串行輸入、并行輸出的位移緩存器:并行輸出為三態輸出。說明如下:
Q0~Q7 8位并行數據輸出端
GND 接地
Q7’ 串行數據輸出
MR 復位引腳,低電平有效
SH_CP 數據輸入時鐘線,上升沿有效
ST_CP 輸出存儲器鎖存時鐘線,上升沿有效
OE 輸出使能端,低電平有效
DS 串行數據輸入
VCC 電源
在74HC595工作時,也就是OE為低電平時,如果這個時候需要將送到74HC595的DS端口的數據發送出去,需要端口SH_CP來一個上升沿信號,那么它將把DS上的數據移入移位寄存器中,先送低位,后送高位。
如果此時ST_CP再來一個上升沿,那么74HC595就會把移位寄存器中的數據送入鎖存器發送。從SH_CP產生一上升沿(移入數據)和ST_CP產生一上升沿(輸出數據)是二個獨立過程,實際應用時互不干擾。即可輸出數據的同時移入數據。
在本次實驗中,用AT89C51的P20、P21和P22口去控制級聯的74HC595,級聯的方式是:
P20、P21和P22口分別連接第一個74HC595的SH_CP、DS以及ST_CP端,由P21口發送串行數據。之后將第一個74HC595的Q7’端再和第二個74HC595的DS端相連,第二個74HC595的SH_CP和ST_CP是和第一個74HC595的接法一致。
之后的6個74HC595都是這種接法,就實現了74HC595的級聯。
級聯之后,整個74HC595模塊的輸出引腳共64個,分別控制一行的哪一個燈的亮滅。
ii. 74HC154
Figure 2 74HC154引腳圖
74HC154譯碼器可接受4位高電平有效二進制地址輸入,并提供16個互斥的低低電平有效輸出。
它的引腳說明如下:
Y0非~Y15非 輸出端
GND 接地
G1非,G2非 使能端,二者同為低,器件才工作
A,B,C,D 地址輸入端
VCC 電源
這個器件的A,B,C,D端接AT59C51的P30~P33端,用來位選,即用來選擇哪一行可以被點亮。
(3) 電路圖
Figure 3 74HC595模塊搭建圖
Figure 4 74HC154連線
Figure 5 AT59C51連線圖
Figure 6 總覽
Figure 7 LED模塊布線圖
如圖7,段選和位選交錯相連,并不會造成混亂,反而能夠大大減少使用的引腳,原因在于程序一列一列的選擇,前一列所用到的位選碼輸入以后,即特定的LED燈亮了之后,下一列的段選碼輸入,此時由于上一列的位選碼已經作用過了,就算此時下一列的段選碼會覆蓋掉上一列的位選碼造成偏差,可是由于人眼的輝光效應,只要列掃描的速度足夠快,人眼也是無法分辨的。
三、 軟件設計
具體的思路是先將第一時刻關于整個屏幕需要點亮的LED的16進制碼共64位全部通過一個for循環使其進入74HC595模塊的各個寄存器待命。
而后跳出這個for循環之后,進行位選,。雖然我的LED模塊接線是位選與段選端復用了,但是正如前面所說的,由于是一列一列的選擇,前一列所用到的位選碼輸入以后,即特定的LED燈亮了之后,下一列的段選碼輸入,此時由于上一列的位選碼已經作用過了,就算此時下一列的段選碼會覆蓋掉上一列的位選碼造成偏差,可是由于人眼的輝光效應,只要列掃描的速度足夠快,人眼也是無法分辨的。
(1)程序流程圖
Figure 8 靜態顯示流程
Figure9 動態顯示流程
(2)程序代碼
1. 靜態顯示
#include<reg52.h>
sbit SH_CP = P2 ^ 0;
sbit DS = P2 ^ 1;
sbit ST_CP = P2 ^ 2;
unsigned char code display[] = {
0x10,0x40,0x10,0x40,0x14,0x50,0xD4,0x57,0x54,0x55,0x54,0x55,0x54,0x55,0xFC,0x7F,
0x52,0x55,0x52,0x55,0x52,0x55,0xD3,0x57,0x12,0x50,0x10,0x40,0x10,0x40,0x00,0x00,/* "重"*/
0x00,0x40,0x00,0x30,0xFC,0x0F,0x04,0x80,0x84,0x40,0x84,0x20,0x84,0x18,0x85,0x06,
0xF6,0x01,0x84,0x06,0x84,0x18,0x84,0x20,0x84,0x40,0x84,0x80,0x04,0x80,0x00,0x00,/* "慶"*/
0x08,0x80,0x08,0x81,0x88,0x40,0x68,0x40,0x08,0x21,0x08,0x22,0x09,0x14,0x0E,0x08,
0x08,0x14,0x08,0x22,0x88,0x41,0x28,0x40,0x48,0x80,0x88,0x81,0x08,0x80,0x00,0x00,/* "交"*/
0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/* "´大"*/
};
void hc595_senddat(unsigned char dat)
{
unsigned char i;
for (i = 0; i<8;i++)
{
DS = dat & 0x80;
SH_CP = 1;
SH_CP = 0;
dat <<= 1;
}
}
int main()
{
unsigned char i;
char j;
SH_CP = 0;
ST_CP = 0;
while (1)
{
for (i = 0; i<16;i++)
{
for (j = 3; j >= 0;j--)
{
hc595_senddat(display[32* j + 2 * i + 1]);
hc595_senddat(display[32* j + 2 * i]);
}
P3 = i;
ST_CP =1;
ST_CP =0;
}
}
}
2. 動態顯示
#include<reg52.h>
sbit SH_CP=P2^0;
sbit DS=P2^1;
sbit ST_CP=P2^2;
unsigned char code display[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//32
0x10,0x40,0x10,0x40,0x14,0x50,0xD4,0x57,0x54,0x55,0x54,0x55,0x54,0x55,0xFC,0x7F,
0x52,0x55,0x52,0x55,0x52,0x55,0xD3,0x57,0x12,0x50,0x10,0x40,0x10,0x40,0x00,0x00,/* "重"*///64
0X00,0x40,0x00,0x30,0xFC,0x0F,0x04,0x80,0x84,0x40,0x84,0x20,0x84,0x18,0x85,0x06,
0XF6,0x01,0x84,0x06,0x84,0x18,0x84,0x20,0x84,0x40,0x84,0x80,0x04,0x80,0x00,0x00,/* "慶"*///96
0X08,0x80,0x08,0x81,0x88,0x40,0x68,0x40,0x08,0x21,0x08,0x22,0x09,0x14,0x0E,0x08,
0X08,0x14,0x08,0x22,0x88,0x41,0x28,0x40,0x48,0x80,0x88,0x81,0x08,0x80,0x00,0x00,/* "交"*/
0X40,0x80,0x42,0x40,0xCC,0x3F,0x00,0x40,0x00,0x80,0xE2,0xFF,0x22,0x89,0x2A,0x89,
0X2A,0x89,0xF2,0xBF,0x2A,0x89,0x26,0xA9,0x22,0xC9,0xE0,0xBF,0x00,0x80,0x00,0x00,/* "通"*/
0X20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
0X20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/* "大"*/
0X40,0x04,0x30,0x04,0x11,0x04,0x96,0x04,0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7E,
0X90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,0x13,0x04,0x50,0x04,0x30,0x04,0x00,0x00,/* "學"*/
0X04,0x10,0x24,0x08,0x44,0x06,0x84,0x01,0x64,0x82,0x9C,0x4C,0x40,0x20,0x30,0x18,
0X0F,0x06,0xC8,0x01,0x08,0x06,0x08,0x18,0x28,0x20,0x18,0x40,0x00,0x80,0x00,0x00,/* "歡"*/
0X40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F,0x00,0x20,0x00,0x40,0xFC,0x4F,0x04,0x44,
0X02,0x42,0x00,0x40,0xFC,0x7F,0x04,0x42,0x04,0x44,0xFC,0x43,0x00,0x40,0x00,0x00,/* "迎"*/
0X20,0x40,0x10,0x30,0x08,0x00,0xFC,0x77,0x23,0x80,0x10,0x81,0x88,0x88,0x67,0xB2,
0X04,0x84,0xF4,0x83,0x04,0x80,0x24,0xE0,0x54,0x00,0x8C,0x11,0x00,0x60,0x00,0x00,/* "您"*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* " " */
};
void hc595_senddat(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS=dat&0x80;// 1000 0000
SH_CP=1;
SH_CP=0;//上升沿,DS端數據移入寄存器
dat<<=1;
}
}
main()
{
unsigned char i,n;
unsigned int k,m;
char j;
m=sizeof(display);
SH_CP=0;
ST_CP=0;
while(1)
{
for(k=0;k<m;k=k+2)
for(n=0;n<2;n++)
for(i=0;i<16;i++)
{
for(j=3;j>=0;j--)
{
hc595_senddat(display[(32*j+2*i+1+k)%m]);
hc595_senddat(display[(32*j+2*i+k)%m]);
}
P3=i;
ST_CP=1;
ST_CP=0;//上升沿,寄存器中的數據送鎖存器
}
}
}
四、 實驗步驟
打開Kei1程序,執行菜單命令“Project"->“New Project" 創建“大屏幕顯示”項目,并選擇單片機型號為AT89C51。
執行菜單命令“File"->"New"創建文件,輸入源程序,保存為“大屏幕顯示.c”。在“Projec t"欄的Fi le項目管理窗口中右擊文件組,選擇“Add Fi les to Group'Source Group1'" 將源程序“大屏幕顯示.c”添加到項目中。
執行菜單命令“Project”->“Options for Target'Target 1”,在彈出的對話框中選擇“ Output 選項卡,選中“Greate HEX File”。
執行菜單命令“Project" ->“Bui ld Target",編譯源程序。如果編譯成功,則在“OutputWindow" 窗口中顯示沒有錯誤,并創建了“大屏幕顯示.HEX”文件。
在proteus仿真平臺上建立參考圖系統,并將程序上載到虛擬芯片上運行,
將所得到的正確的顯示結果截圖。
五、 實驗結果
Figure 10 靜態顯示效果圖
Figure 11 動態顯示效果圖
六、 實驗總結
這次實驗做的不足之處在于對動態掃描的速度控制不到位,在“重慶交通大學歡迎您”的那個您結束之前,后面的“重”又跟上了。
原先的想法本來是用一個74HC154來控制位選,再用4個74HC154去控制段選,但是這么做的確定也顯而易見,那就是引腳使用得太多了,這只是一次實驗,這么做是可以的,但是真正的工程這么做,怕是會被人吐槽。后來我聽了同學的意見,拋棄了這種接線方案。LED模塊的接線改用為如圖7,這樣一來,所使用的引腳就大大減少,不過這么做就提高了程序的復雜度。
在這次實驗中,收獲得最大的就是對兩個主要器件74HC595和74HC154有了一個深入的理解。其中74HC595比較有意思,需要兩次上升沿信號才能將信號發送出去,而且,他這個原件的Q7’就是專門為級聯而生的,這個引腳的存在使得這個元件的使用非常靈活。
|