電 子 時 鐘 萬 年 歷 + 鬧 鐘 設 置
實 現 功 能 :1 . 一 上 電 顯 示 00-00-00 ,且 ‘-’ 一 秒 閃 爍 一 次
2 . 按 鍵 功 能 :
k1:設 置 位
k2:加 位
k3:減 位
k4:萬 年 歷 、鬧 鐘 、時 鐘 切 換 位
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
PCB.png (70.41 KB, 下載次數: 59)
下載附件
PCB
2019-6-26 11:10 上傳
原理圖.png (126.88 KB, 下載次數: 71)
下載附件
原理圖
2019-6-26 11:10 上傳
單片機源程序如下:
- /********************************************************
- 電 子 時 鐘 萬 年 歷 + 鬧 鐘 設 置
- 實 現 功 能 :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; //時鐘暫停
- }
- }
復制代碼 詳細代碼在附件中
0.png (6.53 KB, 下載次數: 66)
下載附件
2019-6-27 01:44 上傳
全部資料51hei下載地址:
51單片機電子時鐘 萬歷表 鬧鐘(代碼 原理圖 PCB).zip
(2.04 MB, 下載次數: 146)
2019-6-26 11:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|