




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
·电子工程学院课外学分设计报告题目:基于51单片机的电子万年历姓名:****学号:****专业:****实验室:开放实验室班级:***设计时间:2011年09月10日——2011年10月8日评定成绩:审阅教师:****目录1.专业综合设计任务…………………12.基本原理与论证……………………1 2.1电路工作原理…………………12.2复位电路………22.3晶振电路………22.4上拉电阻………32.5流程图…………42.6C语言程序……………………53.硬软件设计………164.实现与测试………165.分析与总结………161.专业综合设计任务项目的背景:学习了一定电子知识和焊接技术的情况下。任务:设计制作一个功能齐全的电子万年历。目的:了解电子万年历电路的组成框图;理解电子万年历电路的工作原理;会电子万年历电路设计制作;能调试、测量电子万年历电路;能排除数电子万年历电路的常见故障。要求:用单片机和数码管可以简易地实现电子万年历功能。该设计可以在两个4位数码管上显示时、分、秒、年、月、日、星期等信息。硬件组成简单,主要是单片机的数码管显示电路,晶振电路和按键电路。可以在程序中预先设置每一分钟的某一段时间用来显示时、分、秒和星期信息,另一段时间显示年、月、日和星期信息。可以看到时、分、秒和年、月、日交替显示。同时利用按键可以切换时间的显示。2.基本原理与论证2.1电路工作原理为了实现电子万年历的功能,首先要使时间可以变化,每过一秒单片机的时间也要加一秒,因此我们采用了定时器来产生时间。而12M晶振下AT89C51单片机的定时器采用工作方式1定时的最大定时时间为65.535ms,为了实现时间秒加一,我们设定定时器每10ms溢出一次,计算出定时器的初值是TH0=0D8H,TL0=0F0H。用一个变量来统计定时器的溢出次数,每当定时器溢出100次,我们就让秒加1,这样我们就可以得到准确的时间秒。秒加到60后,让秒清零,分加1;判断分加到60以后,分清零,时加1;判断时加到24后,时清零,日期和星期加1;判断日期到了31后,日期置1,月加1;判断月加到13后,月置1,年加1;判断年加到100时,年清零;判断星期加到8后,星期置1。这样时间的正确变化就实现了。得到时间后,就要考虑怎么来显示了。我们采用数码管的动态扫描来显示时间。在两个4位共阳数码管上,一次只能显示时、分、秒、和星期信息。时和分,分和秒之间用小数点来区分。秒和星期之间用一横来区分。同理,显示年、月、日、星期时年和月,月和日之间用小数点来区分,日和星期之间用一横来区分。那什么时候让数码管显示时分秒星期,什么时候显示年月日星期呢?我们可以在程序中设定。比如我们可以设定每分钟的40~44秒的时候显示年月日,其余时间显示时分秒。让数码管的动态扫描每次都扫描32H~39H单元里面的内容,而在40~44秒时我们往32H~39H里面送时分秒星期的值,在其余时间我们往32H~39H送年月日星期的值。这样就实现了万年历的显示问题。实现了时间的产生和显示问题后,还有一个按键功能的实现问题。时间日期的显示调整设定了4个按键。按键1用来暂停时间,这个很简单,只要关闭中断总开关,时间就不能加了,实现了暂停时间的功能。按键2则用来选择需要显示的时间是日期(年、月、日)信息。由于前面显示时间中就考虑到了时间的切换,我们只要让按键按下后进入往32H~39H送年月日星期的程序就可以了。按键3实现恢复时间秒加1,只要再次打开终端就可以了。按键4功能为单片机的自身的复位。2.2复位电路当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。复位电路由电容串联电阻构成,由"电容电压不能突变"的性质可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。这里我们取R4=2K和C3=10uf,R5=10K2.3晶振电路单片机最小系统起振电容C2、C3一般采用15~33pF,并且电容离晶振越近越好,晶振离单片机越近越好。2.4上拉电阻P0口为开漏输出,作为输出口时需加上拉电阻,接数码管时,阻值一般为1K。2.5流程图开始按键1按下?开始按键1按下?暂停时间确定修改数据位数时间加1时间复位返回按键2按下?按键3按下?按键4按下?显示子程序如下:开始开始判断此时应该显示的内容消隐选择段码位码是2或4?获得位码显示数字和小数点获得位码显示数字8位数码管扫描完了返回YESYESNONO此时在修改数?据?闪烁相应位NOYES主程序:开始开始定时器初始化调用显示子程序设置中断打开调用判断子程序秒等于40?显示年月日星期秒等于45?显示年月日星期按键1按下?调用按键子程序NONONOYESYESYES2.6C语言程序//本程序是通过定时器0产生1S准确时间的电子万年历//通过8位数码管交替显示:年\月\日\星期和时\分\秒\星期//并在修改时间时,相应位数可以闪烁//有三个按键;按键1:停止按键;//按键2:确定修改哪位数据,并在按下5次后恢复时钟//按键3:修改对应位的数据#include<reg51.h>unsignedcharTable[11]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//段码vart_init(); //函数申明Updata_LED1();Updata_LED2();Delay();Delay1();Xiugai();Xiugaishu();sbitled0=P2^0; //定义P2各口sbitled1=P2^1;sbitled2=P2^2;sbitled3=P2^3;sbitled4=P2^4;sbitled5=P2^5;sbitled6=P2^6;sbitled7=P2^7;sbitstop=P1^0; //定义P10--P12口sbitwei=P1^1;sbitjia=P1^2;unsignedintmiao=32; //秒unsignedintfen=18; //分unsignedintshi=8; //时unsignedintriqi=21; //日unsignedintyue=2; //月unsignedintnian=12; //年unsignedintxingqi=2; //星期bitqufen=0; //区分显示年\月\日\星期或时\分\秒\星期bitzhanting=0; //保持按键1按下后允许执行的程序段intweishu=0; //判断此时修改哪位数据intncounter=0; //定时器循环次数intcounter=0;intZJ=3; //定时器T1内部自加变量bitzhongj1=0; //判断修改时间时的闪烁位数bitzhongj2=0;bitzhongj3=0;bitzhongj4=0;bitzhongj5=0;bitzhongj6=0;bitzhongj7=0;bitzhongj8=0;main() //主程序开始{ vart_init(); //定时器初始化 while(1) { Updata_LED1(); //判断子程序 Updata_LED2(); //显示子程序 if(miao==40) //秒等于40秒时显示日期(年\月\日\星期) { qufen=1; } if(miao==45) //秒等于45秒时显示时间(时\分\秒\星期) { qufen=0; } if(stop==0) //判断按键1是否按下并执行后面程序 { zhanting=1; } if(zhanting==1) //判断按键1按下,并调用按键子程序 { Xiugai(); } } } //主程序结束Xiugai() //按键子程序:暂停,判断是否执行数据修改{ TR0=0; //关闭定时器T0 if(wei==0) //判断按键2是否按下并执行相应程序 { weishu++; Delay1(); if(weishu==6) //当按键2按下6次后打开中断 { //并关闭数据修改子程序,恢复时钟继续运行 TR0=1; //打开定时器T0 zhanting=0; weishu=0; } } Xiugaishu();}Xiugaishu() //数据修改子程序{if(qufen==0) //判断此时显示为时\分\秒\星期 { switch(weishu) { case(1):if(jia==0) //检查按键3是否按下并执行下面程序 { shi++; //时++ Delay1();//消抖 }; break; case(2):if(jia==0) //检查按键3是否按下并执行下面程序 { fen++; //分++ Delay1(); }; break; case(3):if(jia==0) //检查按键3是否按下并执行下面程序 { miao++; //秒++ Delay1(); }; break; case(4):if(jia==0) //检查按键3是否按下并执行下面程序 { xingqi++;//星期++ Delay1(); }; break; } } else {if(qufen==1) { switch(weishu) { case(1):if(jia==0) //检查按键3是否按下并执行下面程序 { nian++; //年++ Delay1(); }; break; case(2):if(jia==0) //检查按键3是否按下并执行下面程序 { yue++; //月++ Delay1(); }; break; case(3):if(jia==0) //检查按键3是否按下并执行下面程序 { riqi++; //日++ Delay1(); }; break; case(4):if(jia==0) //检查按键3是否按下并执行下面程序 { xingqi++;//星期++ Delay1(); }; break; } } }}Updata_LED1() //判断秒、分、时、日、月、年、星期是否到上限{ if(ZJ==99) //定时器T1内部自加变量 { ZJ=4; } //并初始化,向上一级进位 if(miao==60) //判断秒是否到60秒 { fen++; miao=0; } if(fen==60) //判断分 { shi++; fen=0; } if(shi==24) //判断小时 { riqi++; xingqi++; shi=0; } if(riqi==30) //判断日期 { yue++; riqi=0; } if(yue==12) //判断月 { nian++; yue=0; } if(nian==100) //判断年 { nian=0; } if(xingqi==8) //判断星期 { xingqi=1; }}Updata_LED2() //显示子程序{ if(qufen==0) //判断此时显示为时\分\秒\星期 { intnTemp,xiaoshu=0x00; if(weishu==5) //修改星期数据时闪烁程序 { zhongj4=0; } if(weishu==4&&ZJ%2==0) { zhongj4=!zhongj4; zhongj3=0; } if(zhongj4==0) { P2=0XFF; //显示星期 P0=Table[xingqi]; led7=0; Delay(); } if(weishu==3&&ZJ%2==0) //修改秒数据时闪烁程序 { zhongj3=!zhongj3; zhongj2=0; } if(zhongj3==0) { nTemp=miao/10; //显示秒十位 P2=0XFF; P0=Table[nTemp]; led4=0; Delay(); nTemp=miao%10; //显示秒个位 P2=0XFF; P0=Table[nTemp]; led5=0; Delay(); } if(weishu==2&&ZJ%2==0) //修改分数据时闪烁程序 { zhongj2=!zhongj2; zhongj1=0; } if(zhongj2==0) { nTemp=fen/10; //显示分十位 P2=0XFF; P0=Table[nTemp]; led2=0; Delay(); nTemp=fen%10; //显示分个位 P2=0XFF; xiaoshu=0x80|Table[nTemp]; //点亮小数点 P0=xiaoshu; led3=0; Delay(); } if(weishu==1&&ZJ%2==0) //修改数据时闪烁程序 { zhongj1=!zhongj1; } if(zhongj1==0) { nTemp=shi/10; //显示时十位 P2=0XFF; P0=Table[nTemp]; led0=0; Delay(); nTemp=shi%10; //显示时个位 P2=0XFF; xiaoshu=0x80|Table[nTemp]; //点亮小数点 P0=xiaoshu; led1=0; Delay(); } P2=0XFF; //显示横杆 P0=Table[10]; led6=0; Delay(); } if(qufen==1) //判断此时显示年\月\日\星期 { intnTemp,xiaoshu=0x00; if(weishu==5) //修改星期数据时闪烁程序 { zhongj5=0; } if(weishu==4&&ZJ%2==0) { zhongj5=!zhongj5; zhongj6=0; } if(zhongj5==0) { P2=0XFF; //显示星期 P0=Table[xingqi]; led7=0; Delay(); } if(weishu==3&&ZJ%2==0) //修改日数据时闪烁程序 { zhongj6=!zhongj6; zhongj7=0; } if(zhongj6==0) { nTemp=riqi/10; //显示日十位 P2=0XFF; P0=Table[nTemp]; led4=0; Delay(); nTemp=riqi%10; //显示日个位 P2=0XFF; P0=Table[nTemp]; led5=0; Delay(); } if(weishu==2&&ZJ%2==0) //月修改数据时闪烁程序 { zhongj7=!zhongj7; zhongj8=0; } if(zhongj7==0) { nTemp=yue/10; //显示月十位 P2=0XFF; P0=Table[nTemp]; led2=0; Delay(); nTemp=yue%10; //显示月个位 P2=0XFF; xiaoshu=0x80|Table[nTemp]; //点亮小数点 P0=xiaoshu; led3=0; Delay(); } if(weishu==1&&ZJ%2==0) //修改年数据时闪烁程序 { zhongj8=!zhongj8; } if(zhongj8==0) { nTemp=nian/10; //显示年十位 P2=0XFF; P0=Table[nTemp]; led0=0; Delay(); nTemp=nian%10; //显示年个位 P2=0XFF; xiaoshu=0x80|Table[nTemp]; //点亮小数点 P0=xiaoshu; led1=0; Delay(); } P2=0XFF; //显示横杆 P0=Table[10]; led6=0; Delay(); } }Delay() //延时子程序(显示){inti;for(i=0;i<10;i++);}Delay1() //延时子程序1(消抖){inti,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}voidTimer0_Overflow()interrupt1 //定时器T0子程序{ TH0=0x3c; //50MS溢出 TL0=0xbd;if(ncounter==20) //循环20次达到准确的1S { ncounter=0; miao++; //秒加1 }ncounter++;}voidTimer1_Overflow()interrupt3 //定时器T1子程序{ TH1=0xCD; //13MS溢出 TL1=0x38;if(counter==10) //循环10次 { counter=0; ZJ++; //变量加1 }counter++;}vart_init() //定时器初始化子程序{ PT0=1; //设置优先级 TMOD=0X11; //定时器T0\T1工作在方式01下 TH0=0XC0; //装载初值 TL0=0XFB; ET0=1; //打开中断 TR0=1; EA=1; TH1=0XCD; TL1=0X38; ET1=1; TR1=1; TF0=0; TF1=0;}3.硬软件设计1、电路仿真:通过仿真软件绘制电子万年历的电路图,并测试其正确可行性。2、硬件准备:按照电路图所需的元件申请元件库。3、焊接电路:依据电路图进行焊接,焊接中确保焊接成功,不出现虚焊、缺焊等问题。4、电板调试:焊接成功后,对电板进行测试,确保电板的可使用性。如果出现问题对其进行检查,并对错误进行修正。4.实现与测试电路板焊接完成确定无误后,将汇编程序写入单片机。然后连接5V电源,测试功能。发现可以交替显示时、分、秒、星期和年、月、日、星期信息。测试按键后没有问题。但是数码管的显示亮度太低。经老师提醒,是所接上拉电阻为10K,导致电流太小的原因。之后重新焊接了上拉电阻,显示亮度达到正常。单片机写入C语言程序后,发现数码管的显示消隐没有做好,星期显示本应显示2,却始终显示0。将C语言程序消隐部分完善后,显示没有问题。按键检测功能正常。5.分析与总结此次的课外学分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制定可持续发展计划的实施方案
- 积极心态引领职场新起点计划
- 仓库人员培训的经验分享计划
- 推动科研成果转化的工作计划
- 提升财务投研能力的途径与方法计划
- 第4课时 相遇问题的练习(教案)2024-2025学年数学 四年级上册 青岛版
- 拍摄景地使用许可合同(2025年版)
- 创意写作与艺术的结合计划
- 四年级下册数学教案-第2单元 认识多位数-苏教版
- 2025年财产保险服务项目建议书
- 《空调工作原理》课件
- 25题电控工程师岗位常见面试问题含HR问题考察点及参考回答
- 机动车驾驶培训教练员岗前培训教材
- 地质学基础-读图题
- 管理会计学:作业成本法
- 脑血管解剖及脑梗塞定位诊断
- SMT常见贴片元器件封装类型和尺寸
- 设计基础全套教学课件
- PCBA红胶工艺贴片掉件改善(6Sigma改善报告)
- 社会主义发展简史智慧树知到课后章节答案2023年下北方工业大学
- 2022年考研数学(二)真题(含答案及解析)【可编辑】
评论
0/150
提交评论