|
單片機(jī)源程序如下:- #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; //定義并初始化時(shí)間為12點(diǎn)整
- unsigned char shi=8,fen,miao; //定義并初始化鬧鐘為8點(diǎn)整
- unsigned char moshi; //0為鬧鐘模式,1為時(shí)鐘模式
- 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) //定義延時(shí)函數(shù):延時(shí)1ms
- {
- unsigned char i,j;
- for(i=0;i<x;i++);
- for(j=0;j<120;j++);
- }
- void display() //數(shù)碼時(shí)鐘管動(dòng)態(tài)顯示
- {
- 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() //數(shù)碼管鬧鐘動(dòng)態(tài)顯示
- {
- 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() //定時(shí)器初始化
- {
- TMOD=0x01; //方式1
- TH0=0x77;
- TL0=0x01;
- EA=1; //總中斷允許
- ET0=1; //定時(shí)器T0中斷允許
- TR0=1; //啟動(dòng)定時(shí)器T0
- }
- void Time1() //時(shí)間累加函數(shù)
- {
- sec++; //秒鐘:sec
- if(sec==60)
- {
- sec=0;
- min++; //分鐘:min
- }
- if(min==60)
- {
- min=0;
- hour++; //時(shí)鐘:hour
- }
- if(hour==24)
- {
- hour=0;
- }
- }
- void Time0() interrupt 1 //定時(shí)器T0中斷服務(wù)函數(shù)
- {
- static unsigned int num;
- TMOD=0x01; //寄存器模式:方式1
- TH0=0x77;
- TL0=0x01;
- num++; //計(jì)數(shù)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++; //時(shí)鐘:hour
- }
- if(hour==24)
- {
- hour=0;
- }
- }
- void init_INT01() //外部中斷初始化
- {
- EA=1; //總中斷允許
- EX0=1; //允許外部中斷0中斷
- EX1=1; //允許外部中斷1中斷
- IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式
- IT1=1; //選擇外部中斷1為跳沿觸發(fā)方式
- }
-
- void INT0_() interrupt 0 //外部中斷0服務(wù)函數(shù) :P3^2
- {
- EX0=0;
- moshi=0; //鬧鐘打開,進(jìn)入鬧鐘設(shè)置模式
- EX0=1;
- }
- void INT1_() interrupt 2 //外部中斷1服務(wù)函數(shù) : P3^3
- {
- EX1=0;
- moshi=1; //鬧鐘關(guān)閉 ,回歸時(shí)鐘狀態(tài)
- EX1=1;
- }
- void compare() //時(shí)間比較函數(shù):判斷時(shí)間是否達(dá)到鬧鐘設(shè)定時(shí)間
- {
- 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:時(shí)的加
- {
- 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:時(shí)的加
- {
- 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(); //定時(shí)器初始化
- init_INT01(); //外部中斷初始化
- while(1)
- {
- keyscan(); //按鍵判斷
- Time1(); //時(shí)間累加函數(shù)
- delay(1);
- }
- }
復(fù)制代碼
|
|