下载此beplayapp体育下载

基于单片机的电子时钟万年历设计.pdf


beplayapp体育下载分类:通信/电子 | 页数:约24页 举报非法beplayapp体育下载有奖
1 / 24
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该beplayapp体育下载所得收入归上传者、原创者。
  • 3.下载的beplayapp体育下载,不会出现我们的网址水印。
1 / 24 下载此beplayapp体育下载
beplayapp体育下载列表 beplayapp体育下载介绍
该【基于单片机的电子时钟万年历设计 】是由【1781111****】上传分享,beplayapp体育下载一共【24】页,该beplayapp体育下载可以免费在线阅读,需要了解更多关于【基于单片机的电子时钟万年历设计 】的内容,可以使用beplayapp体育下载的站内搜索功能,选择自己适合的beplayapp体育下载,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此beplayapp体育下载到您的设备,方便您编辑和打印。:..一、项目介绍与设计目的基于单片机的电子时钟万年历为实现电子万年历的功能,采用单片机STC89C51,辅助以必要的外围电路,用C语言编写程序,、月、日、周日、时、分、秒等,具有功能稳定,精确度高和可调的特点。二、:不使用芯片,采用单片机的定时计数器这种方法原理是利用单片机芯片的定时器来产生固定的时间,模拟时钟的时,分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期,一天就是3600*24=86400个周期。此方法优点是可以省去一些外围的芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留的场合。方案二:并行接口时钟芯片DS12887特点:采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大。方案三:串行接口时钟芯片DS1302芯片主特性:(1)实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力,还有闰年调整的能力:..(2)318位暂存数据存储RAM(3)串行I/O口方式使得管脚数量最少(4)(5),小于300nA(6)读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8脚DIP封装或可选的8脚SOIC封装根据表面装配(8)简单3线接口(9)=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能显示2:..数字,不能显示中文。方案二:LCD1602能够显示英文和数字。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。所以最终选择LCD1602。-51单片机管脚图图如图3所示:单片机管脚图3:..(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。4:..,1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。,。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,,RST必须保持低电平。中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。5:..;6:..::+是否按下—是否按下Y相应项加一相应项减一7:..,蜂鸣器响,星期加一时固定日到时月加1日清零12月到时年加1月清零液晶显示8:..五、(1)在测试中遇到LCD1602不显示分析:首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。再接着研究程序的时序图是否正确。最后发现是1602的液晶屏坏掉了,更换了新的就可以了。(2)按键调整时,不是按单位递增和递减分析:在键盘程序中,按键一次,向芯片写入一个新的数字,在写入数字后必须有一定延时才再写入另一个数字(3)烧写程序进单片机里面时,:,掌握了硬件的设计与分析的能力,学会看英文版的Datasheet,同时在软件的编程方面得到更到的提高,对编程能力得到加强。对所学的知识得到很大的提高与巩固。最终实现功能:(1)能显示年、月、日、星期、小时、分、秒。(2)显示模块采用LCD液晶显示,能用按键调整时间。(3)能调节液晶显示屏的亮度。9:..;期、时间、实时温度的多功能万年历,该万年历还可以定时闹钟。查看了还有单片机和各个芯片之间的通信协议,液晶的读写时序,按键的防抖。本系统基本完成了设计指标的所有要求,所有的程序分块编写,通过main函数来调用,增加了程序的易修改性和易读性,方便他人的使用和改进。但是由于时间的局限性以及本人能力的有限性,本系统还有许多需要改进和完善的地方。其中主要的问题就是功耗和电源供电的问题,该处采用5V供电,最好采用5V供电。整个电路的功耗太大,没让单片机工作在空闲模式,这都是作品不实用,不能够大批量生产,这都有待改进,希望以后有机会对该系统做进一步的完善。10:..1:#include<>#include<>#defineucharunsignedchar#defineuintunsignedintsbitlcden=P0^7;//LCD使能信号sbitlcdrs=P0^5;//LCD数据/命令选择端sbitlcdrw=P0^6;//LCD读写选择端年显示的固定字符时间显示的固定字符#defineyh0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)ucharmiao,shi,fen,ri,yue,nian,week,n,temp;sbitT_CE=P0^0;//DS1302第五管脚sbitT_IO=P0^1;//DS1302第六管脚sbitT_CLK=P0^2;//DS1302第七管脚/****************校时功能控制按键************************************/sbitkey1=P3^7;//设置键sbitkey2=P3^6;//加键sbitkey3=P3^5;//减键sbitkey4=P3^4;//闹钟设置键sbitspeaker=P1^0;/*******************延时函数ms=500延时500毫秒******************/voiddelay(uintms){uinti,j;for(j=0;j>4);com=((com<<2)&)|((com>>2)&0x33);com=((com<<1)&0xaa)|((com>>1)&0x55);;delay(5);lcden=1;delay(5);lcden=0;}voidwrite_1602data(uchardate)//写数据{lcdrs=1;date=(date<<4)|(date>>4);date=((date<<2)&)|((date>>2)&0x33);date=((date<<1)&0xaa)|((date>>1)&0x55);P2=date;delay(5);lcden=1;delay(5);lcden=0;}/*******************1602初始化******************/voidinit_1602(){uchari;lcdrw=0;(0x38);//设置16x2显示,5x7点阵,8为数据接口(0x0c);//开显示,不显示光标,光标不闪烁(0x06);//写一个字符后地址指针加1,光标加112:..(0x01);//清屏(yh);//日历显示固定符号从第一行第1个位置之后开始显示for(i=0;i<12;i++){write_1602data(tabe1[i]);delay(10);}(er+1);//日历显示固定符号从第一行第2个位置之后开始显示for(i=0;i<8;i++){write_1602data(tabe2[i]);delay(10);}}/******************DS1302:写入字节操作(上升沿)*********************/voidDS1302write_byte(uchardate){uchari,temp;temp=date;for(i=0;i<8;i++){temp=temp>>1;T_IO=CY;T_CLK=0;T_CLK=1;//T_IO=CY;}}/******************DS1302:读取字节操作(下降沿)*****************/ucharDS1302read_byte(void){uchari,temp;for(i=0;i<8;i++){temp>>=1;13:..T_CLK=1;T_CLK=0;if(T_IO==1)temp|=0x80;}return(temp);}/******************DS1302:读取操作*****************/ucharDS1302read(ucharaddress){uchardate;T_CE=0;T_CLK=0;T_CE=1;DS1302write_byte(address);date=DS1302read_byte();T_CLK=1;T_CE=1;return(date);}/******************DS1302:写入操作*********************/voidDS1302write(ucharaddress,uchardate){T_CE=0;//停止工作T_CLK=0;T_CE=1;//重新工作DS1302write_byte(address);DS1302write_byte(date);T_CLK=1;T_CE=0;}ucharBCD_Decimal(ucharbcd)//BCD码转十进制函数,输入BCD,返回十进制{ucharDecimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));14:..//1302芯片初始化子函数15以下的数据可以不用转换,BCD码和十六进制一样voidDS1302_init()//1302芯片初始化子函数(2013-07-24,12:59:00,week3){DS1302write(0x8e,0x00);//允许写,禁止写保护//DS1302write(0x80,0x00);//向DS1302内写秒寄存器80H写入初始秒数据00//DS1302write(0x82,0x59);//向DS1302内写分寄存器82H写入初始分数据59//DS1302write(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12//DS1302write(0x86,0x24);//向DS1302内写日期寄存器86H写入初始日期数据24//DS1302write(0x88,0x07);//向DS1302内写月份寄存器88H写入初始月份数据07//DS1302write(0x8a,0x03);//向DS1302内写周寄存器8aH写入初始周数据3//DS1302write(0x8c,0x13);//向DS1302内写年份寄存器8cH写入初始年份数据13DS1302write(0x8e,0x80);//打开写保护}//时分秒显示子函数voidwrite_sfm(ucharadd,uchardat)//向LCD写时分秒,有显示位置加、现示数据,两个参数{uchargw,sw;gw=dat%10;//取得个位数字sw=dat/10;//取得十位数字(er+add);//er是头文件规定的值0x80+0x40write_1602data(0x30+sw);//数字+30得到该数字的LCD1602显示码write_1602data(0x30+gw);//数字+30得到该数字的LCD1602显示码}//-------------------------------------//年月日显示子函数voidwrite_nyr(ucharadd,uchardat)//向LCD写年月日,有显示位置加数、显示数据,两个参数15:..{uchargw,sw;gw=dat%10;//取得个位数字sw=dat/10;//取得十位数字(yh+add);//设定显示位置为第一个位置+addwrite_1602data(0x30+sw);//数字+30得到该数字的LCD1602显示码write_1602data(0x30+gw);//数字+30得到该数字的LCD1602显示码}//写星期函数voidwrite_week(ucharweek)//写星期函数{(yh+0x0c);//星期字符的显示位置switch(week){case1:write_1602data('M');//星期数为1时,显示write_1602data('O');write_1602data('N');break;case2:write_1602data('T');//星期数据为2时显示write_1602data('U');write_1602data('E');break;case3:write_1602data('W');//星期数据为3时显示write_1602data('E');write_1602data('D');break;case4:write_1602data('T');//星期数据为4是显示write_1602data('H');write_1602data('U');break;case5:write_1602data('F');//星期数据为5时显示write_1602data('R');write_1602data('I');16:..break;case6:write_1602data('S');//星期数据为6时显示write_1602data('T');write_1602data('A');break;case7:write_1602data('S');//星期数据为7时显示write_1602data('U');write_1602data('N');break;}}//****************键盘扫描有关函数**********************voidkeyscan(){uchartemp;if(key1==0)//---------------key1为功能键(设置键)--------------------{delay(9);//延时,用于消抖动if(key1==0)//延时后再次确认按键按下{spk();n++;while(!key1);switch(n){case1:(yh+2);//按动1次,nian(0x0f);//按键按动一次,秒位置显示光标17:..break;case2:(yh+5);//按动2次,yuebreak;case3:(yh+8);//按动3次,ribreak;case4:(yh+12);//按动4次,weekbreak;case5:(er+1);//按动5次,shibreak;case6:(er+4);//按6次fen位置显示光标break;case7:(er+7);//设置按键按动一次,秒位置显示光标break;case8:(0x0c);//按动到第8次,设置光标不闪烁DS1302write(0x8e,0x00);//允许写,禁止写保护temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x80,temp);//向DS1302内写秒寄存器80H写入初始秒数据00temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x82,temp);//向DS1302内写分寄存器82H写入初始分数据59temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x84,temp);//向DS1302内写小时寄存器84H写入初始小时数据12temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x86,temp);//向DS1302内写日期寄存器86H写入初始日期数据24temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x88,temp);//向DS1302内写月份寄存器88H写入初始月份数据07temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x8c,temp);//向DS1302内写年份寄存器8cH写入初始年份数据13temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码DS1302write(0x8a,temp);//向DS1302内写周寄存器8aH写入初始周数据3DS1302write(0x8e,0x80);//允许写,禁止写保护n=0;break;}18:..}}//------------------------------加键key2----------------------------if(n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零){if(key2==0)//上调键{delay(10);if(key2==0){spk();while(!key2);//判释放switch(n){case1:nian++;//设置键按动1次,调if(nian==100)nian=0;//秒超过59,再加1,就归零write_nyr(2,nian);//年,从第二行第3个字符后开始显示(yh+2);break;case2:yue++;if(yue==13)yue=1;write_nyr(5,yue);//月,从第一行第6个字符后开始显示(yh+5);//月份,从第一行第6个字符后开始显示break;case3:ri++;if(ri==32)ri=1;write_nyr(8,ri);//日,从第一行第9个字符后开始显示(yh+8);break;case4:week++;if(week==8)week=1;(yh+0x0C);//指定'加'后的周数据显示位置write_week(week);//指定周数据显示内容break;19:..case5:shi++;if(shi==24)shi=0;write_sfm(1,shi);//小时,从第二行第2个字符后开始显示(er+1);//按动5次,shibreak;case6:fen++;if(fen==60)fen=0;write_sfm(4,fen);//分,从第二行第5个字符后开始显示(er+4);//按6次fen位置显示光标break;case7:miao++;if(miao==60)miao=0;write_sfm(7,miao);//秒,从第一行第8个字符后开始显示(er+7);//设置按键按动8次,秒位置显示光标break;}}}//------------------减键key3,各句功能参照'加键'注释---------------if(key3==0){delay(10);//调延时,消抖动if(key3==0){spk();while(!key3);switch(n){case1:nian--;//设置键按动1次,调年if(nian==0)nian=99;//秒减到0,再减1,年等于99write_nyr(2,nian);//年,从第二行第3个字符后开始显示//令LCD在正确位置显示加设定好的秒数(yh+2);break;20:..case2:yue--;if(yue==0)yue=12;write_nyr(5,yue);//月,从第一行第6个字符后开始显示(yh+5);break;case3:ri--;if(ri==0)ri=31;write_nyr(8,ri);(yh+8);break;case4:week--;if(week==0)week=7;(yh+0x0C);write_week(week);break;case5:shi--;if(shi==-1)shi=23;write_sfm(1,shi);//小时,从第二行第2个字符后开始显示(er+1);//按动5次,shibreak;case6:fen--;if(fen==-1)fen=59;write_sfm(4,fen);(er+4);//按6次fen位置显示光标break;case7:miao--;if(miao==-1)miao=59;write_sfm(7,miao);(er+7);break;}}21:..}}}/*************更新时间***************/voidupdatetime(){miao=BCD_Decimal(DS1302read(0x81));fen=BCD_Decimal(DS1302read(0x83));shi=BCD_Decimal(DS1302read(0x85));ri=BCD_Decimal(DS1302read(0x87));yue=BCD_Decimal(DS1302read(0x89));nian=BCD_Decimal(DS1302read(0x8d));week=BCD_Decimal(DS1302read(0x8b));//显示温度、秒、时、分数据://write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示write_sfm(7,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)write_sfm(4,fen);//分,从第二行第5个字符后开始显示write_sfm(1,shi);//小时,从第二行第2个字符后开始显示//显示日、月、年数据:write_nyr(8,ri);//日期,从第二行第9个字符后开始显示write_nyr(5,yue);//月份,从第二行第6个字符后开始显示write_nyr(2,nian);//年,从第二行第3个字符后开始显示write_week(week);}/************闹钟设定***************************/voidalarm(void){}//*******************主函数**************************//***************************************************22:..voidmain(){init_1602();//调用液晶屏初始化子函数DS1302_init();//调用DS1302时钟的初始化子函数while(1)//无限循环下面的语句:{keyscan();if(n==0)updatetime();//调用键盘扫描子函数}}23:..指导老师评语:成绩评定:指导老师签名:基地指导老师签名:年月日教研室意见教研室主任签章年月日学院意见分管院长签章年月日24

基于单片机的电子时钟万年历设计 来自beplayapp体育下载www.apt-nc.com转载请标明出处.

相关beplayapp体育下载 更多>>
非法内容举报中心
beplayapp体育下载信息
  • 页数24
  • 收藏数0收藏
  • 顶次数0
  • 上传人1781111****
  • 文件大小2.41 MB
  • 时间2024-03-08