- #include <REGX52.H>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar count=0,minute=0,second=3,flag=0,stop=0;
- uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極
- uchar disbuf[4]={0};//位選定義一個四位的數組,循環掃描顯示相應的內容
- sbit buzzer=P2^0;//定義單片機的相應引腳
- sbit P11=P1^1;
- //sbit P12=P1^2;
- sbit light=P1^3;
- sbit jianfenkey=P1^4;
- uchar Jia=0, Jian=0;
- void delay_ms(uint x) //延時消抖函數
- {uint t;
- while(x--) for(t = 0; t < 120; t++);
- }
- void display()//模塊化書寫函數,進行相應的調用,實現模塊化編程
- {
- uchar i,j;
- uchar sel;
- disbuf[0]=second%10; //disbuf[]每一個元素賦值,對秒賦值
- disbuf[1]=second/10;
- disbuf[2]=minute%10;//對分鐘賦值
- disbuf[3]=minute/10;
- P2=0XFF; //P2口接數碼管的位選端,選擇哪個數碼管工作 共陰極數碼管,位選0時有效 先置FF,使為選段為高電平,數碼管不工作
- sel=0x01;//定義一個掃描的位選端
- for(i=0;i<4;i++)
- {
- j=disbuf[i]; //掃描依次顯示四個數碼管 上面的賦值已經將disbuf數值更改,也就是1~9
- P0=table[j]; //將字形碼發送到P0端口,顯示位的數據
- P2=(sel^0xff); // ^異或相異為1,保證每次都有一個數碼管點亮
- delay_ms(1); // 延時后,防止程序運行太快,跑飛
- P2=0XFF;
- sel=sel<<1; // 左移運算 0x01左移,1將依次在四位上循環
- }
- }
- void modify_time()//更改計時器時間的函數,修改初始定時時間
- {
- if(Jia == 1)
- {
- if(flag==0)//修改秒
- {
- second++;
- if(second==60)//秒的最大為60,然后會發生進位
- {
- second=0;
- disbuf[0]=0;
- disbuf[1]=0;
- }
- }
- else//修改分鐘
- {
- minute++;
- if(minute==60)//分鐘最大為60,到60以后會發生進位
- {
- minute=0;
- disbuf[2]=0;
- disbuf[3]=0;
- }
- }
- Jia=0;
- }
- else if(Jian==1)
- {
- if(flag==0)//修改秒
- {
- second--;
- if(second==0)//秒的最小為0,然后會發生借位
- {
- second=59;
- disbuf[0]=9;
- disbuf[1]=5;
- minute=minute-1;
- }
- }
- Jian=0;}
- }
- void main(void)//主函數
- {
- TMOD=0x01;//定時器T0,工作方式1,為16位定時器
- TH0=(65536-50000)/256;//高8位賦值
- TL0=(65536-50000)%256;//低8位賦值
- TR0=0;//默認情況下,定時器不工作,在外部的觸發情況下,定時器,工作,開始減1運算
- ET0=1;//打開定時器T0的中斷
- IT0=1;//設置外部中斷0的觸發方式
- EX0=1;//打開外部中斷的中斷
- IT1=1;//設置外部中斷0觸發方式
- EX1=1;//打開外部中斷1中斷
- EA=1;//總中斷
- while(1)
- {
- if(stop==1)//當計時倒計時完成以后,屏幕閃爍顯示
- {
- while(1)
- {
- P2=~P2;
- delay_ms(150);
- }
- }
- else
- display();//調用顯示函數,依次減一
- if(!P11)//判斷更改時間按鍵是否按鍵 進行相應的消抖
- {
- while(!P11)
- delay_ms(10);
- Jia=1;
- if(P11)
- {
-
- modify_time();
- }//調用調日期時間的函數
- }
- if(!jianfenkey)//判斷更改時間按鍵是否按鍵 進行相應的消抖
- {
- while(!jianfenkey)
- delay_ms(10);
- Jian = 1;
- if(jianfenkey)
- {
- modify_time();}//調用調時間的函數
- }
- }
- }
- void inter1() interrupt 1//定時器T0的中斷
- {
- count++;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(count==20)//50ms 20次即為1s
- {
- count=0;
- second--;
- if(second==0)//該處的程序結構應該仔細看下
- {
- if(minute!=0)//防止minute最后為0的時候,還執行minute--,使程序出錯。
- {
- minute--;
- second=60;
- second--;
- if(second==0)
- {
- if(minute==0)
- {
- second=0;
- minute=0;
- TR0=0;
- count=0;
- buzzer=0;
- light=0;
- stop=1;
- }
- }
- }
- else
- {
- second=0;
- minute=0;
- TR0=0;
- count=0;
- buzzer=0;
- light=0;
- stop=1;
- }
- }
- }
- }
-
- void inter0() interrupt 0//外部中斷0
- {
- flag=~flag;//flag參數的作用,是修改定時時間的時,確定是分鐘位還是小時位。
-
- }
- void inter2() interrupt 2//外部中斷1
- {
- TR0=~TR0;//按鍵3,奇數次按下,定時器開始工作,偶數次關閉。
- }
復制代碼 |