基于郭天祥单片机数码管的电子钟(含闹钟、整点报时)
单片机制作数字钟(含万年历、秒表功能)
数字钟、万年历制作(基于单片机)电路原理图:程序://********************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 语言电子钟(已加入调时、闹铃、整点报时功能)#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单片机电子显示时钟带闹钟、整点报时、日期、星期#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仿真
多功能数字时钟设计要求
利用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);}}。
【单片机】c51数字时钟(带年月日显示)
【单片机】c51数字时钟(带年月日显示)显示当前时间:9点58分34秒(第一个零表示闹钟未开启)当前日期:10年4月六日摘要:本设计以单片机为核心,LED数码管动态扫描显示。
采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能说明系统的功能选择由7个按键完成。
其中P3.0,P3.1分别对应调整当前时间的时和分,P3.2为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)P3.3用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按P3.0,P3.1可进行闹钟时分的设定,此时,led1灯灭。
闹铃时间到切闹钟开关开启时,闹铃响一分钟。
P3.5\P3.6\P3.7对年月日进行调整(第一次按P3.5,就进入了年月日的显示,现在就可对日期进行调整)。
按P3.1回到当前时间的显示状态。
整点到时:报警对应小时的次数。
程序如下:#include<reg51.h>#include<intrins.h>#include<stdio.h>#define uchar unsigned char#define uint unsigned intuchar data keyvalue; //查到的键值uchar data keys; //转换出的数字uchar dis[8];uchar codeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x 39,0xf7};// 0 1 2 3 45 6 7 8 9 - 灭灯 c nsbit led_duan=P2^6; //段选通sbit led_wei=P2^7; //位选通sbit speaker=P2^3; //蜂鸣器sbit minitek=P3^0; //分校正按键sbit hourk=P3^1; //小时校正按键sbit p3_4=P3^4; //sbit yeark=P3^5; //年sbit monthk=P3^6; //月sbit dayk=P3^7; //日uchar data wei,i;bit leap_year; //闰年标志位bit dis_nyr;bit cal_year=1;bit calculate=1; //显示年月日与当前时间切换标志uchar data c_min; //闹钟‘分寄存单元uchar data c_hou; //闹钟、小时寄存单元uchar data second; //秒uchar data minite; //分变量uchar data hour; //小时变量uchar data year,month,day; //定义年月日变量uchar data CNTA;uchar data speaker_num; //蜂鸣次数bit beep; //整点报时标志bit run; //运行标志bit flash; //灭灯标志bit clarm_switch; //闹钟开关标志bit baoshi; //报时开关标志sbit led1=P1^6; // 按键标识指示灯sbit led2=P1^7; // 运行标志指示灯sbit P3_2=P3^2;sbit P3_3=P3^3;uint n,k;/*10微秒级延时*/void delay_10us(uchar n){ do{ _nop_();_nop_();_nop_();_nop_();_nop_();}while(--n);}/***毫秒级延时 ***/void delay_ms(uint n){ do delay_10us(131);while(--n);}/****** 当前时间转换******/clk_to_dis(){dis[0]=second%10;dis[1]=second/10;if(flash)dis[2]=10;else dis[2]=11;dis[3]=minite%10;dis[4]=minite/10;dis[5]=hour%10;dis[6]=hour/10;}/*****定时闹钟显示译码(用于七段码显示)*****/clarm_to_dis(){dis[0]=c_min%10;dis[1]=c_min/10;if(flash)dis[2]=10; //亮灯else dis[2]=11; //灭灯dis[3]=c_hou%10;dis[4]=c_hou/10;dis[5]=10;dis[6]=13;}/***********年月日显示译码************/nyr_to_dis(){dis[0]=day%10;dis[1]=day/10;dis[2]=10; //显示'-'dis[3]=month%10;dis[4]=month/10;dis[5]=10; // '-'dis[6]=year%10;dis[7]=year/10;}/*主函数*/void main(){P2=0xff;P1=0XFF;p3_4=0;run=1;led2=0; //运行指示灯亮led1=1;flash=0x00;dis[2]=10; //第三位显示“-”wei=0x7f; //选通低位i=0;second=21;minite=58;hour=9;CNTA=0x00;year=10;month=4;day=5;clk_to_dis();TMOD=0x11;TH0=15560/256;TL0=15560%256;TH1=0xfc;TL1=0x18;EA=1;PT0=1;EX0=1; //开中断;EX1=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1){while(run==1){ clk_to_dis();if(calculate){if(month==1|month==3|month==5|month==7|month==8|month==10|mont h==12){day++;if(day>31){day=0x01;month++;if(month==13){month=1;year++;cal_year=1;}}led1=0; //指示灯亮}if(month==4|month==6|month==9|month==11){day++;if(day>30){day=0x01;month++;}led1=0; //指示灯亮}if(month==2) { if(leap_year==1){day++;if(day==30)day=1;}else {day++;if(day==29)day=1;}}while(cal_year){if((year+2000)%400==0) leap_year=1; // 被400整除为闰年else if((year+2000)%100==0) leap_year=0; // 不能被400整除能被100整除不是闰年elseif((year+2000)%4==0) leap_year=1; // 不能被400、100整除能被4整除是闰年else leap_year=0;cal_year=0;}calculate=0;led1=1;}while(!minitek){for(n=0;n<1000;n++);if(!minitek==0)break; //延时防抖minite++;second=0x00;led1=0;for(n=0;n<20;n++){speaker=!speaker;delay_10us(50); //蜂鸣器响}if(minite==60)minite=0x00;while(!minitek); //等待键松开led1=1; //显示灯}while(!hourk){for(n=0;n<1000;n++);if(!hourk==0)break;hour++;second=0x00;led1=0;for(n=0;n<30;n++){speaker=!speaker;delay_10us(30); //蜂鸣器响}if(hour==24) hour=0x00;while(!hourk);led1=1;}while(!yeark) //yeark键复用进入年月日调整{for(n=0;n<1000;n++);if(!yeark==0)break;dis_nyr=1;while(!yeark);while(dis_nyr){ nyr_to_dis();while(!yeark){for(n=0;n<1000;n++);if(!yeark==0)break;year++;led1=0;for(n=0;n<30;n++){speaker=!speaker;delay_10us(30); //蜂鸣器响}if((year+2000)%400==0) leap_year=1; // 被400整除为闰年else if((year+2000)%100==0) leap_year=0; // 不能被400整除能被100整除不是闰年elseif((year+2000)%4==0) leap_year=1; // 不能被400、100整除能被4整除是闰年else leap_year=0;while(!yeark);led1=1;}while(!monthk){for(n=0;n<1000;n++);if(!monthk==0)break;month++;if(month==13)month=1;led1=0;for(n=0;n<30;n++){speaker=!speaker;delay_10us(30); //蜂鸣器响}while(!monthk);led1=1;}while(!dayk){for(n=0;n<1000;n++);if(!dayk==0)break;if(month==1|month==3|month==5|month==7|month==8|month== 10|month==12){day++;if(day>31)day=0x01;led1=0; //指示灯亮}if(month==4|month==6|month==9|month==11){day++;if(day>30)day=0x01;led1=0; //指示灯亮}if(month==2) { if(leap_year==1){day++;if(day==30)day=1;}else {day++;if(day==29)day=1;}}led1=0;for(n=0;n<30;n++){speaker=!speaker;delay_10us(30); //蜂鸣器响}while(!dayk);led1=1;}while(!hourk){ for(n=0;n<1000;n++);if(hourk) break;dis_nyr=0;while(!hourk);if(clarm_switch)dis[7]=12; //开启显示 Celse dis[7]=11; //关闭不显示dis[6]=11;clk_to_dis();}}}if(clarm_switch) //闹铃时间到,指示灯闪烁蜂鸣器长响{if(c_min==minite&&c_hou==hour){speaker_num=60;beep=1;while(beep&& clarm_switch){led1=!led1;delay_ms(100);clk_to_dis();}led1=1;beep=0;}}}while(run==0) //闹钟时间设定{ clarm_to_dis();/////////////////////////////////////////////////////////// while(!minitek){for(n=0;n<1000;n++);if(!minitek==0)break; //延时防抖c_min++;led1=0;for(n=0;n<20;n++){speaker=!speaker;delay_10us(50); //蜂鸣器响}if(c_min==60)c_min=0x00;while(!minitek); //等待键松开led1=1; //显示灯}while(!hourk){for(n=0;n<1000;n++);if(!hourk==0)break;c_hou++;led1=0;for(n=0;n<30;n++)speaker=!speaker;delay_10us(30); //蜂鸣器响}if(c_hou==24) c_hou=0x00;while(!hourk);led1=1;}}}}/***************定时器T0中断*****************/timer0() interrupt 1 using 2 //定时器0中断号为1号使用第2组寄存器{TR1=0;TH0=15548/256;TL0=15548%256;CNTA++;if(beep){if(speaker_num%2)speaker=!speaker;if(!speaker_num) beep=0;}if(CNTA==20){ if(speaker_num)speaker_num--; //每秒整点报时次数减一flash=!flash;CNTA=0;second++; //秒加if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour>7){speaker_num=2*hour; //整点到设定报时次数蜂鸣标志置1beep=1;}if(hour==24)hour=0; calculate=1; //0点到,日期标志加一}}}}TR1=1;}/*********定时器中断T1**********/timer1() interrupt 3 using 3{TH1=0xfc;TL1=0x18;P0=0xff;led_wei=1;led_wei=0;P0=seg[dis[i]];led_duan=1;led_duan=0;P0=wei;led_wei=1;led_wei=0;if(++i==8)i=0;wei=_cror_(wei,1);}/**********************外中断0*******************/int_0() interrupt 0{clarm_switch=!clarm_switch; // 闹钟开关if(clarm_switch)dis[7]=12; // 开启显示开启第一位显示C else dis[7]=11; // 关闭不显示for(k=0;k<40;k++){speaker=!speaker;led1=!led1;delay_ms(5);}led1=1;}/********************外中断1********************/int_1() interrupt 2 //闹钟时间设置/运行转换开关{run=!run;if(run)led2=0;else led2=1;for(k=0;k<90;k++){speaker=!speaker; // 蜂鸣器响led1=!led1; // 指示灯闪烁delay_10us(100);}led1=1;}。
基于51单片机设计的带有测温功能的电子时钟
目录一、设计要求二、课程设计的方案、目的及意义三、硬件设计方案四、软件设计方案五、总结六、参考资料一、设计要求用51单片机设计带温度显示的电子时钟,具体要求如下:1、利用DS1302时钟芯片实现时钟功能模块。
2、时钟要求可以调节时间:年、月、日、时、分、秒。
3、利用LCD1602显示。
4、利用DS18B20芯片实现温度功能模块。
5、利用按键完成各项功能。
二、课程设计方案、目的及意义1、总体方案:用STC89C51单片机作为CPU主控制器,DS1302时钟芯片提供准确时钟信号,DS18B20温度传感器采集温度信息,三个按键进行加减调整、功能切换作用,通过LCD1602对外多功能显示。
2、具体方案:CPU控制所有模块,通过循环反复从DS1302中读取时钟信息,传送至LCD1602显示,得到基本时钟功能。
当分为59,秒为56时开始,每隔一秒LED 灯点亮240毫秒,0分0秒时LED灯点亮700毫秒。
从而实现整点光报时。
定时循环从DS18B20中读取温度信息,传送至LCD1602显示,得到基本温度计功能。
当温度高于30度(包括30度)时,点亮红色LED灯,提醒当天为高温天气。
低于0度时,点亮蓝色LED灯,提醒当天为冰冻天气。
键盘使用扫面方式,MENU键控制功能切换,完成时钟和温度间的转换。
OK键控制时间调整与确定,UP、DOWN键调节时间,R、L 键选择调整对象。
进入调整时,暂停DS1302数据读取,并将改变的时间数据写入DS1302,并送LCD1602显示,同时,启动LCD1602光标闪烁,确定调整对象,完成人机对话。
退出调整时,停止写入数据,重新读取DS1302时钟信息。
从而完善时钟功能。
3、目的及意义可作为产品生产,作为居家的时钟显示与温度计。
三、硬件设计方案1、原理图2、PCB图3、各功能模块分析(一)、主控制器:STC单片机89C51功能:程序存储器16K、RAM数字存储器1280、可直接通过串口下载程序,单一+5V电源供电,五个中断源的中断控制系统,片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
基于单片机C语言电子时钟完整版(闹钟,整点报时)
《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。
单片机课程设计 基于数码管的电子钟
摘要AT89S52单片机是一款应用广泛、功能强大的八位单片机。
本设计是由单片机AT89S52作为核心,通过单片机使电子钟具有调节显示时分秒的功能,电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示电子钟直观、无机械传动装置等优点。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能。
本设计在原来电子钟的基础上,增加了年月日显示、闹铃、整点提示等功能。
使用时S8键为控制键,控制运行的调时,S4键为翻页查看键,S5、S6、S7键为调时状态下的控制键,分别为减一、加一、移格功能。
关键词电子钟;单片机;定时;闹铃;ABSTRACTAT89S52 SCM is a eight bit microcontroller of wided applicationan and powerful. Core’s this design is by monolithic AT89S52 SCM . it has adjust display by that electric clock.electric clock is a device that use of digital circuit to display seconds, points and the timer. compare of the tradition, , display electric clock intuitive, no mechanical transmission device etc. its timing cycle be for 24 hour, the full scale is hour of 23,minutes of 59, second of 59, another reset function is also the function. The foundation of clock display year month day and other functions. S8 keys control tone. S4 keys scroll view. On the state of adjust, S5、S6、S7control functions of minus one,plus one, move lattice function.Key words :electronic clock; single-chip; timing;alarm目录。
基于51单片机汇编语言的数字钟课程设计报告(含有闹钟万年历)
单片微型计算机课程设计报告多功能电子数字钟姓名学号班级指导教师许伟敏4电气二班林卫2009-06-25目录一:概述 (1)二:设计基本原理简介 (2)三:设计要求及说明 (3)四:整体设计方案 (4)系统硬件电路设计 4系统软件总流程设计模块划分及分析5 6五:单模块流程设计 (8)各模块设计概述、流程图模块源程序集合及注释8 13六:单模块软件测试 (23)七:系统检测调试 (24)硬件电路调试软件部分烧写调试八:系统优化及拓展 (26)九:心得体会 (28)单片微型计算机课程设计一、概述基于汇编语言的电子数字钟概述课程设计题目:电子数字钟应用知识简介:● 51 单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
作为嵌入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。
51 系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51 系列单片机的发展又进入了一个新的阶段。
在今后很长一段时间内51 系列单片机仍将占据嵌入式系统产品的中低端市场。
●汇编语言汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。
汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。
但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。
汇编语言可以与高级语言配合使用,应用十分广泛。
● ISPISP(In-System Programming)在系统可编程,是当今流行的单片机编程模式,指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件。
已经编程的器件也可以用ISP方式擦除或再编程。
本次课程设计便使用ISP方式,直接将编写好的程序下载到连接好的单片机中进行调试。
选题系统功能分析硬件电路设计整体流程设计及模块划分模块流程设计模块编码测试系统合成调试编译下载调试(含硬件电路调试及软件烧写调试)验收完成总结报告课程设计流程图↑选题目的及设计思想简介:课程设计是一次难得的对所学的知识进行实践的机会,我希望通过课程设计独立设计一个简单的系统从而达到强化课本知识并灵活运用的目的。
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], 张芳
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;。