實(shí)驗(yàn)?zāi)康?br />
通過仿真搭建和實(shí)物搭建相結(jié)合,完成LED大屏幕顯示的單片機(jī)系統(tǒng)設(shè)計(jì)。
一、 實(shí)驗(yàn)內(nèi)容
(1) 設(shè)計(jì)一個(gè)16*64個(gè)LED長(zhǎng)方形顯示點(diǎn)陣屏幕,顯示“重慶交通大學(xué)歡迎您”,顯示方方式:i.實(shí)現(xiàn)固定顯示“重慶交大”;ii.從右到左移動(dòng)“重慶交通大學(xué)歡迎您”字符串。
(2) 用Proteus仿真軟件搭建仿真硬件電路圖。驗(yàn)證編制軟件。
(3) 用prote199s布原理圖、建PCB板圖。
(4) 實(shí)物器件焊接搭建。
二、 電路設(shè)計(jì)圖
(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是一個(gè)8位串行輸入、并行輸出的位移緩存器:并行輸出為三態(tài)輸出。說明如下:
Q0~Q7 8位并行數(shù)據(jù)輸出端
GND 接地
Q7’ 串行數(shù)據(jù)輸出
MR 復(fù)位引腳,低電平有效
SH_CP 數(shù)據(jù)輸入時(shí)鐘線,上升沿有效
ST_CP 輸出存儲(chǔ)器鎖存時(shí)鐘線,上升沿有效
OE 輸出使能端,低電平有效
DS 串行數(shù)據(jù)輸入
VCC 電源
在74HC595工作時(shí),也就是OE為低電平時(shí),如果這個(gè)時(shí)候需要將送到74HC595的DS端口的數(shù)據(jù)發(fā)送出去,需要端口SH_CP來一個(gè)上升沿信號(hào),那么它將把DS上的數(shù)據(jù)移入移位寄存器中,先送低位,后送高位。
如果此時(shí)ST_CP再來一個(gè)上升沿,那么74HC595就會(huì)把移位寄存器中的數(shù)據(jù)送入鎖存器發(fā)送。從SH_CP產(chǎn)生一上升沿(移入數(shù)據(jù))和ST_CP產(chǎn)生一上升沿(輸出數(shù)據(jù))是二個(gè)獨(dú)立過程,實(shí)際應(yīng)用時(shí)互不干擾。即可輸出數(shù)據(jù)的同時(shí)移入數(shù)據(jù)。
在本次實(shí)驗(yàn)中,用AT89C51的P20、P21和P22口去控制級(jí)聯(lián)的74HC595,級(jí)聯(lián)的方式是:
P20、P21和P22口分別連接第一個(gè)74HC595的SH_CP、DS以及ST_CP端,由P21口發(fā)送串行數(shù)據(jù)。之后將第一個(gè)74HC595的Q7’端再和第二個(gè)74HC595的DS端相連,第二個(gè)74HC595的SH_CP和ST_CP是和第一個(gè)74HC595的接法一致。
之后的6個(gè)74HC595都是這種接法,就實(shí)現(xiàn)了74HC595的級(jí)聯(lián)。
級(jí)聯(lián)之后,整個(gè)74HC595模塊的輸出引腳共64個(gè),分別控制一行的哪一個(gè)燈的亮滅。
ii. 74HC154
Figure 2 74HC154引腳圖
74HC154譯碼器可接受4位高電平有效二進(jìn)制地址輸入,并提供16個(gè)互斥的低低電平有效輸出。
它的引腳說明如下:
Y0非~Y15非 輸出端
GND 接地
G1非,G2非 使能端,二者同為低,器件才工作
A,B,C,D 地址輸入端
VCC 電源
這個(gè)器件的A,B,C,D端接AT59C51的P30~P33端,用來位選,即用來選擇哪一行可以被點(diǎn)亮。
(3) 電路圖
Figure 3 74HC595模塊搭建圖
Figure 4 74HC154連線
Figure 5 AT59C51連線圖
Figure 6 總覽
Figure 7 LED模塊布線圖
如圖7,段選和位選交錯(cuò)相連,并不會(huì)造成混亂,反而能夠大大減少使用的引腳,原因在于程序一列一列的選擇,前一列所用到的位選碼輸入以后,即特定的LED燈亮了之后,下一列的段選碼輸入,此時(shí)由于上一列的位選碼已經(jīng)作用過了,就算此時(shí)下一列的段選碼會(huì)覆蓋掉上一列的位選碼造成偏差,可是由于人眼的輝光效應(yīng),只要列掃描的速度足夠快,人眼也是無法分辨的。
三、 軟件設(shè)計(jì)
具體的思路是先將第一時(shí)刻關(guān)于整個(gè)屏幕需要點(diǎn)亮的LED的16進(jìn)制碼共64位全部通過一個(gè)for循環(huán)使其進(jìn)入74HC595模塊的各個(gè)寄存器待命。
而后跳出這個(gè)for循環(huán)之后,進(jìn)行位選,。雖然我的LED模塊接線是位選與段選端復(fù)用了,但是正如前面所說的,由于是一列一列的選擇,前一列所用到的位選碼輸入以后,即特定的LED燈亮了之后,下一列的段選碼輸入,此時(shí)由于上一列的位選碼已經(jīng)作用過了,就算此時(shí)下一列的段選碼會(huì)覆蓋掉上一列的位選碼造成偏差,可是由于人眼的輝光效應(yīng),只要列掃描的速度足夠快,人眼也是無法分辨的。
(1)程序流程圖
Figure 8 靜態(tài)顯示流程
Figure9 動(dòng)態(tài)顯示流程
(2)程序代碼
1. 靜態(tài)顯示
#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. 動(dòng)態(tài)顯示
#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,/* "學(xué)"*/
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端數(shù)據(jù)移入寄存器
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;//上升沿,寄存器中的數(shù)據(jù)送鎖存器
}
}
}
四、 實(shí)驗(yàn)步驟
打開Kei1程序,執(zhí)行菜單命令“Project"->“New Project" 創(chuàng)建“大屏幕顯示”項(xiàng)目,并選擇單片機(jī)型號(hào)為AT89C51。
執(zhí)行菜單命令“File"->"New"創(chuàng)建文件,輸入源程序,保存為“大屏幕顯示.c”。在“Projec t"欄的Fi le項(xiàng)目管理窗口中右擊文件組,選擇“Add Fi les to Group'Source Group1'" 將源程序“大屏幕顯示.c”添加到項(xiàng)目中。
執(zhí)行菜單命令“Project”->“Options for Target'Target 1”,在彈出的對(duì)話框中選擇“ Output 選項(xiàng)卡,選中“Greate HEX File”。
執(zhí)行菜單命令“Project" ->“Bui ld Target",編譯源程序。如果編譯成功,則在“OutputWindow" 窗口中顯示沒有錯(cuò)誤,并創(chuàng)建了“大屏幕顯示.HEX”文件。
在proteus仿真平臺(tái)上建立參考圖系統(tǒng),并將程序上載到虛擬芯片上運(yùn)行,
將所得到的正確的顯示結(jié)果截圖。
五、 實(shí)驗(yàn)結(jié)果
Figure 10 靜態(tài)顯示效果圖
Figure 11 動(dòng)態(tài)顯示效果圖
六、 實(shí)驗(yàn)總結(jié)
這次實(shí)驗(yàn)做的不足之處在于對(duì)動(dòng)態(tài)掃描的速度控制不到位,在“重慶交通大學(xué)歡迎您”的那個(gè)您結(jié)束之前,后面的“重”又跟上了。
原先的想法本來是用一個(gè)74HC154來控制位選,再用4個(gè)74HC154去控制段選,但是這么做的確定也顯而易見,那就是引腳使用得太多了,這只是一次實(shí)驗(yàn),這么做是可以的,但是真正的工程這么做,怕是會(huì)被人吐槽。后來我聽了同學(xué)的意見,拋棄了這種接線方案。LED模塊的接線改用為如圖7,這樣一來,所使用的引腳就大大減少,不過這么做就提高了程序的復(fù)雜度。
在這次實(shí)驗(yàn)中,收獲得最大的就是對(duì)兩個(gè)主要器件74HC595和74HC154有了一個(gè)深入的理解。其中74HC595比較有意思,需要兩次上升沿信號(hào)才能將信號(hào)發(fā)送出去,而且,他這個(gè)原件的Q7’就是專門為級(jí)聯(lián)而生的,這個(gè)引腳的存在使得這個(gè)元件的使用非常靈活。
|