基于郭天祥单片机数码管的电子钟(含闹钟、整点报时)

合集下载

单片机制作数字钟(含万年历、秒表功能)

单片机制作数字钟(含万年历、秒表功能)

数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。

带整点报时功能的电子时钟

带整点报时功能的电子时钟

带整点报时功能的电子时钟题目要求:显示时、分、秒,打开电源时,应当显示的数据为00:00:00,然后电路会自动开始计时。

电路中应当有时、分、秒的时间调整按钮。

当显示数据变为00:00:00,而不是24:00:00。

时间调整按钮按下时间小于1s,时钟进入休眠状态;大于1s时,进入时间调整状态,每按1次,显示值加1。

当时间到了整点时,将会进行报时。

设计任务的分析:电子时钟是生活中非常实用的电子部件,比如手机里的时间显示、电子手表里的时间显示等。

一般来说,电子时钟应当具有时、分、秒三个部分的内容显示,而且这三个部分还可以分别调整。

现在好一些的电子时钟除了有时、分、秒显示之外,还有年、月、日显示,闹钟设置等多种功能。

实际上这些功能都能用单片机实现。

本设计实验中,将设计一个能显示时、分、秒并带有整点报时功能的简单电子时钟,时、分、秒均能分别进行调整。

原理:本设计中实现的是6位数的显示。

一般来说,控制多位数码管常采用的方法是扫描显示法,即各位数码管共用输入数据,但各数码管的显示控制线则单独控制。

用扫描显示法来完成多位数字显示设计,程序执行时,先使要显示的数字位数对应的数码管允许点亮;然后,将要显示的数据输出到数码管;显示时间到了之后,再切换到下一个数码管来显示。

而整点报时方面本设计采取使用另外一个单片机控制蜂鸣器,通过输出不同频率的音符而实现歌曲的播放。

电路设计:由以上的分析知,电路中除了单片机之外,还需要6个数码管,2个按钮和2个晶振,一个蜂鸣器和一些电阻、电容、三极管元件。

可以用单片机1的P1端口的P1.0~P1.7来作为数码管显示数据的输出引脚,P2.0~P2.5作为各数码管的控制端,用P3.7作为休眠、时间调整的控制钮。

单片机2的P1.3作为蜂鸣器的控制端,单片机1跟单片机2的P2.7作为2个单片机的通讯端。

一、硬件电路说明二、程序设计:a)软件流程设计说明三、调试过程出现的问题和解决的办法1、数码管刚开始采用单片机直接驱动,但是数码管显示亮度不够,因此改为采用三极管加上拉电阻驱动,最后数码管显示良好;2、两块单片机之间通过P0口对接,结果信号采集不到,加了上拉电阻之后问题解决;3、采用P1口带限流电阻触发三极管驱动蜂鸣器时,蜂鸣器不够响亮,因为单片机的输出电流最大为20mA,加了限流电阻后削弱了电流,采用直接触发方式即解决问题。

51单片机c语言电子钟已加入调时闹铃整点报时功能

51单片机c语言电子钟已加入调时闹铃整点报时功能

51 单片机 c 语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51 单片机c 语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char #define uint unsigned int /* 七段共阴管显示定义*/ // 此表为LED 的字模,共阴数码管0-9 - uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 段码控制/* 定义并初始化变量*/ uchar seconde=0;// 秒uchar minite=0;// 分uchar hour=12; // 时uchar shi=0;// 闹铃功能uchar fen=0;uchar bjcs;// 报警次数sbit P1_0=P1A0; //second 调整定义sbit P1_仁P1A1;//minite 调整定义sbit P1_2二PM2; //hour 调整定义sbitP1_5=P1A5; //整点报时sbit P1_3=P1A3; //闹铃功能,调整时间sbit P1_6=P1A6; //调整时sbit P1_7=P1A7; //调整分sbit P1_4=P1A4; //关闭闹铃/* 函数声明*/void delay(uint k ); // 延时子程序void time_pro( ); // 时间处理子程序void display( ); // 显示子程序void keyscan( ); // 键盘扫描子程序/*xx 子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/* 时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0; minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/* 显示子程序*/void display(void){if(P1_3==1){P2=0XFE;PO=dispcode[seco nde%10];/秒个位delay(1);P2=0XFD;P0=dispcode[seco nde/10];〃秒十位delay(1);P2=0XFB;P0=dispcode[10];// 间隔符-delay(1);P2=0XF7;P0=dispcode[mi nite%10];〃分个位delay(1);P2=0XEF;P0=dispcode[minite/10];// 分十位delay(1);P2=0XDF;P0二dispcode[10];〃间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];〃时个位delay(1);P2=0X7F;P0=dispcode[hour/10];// 时十位delay(1);}}/* 键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_仁=0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)// 时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/* 整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))〃整点报时{P1_5=0;delay(1000);P1_5=1;}}/* 定时闹钟*/void dingshi(void){if(P1_3==0)〃按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。

第一个项目:电子万年历任务要求

第一个项目:电子万年历任务要求

电子万年历设计任务书1、功能简述使用郭天祥单片机开发板设计并实现电子万年历。

本系统能够显示阳历的年、月、日、星期、时、分、秒及阴历的年、月、日,并表明是否是闰年。

本系统能够整点报时,有闹钟功能,能够显示当前温度。

系统硬件电路主要由单片机最小系统、数码管、温度传感器、按键、蜂鸣器等模块组成。

系统组成框图如图1所示。

单片机电源时钟电路复位电路显示模块温度采集模块时钟芯片按键输入蜂鸣器图1 系统组成框图2、任务及要求(1)时间的采集和显示本系统使用时钟芯片获得时间信息,能够在数码管上显示阳历的年、月、日、星期、时、分、秒及阴历的年、月、日,并表明是否是闰年。

