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