作者:青見
主要元器件:89C52RC,74HL138,四位數(shù)碼管兩個,獨立按鈕三個,排線,杜邦線
原理:利用定時計數(shù)器定時50ms,每20次為一秒,產(chǎn)生一次中斷,在中斷函數(shù)中,對秒數(shù)加一,當秒數(shù)加滿60后清零,分數(shù)加一,同理可得分數(shù)和時數(shù)直接安定關(guān)系。數(shù)碼管的顯示采用動態(tài)掃描法,至于如何對按鍵進行實時響應,參考程序部分。
說明:由于本程序軟件部分既不是很復雜也不是很簡單,故采用C51編寫,硬件原理圖暫缺。軟件部分如下,本程序僅供QQ好友中從事嵌入式工作的叔叔和大哥們參考,修改。
結(jié)語:向廣大大哥大叔們表示感謝,在此也多謝導師的指引,青見一定不負所望,仰望星空,腳踏實地,五月份本人事情較多,估計沒有時間和你們討論一些問題,期待我們暑假的大飛機項目。告嵌入式同胞們,我的一些上位機軟件和硬件自學筆記在我的嵌入式服務器中,用戶名和密碼已經(jīng)給你們了?臻g上的只是備份,大家無需來我空間,直接登錄服務器即可,下次有空決定為我的寶馬做一個速度計和里程表,希望有興趣的去我服務器討論。
視頻:
將程序編譯成HEX后燒錄到MCU中運行的實時情景如下:
附錄:代碼下載:http://www.torrancerestoration.com/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; //鍵盤的控制位 sbit SetMode=P2^5; sbit Plus=P2^6; sbit Minus=P2^7; sbit duanxuan=P1^0; //鍵盤的狀態(tài)位 bit Sethour,Setmin,Setsec; //時間數(shù)據(jù)位 uchar hour,min,sec,count,state; //共陽數(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; } } } } }