(2)整点报时根据当前的时间信息,当整点时能用蜂鸣器报时,可以控制蜂鸣器蜂鸣的次数(如:)。

(3)闹钟本系统可以设置闹钟,根据设置时间蜂鸣器蜂鸣。

(4)温度检测本系统采用温度传感器进行温度检测。

温度传感器采集的温度数据经过单片机处理后,显示在数码管上。

(5)按键按键模块要实现设置时间初始值、设置闹钟的功能。

(6)扩展功能:将温度每隔1分钟存储到E2PROM 中。

3、验收内容(1)电路原理图设计根据设计任务要求,使用Protel 或altium designer 软件设计电路原理图,原理图中标明元器件参数。

(2)流程图绘制及程序的编写。

①画出程序流程图。

②按照设计要求完成程序设计任务。

(3)软、硬件统调将编译通过的程序下载到单片机芯片中,进行软、硬件的统调。

①系统初始化状态正确;②数码管显示功能,界面满足题目要求;③时间显示正确;④实现整点报时功能;⑤实现闹钟功能;⑥实现温度检测功能;⑦实现按键参数设置功能;⑧实现蜂鸣器报时和闹钟功能。

(4)设计报告完成本系统的设计报告。

设计报告包括以下几部分:①课题的目的和意义;②系统结构的设计;③方案和器件的选择并列出芯片的具体型号;④原理图的设计;⑤软件的设计(必须包括流程图);⑥系统的测试及结果;⑦收获和心得。

基于51单片机电子显示时钟带闹钟、整点报时、日期、星期

基于51单片机电子显示时钟带闹钟、整点报时、日期、星期

