電路圖如圖1所示,通過51單片機的P1作為段口,P0作為位口構成2位LED動態顯示的硬件電路。P2.0、P2.1連接兩個按鍵K0、K1分別用于調整初始時間的+1和-1,P3.0連接LED燈,P3.2連接復位按鍵,P3.3連接啟動按鍵。 要求實現一倒計時秒表,啟動后顯示初始時間20,可以調整初始時間。調整結束后按下啟動鍵,開始倒計時。在倒計時過程中調整初始時間按鍵無效。倒計時時間到,顯示00,并且LED燈亮。整個過程中都可以復位,復位后顯示初始時間,LED燈滅。圖1 倒計時秒表的電路原理圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg51.h>
- unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數碼管 0-9
- sbit led=P3^0;
- sbit s1=P0^0;
- sbit s2=P0^1;
- sbit k0=P2^0;
- sbit k1=P2^1;
- int sec=0,i,a,b=20,key1;
- /*-----延遲函數-------*/
- void delay(int z)
- {
- while(z-->0);
- }
- /*-----顯示函數-------*/
- void display(int n)
- {
- if(n>0)
- {
- s2=1;s1=0; //顯示十位
- P1=tab[n/10]; //除10,取十位數值
- delay(100); //延遲顯示
- s1=1;s2=0; //顯示個位
- P1=tab[n%10]; //求余,取個位數值
- delay(100); //延遲
- }
- else
- { //當輸入值小于0,顯示0
- s2=1;s1=0; //顯示十位
- P1=tab[0]; //除10,取十位數值
- delay(100); //延遲
- s1=1;s2=0; //顯示個位
- P1=tab[0]; //求余,取個位數值
- delay(100); //延遲顯示
- }
- }
- /*-----外部中斷0中斷服務函數----------*/
- void RESET() interrupt 0
- {
- sec=0; //恢復初始值
- b=20; //恢復初始值
- TR0=0; //關閉定時器
-
- }
- /*-----外部中斷1中斷服務函數----------*/
- void START() interrupt 2
- {
- TR0=1; //打開定時器
- }
- /*-----定時器T0服務函數,計時功能----------*/
- void timer0() interrupt 1
- {
- i--; //50ms時間到
- TH0=(65536-50000)/256; //存放高8位,50ms
- TL0=(65536-50000)%256; //存放低8位
- if(i==0)
- {
- i=20; //1s計數
- sec++; //軟件計數1s
- }
- }
- /*------鍵值掃描函數----------*/
- void key()
- {
- k0=1;k1=1; //讀按鍵
- key1=P2; //將P2的值賦值給key1
- key1=key1&0x03; //屏蔽高6位,保留k0,k1的值
- while(key1!=0x03) //判斷是否有按鍵按下
- {
- delay(600); //消抖動
- key1=P2;
- key1=key1&0X03;
- while(key1!=0x03) //當有按鍵按下時
- {
- if(k0==0) b=b+1; //按下k0按鍵時,初始值加1
- else b=b-1; //按下k1按鍵時,初始值減1
- k0=1;k1=1; //判斷按鍵是否抬起
- key1=P2; //重新將P2的值賦值給key1
- key1=key1&0x03;
- while(key1!=0x03) //判斷是否有按鍵按下
- {
- key1=P2;
- key1=key1&0x03;
- }
- }
- }
- }
- /*------主函數----------*/
- void main()
- {
- TMOD=0X01; //設定定時器0工作,工作方式1
- TH0=(65536-50000)/256; //存放高8位,50ms
- TL0=(65536-50000)%256; //存放低8位
- IT0=1;IT1=1; //外部中斷選擇下降沿觸發
- IE=0X87; //開啟INT0,INT1,T0
- PX0=1; //設定INT0為高優先級
- led=1; //初始燈熄滅
- TR0=0; //初始計數停止
- i=2;
- while(1)
- {
- a=b-sec; //將增計時變為減計時
- if(TR0==0) //當定時器關閉時開啟鍵值掃描
- {key();}
- display(a); //顯示函數
- if(a<=0)
- {
- led=0; //當減計時為0時,報警燈點亮
- }
- else
- {
- led=1; //當減計時不為0時,報警燈熄滅
- }
- }
- }
復制代碼
所有資料51hei提供下載:
單片機系統實驗.rar
(41.61 KB, 下載次數: 62)
2020-12-19 11:11 上傳
點擊文件名下載附件
|