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