基于51单片机电子显示时钟带闹钟、整点报时、日期、星期#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit KEY1=P3^0; //切换键sbit KEY3=P3^1; //minute ,hour调整加1定义sbit KEY2=P3^7; //minute ,hour调整减1定义sbit bear=P3^4; //闹铃uchar a=0; //时间显示和闹钟时间显示切换code unsigned chartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0 x8e,0xff,0x21}; //段码控制char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar StrTab[32];char minute=01,hour=13,second=00; // 正常时钟秒,分,时定义char minute1=12,hour1=24; // 闹钟时钟秒,分,时定义uint year=2014;char month=12,day=10; //日期年,月,日定义char week=3,v=1; //星期//要保持高位为0char pp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,0x3e,0x3d,0x3b,0x37,0x2f,0x1f,0x1e,0x1d,0x1b,0x17,0x0f,0x0e,0x0d,0x0b,0x07,0x06,0x05,0x03,0x02,0x01,0x00};char w=0;uchar flag=0; //切换标志uint count=0; //定时器计数,定时50ms,count满20,秒加1/********************** 延时子程序*****************************/ void delay(uint z){ uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}/*******************蜂鸣器子程序****************************/ void beng(){bear=~bear;delay(10);bear=1;}/**********************显示时钟子函数***************************/void display(uchar w[32]){ unsigned int i,j,c=0;if(a==0) //正常时间显示{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示{ P2=weikong_code[i]; //位选j=w[i]; //取出要显示的数码P0=tab[j]; //取出段选编码delay(1); //显示延时P0=0xff;} }if(a==1) //闹钟调整显示{ for(i=8;i<16;i++){ if(c==8) c=0;P2=weikong_code[c];c++;j=w[i];P0=tab[j];delay(1);P0=0xff;} }if(a==2) //日期调整显示{ for(i=16;i<24;i++) //取w内容显示{ if(c==8) c=0; //控制位选1P2=weikong_code[c]; //控制位选2c++; //控制位选3j=w[i]; //取w内容P0=tab[j]; //取w内容查表delay(1);P0=0xff;} }if(a==3) //星期调整显示{ for(i=24;i<32;i++){ if(c==8) c=0;P2=weikong_code[c];c++;j=w[i];P0=tab[j];delay(1);P0=0xff;} }}/***********************显示时钟数组子程序***********************/ void xianshishuzu(){ StrTab[1]=second/10; //秒十位StrTab[0]=second%10; //秒个位StrTab[2]=10; //间隔符 -StrTab[4]=minute/10; //分十位StrTab[3]=minute%10; //分个位StrTab[5]=10; //间隔符 -StrTab[7]=hour/10; //时十位StrTab[6]=hour%10; //时个位}/********************************定时闹钟****************/ void alarm(){ char k;if((hour==hour1)&(minute==minute1)&(k)){if(P3!=0XFF){k=0;}beng();display(StrTab);}if((hour==hour1)&(minute!=minute1)){k=1;}StrTab[9]=10; //闹钟秒个位StrTab[8]=10; //秒十位StrTab[10]=10; //间隔符 -StrTab[12]=minute1/10; //分个位StrTab[11]=minute1%10; //分十位StrTab[13]=10; //间隔符 -StrTab[15]=hour1/10; //时个位StrTab[14]=hour1%10; //时十位display(StrTab);}void data1() //年日期显示{StrTab[17]=day/10; //闹钟秒个位StrTab[16]=day%10; //秒十位 9 StrTab[18]=month%10; //间隔符 - StrTab[20]=year%10; //分个位StrTab[19]=month/10; //分十位StrTab[21]=(year/10)%10; //间隔符 - StrTab[23]=year/1000; //时个位StrTab[22]=(year/100)%10; //时十位display(StrTab);}void week1() //星期显示{StrTab[25]=10; //闹钟秒个位StrTab[24]=10; //秒十位 9StrTab[26]=10; //间隔符 -StrTab[28]=week/10; //分个位StrTab[27]=week%10; //分十位StrTab[29]=10; //间隔符 -StrTab[31]=10; //时个位StrTab[30]=10; //时十位display(StrTab);}void godata(){if((hour==0)&(minute==0)&(second==0)){ day++; //日期格式走if((month==2)|(month==4)|(month==6)|(month==9)|(month==11)) //2,4,6,9,11数月30天)//其他偶数月{ if(month==2) //对二月的特殊判断{if((year%4==0)&(year/100!=0)|(year/400==0)) //判断是闰年{if(day==30); //闰年29天{day=1; month++;if(month==13){month=1; year++;if(year==10000)year=0;}}}else if(day==29)//平年28天{day=1; month++;if(month==13){month=1; year++;if(year==10000)year=0;}}}else if(day==31)// 其他月30天{day=1; month++;if(month==13){month=1; year++;if(year==10000)year=0;}}}elseif(day==32) //其他其他月31天{day=1; month++;if(month==13){month=1; year++;if(year==10000)year=0;}}week++; //星期走if(week==8)week=1;data1();week1();while(second==0);}}/**********************键盘扫描子程序*************************/ void keycan(){if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,{ delay(10); //按键1去抖以及动作if(KEY1==0) //确认按键是否按下{flag++;} //切换标志if(flag==10)flag=0;a=0;if((flag==4)|(flag==5))a=1;if((flag==6)|(flag==7)|(flag==8))a=2;if(flag==9)a=3;while(!KEY1);} //释放按键}void tiao(){while(flag==1){ if(KEY2==0){ delay(10);if(KEY2==0){ hour++;if(hour==24)hour=0; } //正常时间小时加1while(!KEY2)display(StrTab); }if(KEY3==0){delay(10);if(KEY3==0){ hour--;if(hour==-1)hour=23;} //正常时间小时减1 while(!KEY3)display(StrTab);} display(StrTab);keycan(); }while(flag==2){if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ minute++;if(minute==60)minute=0;} //分加1while(!KEY2)display(StrTab); }if(KEY3==0){ delay(10);if(KEY3==0){minute--;if(minute==-1)minute=59;}while(!KEY3)display(StrTab);} display(StrTab);keycan();}while(flag==3) // 秒表的加1{ if(KEY3==0){ delay(10);if(KEY3==0)second=0;while(!KEY3)display(StrTab);}if(KEY2==0){ delay(10);if(KEY2==0)second=0;while(!KEY2)display(StrTab);}display(StrTab);keycan();}while(flag==4) //闹钟{ if(KEY2==0){ delay(10);if(KEY2==0){ hour1++;if(hour1==25)hour1=0; } //闹钟时间小时加1 while(!KEY2)alarm(); }if(KEY3==0){ delay(10);if(KEY3==0){ hour1--;if(hour1==-1)hour1=24; } //闹钟时间小时减while(!KEY3)alarm();} alarm(); keycan(); }while(flag==5){ if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ minute1++;if(minute1==60)minute1=0; } //闹钟分加1 while(!KEY2)alarm(); }if(KEY3==0) //按键去抖以及动作{ delay(10);if(KEY3==0){ minute1--;if(minute1==-1)minute1=59; } //闹钟分减1 while(!KEY3)alarm(); } alarm();keycan(); }while(flag==6) // 调整年{ if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ year++;if(year==10000)year=0;} //闹钟分加1while(!KEY2)data1(); }if(KEY3==0) //按键去抖以及动作{ delay(10);if(KEY3==0){ year--;if(year==-1)year=9999; } //闹钟分减1while(!KEY3)data1(); } data1();keycan(); }while(flag==7) // 调整月只加{ if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ month++;if(month==13)month=1; } //闹钟分加1while(!KEY2)data1(); }data1();keycan(); }while(flag==8) //调整日只加{if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ day++;if((month==2)|(month==4)|(month==6)|(month==9)|(month==11)) //2,4,6,9,11数月30天)//其他偶数月{ if(month==2) //对二月的特殊判断{ if((year%4==0)&(year%100!=0)|(year%400==0)) //判断是闰年{if(day==30) //闰年29天day=1;}else if(day==29) //平年28天day=1;}else if(day==31)// 其他月30天day=1; }else if(day==32) //其他其他月31天day=1;}while(!KEY2)data1(); } //日期加加data1();keycan(); }while(flag==9) //调整星期只加{ if(KEY2==0) //按键去抖以及动作{ delay(10);if(KEY2==0){ week++;if(week==8)week=1; }while(!KEY2)week1(); }week1();keycan();}}/*****************整点报警子程序***************************/ void zhengdian(void){ char i;if((minute==0)&(second==0)) //整点报时{ if ((hour<=23)&(hour>=7)){for(i=0;i<hour;i++){beng();delay(1000);display(StrTab);}}else{ beng();godata();delay(3000); }}}/**************************中断子程序*********************************/void time_() interrupt 1 //中断程序{ count++;TH0=(65536-50000)/256; //0.5ms重新送初值TL0=(65536-50000)%256;if(count==20) //定时器计数,定时50ms,count满20,秒加1 { second++;count=0;if(second==60) //秒值等于60,秒清零,分加1{ second=0;minute++;if(minute==60) //分值等于60,分清零,时加1{ minute=0;hour++;if(hour==24) //时值等于24,时清零,返回,全部归零{hour=0;} } } }xianshishuzu();}/***********************主函数***************************/ void main(){ P3=0XFF; TMOD = 0x01; //time0为定时器,方式1TH0=(65536-50000)/256; //预置计数初值,50msTL0=(65536-50000)%256;EA=1; //总中断开ET0=1; //允许定时器0中断TR0=1; //开启定时器0bear=1;while(1) //主循环 {display(StrTab);zhengdian();alarm();keycan();tiao();if((second%8==1)&(flag==0)){w++;if(w==36)w=0;while((second%8==1)&(flag==0)){display(StrTab);alarm();keycan();tiao(); } }P1=pp[w];if(flag==0){if(second==11)a=2;if(second==15)a=3;if(second==19)a=0;}} }。

