一、實驗目的和要求
1、進一步熟練Keil uVision3的項目文件創建、編譯、運行和軟件仿真的基本操作方法;
2、鞏固程序調試的方法;
3、熟悉定時器0的定時功能的設計方法,掌握單片機實驗箱中數碼管顯示的電路工作原理。
4、初步熟悉單片機c語言開發方法;
5、用c語言編程實現以下功能:同時驅動8位數碼管顯示數字時鐘,并能動態改變,每隔1s自動加1,要有時分秒。
二、實驗儀器和設備
單片機編譯軟件Keil uVision3,計算機,USB下載線,CT107D單片機綜合開發平臺
三、實驗過程
在本實驗的開發平臺中,采用了2只四位共陽數碼管,根據前面的實驗,控制口都是由P0口執行,所以用到了2片74HC573鎖存器U7、U8。
開發平臺中,均采用了8位數碼管動態掃描顯示(見圖1)。它將所有數碼管的8個段線相應地并接在一起,并接到 AT89S52的鎖存器U7的Q端,由P0口控制字段(要顯示什么數字)輸出。而各位數碼管的共陽極由也是P0口控制鎖存器U8來實現8位數碼管的位輸出控制。
這樣,對于一組數碼管動態掃描顯示需要由兩組信號來控制:一組是字段輸出口輸出的字形代碼,用來控制顯示的字形,稱為段碼;另一組是位輸出口輸出的控制信號,用來選擇第幾位數碼管工作,稱為位碼。
由于各位數碼管的段線并聯,段碼的輸出對各位數碼管來說都是相同的。因此,在同一時刻如果各位數碼管的位選線都處于選通狀態的話,8位數碼管將顯示相同的字符。若要各位數碼管能夠顯示出與本位相應的字符,就必須采用掃描顯示方式。即在某一時刻,只讓某一位的位選線處于導通狀態,而其它各位的位選線處于關閉狀態。同時,段線上輸出相應位要顯示字符的字型碼。這樣在同一時刻,只有選通的那一位顯示出字符,而其它各位則是熄滅的,如此循環下去,就可以使各位數碼管顯示出將要顯示的字符。
雖然這些字符是在不同時刻出現的,而且同一時刻,只有一位顯示,其它各位熄滅,但由于數碼管具有余輝特性和人眼有視覺暫留現象,只要每位數碼管顯示間隔足夠短,給人眼的視覺印象就會是連續穩定地顯示。
數碼管不同位顯示的時間間隔可以通過調整延時程序的延時長短來完成。數碼管顯示的時間間隔也能夠確定數碼管顯示時的亮度,若顯示的時間間隔長,顯示時數碼管的亮度將亮些,若顯示的時間間隔短,顯示時數碼管的亮度將暗些。若顯示的時間間隔過長的話,數碼管顯示時將產生閃爍現象。所以,在調整顯示的時間間隔時,即要考慮到顯示時數碼管的亮度,又要數碼管顯示時不產生閃爍現象。
數碼管是由7個條形的LED和右下方一個圓形的LED組成,這樣一共有8個段線,恰好適用于8位的并行系統。數碼管有共陰極和共陽極兩種,共陰極數碼管的公共陰極接地,當各段陽極上的電平為“1”時,該段點亮,電平為“0”時,該段熄滅;
在c語言中,我們在flash中(code關鍵詞)可以定義以下字形代碼,這是段碼:
Unsigned char code DuanMa[]={0xc0(0),0xf9(1),0xa4(2),0xb0(3),0x99(4),0x92(5),0x82(6),0xf8(7),0x80(8),0x90(9),0xbf(-),0xff(消隱)}; //共陽
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換
- #define uchar unsigned char
- #define uint unsigned int
- sbit buzz=P0^6;//蜂鳴器
- sbit relay=P0^4;//繼電器
- // 0 1 2 3 4 5 6 7 8 9 - 消隱
- unsigned char code DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //共陽
- unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分別對應相應的數碼管點亮,即位碼
- uchar disData[8]={11,11,11,11,11,11,0,0};
- uchar times=0;
- uchar hour,minute,second;
- //函數聲明
- void delay_50us(uint t);
- void display(uchar *point);
- void SEG_Latch(void); //段碼鎖存子程序
- void BIT_Latch(void); //位碼鎖存子程序
- void ULN2003_Latch(void);
- //P2.7~P2.5=111段碼鎖存
- //P2.7~P2.5=110位碼鎖存
- main()
- {
- buzz=0;//關蜂鳴器
- relay=0;//關繼電器
- ULN2003_Latch();
- TMOD |=0x01;//T0 16位定時器
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- TR0=1;
- EA=1;
- while(1)
- {
- if(second == 60 )
- {
- second = 0;
- minute++;
- if(minute == 60)
- {
- minute=0;
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- }
- disData[6]=second/10;
- disData[7]=second%10;
- disData[5]=10;
- disData[3]=minute/10;
- disData[4]=minute%10;
- disData[2]=10;
- disData[0]=hour/10;
- disData[1]=hour%10;
- display(disData);
- }
- }
- void ISR_Timer0(void) interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- times++;
- if (times == 20)
- {
- second++;
- times=0;
- }
- }
- void delay_50us(uint t) //50us 延時
- {
- uchar j;
- for(;t>0;t--)
- for(j=19;j>0;j--)
- ;
- }
- void SEG_Latch(void) //段碼鎖存子程序
- {
- P2 &= 0x1f;//清P2.7~P2.5
- P2 |= 0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段碼數據選通
- _nop_();
- P2 &= 0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段碼數據被鎖存
- }
- void BIT_Latch(void) //位碼鎖存子程序
- {
- P2 &= 0x1f;//清P2.7~P2.5
- P2 |= 0xC0; //P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位碼數據選通
- _nop_();
- P2 &= 0x1f; //P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位碼數據被鎖存
- }
- void display(uchar *point)
- {
- unsigned char i=0;
- for(i=0;i<8;i++)
- {
- DataPort=WeiMa[i]; //取位碼
- BIT_Latch(); //數據鎖存
- DataPort=DuanMa[*(point+i)]; //取顯示數據,段碼
- SEG_Latch(); //數據鎖存
- delay_50us(20); // 掃描間隙延時,時間太長會閃爍,太短不亮
- DataPort=0xff; //關顯示,消除重影
- SEG_Latch(); //數據鎖存
-
- }
- }
- void ULN2003_Latch(void) // ULN2003鎖存子程序
- {
- P2 &= 0x1f;//清P2.7~P2.5
- P2 |= 0xa0;//P2.7~P2.5=101,Y5=0,Y5C=1,即U9的LE=1,數據選通
- _nop_();
- P2 &= 0x1f;//P2.7~P2.5=000,Y5=1,Y5C=0,即U9的LE=0,數據被鎖存
- }
復制代碼
所有資料51hei提供下載:
test4參考改.zip
(14.34 KB, 下載次數: 16)
2018-6-21 10:02 上傳
點擊文件名下載附件
|