單片機源程序如下:- #include<reg51.h> //寄存器51的頭文件
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極0-9字型碼
- unsigned char hour=12,min,sec; //定義并初始化時間為12點整
- unsigned char shi=8,fen,miao; //定義并初始化鬧鐘為8點整
- unsigned char moshi; //0為鬧鐘模式,1為時鐘模式
- sbit key1=P3^0; //按鈕
- sbit key2=P3^1;
- sbit key3=P3^2; // 外部中斷0輸入
- sbit key4=P3^3; // 外部中斷1輸入
- sbit key5=P3^4;
- sbit s=P1^0; //蜂鳴器
- void keyscan();
- void delay(uint x) //定義延時函數:延時1ms
- {
- unsigned char i,j;
- for(i=0;i<x;i++);
- for(j=0;j<120;j++);
- }
- void display() //數碼時鐘管動態顯示
- {
- P2=0x7f;
- P0=LED[sec%10];
- delay(5);
- P2=0xbf;
- P0=LED[sec/10];
- delay(5);
- P2=0xdf; //顯示“-”
- P0=0x40;
- delay(5);
- P2=0xef;
- P0=LED[min%10];
- delay(5);
- P2=0xf7;
- P0=LED[min/10];
- delay(5);
- P2=0xfb; //顯示“-”
- P0=0x40;
- delay(5);
- P2=0xfd;
- P0=LED[hour%10];
- delay(5);
- P2=0xfe;
- P0=LED[hour/10];
- delay(5);
- }
- void dishow() //數碼管鬧鐘動態顯示
- {
- P2=0x7f;
- P0=LED[miao%10];
- delay(5);
- P2=0xbf;
- P0=LED[miao/10];
- delay(5);
- P2=0xdf; //顯示“-”
- P0=0x40;
- delay(5);
- P2=0xef;
- P0=LED[fen%10];
- delay(5);
- P2=0xf7;
- P0=LED[fen/10];
- delay(5);
- P2=0xfb; //顯示“-”
- P0=0x40;
- delay(5);
- P2=0xfd;
- P0=LED[shi%10];
- delay(5);
- P2=0xfe;
- P0=LED[shi/10];
- delay(5);
- }
- void init_timer() //定時器初始化
- {
- TMOD=0x01; //方式1
- TH0=0x77;
- TL0=0x01;
- EA=1; //總中斷允許
- ET0=1; //定時器T0中斷允許
- TR0=1; //啟動定時器T0
- }
- void Time1() //時間累加函數
- {
- sec++; //秒鐘:sec
- if(sec==60)
- {
- sec=0;
- min++; //分鐘:min
- }
- if(min==60)
- {
- min=0;
- hour++; //時鐘:hour
- }
- if(hour==24)
- {
- hour=0;
- }
- }
- void Time0() interrupt 1 //定時器T0中斷服務函數
- {
- static unsigned int num;
- TMOD=0x01; //寄存器模式:方式1
- TH0=0x77;
- TL0=0x01;
- num++; //計數5ms,num+1
- if(num==300) //num=300,增加1秒
- {
- sec++; //秒鐘:sec
- num=0;
- }
- if(sec==60)
- {
- sec=0;
- min++; //分鐘:min
- }
- if(min==60)
- {
- min=0;
- hour++; //時鐘:hour
- }
- if(hour==24)
- {
- hour=0;
- }
- }
- void init_INT01() //外部中斷初始化
- {
- EA=1; //總中斷允許
- EX0=1; //允許外部中斷0中斷
- EX1=1; //允許外部中斷1中斷
- IT0=1; //選擇外部中斷0為跳沿觸發方式
- IT1=1; //選擇外部中斷1為跳沿觸發方式
- }
-
- void INT0_() interrupt 0 //外部中斷0服務函數 :P3^2
- {
- EX0=0;
- moshi=0; //鬧鐘打開,進入鬧鐘設置模式
- EX0=1;
- }
- void INT1_() interrupt 2 //外部中斷1服務函數 : P3^3
- {
- EX1=0;
- moshi=1; //鬧鐘關閉 ,回歸時鐘狀態
- EX1=1;
- }
- void compare() //時間比較函數:判斷時間是否達到鬧鐘設定時間
- {
- if(shi==hour&&fen==min)
- {
- s=0;
- delay(9);
- }
- }
- void keyscan() //按鍵判斷
- {
- static uchar key1_Temp=1;
- static uchar key2_Temp=1;
- static uchar key5_Temp=1;
- if(moshi==0)
- {
- dishow();
- }
- if(moshi==1)
- {
- display();
- compare();
- }
- if(moshi==1)
- {
- if(key1==0&&key1!=key1_Temp) //key1:秒的加
- {
- delay(10);
- if(key1==0&&key1!=key1_Temp)
- {
- sec++;
- if(sec==60)
- {
- sec=0;
- }
- }
- }
- if(key2==0&&key2!=key2_Temp) //key2:分的加
- {
- delay(10);
- if(key2==0&&key2!=key2_Temp)
- {
- min++;
- if(min==60)
- {
- min=0;
- }
- }
- }
- if(key5==0&&key5!=key5_Temp) //key5:時的加
- {
- delay(10);
- if(key5==0&&key5!=key5_Temp)
- {
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- }
- }
- }
- if(moshi==0)
- {
- if(key1==0&&key1!=key1_Temp) //key1:秒的加
- {
- delay(10);
- if(key1==0&&key1!=key1_Temp)
- {
- miao++;
- if(miao==60)
- {
- miao=0;
- }
- }
- }
- if(key2==0&&key2!=key2_Temp) //key2:分的加
- {
- delay(10);
- if(key2==0&&key2!=key2_Temp)
- {
- fen++;
- if(fen==60)
- {
- fen=0;
- }
- }
- }
- if(key5==0&&key5!=key5_Temp) //key5:時的加
- {
- delay(10);
- if(key5==0&&key5!=key5_Temp)
- {
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- }
- key1_Temp=key1; //賦值
- key2_Temp=key2;
- key5_Temp=key5;
- }
- void main()
- {
- init_timer(); //定時器初始化
- init_INT01(); //外部中斷初始化
- while(1)
- {
- keyscan(); //按鍵判斷
- Time1(); //時間累加函數
- delay(1);
- }
- }
復制代碼
|