基于STC51单片机数字时钟-带闹铃功能-省电模式-整点报时功能proteus仿真

基于STC51单片机数字时钟-带闹铃功能-省电模式-整点报时功能proteus仿真

多功能数字时钟设计要求
利用51单片机或者STC单片机设计多功能数字时钟,要求:
1.用单片机控制6位数码管显示时、分、秒,以24小时计时方式运
行;
2.利用单片机片内定时器(如T0)产生1s计时,时钟最大计数值为
23时59分59秒;
3. 时钟有整点提醒功能,短蜂鸣,次数代表整点时间;
4. 时钟可以通过按键进行时间的设置;
5. 可通过按键使系统进入省电状态(数码管不亮,时钟不停)。

6.闹钟功能。

能通过按键实现闹钟/时钟功能之间的转换;可通过按键
设定闹钟时间,在定时闹钟时精确到分,可通过显示器显示闹钟设定时间;可通过按键实现闹钟有效、无效;在闹铃时,可通过按键开关使闹铃停止。

多功能数字时钟操作说明
1.上电初始化程序,时钟时显01时01分00秒
2.按键功能说明:
K1 设置键功能第一次按下时钟设置功能
第二次按下闹铃设置功能
第三次按下回到时钟显示功能
K2 加功能在时钟或闹铃设置状态下进行加操作
K3 减功能/闹铃关闭第一种功能,在时钟或闹铃设置状态下进行加操作
第二种功能,当闹铃响起来,可关闭闹铃K4 时位和分位设置切换切换时位和分位进行加减操作
K5 省电模式切换第一次按下数码管全灭,计时不停止
第二次按下数码管亮起,正常显示时间
K6启动/关闭闹铃功能默认情况下闹铃功能是开启的,按一下K6关闭闹功能,再按一下开启闹铃功能。

程序流程图。

基于单片机的多功能数字钟的设计

基于单片机的多功能数字钟的设计

电子基础基于单片机的多功能数字钟的设计作者/尹克岩,开封大学电子电气工程学院摘要:多功能电子钟除了具有时钟的功能外还可以包含星期、日历,以及对环境温度的检测功能。

星期是一种时间依据,也是现在制定工 作日、休息日的依据。

日历是现在通用的历法与纪年。

温度是环境的基本参数,在各行各业中占有着很重要的位置。

本文以AT 89S 52为核 心控制器制作了一款多功能数字钟,该数字钟具有功耗低,实用性强等特点,具有较高是推广应用价值。

关键词:电子钟;单片机;农历;温度检测引言数字钟是一种利用数字电路来显示时分秒的计时装置, 与传统的机械钟相比,它具有走时准确、显示直观、无机械 传动装置等优点,因而得到广泛的应用。

随着人们生化环境 的不断改善和美化,在许多场合可以看到电子钟。

随着科技 的进步和发达,人们对数字钟的要求越来越多,能够显示 周边的气候和湿度,自带投影,可以让时间显示在天花板 上,在汽车中带有背景光等等,衍生的辅助功能越来越多。

多功能数字钟在外观、性能、用途上都出现了极大的变化, 大部分电子钟都已具备了闹钟、秒表、温湿度检测等功能。

本文将以单片机为基础的对于带曰历、温湿度检测电子钟进 行设计。

1•硬件设计■ 1.1系统框囫数字钟硬件有单片机、数码管显示、温度检测、按键 输入和蜂鸣器组成电气回路。

接通电源数字钟显示“〇〇-〇〇- 00”,按下按钮可以调节时间和闹钟,整点蜂鸣器报警, 按下相应按键可以显示日历和环境温度。

整体框图如图1 所示。

图1系统框图■ 1.2模块设计 1.2.1单片m s 统AT 89S 52是一种低功耗、高性能的微控制器,具有低功耗空闲和掉电模式以及三级加密程序存储器。

40个引脚,VCC 接5V 电源,G N D 接地,E A 接高电平,XTAL 接晶振电路,R ST 接复位电路,P 1和P 2 口接数码管显示,P 3 口接 5位控制按键以及蜂鸣器和温度检测器。

1.2.2晶摄电路在51单片机内部有一个高增益反向放大器,其输入输 出端引脚为XTAL 1和XTAL 2,只要在它们之间接晶体振荡 器和微调电容,就可构成一个稳定的自激振荡器。

最新单片机作品 液晶显示多功能电子钟 带音乐闹铃

最新单片机作品 液晶显示多功能电子钟 带音乐闹铃

最新单片机作品液晶显示多功能电子钟带音乐闹铃(写在前面的:很想了解无线供电技术,志同道合者共勉。

力求把QQ空间打造成技术交流中心--张自变)最新单片机作品:液晶显示多功能电子钟(带音乐闹铃)楼主卜晓旸 2011-05-23 12:28最近重温了一下单片机的部分知识,做了一个LCD1602的电子钟。

还记得上次做的电子钟已经是09年初的事情了。

不说什么先上图:图一、正面(实际比图片稍微漂亮点)图二、背面(因为用手拿的时候会碰到时钟芯片和单片机的晶振焊点,所以贴了这么一个标签挡一下:))视频:功能简介:1、日期,星期,时间的显示功能。

2、一路闹钟。

铃声为那个啥歌曲来着忘了,以前单片机书上的一个例子。

3、实时温度显示。

4、自定义logo。

