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

合集下载

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

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

数字钟、万年历制作(基于单片机)电路原理图:程序://********************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中断函数【完】。

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

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

基于单片机数码管的电子钟(郭天祥系列单片机)功能说明(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;。

2019年基于单片机的LED数码管数字电子钟智能仪表课程设计.doc

2019年基于单片机的LED数码管数字电子钟智能仪表课程设计.doc

内蒙古科技大学智能仪表综合训练设计说明书题目:基于单片机的LED数字电子钟学生姓名:蒙龙华学号:1067112303专业:测控技术与仪器班级:2010-3班指导教师:肖俊生摘要数字电子钟是采用电子电路实现对年、月、日、时、分、秒数字显示的计时装置,由于数字集成电路的发展和石英晶体震荡器的广泛应用,使得数字电子钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,成为人们日常生活中不可缺少的必需品。

本次课程设计的是基于AT89C52单片机和实时时钟芯片DS1302在数码管上进行时钟显示,并能通过按键对其进行调时和校准,并且可以设置闹钟,且具有秒表功能。

通过按键可以切换时钟和秒表功能,同时可以对闹钟进行设置。

采用AT89C52单片机和DS1302实时时钟芯片,使用5V电源供电。

DS1302是一种高性能、低功耗、带RAM 的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出的时间数据送到数码管上显示。

程序运行时,数码管将从当前时间开始显示,通过调节按键可以分别对小时和分钟进行调整,调整后,时钟以新的时间为起点继续刷新显示。

这种实现方法的优点是电路简单,性能可靠,实时性好,时间和日期精度高,操作简单,编程容易。

关键词:AT89C52单片机;DS1302;LED数码管;闹钟;秒表目录目录 ............................................................... - 1 - 第1章前言 ........................................................ - 2 -1.1课题研究的现实性意义........................................ - 2 -1.2国内外研究现状.............................................. - 2 -1.3课题基本概况................................................ - 3 - 第2章总体方案设计 ................................................ - 4 -2.1方案原理.................................................... - 4 -2.2 硬件选择.................................................... - 4 -2.2.1 DS1302简介 ........................................... - 4 -2.2.2单片机 ................................................ - 5 -2.2.3显示方案 .............................................. - 6 - 第3章硬件设计 .................................................... - 8 -3.1显示模块.................................................... - 9 -3.2独立按键模块................................................ - 9 -3.3实时时钟芯片DS1302 ......................................... - 10 - 第4章软件设计 ................................................... - 11 -4.1 程序流程图................................................. - 11 -4.2 按键子程序................................................. - 12 -4.3 功能键按键程序流程图....................................... - 12 -4.4 时间调整程序............................................... - 13 - 第5章总结 ....................................................... - 14 - 附录A:硬件原理图................................................. - 15 - 附录B:C语言源程序 ............................................... - 16 - 参考文献 .......................................................... - 23 -第1章前言1.1课题研究的现实性意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

基于单片机的多时刻闹铃数字钟的实现

基于单片机的多时刻闹铃数字钟的实现

基于单片机的多时刻闹铃数字钟的实现
鲁杰爽
【期刊名称】《商丘职业技术学院学报》
【年(卷),期】2011(010)002
【摘要】常见数字钟只有一次时刻闹铃的设定,无法满足多时刻闹铃的需求.我们研究设计了一种新型的基于单片机的多时刻闹铃数字钟.该设计电路结构简单,具有走时显示、时间校时、整点报时、多时刻闹铃设定等功能,具有很好的单片机实训教学效果和实际应用价值.
【总页数】4页(P56-58,77)
【作者】鲁杰爽
【作者单位】湖北职业技术学院机电工程学院,湖北孝感432000
【正文语种】中文
【中图分类】TM933
【相关文献】
1.基于8051单片机的数字钟的设计与实现 [J], 公相
2.基于AT89S51单片机的数字钟设计与实现 [J], 祝良;郭臣鹏;苏宏锋
3.基于单片机的智能数字钟的设计与实现 [J], 严敏
4.基于AT89S51单片机的数字钟设计与实现 [J], 祝良;郭臣鹏;苏宏锋
5.基于AT89S52单片机数字钟的实现 [J], 张芳
因版权原因,仅展示原文概要,查看原文内容请购买。

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.确定需求:首先确定电子时钟的功能和要求,包括时间显示、闹钟功能、调节功能等。

根据需求确定显示部分所需的数码管数量和接口方式。

2.选择单片机:根据需求选择一款适合的单片机,考虑其处理能力、接口数量和扩展性等因素。

3.设计时钟源:选择合适的晶振作为时钟源,并将时钟信号输入到单片机的计时部分,生成一个恒定频率的脉冲信号。

4.编程设计:根据单片机类型选择相应的开发工具,编写程序实现时钟的计数、显示和控制功能。

其中,需要实现时钟的秒、分、时等单位的计数和显示、时钟调节和设置等功能。

5.数码管接口设计:根据数码管的数量和接口方式,进行接口设计。

常用的接口方式有共阳和共阴两种方式。

通过连接适当的电阻和引脚控制,实现对数码管进行数字显示。

6.硬件设计:根据实际需求和电路原理进行电路设计,包括电源电路、晶振电路和数码管显示电路。

注意电源的稳定性以及数码管的驱动电流和电压等参数。

7.调试和测试:完成硬件设计后,进行电子时钟的调试和测试工作。

通过对时钟进行时间设置和调整,验证时钟的计时和显示功能是否正常。

8.最终优化:对电子时钟的功能和性能进行评估,并进行必要的优化。

可以考虑添加闹钟功能、温度显示等扩展功能。

三、实现方法电子时钟的实现方法主要有两种,一种是基于单片机开发板实现,另一种是自己设计和制作。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

①画出程序流程图。

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

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

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

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

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

基于单片机数码管电子闹钟仿真设计

基于单片机数码管电子闹钟仿真设计

基于单⽚机数码管电⼦闹钟仿真设计#include <regx51.h>#include <intrins.h>sfr AUXR = 0x8e;/*数码管显⽰字符转换表*/unsigned char tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x39};signed char num[] = {10,10,10,10,10,10,10,10}; //数码管显⽰缓冲区signed char timeclock[] = {0,0,11,0,0,11,0,0}; //闹钟时间unsigned char TRH0,TRL0; //T0重载值的⾼字节和低字节bit clock = 0; //闹钟时间到标志位bit flag = 0; //1s闪烁标志位bit flag200ms = 0; //200ms定时标志位bit timesetup = 0; //时间设置标志位bit clocksetup = 0; //闹钟设置标志位unsigned position = 0; //设置⼩时,分钟,秒标志位(‘1’⼩时,‘2’分钟,‘3’秒)unsigned char Temp; //温度值unsigned char Time[5]; //时间值void key(); //按键判断执⾏函数void Ds1302_Display(); //时间显⽰函数void Ds18b20_Display(); //温度显⽰函数extern void Ds1302_Init(); //DS1302初始化函数void Ds1302_Time(unsigned char *time); //带参数的向DS18B20写时间extern void Write_Ds1302_Byte(unsigned char temp); //向DS1302写⼊数据extern unsigned char Read_Ds1302 (unsigned char address); //从DS1302读取数据extern unsigned char DS18B20_Temp(); //读取DS18B20温度值。

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

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

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

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

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

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

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

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

附录:C语言程序//设计项目:带闹铃的电子钟//功能: key1-键:开始/调时分秒/调年月日/调定时// key2-键:加1// key3-键:减1// key4-键:切换页面#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;sbit bear=P2^3;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar sec1,min1,hour1,year1,mon1,day1,temp1,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;min1=00;sec1=00;year1=12;mon1=03;day1=10;}void display(uchar hour,uchar min,uchar sec) {uchar s1,s2,m1,m2,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;P0=0XFf;wela=1;P0=0Xef;delay(1);dula=1;P0=table[s1];dula=0;P0=0XFF;wela=1;P0=0Xdf;delay(1);}void keyscan(){if(key1==0){delay(10);if(key1==0){//TR0=0;temp1++;if(temp1==4){temp1=0;TR0=1;}while(!key1)switch(temp2){case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;}}}if(key2==0){delay(10);if(key2==0){if(temp2==0){ TR0=0;switch(temp1){case 1:sec1++;if(sec1==60)sec1=0;break;case 2:min1++;if(min1==60)min1=0;break;case 3:hour1++;if(hour1==24)hour1=0;break;}while(!key2)display(hour1,min1,sec1);}if(temp2==1){ TR0=1;switch(temp1){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(temp1){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(temp1){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(temp1){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(temp1){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,min2,sec2);}}}if(key4==0){delay(10);if(key4==0){temp1=0;temp2++;if(temp2==3)temp2=0;while(!key4)switch(temp2){case 0:display(hour1,min1,sec1);break;case 1: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;case 2:display(hour2,min2,sec2);break;}}void alarm(){uint i;if((hour1==hour2&&min1==min2&&(sec1>=sec2&&sec1<sec2+30))||(min1==0 &&sec1<20)){ for(i=0;i<20;i++){bear=~bear;P1=~P1;switch(temp2){case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;}delay(30);}bear=1;P1=0xff;}}void main(){init();while(1){keyscan();{if(key1==0 || key2==0 || key3==0 || key4==0 ) 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;mon1++;if(mon1==13){mon1=1;year1++;if(year1==100)year1=0;}}}}}} }。

相关文档
最新文档