电子秒表时钟 数码管显示 可设置时间 可用于秒表暂停、清零蜂鸣器按键音
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include"delay.h"
- #include"intrins.h"
- unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //定义共阴极LED7段显示码
- unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位码
- unsigned char hour=23,min=58,sec=52,week=1; //定义初始时间为23时58分52秒
- unsigned char tcount; //定义50ms计数变量
- unsigned char flag=0;
- sbit KEY1=P1^0;
- sbit KEY2=P1^1;
- sbit KEY3=P1^2;
- sbit key1=P1^3;
- sbit key2=P3^6;
- sbit key3=P3^7;
- sbit LED1=P1^7;
- sbit LED2=P1^6;
- sbit LED3=P1^5;
- sbit LED4=P1^4;
- sbit BEEP=P3^0;
- void display(unsigned char,unsigned char,unsigned char,unsigned char);
- void delay(unsigned int time)//定义延时函数
- {
- unsigned int j = 0;
- for(;time>0;time--)
- for(j=0;j<125;j++);
- }
- void Delay100us() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 2;
- j = 100;
- do
- {
- while (--j);
- } while (--i);
- }
- void main(void)
- {
- TMOD=0x01; //定时/计数器0设为方式1
- TH0=(65536-50000)/256; //定时50ms初值的高八位送入TH0
- TL0=(65536-50000)%256; //定时50ms初值的低八位送入TL0
- EA=1; //开CPU中断
- ET0=1; //开定时/计数器0的中断
- TR0=1; //启动定时器0
- while(1)
- {
- if(key1==0)
- { BEEP=0;Delay100us();BEEP=1;
- hour=0;min=0;sec=0;
- }
- if(key2==0)
- { BEEP=0;Delay100us();BEEP=1;
- TR0=0;
- }
- if(key3==0)
- { BEEP=0;Delay100us();BEEP=1;
- TR0=1;
- }
-
- if(KEY1==0)
- { delay(180);
- if(KEY1==0)
- {
- TR0=0;
- flag++;
- if(flag>4)
- {
- flag=0;
- TR0=1;
- LED1=1;LED2=1;LED3=1;LED4=1;
- }
- }
- }
- switch(flag)
- {
- case 1: LED1=0;LED2=1;LED3=1;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- hour++;
- if(hour>23)
- hour=0;
- }
- }
- if(KEY3==0)
- {
- delay(150);
- if(KEY3==0)
- {
- hour--;
- if(hour<0)
- hour=23;
- }
- }
- display(hour,min,sec,week);
- break;
- case 2: LED1=1;LED2=0;LED3=1;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- min++;
- if(min>59)
- min=0;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- min--;
- if(min<0)
- min=59;
- }
- }
- display(hour,min,sec,week);
- break;
- case 3: LED1=1;LED2=1;LED3=0;LED4=1;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- sec++;
- if(sec>59)
- sec=0;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- sec--;
- if(sec<0)
- sec=59;
- }
- }
- display(hour,min,sec,week);
- break;
- case 4:LED1=1;LED2=1;LED3=1;LED4=0;
- if(KEY2==0)
- {
- delay(180);
- if(KEY2==0)
- {
- week++;
- if(week>7)
- week=1;
- }
- }
- if(KEY3==0)
- {
- delay(180);
- if(KEY3==0)
- {
- week--;
- if(week<1)
- week=7;
- }
- }
- display(hour,min,sec,week);
- break;
- case 5:LED1=1;LED2=1;LED3=1;LED4=1;flag=0;TR0=1;
- default:break;
-
-
- }
- display(hour,min,sec,week);
- }
- }
- void display(unsigned char hour,unsigned char min,unsigned char sec,unsigned char week)
- {
-
- P0=LED[hour/10]; //小时的十位送数码管1位显示
- P2=0xfe;
- delay(1);
- P2=0xff;
-
- P0=LED[hour%10]; //小时的个位送数码管2位显示
- P2=0xfd;
- delay(1);
- P2=0xff;
-
- P0=LED[min/10]; //横杠送数码管3位显示
- P2=0xfb;
- delay(1);
- P2=0xff;
-
- P0=LED[min%10]; //分的十位送数码管4位显示
- P2=0xf7;
- delay(1);
- P2=0xff;
-
- P0=LED[sec/10]; //分的个位送数码管5位显示
- P2=0xef;
- delay(1);
- P2=0xff;
-
- P0=LED[sec%10]; //横杠送数码管6位显示
- P2=0xdf;
- delay(1);
- P2=0xff;
-
- P0=LED[10]; //秒的十位送数码管7位显示
- P2=0xbf;
- delay(1);
- P2=0xff;
-
- P0=LED[week]; //秒的个位送数码管8位显示
- P2=0x7f;
- delay(1);
- P2=0xff;
- }
- void T0_time() interrupt 1 //定时器中断处理函数
- {
- TH0=(65536-50000)/256; //重新将定时50ms初值的高八位送TH0
- TL0=(65536-50000)%256; //重新将定时50ms初值的低八位送TH0
- tcount++; //定时50ms时间到加1
- if(tcount==20) //判断是否到1s
- {
- tcount=0; //到1s,变量清0
- sec++; //秒计数变量加1
- if(sec==60) //判断秒是否到60
- {
- sec=0; //到60,秒变量清0
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子时钟设计.zip
(126.91 KB, 下载次数: 298)
|