5、三级背光亮度调节。

6、掉电走时(貌似这是必须的)。

电路图:点击下载大图源代码(Keil编译通过):1602万年历_带闹钟_MT1.zip估算了一下所有器件成本大概二十多块钱。

不过人工成本太高。

写程序不说,光焊这块板子就花了我一整天,咱一天的工资也不菲啊。

呵呵。

不过如果做成PCB倒是可以省相当部分时间。

/*///LCD1602单片机万年历(带闹钟功能)//作者:卜晓旸//时间:2011年5月8日//版本:1.0/*/#include reg52.h#define uint unsigned int#define uchar unsigned char//LCD1602引脚定义sbit rs=P2^7;sbit rd=P2^6;sbit lcdcs=P2^5;sbit lcdbacklight1=P2^1;sbit lcdbacklight0=P2^0;uchar backlight=2;//DS18B20定义uchar count,s1num,tempint,f,tempth,settemp;//温度整数部分和小数部分;int tempdf,c;sbit TMDAT=P1^6;//DS18B20数据线//DS1302定义uchar nian,yue,ri,shi,fen,miao,zhou;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit T_RST=P2^2;//ds1302-5 sbit T_IO=P2^3;//ds1302-6 sbitT_CLK=P2^4;//ds1302-7//显示缓冲区uchar lcd1602_one="2011-05-08 6MT1";a uchar lcd1602_two="11:08:23 30^C";//运行状态标志位uchar status=0;//0:正常运行1:年调节2:月调节3:日调节4:周调节//5:时调节6:分调节7:秒调节8:闹钟设置是否开启9:闹钟时设置//10:闹钟分设置11:logo第一位设置12:logo第二位设置13:logo第三位设置//20:保存设置21:闹钟模式//按键定义sbit MODE=P3^2;sbit UP=P3^3;sbit DOWN=P3^4;//每月天数定义用于日期调整code uchar days={31,28,31,30,31,30,31,31,30,31,30,31};//按键按下时当前秒数用于长时间没有设置操作时时钟进入正常走时状态uchar key_click_sec,now_sec;//闹钟设置显示缓冲区uchar alarm_on="OFF";uchar alarm_time="07:10";//闹钟设置缓冲区code uchar alarm_set_one="Alarm:";code uchar alarm_set_two="Logo:";//闹钟显示缓冲区code uchar alarm_one="*?:?*";code uchar alarm_two="*Alarm*";//闹钟用变量定义sbit BEEP=P1^4;code uint cyc={1800,1600,1440,1351,1200,1079,960};//音阶1-7的半周期数code uchartone={13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13,13,15,16,16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13, 12,13,12,11,12,6,5,6,0xff};//乐曲《康定情歌》的简谱表code uchartime={8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4,4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32};//节拍表uchar H0,L0,cnt;/*延时函数*/void delay(uint ms){uint i,j;for(j=0;j ms;j++)for(i=0;i 120;i++);}//*LCD1602相关函数*/*LCD1602写命令函数*/void write_command(uchar command) {rs=0;P0=command;lcdcs=1;lcdcs=0;}/*LCD1602写数据函数*/void write_data(uchar data0){rs=1;P0=data0;lcdcs=1;lcdcs=0;}/*初始化LCD1602函数*/void init_1602()rd=0;delay(15);write_command(0x38);delay(5);write_command(0x0c);delay(5);write_command(0x06);delay(5);}/*LCD1602时钟显示函数*/void display_1602(){uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j sizeof(lcd1602_one)-1;j++) {write_data(lcd1602_one[j]);}write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(lcd1602_two)-1;j++) {write_data(lcd1602_two[j]);delay(5);}}/*LCD1602闹钟设置显示函数*/void display_1602_alarm_set(){uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_set_one)-1;j++) {write_data(alarm_set_one[j]);}for(j=0;j sizeof(alarm_on)-1;j++){write_data(alarm_on[j]);delay(5);}write_data('');delay(5);for(j=0;j sizeof(alarm_time)-1;j++) {write_data(alarm_time[j]);delay(5);}write_data('');delay(5);write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_set_two)-1;j++){write_data(alarm_set_two[j]);delay(5);}write_data(lcd1602_one[13]);delay(5);write_data(lcd1602_one[14]);delay(5);write_data(lcd1602_one[15]);delay(5);for(j=0;j 7;j++){write_data('');delay(5);}}/*LCD1602闹钟显示函数*/void display_1602_alarm() {uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j 5;j++){write_data(alarm_one[j]);delay(5);}for(j=0;j sizeof(alarm_time)-1;j++) {write_data(alarm_time[j]);delay(5);}for(j=10;j sizeof(alarm_one)-1;j++) {write_data(alarm_one[j]);delay(5);}write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_two)-1;j++) {write_data(alarm_two[j]);delay(5);}}//*DS18B20相关函数*//*/*初始化DS18B20子程序*/void set_ds18b20(){while(1){uchar dela,flag;flag=0;TMDAT=1;dela=1;while(--dela);TMDAT=0;//数据线置低电平dela=250;while(--dela);//低电平保持500us TMDAT=1;//数据线置高电平dela=30;while(--dela);//高电平保持60us while(TMDAT==0)//判断DS18B20是否发出低电平信号{dela=210;//DS18B20响应,延时420us while(--dela);if(TMDAT)//DS18B20发出高电平初始化成功,返回{flag=1;//DS18B20初始化成功标志break;}}if(flag)//初始化成功,再延时480us,时序要求{dela=240;while(--dela);break;}}}/*读DS18B20子程序*/void read_ds18b20(){uchar dela,i,j,k,temp,temph,templ;j=3;//读2位字节数据do{for(i=8;i 0;i--)//一个字节分8位读取{temp=1;//读取1位右移1位TMDAT=0;//数据线置低电平dela=1;while(--dela);TMDAT=1;//数据线置高电平dela=4;while(--dela);//延时8us if(TMDAT)//读取1位数据temp|=0x80;dela=25;//读取1位数据后延时50us while(--dela);}if(j==3)templ=temp;//读取的第一字节存templ if(j==2)temph=temp;//读取的第二字节存temph if(j==1)tempth=temp;//读取的第3字节存tempth TH的值}while(--j);f=0;if((temph&0xf8)!=0x00)//若温度为负的处理,对二进制补码的处理{f=1;//为负温度f置1 temph=~temph;templ=~templ;k=templ+1;templ=k;if(k 255){temph++;}}tempdf=templ&0x0f;//将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf c=(tempdf*625);tempdf=c;templ=4;temph=4;tempint=temph|templ;//两字节合并为一个字节}/*写DS18B20子程序*/void write_ds18b20(uchar command){uchar dela,i;for(i=8;i 0;i--)//将一字节数据一位一位写入{TMDAT=0;//数据线置低电平dela=6;//延时12us while(--dela);TMDAT=command&0x01;//将数据放置在数据线上dela=25;//延时50us while(--dela);command=command 1;//准备发送下一位数据TMDAT=1;//发送完一位数据,数据线置高电平}}/*DS18B20获得温度更新显示缓冲区*/void get_temperature(){set_ds18b20();//初始化DS18B20 write_ds18b20(0xcc);//发跳过ROM 匹配命令write_ds18b20(0x44);//发温度转换命令delay(5);set_ds18b20();write_ds18b20(0xcc);//发跳过ROM匹配命令write_ds18b20(0xbe);//发出读温度命令read_ds18b20();//将读出的温度数据保存到tempint和tempdf处lcd1602_two[12]=0x30+tempint%10;lcd1602_two[11]=0x30+tempint%100/10;}//*DS1302相关函数*//*/*DS1302:写入操作(上升沿)*/void write_byte(uchar da){uchar i;ACC=da;for(i=8;i 0;i--){T_IO=ACC0;T_CLK=0;T_CLK=1;ACC=ACC 1;}}/*DS1302:读取操作(下降沿)*/ uchar read_byte(void){uchar i;for(i=0;i 8;i++){ACC=ACC 1;T_CLK=1;T_CLK=0;ACC7=T_IO;}return(ACC);}/*DS1302:写入数据(先送地址,再写数据)*/ void write_1302(uchar addr,uchar da) {T_RST=0;//停止工作T_CLK=0;T_RST=1;//重新工作write_byte(addr);//写入地址write_byte(da);T_RST=0;T_CLK=1;}/*DS1302:读取数据(先送地址,再读数据)*/ uchar read_1302(uchar addr){uchar temp;T_RST=0;//停止工作T_CLK=0;T_RST=1;//重新工作write_byte(addr);//写入地址temp=read_byte();T_RST=0;T_CLK=1;//停止工作return(temp);}/*DS1302:获取当前温度更新显示缓冲区*/ void get_1302time(){miao=read_1302(0x81);fen=read_1302(0x83);shi=read_1302(0x85);ri=read_1302(0x87);yue=read_1302(0x89);nian=read_1302(0x8d);zhou=read_1302(0x8b);lcd1602_two[8]=0x30+miao%16;lcd1602_two[7]=0x30+miao/16;lcd1602_two[5]=0x30+fen%16;lcd1602_two[4]=0x30+fen/16;lcd1602_two[2]=0x30+shi%16;lcd1602_two[1]=0x30+shi/16;lcd1602_one[9]=0x30+ri%16;lcd1602_one[8]=0x30+ri/16;lcd1602_one[6]=0x30+yue%16;lcd1602_one[5]=0x30+yue/16;lcd1602_one[3]=0x30+nian%16;lcd1602_one[2]=0x30+nian/16;lcd1602_one[11]=0x30+zhou%16;}//*中断处理函数*//*/*定时器0中断用于产生音阶方波*/ void cntint0(void)interrupt 1 {TH0=H0;TL0=L0;BEEP=~BEEP;//BEEP是音乐信号输出脚,BEEP反相,产生方波}/*定时器1中断用于产生节拍延时*/void cntint1(void)interrupt 3{cnt++;//计数初值为0,所以不用赋值}//*按键处理函数*//*/*按键扫描用于设置时间*/void time_set_key_scan(){//年设置if(status==1){write_command(0x80+0x03);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[3]++;if(lcd1602_one[3]'9') {lcd1602_one[3]='0';lcd1602_one[2]++;if(lcd1602_one[2]'9') {lcd1602_one[2]='0';}}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[3]--;if(lcd1602_one[3]'0'){lcd1602_one[3]='9';lcd1602_one[2]--;if(lcd1602_one[2]'0'){lcd1602_one[2]='9';}}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//月设置else if(status==2){write_command(0x80+0x06);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[6]++;if(lcd1602_one[6]'9'&&lcd1602_one[5]=='0') {lcd1602_one[6]='0';lcd1602_one[5]++;}if(lcd1602_one[6]'2'&&lcd1602_one[5]=='1') {lcd1602_one[6]='1';lcd1602_one[5]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[6]--;if(lcd1602_one[6]'0'&&lcd1602_one[5]=='1'){lcd1602_one[6]='9';lcd1602_one[5]--;}if(lcd1602_one[6]'1'&&lcd1602_one[5]=='0'){lcd1602_one[6]='2';lcd1602_one[5]='1';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//日设置else if(status==3){uchar nowMonthDays=days[(lcd1602_one[5]-0x30)*10+(lcd1602_one[6]-0x30)-1];write_command(0x80+0x09);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[9]++;if(lcd1602_one[9]'9'){lcd1602_one[9]='0';lcd1602_one[8]++;if(lcd1602_one[8]'9'){lcd1602_one[8]='0';}}if((lcd1602_one[8]-0x30)*10+(lcd1602_one[9]-0x30)nowMonthDays) {lcd1602_one[9]='1';lcd1602_one[8]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[9]--;if(lcd1602_one[9]'0'){lcd1602_one[9]='9';lcd1602_one[8]--;if(lcd1602_one[8]'0'){lcd1602_one[8]='9';}}if((lcd1602_one[8]-0x30)*10+(lcd1602_one[9]-0x30)1) {lcd1602_one[9]=nowMonthDays%10+0x30;lcd1602_one[8]=nowMonthDays/10+0x30;;}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//周设置else if(status==4){write_command(0x80+0x0b);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[11]++;if(lcd1602_one[11]'7'){lcd1602_one[11]='1';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[11]--;if(lcd1602_one[11]'1'){lcd1602_one[11]='7';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//时设置else if(status==5){write_command(0x80+0x40+0x02);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[2]++;if(lcd1602_two[2]'9'){lcd1602_two[2]='0';lcd1602_two[1]++;if(lcd1602_two[1]'9'){lcd1602_two[1]='0';}}if((lcd1602_two[1]-0x30)*10+(lcd1602_two[2]-0x30)23) {lcd1602_two[2]='0';lcd1602_two[1]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[2]--;if(lcd1602_two[1]!='0'&&lcd1602_two[2]'0') {lcd1602_two[2]='9';lcd1602_two[1]--;if(lcd1602_two[1]'0'){lcd1602_two[1]='9';}}if(lcd1602_two[1]=='0'&&lcd1602_two[2]'0'){lcd1602_two[2]='3';lcd1602_two[1]='2';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//分设置else if(status==6){write_command(0x80+0x40+0x05);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[5]++;if(lcd1602_two[5]'9'){lcd1602_two[5]='0';lcd1602_two[4]++;if(lcd1602_two[4]'9'){lcd1602_two[4]='0';}}if((lcd1602_two[4]-0x30)*10+(lcd1602_two[5]-0x30)59) {lcd1602_two[5]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[5]--;if(lcd1602_two[4]!='0'&&lcd1602_two[5]'0'){lcd1602_two[5]='9';if(lcd1602_two[4]'0'){lcd1602_two[4]='9';}}if(lcd1602_two[4]=='0'&&lcd1602_two[5]'0'){lcd1602_two[5]='9';lcd1602_two[4]='5';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//秒设置else if(status==7){write_command(0x80+0x40+0x08);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[8]++;if(lcd1602_two[8]'9'){lcd1602_two[8]='0';lcd1602_two[7]++;if(lcd1602_two[7]'9'){lcd1602_two[7]='0';}}if((lcd1602_two[7]-0x30)*10+(lcd1602_two[8]-0x30)59) {lcd1602_two[8]='0';lcd1602_two[7]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[8]--;if(lcd1602_two[7]!='0'&&lcd1602_two[8]'0') {lcd1602_two[8]='9';lcd1602_two[7]--;if(lcd1602_two[7]'0'){lcd1602_two[7]='9';}}if(lcd1602_two[7]=='0'&&lcd1602_two[8]'0') {lcd1602_two[8]='9';lcd1602_two[7]='5';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}}/*按键扫描用于设置闹钟*/void alarm_key_scan(){//闹钟设置模式if(status==8){write_command(0x80+0x08);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){if(alarm_on[2]=='N')//闹钟开{alarm_on[0]='O';alarm_on[1]='F';alarm_on[2]='F';}else{alarm_on[0]='';alarm_on[1]='O';alarm_on[2]='N';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){if(alarm_on[2]=='N')//闹钟开{alarm_on[0]='O';alarm_on[1]='F';alarm_on[2]='F';}else{alarm_on[0]='';alarm_on[1]='O';alarm_on[2]='N';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//闹钟时设置else if(status==9){write_command(0x80+0x0b);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){alarm_time[1]++;if(alarm_time[1]'9'){alarm_time[1]='0';alarm_time[0]++;if(alarm_time[0]'9'){alarm_time[0]='0';}}if((alarm_time[0]-0x30)*10+(alarm_time[1]-0x30)23) {alarm_time[1]='0';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){alarm_time[1]--;if(alarm_time[0]!='0'&&alarm_time[1]'0'){alarm_time[1]='9';if(alarm_time[0]'0'){alarm_time[0]='9';}}if(alarm_time[0]=='0'&&alarm_time[1]'0'){alarm_time[1]='3';alarm_time[0]='2';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机数码管的电子钟(郭天祥系列单片机)功能说明(D本电子钟可以显示当前时刻、年月日和闹钟时刻。

