一俭厚、實驗?zāi)康?/h1>
1.了解LED8×8點陣的內(nèi)部結(jié)構(gòu)户魏。
2.學(xué)會編寫點陣顯示實驗的代碼程序。
3.了解編寫程序各部分的作用。
二叼丑、實驗工具
Keil 5关翎、STC89C52實驗板、燒錄軟件鸠信、計算機
三纵寝、實驗原理
(一)功能概述
?8X8點陣共由64個發(fā)光二極管組成,且每個發(fā)光二極管是放置在行線和列線的交叉點上星立,使用逐行掃描的方式爽茴,P0口輸出位碼,P3口輸出段碼绰垂,當(dāng)掃描速度加快時室奏,因為視覺暫留的原因,則看到的就是8行的顯示了劲装。
(二)硬件結(jié)構(gòu)
(三)內(nèi)部結(jié)構(gòu)
內(nèi)部結(jié)構(gòu)不同可分為共陽極和共陰極兩種胧沫。
共陰極時:當(dāng)對應(yīng)的某一行置1電平,某一列置0電平占业,則相應(yīng)的二極管就亮绒怨;如要將第一個點點亮,則1腳(位選信號)接高電平a腳(段選信號)接低電平纺酸,則第一個點就亮了窖逗。
共陽極時:當(dāng)對應(yīng)的某一行置0電平,某一列置1電平餐蔬,則相應(yīng)的二極管就亮碎紊;如要將第一個點點亮,則1腳接低電平電平a腳接高電平樊诺,則第一個點就亮了仗考,在該實驗中所采用的是共陽極電路,故在編寫代碼時位選信號低電平亮词爬,段選信號高電平亮秃嗜,且段選位選字符轉(zhuǎn)換時均是列陣顯示,由上到下為從地位到高位顯示顿膨。(內(nèi)部結(jié)構(gòu)圖如下)
四锅锨、試驗流程
1.熟悉C51程序編寫規(guī)則,了解點陣顯示代碼編寫方式恋沃。
2.Keil 5中編寫實現(xiàn)LED燈顯示的代碼必搞。
3.運行程序并導(dǎo)出hex文件。
4.打開燒錄軟件囊咏,在單片機上運行程序恕洲。
五塔橡、代碼實現(xiàn)
(一)整體代碼
#includ<reg51.h>
#include <intrins.h>//調(diào)用頭文件intrins.h實現(xiàn)空操作,執(zhí)行NOP指令
sbit SRCLK=P3^6;//位定義霜第,將P3.6引腳(第7口)定義為SRCLK
sbit RCLK=P3^5;
sbit SER=P3^4;
#define COMMONPORTS P0//定義公共端口為P0
unsigned char code TAB[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//列選低電平導(dǎo)通控制葛家,位選低電平有效
unsigned char code CHARCODE[6][8]={0x00,0x08,0x10,0x30,0x50,0x30,0x10,0x08,//A
0x00,0x00,0x7E,0x52,0x52,0x7F,0x00,0x00,//B
0x00,0x00,0x7E,0x42,0x42,0x42,0x00,0x00,//C
0x00,0x00,0x7E,0x42,0x42,0x42,0x3C,0x00,//D
0x00,0x00,0x7E,0x52,0x52,0x52,0x51,0x00,//E
0x00,0x00,0x7E,0x50,0x50,0x50,0x50,0x00,//F};
//延時函數(shù),延時時間為124×time×2泌类,在這里time為2時延時時間為0.5ms
void delay(unsigned int time)
{unsigned int i,j;
{
for(i=0;i<time;i++)
for(j=0;j<124;j++);
}
}
void Hc595SendByte(unsigned char dat)
{
? ? ? unsigned char a;
???????????? dat<<=1;
? ? ? ? ? ? ? SRCLK=1;
? ? ? ? ? ? ? _nop_();
? ? ? ? ? ? ? _nop_();
? ? ? ? ? ? ? SRCLK=0;? ?
? ? ? }
? ? ? RCLK=1;
? ? ? _nop_();
? ? ? _nop_();
? ? ? RCLK=0;
}
//主函數(shù)
void main()
{? ?
? ? ? unsigned char tab, j;
? ? ? unsigned int i;
? ? ? while(1)
? ? ? {? ?
? ? ? ? ? ? ? for(i=0; i<50; i++ )?
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? for(tab=0;tab<8;tab++)
? ? ? ? ? ? ? ? ? ? {? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? Hc595SendByte(0x00);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? COMMONPORTS? = TAB[tab]; //輸出位選信號? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? Hc595SendByte(CHARCODE[j][tab]);
? ? ? ? ? ? ? ? ? ? ? ? ? ? delay(2);? ? ?
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? ? ? j++;
? ? ? ? ? ? ? if(j== 6)//6個字母循環(huán)完之后返回重新循環(huán)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? j= 0;
? ? ? ? ? ? ? }
? ? ? }? ?
}
(二)延時函數(shù)
void delay(unsigned int time)
{unsigned int i,j;
{
for(i=0;i<time;i++)
? for(j=0;j<124;j++);
}
}
延時函數(shù)2層for循環(huán)癞谒,循環(huán)次數(shù)是 NUM= 2X124 = 248次,由每次循環(huán)都有條件判斷(如 i >0)和自加語句(如 i++)末誓,因此每次循環(huán)又耗費兩個機器周期扯俱, 所以,總耗費的機器周期為SUM = NUM x 2 =496個喇澡,又因為 12M 晶振頻率迅栅,每一個機器周期為1us,所以這個函數(shù)話費的時間為856us =8.56 ms 約等于0.5ms晴玖,而把賦值語句读存,壓棧出棧操作計算在內(nèi),加起來差不多0.5ms.
(三)消隱函數(shù)
void Hc595SendByte(unsigned char dat)
{
? ? ?? unsigned char a;
???????????? dat<<=1;
? ? ? ? ? ? ? SRCLK=1;
? ? ? ? ? ? ? _nop_();
? ? ? ? ? ? ? _nop_();
? ? ? ? ? ? ? SRCLK=0;? ??
? ? ?? }
? ? ?? RCLK=1;
? ? ?? _nop_();
? ? ?? _nop_();
? ? ?? RCLK=0;
}
51單片機控制多位數(shù)碼管或者點陣LED做動態(tài)顯示呕屎,由于處理不當(dāng)會產(chǎn)生非預(yù)期的“鬼影”現(xiàn)象让簿,消除這隱藏圖像即為消隱。從產(chǎn)生這種情況的根本原因入手秀睛,在程序方面做進一步優(yōu)化從而解決此問題尔当。因為動態(tài)顯示是利用人眼的暫留效應(yīng)來多位顯示的。原理是其多位數(shù)碼管的每位段碼控制只由一個IO口8 位輸出蹂安,先位選椭迎,送段碼,延時(1~3ms)田盈,關(guān)位選(這個就是消隱作用畜号,如果沒關(guān),下一位的段碼送出時允瞧,這一位也顯示下一位的段碼简软,這樣就亂了)
六、實驗結(jié)果
七述暂、注意事項
(一)延時函數(shù)必須要有
編寫代碼時因為錯誤導(dǎo)致延時函數(shù)沒有生效痹升,則出現(xiàn)LED點陣不顯示的結(jié)果。
(二)跳線帽的連接
改變的跳線帽應(yīng)為89C52芯片左側(cè)跳線帽畦韭,UCC.LOE.GND所在位置视卢,且應(yīng)該使右側(cè)兩個條線即JOE,GND相連。
(三)列陣顯示字符碼
字符碼轉(zhuǎn)換時廊驼,不論段選還是位選編寫16進制時均是以一列的8個二進制為一個整體据过,從上到下為從高位到低位。
例如在顯示J時妒挎,因為列陣弄成行陣绳锅,則字母方向改變。(如下圖)
(四)寫程序仔細(xì)小心
稍加不注意錯一個字母酝掩,可能就會出現(xiàn)問題鳞芙,有時候還能正常編譯,只是在實驗板上無法正常實現(xiàn)期虾,我就是個例子......因此在寫代碼的時候一定要細(xì)心仔細(xì)原朝,寫完之后進行認(rèn)真檢查。否則就會出現(xiàn)失之毫厘謬以千里的狀況了镶苞。