? ???STC12C2052AD單片機控制的數碼管時鐘,數碼管是共陽4位時鐘數碼管,由于使用單片機真驅,電路比較簡單,且使用的材料和工具也很簡單,用數碼管顯示,單片機控制,兩個按鍵調時,蜂鳴器整點報時。所需要的元件如下:
? ?? ? 材料有以下這些:
? ?? ???STC12C2052AD單片機一片
? ?? ???黃色共陽4位時鐘數碼管一塊
? ?? ???6mm×6mm按鍵兩個
? ?? ???杜邦線插針2p兩個
? ?? ???無源蜂鳴器一個
? ?? ???20腳+14腳芯片座各一個
? ?? ???洞洞板一塊(截取一小部分)
? ?? ???100歐電阻4個
? ???源程序如下:
- #include
??//聲明頭文件 - ??
- sbit key1=P3^4;??//按鍵接口定義
- sbit key2=P3^5;??//按鍵接口定義
- sbit speaker=P3^7;??//蜂鳴器接口定義
- /************************************************************************************/
- unsigned char code LED[10]={0x20,0xA7,0x90,0x82,0x07,0x42,0x40,0xA6,0x00,0x02};//數碼管段位碼定義
- unsigned int time; //全局秒基準定義
- /*-------------------------------------延時函數-------------------------------------*/
- void delayms (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*----------------------------------蜂鳴器驅動函數----------------------------------*/
- void beep (void)
- {? ?
- unsigned char i=30;
- while(i--)
- {
- speaker=~speaker;
- delayms(3);
- ? ? }
- }
- /*----------------------------------數碼管驅動函數----------------------------------*/
- void display (unsigned char hour,min)
- {
- unsigned char H1,H2,M1,M2;
- P3=0xf8; //數碼管位選
- P1 = LED[H1];? ???//數碼管段選
- delayms (2); //掃描延時
- P3=0xf4; //數碼管位選
- P1 = LED[H2];? ???//數碼管段選
- delayms (2); //掃描延時
- P3=0xf2; //數碼管位選
- P1 = LED[M1];? ???//數碼管段選
- delayms (2); //掃描延時
- P3=0xf1; //數碼管位選
- P1 = LED[M2];? ???//數碼管段選
- delayms (2); //掃描延時
- /*--------------------------------------分定義--------------------------------------*/
- M1=min/10;//取分十位
- min=min%10;//取余??
- M2=min;//取分個位
- /*--------------------------------------時定義--------------------------------------*/
- H1=hour/10;//取時十位
- hour=hour%10;//取余??
- H2=hour;//取時個位
- }
- /*-----------------------------------按鍵去抖函數-----------------------------------*/
- void qudou (unsigned char hour,min)
- {
- unsigned char i;
- for(i=0;i<25;i++){//循環顯示,等于鍵盤去抖的功能
- display (hour,min);
- }
- }
- /*--------------------------------------主函數--------------------------------------*/
- void main(void)
- {
- ////定時器初始設置
- TMOD=0x01;//定時器工作方式1
- TH0=0x3C;//定時器初始產生50ms時基信號
- TL0=0xB0;//定時器初始產生50ms時基信號
- ET0=1;//開定時器中斷
- EA=1;//開總中斷
- TR0=1;//啟動定時器
- /*************************************************************************************/
- while(1)
- {
- unsigned char hour,min;//定義時分
- display (hour,min);//調用顯示函數
- if (time>59)//60秒向分進1
- {
- time=0;
- min++;
- ? ?}
- if (min>59)//60分向時進1
- {
- min=0;
- hour++;
- beep ();
- ? ? }
- if (hour>23)//24時時分秒清零
- {
- hour=0;
- min=0;
- time=0;
- }
- /*-----------------------------------按鍵判斷程序-----------------------------------*/
- if(key1==0)
- qudou (hour,min);
- if (key1==0) {hour++;}
- if(key2==0)
- qudou (hour,min);
- if (key2==0) {min++;}
- }
- }
- /*-----------------------------------中斷服務程序-----------------------------------*/
- void Timer0_Routine(void) interrupt 1
- {
- unsigned char a;
- TH0=0x3C;//定時器初始產生50ms時基信號
- TL0=0xB0;//定時器初始產生50ms時基信號
- ? ? a++;//定時器循環計數20次為一秒
- if (a==20){//定時器循環計數20次為一秒
- a=0;//次數清零,從新循環計數
- time++;//秒加一
- }
- }