




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、万年历课程设计万年历课程设计 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(万年历课程设计)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为万年历课程设计的全部内容。- 27 -电子课程设计报告课程名称: 单片机课程设计 设计内容: 万年历电子时钟 实验时间: 2011年12月 专业班级: 09电子(2)班 姓 名: 吴益
2、智 学 号: 0901001215 同 组 人: 张雪莹 李建洪 指导老师: 廖传柱 施众 2011年 12月 29 日目录摘要2第一章 绪论31。1引言及设计思路3第二章 系统设计42.142.2 系统硬件设计42。2.1系统总体框架42.2.2 模块二52.3系统软件设计52。4设计说明书:62。4.1模块划分:62。5使用说明书:62。6元件清单:6第三章总结73.1设计过程73。2心得体会7附录8摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置到飞机上的各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各
3、种智能ic卡等,这些都离不开单片机。单片机是集cpu、ram、rom、定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。万年历在日常生活中最常见,应用也最广泛。本次课程设计主要就是设计一款数字钟,以89s51单片机为核心,配备数码管,按键,蜂鸣器。数字钟采用24小时制方式显示时间,年、月、日、秒及毫秒。 文章的核心主要从硬件设计和软件编程两个大的方面。硬件电路设计主要包括中央处理单元电路、时钟电路、人机接口电路、信号处理电路、执行电路等几部分组成。软件用c语言来实现,主要包括主程序、时间设置
4、子程序,按键切换程序,校时程序等软件模块.关键字: 单片机 时间 小时 分钟 秒第一章 绪论1。1引言及设计思路万年历是采用数字电路实现对年、月、日,时、分、秒,数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的.
5、因此,研究数字钟及扩大其应用,有着非常现实的意义。一开始接触到实验箱的时候大家都很陌生,因为是第一次使用,所以实验箱很多模块的功能及使用方法都要我们自己去掌握。在没有实质说明书的情况下,我们先后使用万用表测电压、电阻的方法得到了实验箱主芯片与单片机p口的引脚对应图,为接下来的软件编程和硬件接口连接打下了基础。万年历电子时钟的实现主要硬件模块是单片机,本实验箱使用的的at89s51单片机,此外还有显示模块四位数码管,还有时间切换和调整模块按钮和闹铃模块蜂鸣器。起初我们想用实验箱上原有的hd7279芯片来驱动数码管显示和键盘控制,但由于对这款芯片的认识不足,虽然从网上找到了很多关于hd7279的资
6、料,但仍不能正确的使用它,于是我们想到通过对tft彩屏液晶显示器的控制来显示时间,但对于它的显示原理也不能掌握,最后我们想到了用单片机直接控制数码管来显示时间.单片机p0的八个口分别接到数码管的八个段选位。通过按下按钮1,可以实现从年-月日时分-秒毫秒的显示切换,按下按钮2,可实现年份、月份日期,时分的加减,以实现时间的校正。第二章 系统设计2。1设计任务:设计一个万年历,主要以单片机和数码管为硬件基础,载入用c语言编写的程序,设计出功能完善的万年历。该万年历通过按键可切换显示时间与日期、月份、日期、年份;能自动准确的计时;能通过判断年份和月份来显示相应的天数(即能判断闰年,大月和小月)。2.
7、2 系统硬件设计和显示2.2.1系统总体框架2。2.2 模块二万年历的原理图2。3系统软件设计3、1数字电子钟设计用到很多子程序,它们的流程图如下所示。 主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。2.4设计说明书:2。4.1模块划分:1、显示模块利用单片机来控制数码管的显示。通过单片机p0口来控制数码管的八段,p1口来控制4位数码管.本程序采用方式0译码.在主程序中进行。2、切换模块主要靠按键来切换显示时间和日期,采用中断方式来进行。3、计时模块本程序采用定时计数器t0,定时10ms,即50ms进一次中断,100次后达到1秒,秒位加一,达到60秒后分
8、位加一,一次类推周而复始的进行计数。该模块也是采用中断方式进行采用12m的晶振。4、校时模块该模块也是通过按键来对时间和日期进行校时。先通过一个按键来选择要校时的部分,再通过另外两个按键来对该部分进行加减,调整到正确的时间和日期。日期在校时过程中还要对年份和月份进行判断是不是闰年,是大月还是小月。进过判断后来显示相应的日期。上述计时过程中也要进行判断。该模块也采用中断方式。2.5使用说明书:打开电源,1602液晶屏显示时间.按键s1用来控制切换,即按下s1就显示日期,再按一次就显示时间,依次循环。按键s2用来控制校时部分的选择,第一次按下,分位或时位会闪烁,表示以选择该位,同时计数器会停止计数
9、;第二次按下,月位或日位会闪烁;第三次按下,年的高位或年的低位会闪烁;第四次按下时,会退出选择功能,计数器恢复计时,依次循环。按键s3和s4分别用来控制时间或日期的加、减,使用该功能时,按键s2必须先按下选择某一位进行加减,按键s2第四次按下时,也同时退出该功能。2.6元件清单:at89s51单片机1602显示屏一个、电阻电容若干,5个独立按键,12m晶振一个,记忆电池一块第三章 总结3.1设计过程通过老师给我们讲解了课程设计的内容后,我们便投入了紧张的课设中,万事开头难,面对着完全陌生的实验箱,我们首先要做的就是收集资料,以便弄清实验箱各功能模块及使用方法,第一天就这么过去了,对实验箱的模块
10、有了大致的了解.星期二,我们开始对主芯片的串口进行测试,找到了它与单片机引脚对应图。对于万年历,我们首先想到的是用单片机,89sc51芯片,液晶屏和按键来实现,查阅了很多关于芯片的资料后仍对其显示原理搞不清楚,于是我们只好放弃使用该芯片,最后我们想到了直接用单片机控制液晶屏,采用动态扫描的方式来实现时间显示,用按键切换来实现.但这样的话,编程就相对来说复杂了很多。星期三,上午开始了编程,8个段选和4个位选就占了12个i/o口,定时和中断占2个口,四个按键也占了4个口,这样一来串行口就显得很紧张.但这不是最主要的,编程是块难啃的骨头,连续编了三天的程序,周五晚上进行仿真调试通过,7月18号的周一
11、来实验室进行硬件调试,硬件调试也经历了数码管显示错位,乱码,按键不灵的问题,通过线路的重新连接,消抖的程序的修改,一一把这些问题解决了。经过经过一上午辛苦的调试,终于成功的把万年历设计出来了!3.2 心得体会回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识.通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手
12、能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说单片机的动态扫描原理,不懂分得二极管的正负极,不知道数码管是共阴极还是共阳极,对单片机汇编语言掌握得不好通过这次课程设计之后,一定把以前所学过的知识重新温故。 本次课程设计,真可谓是感慨万千,从一开始的一无所知,到后来的轻车熟路,其中所经历的波折真是无以言表。坚持不懈是我最大的收获,在课设过程中我曾一度有想放弃的念头,但理智战胜了冲动,我还是坚持下来了,坚持就是胜利!同时也再一次让我体会了
13、团队协作的重要性,我们分工协作,各显神通,一起讨论,一起攻关,请别的组同学帮忙,向老师请教遇到不懂的问题,互相提问,互帮互助。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在陈铧森同学的帮助下解决了难题,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!也感谢学校为我们课程设计提供了这么好的设备,这么好的环境。附录#include reg52。h#include 0; i-) ds1302_io = acc0; /相当于汇编中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; unsigned char ds1302output
14、byte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) acc = acc 1; /相当于汇编中的 rrc acc7 = ds1302_io; ds1302_clk = 1; ds1302_clk = 0; return(acc); void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要写的数据 ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputb
15、yte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 写1byte数据 ds1302_clk = 1; ds1302_rst = 0; unsigned char read1302(unsigned char ucaddr)/读取ds1302某地址的数据 unsigned char ucdata; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0x01); / 地址,命令 ucdata = ds1302outputbyte(); / 读1byte数据 ds130
16、2_clk = 1; ds1302_rst = 0; return(ucdata);void ds1302_gettime(systemtime time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char readvalue;readvalue = read1302(ds1302_second);time-second = ((readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_minute);timeminute = ((readvalue0x70)4)*10 + (readvalue
17、&0x0f);readvalue = read1302(ds1302_hour);timehour = ((readvalue0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_day);timeday = ((readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_week);time-week = ((readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_month)
18、;timemonth = (readvalue0x70)4)10 + (readvalue&0x0f);readvalue = read1302(ds1302_year);time-year = ((readvalue&0x70)4)10 + (readvalue&0x0f);void datetostr(systemtime time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里datestring if(hide_year2) /这里的if,else语句都是判断位闪烁,datestring0 = 2; timedatestring1 = 0; time-datestrin
19、g2 = timeyear/10 + 0; time-datestring3 = time-year%10 + 0; else time-datestring0 = ; timedatestring1 = ; timedatestring2 = ; time-datestring3 = ;time-datestring4 = /;if(hide_month2) time-datestring5 = timemonth/10 + 0; timedatestring6 = time-month%10 + 0; else time-datestring5 = ; timedatestring6 =
20、; time-datestring7 = /;if(hide_daydatestring8 = time-day/10 + 0; timedatestring9 = time-day%10 + 0; else timedatestring8 = ; timedatestring9 = ; if(hide_weekweek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;time-datestring10 = 0; /字符串末尾加 0 ,判断结束字符void
21、 timetostr(systemtime time) /将时,分,秒数据转换成液晶显示字符放到数组 timestring; if(hide_hourtimestring0 = timehour/10 + 0; timetimestring1 = timehour%10 + 0; else time-timestring0 = ; time-timestring1 = ;timetimestring2 = :; if(hide_min2) time-timestring3 = time-minute/10 + 0; timetimestring4 = timeminute10 + 0; els
22、e time-timestring3 = ; time-timestring4 = ; time-timestring5 = :; if(hide_sec2) time-timestring6 = timesecond/10 + 0; timetimestring7 = time-second10 + 0; else timetimestring6 = ; timetimestring7 = ; time-datestring8 = 0;void initial_ds1302(void) /时钟芯片初始化 unsigned char second=read1302(ds1302_second)
23、;if(second0x80) /判断时钟芯片是否关闭 write1302(0x8e,0x00); /写入允许write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55write1302(0x88,0x07);write1302(0x86,0x25);write1302(0x8a,0x07); /xingqiwrite1302(0x84,0x23);write1302(0x82,0x59);write1302(0x80,0x55);write1302(0x8e,0x80); /禁止写入/*ds18b20子程序*/*ds18b
24、20延迟子函数(晶振12mhz )*/ void delay_18b20(unsigned int i)while(i-);/*ds18b20初始化函数*/void init_ds18b20(void) unsigned char x=0; dq = 1; /dq复位 delay_18b20(8); /稍做延时 dq = 0; /单片机将dq拉低 delay_18b20(80); /精确延时 大于 480us dq = 1; /拉高总线 delay_18b20(14); x=dq; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18b20(20);/*ds18b20读一
25、个字节*/ unsigned char readonechar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) dq = 0; / 给脉冲信号 dat=1; /数据右移一位 dq = 1; / 给脉冲信号 if(dq) dat=0x80; /按位或,取最高位 delay_18b20(4); return(dat);/*ds18b20写一个字节*/ void writeonechar(uchar dat) unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; /取最低位 delay_18b
26、20(5); dq = 1; /上升沿将数据送入 dat=1; /*读取ds18b20当前温度*/void readtemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;init_ds18b20();writeonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); / 启动温度转换delay_18b20(100); / this message is wery importantinit_ds18b20();writeonechar(0xcc); /跳过读序号列号的操作writeon
27、echar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18b20(100);a=readonechar(); /读取温度值低位b=readonechar(); /读取温度值高位temp_value=b4;/取温度值的地位的高四位,右移四位后与温度的高四位相加得到温度值 void temp_to_str() /温度数据转换成液晶字符显示 tempbuffer0=temp_value/10+0; /十位 tempbuffer1=temp_value10+0; /个位 tempbuffer2=0xdf; /温度符号 tempbuffer3=c; tempbuff
28、er4=0;void delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+);/*延时子程序*/void mdelay(uint delay)uint i; for(;delay0;delay-) for(i=0;i0x23) /超过23小时,清零 temp=0; break; case 4: temp=read1302(ds1302_week); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp0x7) temp=1; break; case 5:
29、 temp=read1302(ds1302_day); /读取日数 temp=temp+1; /日数加1 up_flag=1; if(temp0x31) temp=1; break; case 6: temp=read1302(ds1302_month); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp0x12) temp=1; break; case 7: temp=read1302(ds1302_year); /读取年数 temp=temp+1; /年数加1 up_flag=1; if(temp0x85) temp=0; break; default:break; while(up=0); /while(wireless_2=1); /void downkey()/降序按键 down=1; if(down=0)/if(down=0|wireless_3=1) mdelay(8); switch(count) case 1: temp=read1302(ds1302_second); /读取秒数 temp=temp1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学检验技术课本课件
- 百胜餐饮培训体系
- 2025年国际汉语教师证书(CTCSOL)笔试模拟试卷:教学理论与实践应用研究
- 大学法语(初级)2025年期末考试词汇语法与听力同步提升试卷
- 北京市第十二中学2024-2025学年高一上学期期中数学试题(无答案)
- 护理传承与创新
- 高考数学一轮复习 专题11.5 离散型随机变量的分布列(练)
- 2025年医保知识考试题库及答案:医保谈判药品管理相关法规与标准测试试题
- 2025年小升初数学几何阶段解题技巧试卷
- java三目运算面试题及答案
- 旅游经济专业知识和实务经济师考试(中级)试卷及解答参考(2025年)
- 2024年吉林省长春市中考地理试卷(含答案与解析)
- 基于平衡计分卡绩效管理研究-以青岛啤酒为例
- 路基土石方施工作业指导书
- 方山县赤坚岭至刘家坡村段、横泉水库至东坡村段防洪能力提升工程环评报告书
- 一次性筷子购销合同
- AQ/T 1119-2023 煤矿井下人员定位系统通 用技术条件(正式版)
- 家庭护理服务劳务合同范本
- 幼儿园班级幼儿图书目录清单(大中小班)
- 四川省自贡市2023-2024学年八年级下学期期末数学试题
- 借用舞台布置设备协议
评论
0/150
提交评论