作者:青見(jiàn)
主要元器件:89C52RC,74HL138,四位數(shù)碼管兩個(gè),獨(dú)立按鈕三個(gè),排線,杜邦線
原理:利用定時(shí)計(jì)數(shù)器定時(shí)50ms,每20次為一秒,產(chǎn)生一次中斷,在中斷函數(shù)中,對(duì)秒數(shù)加一,當(dāng)秒數(shù)加滿60后清零,分?jǐn)?shù)加一,同理可得分?jǐn)?shù)和時(shí)數(shù)直接安定關(guān)系。數(shù)碼管的顯示采用動(dòng)態(tài)掃描法,至于如何對(duì)按鍵進(jìn)行實(shí)時(shí)響應(yīng),參考程序部分。
說(shuō)明:由于本程序軟件部分既不是很復(fù)雜也不是很簡(jiǎn)單,故采用C51編寫(xiě),硬件原理圖暫缺。軟件部分如下,本程序僅供QQ好友中從事嵌入式工作的叔叔和大哥們參考,修改。
結(jié)語(yǔ):向廣大大哥大叔們表示感謝,在此也多謝導(dǎo)師的指引,青見(jiàn)一定不負(fù)所望,仰望星空,腳踏實(shí)地,五月份本人事情較多,估計(jì)沒(méi)有時(shí)間和你們討論一些問(wèn)題,期待我們暑假的大飛機(jī)項(xiàng)目。告嵌入式同胞們,我的一些上位機(jī)軟件和硬件自學(xué)筆記在我的嵌入式服務(wù)器中,用戶名和密碼已經(jīng)給你們了。空間上的只是備份,大家無(wú)需來(lái)我空間,直接登錄服務(wù)器即可,下次有空決定為我的寶馬做一個(gè)速度計(jì)和里程表,希望有興趣的去我服務(wù)器討論。
視頻:
將程序編譯成HEX后燒錄到MCU中運(yùn)行的實(shí)時(shí)情景如下:
附錄:代碼下載:http://www.zg4o1577.cn/f/smgpp.rar 部分代碼: #include<reg52.h> #define uchar unsigned char #define uint unsigned int #define delaytime 4 //譯碼器的控制位 sbit LA=P2^2; sbit LB=P2^3; sbit LC=P2^4; //鍵盤(pán)的控制位 sbit SetMode=P2^5; sbit Plus=P2^6; sbit Minus=P2^7; sbit duanxuan=P1^0; //鍵盤(pán)的狀態(tài)位 bit Sethour,Setmin,Setsec; //時(shí)間數(shù)據(jù)位 uchar hour,min,sec,count,state; //共陽(yáng)數(shù)碼管數(shù)字0~9的碼值 uchar code table[11]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 }; void show(); void display_wei(uchar wei) { wei=wei-1; LA=wei%2; LB=(wei/2)%2; LC=(wei/2/2)%2; } void display_duan(uchar duan) { duanxuan=1; P3=duan; duanxuan=0; } void init() { EA=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TMOD=0x01; TR0=1; hour=0; min=0; sec=0; count=0; Sethour=0; Setmin=0; Setsec=0; state=1; } void timer() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==10) state=~state; if(count==20) { state=~state; count=0; sec++; } if(sec==60) { sec=0; min++; } if(min==60) { min=0; hour++; } if(hour==24) hour=0; } void delay(uint ms) { unsigned char i; while(ms--) { for(i=0;i<120;i++); } } void show() { if(Sethour==1&&Setmin==0&&Setsec==0&&state==1) { display_wei(1); display_duan(table[10]); delay(delaytime); display_wei(2); display_duan(table[10]); delay(delaytime); } else { display_wei(1); display_duan(table[hour%100/10]); delay(delaytime); display_wei(2); display_duan(table[hour%10]); delay(delaytime); } display_wei(3); display_duan(0x40); delay(delaytime); if(Sethour==1&&Setmin==1&&Setsec==0&&state==1) { display_wei(4); display_duan(table[10]); delay(delaytime); display_wei(5); display_duan(table[10]); delay(delaytime); } else { display_wei(4); display_duan(table[min%100/10]); delay(delaytime); display_wei(5); display_duan(table[min%10]); delay(delaytime); } display_wei(6); display_duan(0x40); delay(delaytime); if(Sethour==1&&Setmin==1&&Setsec==1&&state==1) { display_wei(7); display_duan(table[10]); delay(delaytime); display_wei(8); display_duan(table[10]); delay(delaytime); } else { display_wei(7); display_duan(table[sec%100/10]); delay(delaytime); display_wei(8); display_duan(table[sec%10]); delay(delaytime); } } void process_Plus() { if(Plus==0) { delay(7); if(Plus==0) { while(show(),Plus==0) delay(7); if(Sethour==1&&Setmin==0&&Setsec==0) hour++; if(Sethour==1&&Setmin==1&&Setsec==0) min++; if(Sethour==1&&Setmin==1&&Setsec==1) sec=0; } } } void process_Minus() { if(Minus==0) { delay(7); if(Minus==0) { while(show(),Minus==0) delay(7); if(Sethour==1&&Setmin==0&&Setsec==0) { hour--; if(hour==255) hour=23; } if(Sethour==1&&Setmin==1&&Setsec==0) { min--; if(min==255) min=59; } if(Sethour==1&&Setmin==1&&Setsec==1) { sec=0; } } } } void main() { init(); while(show(),process_Plus(),process_Minus(),1) { if(SetMode==0) { delay(10); if(SetMode==0) { while(show(),SetMode==0); delay(10); if(SetMode==1) { if(Sethour==0&&Setmin==0&&Setsec==1) { Sethour=0; Setmin=0; Setsec=0; } if(Sethour==1&&Setmin==1&&Setsec==1) { Sethour=0; Setmin=0; Setsec=1; } if(Sethour==1&&Setmin==1&&Setsec==0) Setsec=1; if(Sethour==1&&Setmin==0&&Setsec==0) Setmin=1; if(Sethour==0&&Setmin==0&&Setsec==0) Sethour=1; } } } } }