电 子 时 钟 万 年 历 + 闹 钟 设 置
实 现 功 能 :1 . 一 上 电 显 示 00-00-00 ,且 ‘-’ 一 秒 闪 烁 一 次
2 . 按 键 功 能 :
k1:设 置 位
k2:加 位
k3:减 位
k4:万 年 历 、闹 钟 、时 钟 切 换 位
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /********************************************************
- 电 子 时 钟 万 年 历 + 闹 钟 设 置
- 实 现 功 能 :1 . 一 上 电 显 示 00-00-00 ,且 ‘-’ 一 秒 闪 烁 一 次
- 2 . 按 键 功 能 :
- k1:设 置 位
- k2:加 位
- k3:减 位
- k4:万 年 历 、闹 钟 、时 钟 切 换 位
- *********************************************************/
- #include <reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- u16 i,j,k;
- u8 anjian,jia,jian,beep;
- u8 sec,min,hour,shine;
- u8 N_sec,N_min,N_hour; //闹钟
- u8 shine1;
- u16 year=2019,month=6,day=17;
- sbit buzzer=P3^7;
- sbit k2=P3^1;
- sbit k1=P3^0;
- sbit k3=P3^2;
- sbit k4=P3^3;
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //数码管显示0123456789- 空
- u8 code smgwei[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //选择1-8位数码管
- /********延时函数*************/
- void delay(i)
- {
- while(i--);
- }
- /***********数码管段位选********/
- void time(j,k)
- {
- P2=smgwei[j]; //数码管位选
- P0=smgduan[k]; //数码管段选
- delay(100); //间隔一段时间
- }
- /**********数码管时间循环流动**********/
- void time_Display()
- {
- if(shine == 1) //3、6位数码管'-'闪烁
- {
- time(2,11);
- time(5,11);
- }
- else if(shine==0)
- {
- time(2,10);
- time(5,10);
- }
- if(anjian==0) //一上电,时钟显示00-00-00
- {
- time(0,sec%10);
- time(1,sec/10);
- time(3,min%10);
- time(4,min/10);
- time(6,hour%10);
- time(7,hour/10);
- }
- else if(anjian==1) //切换设置模式,选择位为秒位
- {
- TR0=0; //关闭定时器0,在设置模式下时钟不运行
- TR1=1; //打开定时器1,开始计数
- if(shine1<=50) //在shine1为0-50区间内,即1秒灭
- {
- time(0,11);
- time(1,11);
- }
- else if((shine1>50)&&(shine1<=100)) //在shine1为50-100区间内,即1秒亮
- {
- time(0,sec%10);
- time(1,sec/10);
- }
- time(3,min%10); //其他不变
- time(4,min/10);
- time(6,hour%10);
- time(7,hour/10);
- }
- else if(anjian==2) //设置模式下,选择位为分位
- {
- TR0=0; //关闭定时器0,在设置模式下时钟不运行
- TR1=1; //打开定时器1,开始计数
- if(shine1<=50) //在shine1为0-50区间内,即1秒灭
- {
- time(3,11);
- time(4,11);
- }
- else if((shine1>50)&&(shine1<=100)) //在shine1为50-100区间内,即1秒亮
- {
- time(3,min%10);
- time(4,min/10);
- }
- time(0,sec%10); //其他不变
- time(1,sec/10);
- time(6,hour%10);
- time(7,hour/10);
- }
- else if(anjian==3) //设置模式下,选择位为时位
- {
- TR0=0; //关闭定时器0,在设置模式下时钟不运行
- TR1=1; //打开定时器1,开始计数
- if(shine1<=50) //在shine1为0-50区间内,即1秒灭
- {
- time(6,11);
- time(7,11);
- }
- else if((shine1>50)&&(shine1<=100)) //在shine1为50-100区间内,即1秒亮
- {
- time(6,hour%10);
- time(7,hour/10);
- }
- time(0,sec%10); //其他不变
- time(1,sec/10);
- time(3,min%10);
- time(4,min/10);
- }
- //k2加一功能
- if(jia==1&&anjian==1) //选择秒位时,按下k2加一
- {
- jia=0;
- sec++;
- if(sec>59)
- sec=0;
- TR0=0; //时钟暂停
- }
- if(jia==1&&anjian==2) //选择分位时,按下k2加一
- {
- jia=0;
- min++;
- if(min>59)
- min=0;
- TR0=0; //时钟暂停
- }
- if(jia==1&&anjian==3) //选择时位时,按下k2加一
- {
- jia=0;
- hour++;
- if(hour==24)
- hour=0;
- TR0=0; //时钟暂停
- }
- //k3减一功能
- if(jian==1&&anjian==1) //选择秒位时,按下k3减一
- {
- jian=0;
- sec--;
- if(sec==-1)
- sec=59;
- TR0=0; //时钟暂停
- }
- if(jian==1&&anjian==2) //选择分位时,按下k3减一
- {
- jian=0;
- min--;
- if(min==-1)
- min=59;
- TR0=0; //时钟暂停
- }
- if(jian==1&&anjian==3) //选择时位时,按下k3减一
- {
- jian=0;
- hour--;
- if(hour==-1)
- hour=23;
- TR0=0; //时钟暂停
- }
- }
复制代码 详细代码在附件中
全部资料51hei下载地址:
51单片机电子时钟 万历表 闹钟(代码 原理图 PCB).zip
(2.04 MB, 下载次数: 146)
|