版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机万年历实训汇报 系部:电气自动化系班级:13电信2班姓名:周祝福指导老师:黄丽英、侯聪玲实训时间:1月19日~23日用AT89C51和LCD1602设计可调式电子日历时钟一、总体设计1.1、设计目标为巩固所学单片机知识,把所学理论利用到实践中,用LCD1602和AT89C51设计可调式电子日历时钟。1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期初始状态;(3)能够用4个按键调整日历时钟年、月、日、时、分、秒和星期;完成可调式电子日历时钟硬件和软件设计,包含单片机相关内容;日历时钟模块设计,液晶显示模块设计,按键模块设计。控制程序编写等。1.3、系统基础方案选择和论证1.3.1、单片机芯片选择方案方案一:采取89C51芯片作为硬件关键,采取FlashROM,内部含有4KBROM存放空间,能于3V超低压工作,而且和MCS-51系列单片机完全兼容。方案二:采取STC12C5A60S2系列单片机是宏晶科技生产单时钟/机器周期(1T)单片机,是高速/低功耗/超强抗干扰新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场所。1.3.2、显示模块选择方案和论证:方案一:采取点阵式数码管显示,点阵式数码管是由八行八列发光二极管组成,对于显示文字比较适合,如采取显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。方案二:采取LED数码管动态扫描,即使LED数码管价格适中,但要显示多个数字所需要个数偏多,功耗较大,显示出来只是拼音,而不是汉字。所以也不用此种作为显示。方案三:采取LCD液晶显示器,液晶显示器显示功效强大,可显示大量字符,且视觉效果很好,外形美观。LCD1602可实现显示2行十六个字符。1.3.4、电路设计最终方案决定综上各方案所述,对此次作品方案选定:采取80C51作为主控制系统;LCD1602液晶带汉字库显示器作为显示部分。二、硬件设计2.1、电路设计模块图图AT89CAT89C51LCD162按键控制模块2.3、用proteus仿真软件仿真并抓图。三、软件设计3.1、画出各个函数步骤图。3.1.1、LCD1602液晶显示控制步骤图图3.1.2、调时函数控制步骤图实训心得:经过为期一周单片机实训,是我们对这门课有了很多新了解,填补了在课堂上学习不足。相信这对我们以后学习和工作全部会有很大帮助。我们一定要在最短时间里对这些不足加以更正!在试训中有苦有甜,当我们为一个极难攻破程序找出路时,心情烦躁,感觉自己很不可理喻,当程序一点一点编好后,自己从心底感觉到一点小小抚慰,看着自己结果。感觉很欣慰。总而言之,单片机课程设计对于我们有很大帮助,我们从中受益匪浅。程序代码。#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintuchara,count,S1num,xqnum;ucharyue,ri,shi,fen,miao;uintnian;sbitlcdrs=P2^5;sbitlcdrw=P2^4;sbitlcden=P2^3;sbitS1=P3^0; //定义键--进入设置sbitS2=P3^1; //定义键--增大sbitS3=P3^2; //定义键--减小sbitS4=P3^3; //定义键--退出设置ucharcodetable0[]="-01-11SUN";ucharcodetable1[]="00:00:00";ucharcodexingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};voiddelay(uintz){ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}/**************************************************1602液晶显示器模块*************************************************/voidwrite_com(ucharcom) //液晶写指令{ lcdrw=0; lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;}voidwrite_data(uchardat) //液晶写数据{ lcdrw=0; lcdrs=1; P0=dat; delay(5); lcden=1; delay(5); lcden=0;}/********************************************年月日写入1602函数********************************************/voidwrite_sfm(ucharadd,uchardat) //写时分秒函数{ ucharshi,ge; shi=dat/10; ge=dat%10; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge);}voidwrite_yr(ucharadd,uchardat) //写月日函数{ ucharshi,ge; shi=dat/10; ge=dat%10; write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge);}voidwrite_nian(ucharadd,uintdat) //写年函数{ uintqian,bai,shi,ge; qian=dat/1000; bai=dat%1000/100; shi=dat%100/10; ge=dat%10; write_com(0x80+add); write_data(0x30+qian); write_data(0x30+bai); write_data(0x30+shi); write_data(0x30+ge);}/***************************************************1602初始化***************************************************/voidinit_lcd() //液晶初始化{ lcden=0; nian=; yue=1; ri=11; shi=0; //初始shi、fen、miao fen=0; miao=0; write_com(0x38); //设置16x2显示,5x7点阵,8位数据口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针加1 write_com(0x01); //显示清0,数据指针清0}voidinit() //初始化函数{ init_lcd(); //液晶初始化 write_com(0x80); //设置显示初始坐标 for(a=0;a<14;a++) //显示年月日初始值 { write_data(table0[a]); delay(5); } write_com(0x80+0x40); //设置显示初始坐标 for(a=0;a<8;a++) //显示时分秒初始值 { write_data(table1[a]); delay(5); } write_nian(0,nian); write_sfm(6,miao); //分别将shi、fen、miao送去液晶显示 write_sfm(3,fen); write_sfm(0,shi); count=0; xqnum=0; S1num=0; //初始化全局变量count TMOD=0x01; //设置定时器0工作模式1 TH0=(65535-50000)/256; //定时器装初始值 TL0=(65535-50000)%256; EA=1; //开总中止 ET0=1; //开定时器0中止 TR0=1; //开启定时器0}/**************************************************独立键盘*************************************************/voidkeyscan(){ if(S1==0) { delay(5); //确定定义键被按下 if(S1==0) { S1num++; //定义键S1按下次数统计 while(!S1); //释放按键确定 if(S1num==1) //S1按下一次时 { TR0=0; //关闭定时器 write_com(0xc0+7); //光标定位到秒位置 write_com(0x0f); //光标闪烁 } if(S1num==2) //S1按下两次时 { write_com(0xc0+4); //光标定位到分位置 } if(S1num==3) //S1按下三次时 { write_com(0xc0+1); //光标定位到时位置 } if(S1num==4) //S1按下四次时 { write_com(0x80+13); //光标定位到星期位置 } if(S1num==5) //S1按下五次时 { write_com(0x80+9); //光标定位到日位置 } if(S1num==6) //S1按下六次时 { write_com(0x80+6); //光标定位到月位置 } if(S1num==7) //S1按下七次时 { write_com(0x80+3); //光标定位到年位置 } if(S1num==8) //S1按下八次时 { S1num=0; //S1统计按键次数清零 TR0=1; //开启定时器 write_com(0x0c); //取消光标闪烁 } } } if(S1num!=0) //只有定义键按下后S2、S3、S4才有效 { if(S2==0) { delay(5); //防抖 if(S2==0) //确定按键被按下 { while(!S2); //释放按键确定 if(S1num==1) //S1按下一次时 { miao++; //调整秒加1 if(miao==60) //满60清零 miao=0; write_sfm(6,miao); //每调整一次送液晶显示一次 write_com(0x80+0x40+6); //显示位置重新回到调整处 } if(S1num==2) //S1按下两次时 { fen++; //调整分加1 if(fen==60) fen=0; write_sfm(3,fen); write_com(0x80+0x40+3); } if(S1num==3) //S1按下三次时 { shi++; //调整时加1 if(shi==24) shi=0; write_com(0x80+0x40); write_sfm(0,shi); } if(S1num==4) //星期加调整 { xqnum++; if(xqnum==7) xqnum=0; write_com(0x80+0x0b); for(a=0;a<3;a++) { write_data(xingqi[xqnum][a]); delay(5); } } if(S1num==5) //日加调整 { ri++; if(yue==2) { if(nian%400==0) { if(ri==30) { ri=1; } } if(nian%400!=0) { if(ri==29) { ri=1; } } } elseif(yue<=7) { if(yue%2==0&yue!=2) { if(ri==31) { ri=1; } } elseif(yue%2!=0&yue!=2) { if(ri==32) { ri=1; } } } elseif(yue>=8) { if(yue%2==0) { if(ri==32) { ri=1; } } elseif(yue%2!=0) { if(ri==31) { ri=1; } } } write_yr(8,ri); } if(S1num==6) //月加调整 { yue++; if(yue==13) yue=1; write_yr(5,yue); } if(S1num==7) //年加调整 { nian++; if(nian==) nian=; write_nian(0,nian); } } } if(S3==0) { delay(5); if(S3==0) //确定按键被按下 { while(!S3); if(S1num==1) { miao--; //调整秒减1 if(miao==-1) //减到00后再减重新设置为59 miao=59; write_sfm(6,miao); write_com(0x80+0x40+6); } if(S1num==2) { fen--; //调整分减1 if(fen==-1) fen=59; write_sfm(3,fen); write_com(0x80+0x40+3); } if(S1num==3) { shi--; //调整时减1 if(shi==-1) shi=23; write_sfm(0,shi); write_com(0x80+0x40); } if(S1num==4) { xqnum--; //调整星期减一 if(xqnum==-1) xqnum=6; write_com(0x80+0x0b); for(a=0;a<3;a++) { write_data(xingqi[xqnum][a]); delay(5); } } if(S1num==5) //调整日 { ri--; if(yue==2) { if(nian%400==0) { if(ri==0) { ri=29; } } if(nian%400!=0) { if(ri==0) { ri=28; } } } elseif(yue<=7) { if(yue%2==0&yue!=2) { if(ri==0) { ri=30; } } elseif(yue%2!=0&yue!=2) { if(ri==0) { ri=31; } } } elseif(yue>=8) { if(yue%2==0) { if(ri==0) { ri=31; } } elseif(yue%2!=0) { if(ri==0) { ri=30; } } } write_yr(8,ri); } if(S1num==6) //调整月 { yue--; if(yue==0) yue=12; write_yr(5,yue); } if(S1num==7) //调整年 { nian--; if(nian==) nian=; write_nian(0,nian); } } } if(S4==0) //退出设置、开启中止 { delay(5); if(S4==0) { S1num=0; TR0=1; write_com(0x0c); } } }}/**************************************************定时器0*************************************************/voidtimer0()interrupt1 //定时器0中止服务程序{ TH0=(65535-50000)/256; //重装定时器初始值 TL0=(65535-50000)%256; count++; //中止次数累加 if(count==20) //20次50毫秒即一秒 { count=0; miao++; if(miao==60) //秒加到60时分进位 { miao=0; fen++; if(fen==60) //分加到60时时进位 { fen=0; shi++; if(shi==24) //时加到24时清0 { shi=0; xqnum++; ri++; if(yue==2) //假如是二月 { if(nian%400==0) //闰年判定 { if(ri==30) { ri=1; yue++; write_yr(5,yue); } } if(nian%400!=0) //平年判定 { if(ri==29) { ri=1; yue++; write_yr(5,yue); } } } elseif(yue<=7&yue!=2) //一月到七月 { if(yue%2==0) //偶数月(除二月) { if(ri==31) { ri=1; yue++; } } elseif(yue%2!=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院老人心理健康制度
- 养老院老人紧急救援人员职业发展规划制度
- 质量管理体系制度
- 《运动健康模板》课件
- 房屋权属转移合同(2篇)
- 2024年度市政绿化工程土石方施工补充合同6篇
- 2024年教育软件销售与授权合同3篇
- 《修炼执行智慧》课件
- 2025年文山道路客货运输从业资格证b2考试题库
- 2025年昭通下载b2货运从业资格证模拟考试考试
- 做成功父母 培养出色孩子
- 12D401-3 爆炸危险环境电气线路和电气设备安装
- 军队文职公共科目(人文与社会)模拟试卷3(共258题)
- 2024广西继续教育公需科目(高质量共建“一带一路”)
- 输电线路工频参数测试仪校准规范
- APS系统设计蓝图与方案
- 心爱之物五年级作文精彩开头和结尾10篇
- 我是记忆小达人(课件)-心理健康六年级
- 非ST段抬高型急性冠脉综合征诊断和治疗指南(2024)解读
- YBT 6266-2024《高温纯化炉》规范要求
- 模拟电子技术基础(山东理工大学)智慧树知到期末考试答案章节答案2024年山东理工大学
评论
0/150
提交评论