|
电子时钟、秒表及闹钟仿真图及程序
- /************************************************/
- /**设计题目:数字电子钟**/
- /**设计要求:能显示时,分,秒,能对时,分进行调节,有秒表功能.**/
- /**设计人: 史亚林 (西安科技大学)于2011年5月 QQ:598241556**/
- /************************************************/
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit qingling=P1^0; //清零
- sbit tiaofen=P1^1; //调分
- sbit tiaoshi=P1^2; //调时
- sbit sounder=P1^7; //naozhong
- uint a,b;
- uchar hour,minu,sec, //时钟
- hour0,minu0,sec0,//秒表
- hour1,minu1,sec1;
- h1,h2,m1,m2,s1,s2,//显示位
- k,s;//状态转换标志
-
- uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- /*****************函数声明***********************/
- void keyscan();
- void init();
- void delay(uchar z);
- void display(uchar,uchar,uchar);
- void sounde();
- /*****************主函数*************************/
- void main()
- {
- init();
- while(1)
- {
- while(TR1)
- {
-
- keyscan(); //扫描函数
- while(s==1) ///////////////s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);
- { //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.
- keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。
- display(hour1,minu1,sec1); //闹钟时刻显示
- }
- display(hour0,minu0,sec0);//时钟表显示
-
- while(k) /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/
- {
- display(hour,minu,sec); //秒表显示
- }
-
- }
- }
- }
- /*****************初始化函数***********************/
- void init()
- {
- a=0;
- b=0;
- k=0;
- s=0;
- hour0=0;
- minu0=0;
- sec0=0;
- hour=0;
- minu=0;
- sec=0;
- hour1=0;
- minu1=0;
- sec1=0;
- TMOD=0x11; //定时器0,1工作于方式1;赋初值
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
-
- EA=1;
- EX0=1; //秒表中断
- EX1=1; //闹钟设定中断
- ET0=1;
- ET1=1;
- IT0=1; //边沿触发方式
- IT1=1;
- PX0=1;
- PX1=1;
-
- TR0=0; //初始,秒表不工作
- TR1=1; //时钟一开始工作
- }
- /*****************定时器0中断*************/
- void timer0_int() interrupt 1 //秒表
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- a++;
- if(a==2)
- {
- a=0;
- sec++;
- if(sec==100)
- {
- sec=0; //毫秒级
- minu++;
- if(minu==60)
- {
- minu=0; //秒
- hour++;
- if(hour==60) //分
- {
- hour=0;
- }
- }
- }
- }
-
- }
- /*************外部中断0中断函数************/
- void ex0_int() interrupt 0
- {
- k++;
- if(k==3)
- k=0;
- if(k==1)
- {
- TR0=~TR0;
- if(TR0==1)
- {
- hour=0;
- minu=0;
- sec=0;
- }
- }
- if(k==2)
- {
- TR0=~TR0;
- }
- }
- /*************外部中断1中断函数************/
- void ex1_int() interrupt 2
- {
- s++;
- if(s==3)
- s=0;
- }
- /*************定时器1中断****************/
- void timer1_int() interrupt 3 //控制时钟工作
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(s==2)
- {
- if(hour1==hour0 && minu0==minu1)
- sounde();
- }
- b++;
- if(b==20)
- {
- b=0;
- sec0++;
- if(sec0==60)
- {
- sec0=0;
- minu0++;
- if(minu0==60)
- {
- minu0=0;
- hour0++;
- if(hour0==24)
- hour0=0;
-
- }
- }
-
- }
-
- }
- /*************键盘扫描****************/
- void keyscan()
- {
-
- if(s==1)
- {
- if(qingling==0)
- {
- delay(10);
- if(qingling==0)
- {
- sec1=0;
- minu1=0;
- hour1=0;
- }
- }
- if(tiaofen==0)
- {
- delay(10);
- if(tiaofen==0)
- {
- minu1++;
- if(minu1==60)
- {
- minu1=0;
- }
- while(!tiaofen);
-
- }
- }
- if(tiaoshi==0)
- {
- hour1++;
- if(hour1==24)
- {
- hour1=0;
- }
- while(!tiaoshi);
-
- }
- }
- else //调整时钟时间
- {
- if(qingling==0)
- {
- delay(10);
- if(qingling==0)
- {
- sec0=0;
- minu0=0;
- hour0=0;
- }
- }
- if(tiaofen==0)
- {
- delay(10);
- if(tiaofen==0)
- {
- minu0++;
- if(minu0==60)
- {
- minu0=0;
- }
- while(!tiaofen);
-
- }
- }
- if(tiaoshi==0)
- {
- hour0++;
- if(hour0==24)
- {
- hour0=0;
- }
- while(!tiaoshi);
-
- }
- }
- }
- /*************显示函数****************/
- void display(uchar hour,uchar minu,uchar sec)
- {
- h1=hour/10;
- h2=hour%10;
- m1=minu/10;
- m2=minu%10;
- s1=sec/10;
- s2=sec%10;
- P0=0xff;
- P2=table[h1];
- P0=select[7];
- delay(5);
- P0=0xff;
- P2=table[h2];
- P0=select[6];
- delay(5);
- P0=0xff;
- P2=0x40;;
- P0=select[5];
- delay(5);
- P0=0xff;
- P2=table[m1];
- P0=select[4];
- delay(5);
- P0=0xff;
- P2=table[m2];
- P0=select[3];
- delay(5);
- P0=0xff;
- P2=0x40;
- P0=select[2];
- delay(5);
- P0=0xff;
- P2=table[s1];
- P0=select[1];
- delay(5);
- P0=0xff;
- P2=table[s2];
- P0=select[0];
- delay(5);
- }
- /*************闹钟函数****************/
- void sounde()
- {
- sounder=~sounder;
- }
- /*************延时函数****************/
- void delay(uchar z)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
复制代码
|
-
-
时钟秒表.rar
20.15 KB, 下载次数: 91, 下载积分: 黑币 -5
毕业设计
|