不同时间的显示可以用key4来切换。

(2)、独立键盘key—key4(左到右)调节不同功能,7段数码管显示。

(3)整点提示功能:当时间为整点时,蜂鸣器会滴滴滴响,响20秒;(4)闹铃功能:本程序有闹铃功能,当定时时间到时,闹铃会滴滴滴报警,报警30秒;(5)附加功能:当在闹铃和整点时,8个发光二极管会闪亮;(6)时、分、秒之间和年、月、日之间也是用分割。

2、键盘控制(1)key1-键移动调整单位,每按一次移动一个单位,可调整时分秒、年月日和闹钟时间。

比如:在显示时分秒时,按下keyl 键, 可通过key2和key3对'秒'加减;再按一下keyl,可对"分'加减;再按一下keyl,可对"时'加减;再按keyl,时间开始走动(2)key2-加 1 ; key3-减 1;(3)key4-键切换时分秒、年月日和闹铃时间的显示。

比如:当前为时分秒,按一下key4,则显示年月;再按一下,则显示闹铃时间;再按一下,则显示时分秒时间。

附录:C语言程序〃设计项目:带闹铃的电子钟//功能:keyV键:开始/调时分秒/调年月日/调定时// key2 ■键:加 1// key3-键:减 1// key4-键:切换页面#in clude<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;sbit wela=P2A7;sbit key1=P3A4;sbit key2=P3A5;sbit key3=P3A6;sbit key4=P3A7;sbit bear=P2A3;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar sed ,hour1 ,year1 ,mon1 ,day1,tempi ,temp2,sec2,min2,hour2; void keyscan();void display(uchar hour,uchar min,uchar sec);void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}void init(){TMOD=0X02;TH0=6;TL0=6;EA=1;ET0=1;TR0=1;hour1=00;mini =00;sed =00;year1=12;mon1=03;day1=10;void display(uchar hour,uchar min,uchar sec) { uchar s1 ,s2,m15m2,h1 ,h2;s2=sec/10;s1=sec%10;m2=min/10;m1=min%10;h2=hour/10;h1=hour%10;dula=1;P0=table[h2];dula=0;P0=0XFF;wela=1;P0=0XFE;delay(1);dula=1;P0=table[h1]+0x80;dula=0;P0=0XFF;wela=1;P0=0XFd;delay(1);dula=1;P0=table[m2];dula=0;P0=0XFF;wela=1;P0=0XFb;delay(1);dula=1;P0=table[m1]+0x80;dula=0;P0=0XFF;wela=1;P0=0XF7;delay(1);dula=1;P0=table[s2];dula=0;PO=OXFf;wela=1;P0=0Xef;delay(1);dula=1; PO=table[s1J; dula=0; P0=0XFF; wela=1; PO=OXdf; delay(1);}void keyscan()if(key1 ==0)delay(10); if(key1 ==0)//TR0=0; tempi++; if(temp1 ==4){tempi=;TR0=1;while(!key1)switch(temp2){case 0:display(hour1,sec1 );break; case1:display(year1 ,mon1 ,day1 );break; case2:display(hour2,min2,sec2);break;if(key2==0){delay(10); if(key2==0){ if(temp2==0) { TR0=0;switch(templ){case 1:sed ++;if(sec1 ==60)sec1 =O;break;case 2:min1 ++;if(min1 ==60)min1 =O;break;case 3:hour1 ++;if(hour1 ==24)hour1 =O;break;while(!key2) display(hour1 ,min1 ,sec1);if(temp2==1) { TR0=1;switch(templ)case 1:day1 ++;if(day1==31 )day1=1 ;break; case 2:mon1 ++;if(mon1==13)mon1 =1 ;break;case 3:year1 ++;if(year1 ==100)year1 =0;break; } while(!key2)display(year1 ,mon1 ,day1);if(temp2==2) { TR0=1;switch(templ)case 1:sec2++;if(sec2==60)sec2=0;break;case 2:min2++;if(min2==60)min2=0;break;case 3:hour2++;if(hour2==24)hour2=0;break; }while(!key2)display(hour2,min2,sec2);if(key3==0){delay(10); if(key3==0){if(temp2==0){ TR0=0;switch(templ){case 1:if(sec1 ==0)sec1 =60;sec1 ~;break;case 2:if(min1 ==0)min1 =60;min1 -;break;case 3:if(hour1 ==0)hour1 =24;hour1 -;break; } while(!key3)display(hour1 ,min1 ,sec1);if(temp2==1){ TR0=1;switch(templ){case 1:if(day1==1 )day1=31 ;day1-;break;case 2:if(mon1==1 )mon1 =13;mon1 ・-;break;case 3:if(year1 ==0)year1 =100;year1 -;break; } while(!key3) display(year1 ,mon1,day1);}if(temp2==2){ TR0=1;switch(templ){case 1:if(sec2==0)sec2=60;sec2-;break;case 2:if(min2==0)min2=60;min2-;break;case 3:if(hour2==0)hour2=24;hour2-;break; } while(!key3)display(hour2,mi n2,sec2);if(key4==0)delay(10); if(key4==O)tempi =0;temp2++; if(temp2==3)temp2=0;while(!key4) switch(temp2){case 0:display(hour1 ,min1 ,sec1);break; case1:display(year1 ,mon1 ,day1 );break;case 2:display(hour2,min2,sec2);break;switch(temp2){case 0:display(hour1 ,min1 ,sec1 );break;case 1:display(year1 ,mon1 ,day1 );break; case2:display(hour2,min2,sec2);break;void alarm(){uint i;if((hour1==hour2&&min1==min2&&(sec1 >=sec2&&sec1 <sec2+30))||(min1==0 &&sec"l <20)) { for(i=0;i<20;i++){bear=~bear;P1=~P1;switch(temp2){case 0:display(hour1,mi,sec1 );break;case 1:display(year1 ,mon1 ,day1);break;case 2:display(hour2,min2,sec2);break;}delay(30);}bear=1;P1=Oxff;void main(){init();while(1){keyscan();{if (key 1 ==0 || key2==0 || key3==0 || key4==O )Bear=0}alarm();void time1()interrupt 1{uint m;m++;if(m==3686){m=0;sec1++;if(sec1 ==60){sec1=0;min1++;if(min1==60){min1=0; hour1++; if(hour1==24)hour1=0;day1++; if(day1==31) {day1=1;mon 1++;if(mon1==13){mon1 =1; year1++; if(year1==100) year1=0;。

相关文档
最新文档