已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机制作万年历方案1.1 本课题主要的研究工作本项目是一种基于at89c51片机的万年历设计,本方案以at89c51片机作为主控核心,与时钟芯片ds1302、温度ds18b20按键、lcd1602液晶显示器组成硬件系统。在硬件系统中设有独立按键和lcd1602显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行更改,读取方便、显示直观。当程序执行后,lcd显示即时时间、年月日、星期。设置4个操作键:k1:选择键;k2:加键;k3:减键;k4:确定键。1本设计的主要内容:(1)熟悉万年历各模块的工作原理;(2)选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;(3)熟悉单片机使用方法和c语言,编写出相应模块的应用程序;(4)分别在各自的模块中调试出对应的功能,在proteus软件上进行仿真,并实现各种功能。2设计目标:万年历实现以下三个功能:(1)具有年、月、日、星期、时、分、秒等功能;(2)具备年、月、日、星期、时、分、秒校准功能,具备自动调节闰年的功能;(3)具有与即时时间同步的功能。(4)具有温度显示功能本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。1.2 系统硬件概述本电路是以stc89c51单片机为控制核心,该芯片具有在线编程功能,功耗低,能在3.3v的超低压下工作;时钟芯片采用ds1302,它是一款高性能、低功耗、自带ram的实时时钟芯片,具有掉电自动保存功能。可自动对秒、分、时、日、周、月、年进行计数,具有闰年补偿功能,而且精度高位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na。显示模块采用1602显示屏,它内置192种字符,可显示32个符号或数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。其工作电压为5v。1.3单片机主控制模块的设计一个典型的单片机最小系统一般由时钟电路、复位电路、电源指示灯和外部扩展接口等部分组成。单片机的最小系统如下图所示,单片机的xtal0和xtal1引脚用于连接晶振电路。reset为复位引脚,连接复位电路,用于初始化mcu1.4显示模块的设计本设计中要对时间、温度进行显示,液晶显示屏1602模块作为输出。1602字符型lcd通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5v电源供电,外围电路配置简单。1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是01000001b(41h),显示时模块把地址41h中的点阵字符图形显示出来,我们就能看到字母“a”。lcd1602引脚功能:1vss一般接地2vdd接电源(+5v)3v0液晶显示器对比度调整端。4rsrs为寄存器选择。5r/wr/w为读写信号线。6ee(或en)端为使能(enable)端,下降沿使能。1602主要管脚介绍:v0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个10k的电位器调整对比度。rs为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。rw为读写信号线端,高电平时进行读操作,低电平时进行写操作。当rs和rw共同为低电平时可以写入指令或者显示地址;当rs为高电平rw 为低电平时可以写入数据。e为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。将l1602的rs端和p2.0,r/w端和p2.1, e 端和p2.2相连,当rs=0时,对lcd1602写入指令;当rs=1时,对lcd1602写入数据。当r/w端接高电平时芯片处于读数据状态,反之处于写数据状态,e端为使能信号端。当r/w为高电平,e端也为高电平,rs为低电平时,液晶显示屏显示需要显示的示数。显示模块电路图如图3所示:图31.5独立式键盘设计独立式键盘每个键单独占用一根i/o口线。键盘的工作方式可分为编程控制方式和中断控制方式。cpu在一个工作周期内,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使cpu经常处于工作状态, 在进行本次设计中,只涉及到了选择、加、减、确定四个功能。因此采用独立式键盘。2电路设计框图显示模块lcd1602温度模块ds18b20at89c51主控制模 块 键盘模块时钟模块ds13023程序流程框图初始化开始读、写日期、时间和温度分离日期时间温度显示值显示子程序日期、时间修改子程序定时闹铃子程序农历自动更新子程序返 回闰月子程开始控制键有效,进入年调整程序等待按键程序加键有效减键有效年加1减加1控制键有效,进入日调整程序等待按键程序加键有效减键有效日加1日减1控制键有效,进入月调整程序等待按键程序加键有效减键有效月加1月减1控制键有效,进入星期调整程序等待按键程序加键有效减键有效星期加1星期减1控制键有效,进入分钟调整程序等待按键程序加键有效减键有效分钟加1分钟减1按键有效,跳出时间调整程序,进入主循环程序控制键有效,进入小时调整程序等待按键程序加键有效减键有效小时加1小时减14电路图:5元件清单:元件个数元件个数ds13201ds18b201lcd1602(显示器)1晶振32.768khz1瓷片电容220pf13v纽扣电池及底座1按键44.7k(9针)排阻1可调电阻1k26:程序设计1602液晶万年历程序-显示年月日,时间,温度(续) /*键盘识别程序*uchar key(void)uchar i,j;k1=0;i=p2;delay_key(500);j=p2;k1=1;if(i=j)switch(j) case 0xee: return(j);break; case 0xed: return(j);break; case 0xeb: return(j);break; case 0xe7: return(j);break; k2=0; i=p2; delay_key(500); j=p2; k2=1; if(i=j) switch(j) case 0xde: return(j);break; case 0xdd: return(j);break; case 0xdb: return(j);break; case 0xd7: return(j);break; /=模式的判断=uchar key_only(void) /此程序延时较长uchar i,j;k1=0;i=p2;delay_key(500);j=p2;k1=1;if(i=j)if(j=0xee)while(j=0xee) /直到放手 delay_key(50000); j=p2; delay_key(10000); return(0xee);elsereturn(0);elsereturn(0);/=指针移动=void cursor_shift_right()if(addr=0x80+0x0f)addr=0x80+0x3f;elseif(addr=0x80+0x4f)addr=0x7f;lcd_write(lcd_command, +addr);/rightvoid cursor_shift_left() if(addr=0x80)addr=0x80+0x50;elseif(addr=0x80+0x40)addr=0x80+0x10;lcd_write(lcd_command, -addr);/left/*模式判断*void mode(void)if(key_only()=0xee) +done; if(done=4) done=0; /=警报声,分长短音=void alarm_voice(uchar i) uchar n; if(i=0)n=8;for(;n0;n-) ds1302_gettime(¤ttime); /获取时钟芯片的时间数据 timetostr(¤ttime); /时间数据转换液晶字符 datetostr(¤ttime); /日期数据转换液晶字符 readtemp(); /开启温度采集程序 temp_to_str(); /温度数据转换成液晶字符 gotoxy(10,1); /液晶字符显示位置 print(tempbuffer); /显示温度 gotoxy(0,1); print(currenttime.timestring); /显示时间 gotoxy(0,0); print(currenttime.datestring); /显示日期 gotoxy(15,0); print(week_value); /显示星期 voice=voice;else if(i=1)n=10;for(;n0;n-) show_time(); voice=voice;else if(i=2)n=20;for(;n0;n-) ds1302_gettime(¤ttime); /获取时钟芯片的时间数据 timetostr(¤ttime); /时间数据转换液晶字符 readtemp(); /开启温度采集程序 temp_to_str(); /温度数据转换成液晶字符 gotoxy(10,1); /液晶字符显示位置 print(tempbuffer); /显示温度 gotoxy(0,1); print(currenttime.timestring); /显示时间 voice=voice;else if (i=3)n=16;for(;n0;n-) delay_key(10000); voice=voice;/*主函数*/main() uchar i,num,alarm_count=0;uchar code table=welcome chen611b; uchar code table1=clock+temp v1.0 ;float current_temp,max_temp_count,min_temp_count; guandz(); guanled(); lcd_initial(); /液晶初始化init_ds18b20( ) ; /ds18b20初始化initial_ds1302(); /时钟芯片初始化max_temp_value(); /上限min_temp_value(); /下限done=2; /进入默认液晶显示/=lcd_write(lcd_command,0x80+0x10);for(num=0;num16;num+) lcd_write(lcd_data,tablenum); delay_key(50);lcd_write(lcd_command,0x80+0x51);for(num=0;num15;num+) lcd_write(lcd_data,table1num); delay_key(50);for(num=0;num16;num+) lcd_write(lcd_command,0x18); delay_key(300000);delay_key(50000000);/=while(1) alarm_count=0; mode();delay_key(20000);/*闹钟* if(done=0)lcd_write(lcd_command, 0x01); gotoxy(0,0); lcd_write(lcd_command,0x80); print( alarm); /这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了 gotoxy(0,1); print(alarm_timestring); /显示时间 while(done=0) mode(); lcd_setdisplay(lcd_show|lcd_flash); if(key()=0xed) cursor_shift_left(); delay_key(20000); else if(key()=0xd7) cursor_shift_right(); delay_key(20000); else if(key()=0xdd) alarm_add_time(); lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标 gotoxy(0,1); print(alarm_timestring); /显示时间 lcd_write(lcd_command,addr); lcd_setdisplay(lcd_show|lcd_flash); delay_key(8000); else if(key()=0xdb) alarm_sub_time(); lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标 gotoxy(0,1); print(alarm_timestring); /显示时间 lcd_write(lcd_command,addr); lcd_setdisplay(lcd_show|lcd_flash); delay_key(8000); mode(); /*调整时间*if(done=1) /进入调整模式 ds1302_gettime(&ad_currenttime); show_time_mode(); addr=0x80+0x0f; lcd_setdisplay(lcd_show|lcd_flash); while(done=1) mode(); if(key()=0xed) cursor_shift_left(); delay_key(20000); else if(key()=0xd7) cursor_shift_right(); delay_key(20000); else if(key()=0xdd) add_time(&ad_currenttime); lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标 show_time_mode(); lcd_write(lcd_command,addr); lcd_setdisplay(lcd_show|lcd_flash); delay_key(1000); else if(key()=0xdb) sub_time(&ad_currenttime); lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标 show_time_mode(); lcd_write(lcd_command,addr); lcd_setdisplay(lcd_show|lcd_flash); delay_key(1000); if(key()=0xeb) ad_ds1302(); lcd_setdisplay(lcd_show|lcd_no_cursor); show_time(); addr=0x80+0x0f; mode();/*正常时间温度显示*while(done=2) mode(); lcd_write(lcd_command, 0x01); lcd_setdisplay(lcd_show|lcd_no_cursor); show_time(); /液晶显示数据 addr=0x80+0x0f; for(i=0;i=max_temp_count) alarm_voice(2); else if(current_temp=min_temp_count) alarm_voice(0); mode();/=上下限温度设置=if(done=3)lcd_write(lcd_command, 0x01); lcd_setdisplay(lcd_show|lcd_flash);gotoxy(0,0);lcd_write(lcd_command,0x80); print( max_temp); /这个问题一直想不通,清屏后,为什么不会在指定的地方写,我只好在前面加空格了gotoxy(12,0); print(max_temp); gotoxy(0,1); print(min_temp); gotoxy(12,1); /液晶字符显示位置 print(min_temp);addr=0x80+0x4f; while(done=3) mode(); lcd_setdisplay(lcd_show|lcd_flash); if(key()=0xed) cursor_shift_left(); delay_key(20000); else if(key()=0xd7) cursor_shift_right(); delay_key(20000); else if(key()=0xdd) if(addr=0x80+0x0f|addr=0x80+0x0c|addr=0x80+0x0d) max_tempaddr-0x80-12+; else if(addr=0x80+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省2026年选调生选拔历年真题汇编带答案解析
- 2026年版社会工作者(初)《社会工作实务》考试题库带答案解析
- 2026年设备监理师之设备监理合同考试题库带答案(综合题)
- 2025湖南省社会科学院(湖南省人民政府发展研究中心)第二批高层次人才招聘3人备考题库带答案解析
- 长沙市雨花区社区工作者考试题库及答案解析(夺冠)
- 2025新疆丰达棉业科技有限责任公司招聘2人笔试模拟试卷附答案解析
- 2025安徽宿州市砀山县中医医院招聘编外工作人员9人参考题库附答案解析
- 2026云南省普洱市青年人才专项招引31人笔试备考试卷附答案解析
- 2026年陕西省选调生招录(面向北京师范大学)历年真题库带答案解析
- 2026陕西省选调生招录考试已发布备考公基题库带答案解析
- 2025至2030全球及中国绝缘体上硅(SOI)行业产业运行态势及投资规划深度研究报告
- 项目档案课件模板
- 压力管道操作安全培训课件
- 2025年公安机关人民警察职业道德和纪律要求面试题解析
- 2024-2025学年六年级上册期中考试语文试卷(江苏卷)
- 战术战伤救护培训课件
- 全屋定制营销知识培训
- 小儿细菌性肠炎课件
- 2025年医院副院长考试题库
- 2025年达州小升初招生考试题库
- 低压湿式气柜维护维修规程
评论
0/150
提交评论