




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机的电子万年历设计毕业论文目 录第1章绪论61.1 课题产生背景及其意义61.2 电子万年历的研究现状与发展趋势61.3 本课题主要流程和论文章节安排71.4 小结7第2章课题设计方案选择82.1 单片机电子万年历系统概述82.2 单片机方案选择82.3 计时方案选择92.4 显示方案选择92.5 温度传感器方案选择102.6 按键方案选择102.7 报时方案选择102.8 课题设计流程说明112.9 小结11第3章软件设计部分123.1 模块化程序设计简介123.2 主程序流程描述123.2 各子程序设计133.2.1 DS1302时钟子程序143.2.2 LCD12864显示子程序153.2.3 DS18B20温度传感器子程序173.2.4 独立按键子程序183.2.5 阳历转阴历显示程序203.2.6 干支纪年子程序213.2.7 星期计算子程序213.2.8 延时子程序223.3 程序调试的常见问题说明223.4实验板仿真233.5 小结23第4章硬件设计部分244.1 硬件设计整体框架244.2 单片机最小系统设计244.3 外围电路设计254.3.1 温度传感器电路254.3.2 时钟电路254.3.3 按键电路与蜂鸣器电路264.3.4 12864显示电路264.4 小结27第5章结论285.1 课题成果285.1.1 焊接实物图展示285.1.2上电实物图展示285.2 可改进部分295.3 课题收获29致谢30参考文献31附录32第1章绪论1.1 课题产生背景及其意义上世纪九十年代以来,电子技术的发展势头强劲,它使得人类社会发生了深刻变革,并且到目前为止这种变革依然在迅猛发展,而半导体技术的发展使得摩尔定律所预言的发展周期越来越短,电子产品竞争激烈,产品更新速度更是让人应接不暇。各种各样的消费电子产品正以前所未有的速度占据千家万户的购物车。单片机技术自诞生之日起,就以它灵活的可编程特性,丰富的外围接口和越来越便捷可靠的可扩展功能赢得了电子产品开发人员的青睐。而多功能电子万年历就是依靠单片机实现的电子产品中最具代表性的一类。众所周知,在电子万年历大规模普及之前,人们曾靠月份牌、石英钟等计时工具来计时,这种方法显示内容单一,需要人为干预过多,可靠性不佳。一个可靠性好、计时准确、提供附加功能丰富的日历产品的需求使得多功能数字电子万年历应运而生。可以说,多功能数字电子万年历的产生便利了人们的生活,顺应了时代和技术的发展趋势,因此占领了市场,成为千万家庭不可或缺的生活必需品。可以肯定,未来万年历产品会集成更多的功能,以更实惠的价格走入更多人的生活。本课题的提出即是看到了上述趋势,采用典型的单片机为控制核心,结合外部传感器、时钟芯片、液晶显示,应用本科阶段所学知识完成一个多功能电子万年历的软硬件设计,实现可用的万年历产品。本课题拥有良好的可扩展性和发挥余地,能很好地锻炼设计者的软件编程能力和硬件调试能力,从而起到毕业设计考察全面,又有应用价值的目的。1.2 电子万年历的研究现状与发展趋势应该说,数字电子万年历是一个成熟的产品。市场上拥有的附加功能多样、交互性极佳的万年历产品不计其数。比如纯数码管构成的万年历,简洁可靠;传统石英钟样式的万年历,保留传统又提供了多种附加功能;动态年画风格的万年历产品,兼具年画的美观、体现万年历的大气。这些产品都用到了各种电子芯片,基于FPGA、基于DSP芯片、单片机为控制核心的以及专用集成电路设计的。综合考量成本,市场总能够找到一种性价比合适,利润可观的方案进行设计。因为需求,所以倒逼研发,万年历的产品发展速度较快。国内外对这些方面的研究相对成熟。这使得其稳定性和实用性都大大提高,电子万年历也发展为由原来只能实现基本时钟功能到现在市面上集实用性和娱乐性于一体的普通消费电子产品。当今市场上的数字电子万年历几乎都采用了集成度极高的专用芯片,这能在降低设计难度的同时也大大缩短了生产周期。今后,随着单片机技术和高性能高精度石英技术的发展,数字电子万年历的体积将在需要时进一步缩小,可靠性进一步提高、维护更简单,并响应时代号召,变得更加高效节能。更多的,将来随着物联网技术的发展,远程控制、网络对时,以及记忆用户操作习惯的深交互操作也未必不可能实现。1.3 本课题主要流程和论文章节安排课题主要目的是设计出实用的数字电子万年历,主要围绕单片机进行单片机系统的外围电路设计,诸如复位电路部分的设计、时钟部分的设计、按键部分设计、报时部分的设计、显示电路部分的设计,以及实现各个模块各项功能而编写的c语言程序设计等。力求详细完整,使具有基本电子知识基础者能够依靠本文做出电子万年历。按照课题进展过程安排的论文主要章节如下:第一章:阐明本课题的产生背景及其意义,并对数字电子万年历系统的研究现状与发展趋势做了相应的讨论,最后按课题实际流程介绍各章节基本内容安排。第二章:主要介绍单片机电子万年历的系统构成,各模块的选型问题,并讨论了最终采用的数字万年历系统的方案与其他可用方案的优缺点比较,从而理论上确定本课题采用的电子万年历设计方案。此外,本章还就本课题的实际设计流程做了说明。第三章:介绍了单片机电子万年历的程序设计部分,包括基于开发板的仿真,必要算法的研究与选择,详细描述了程序设计中遇到的问题和解决的方案。第四章:主要介绍了各个外围主要模块的相关知识和特性以及各个外围电路的设计。包括原理图的画法,焊接过程遇到的问题和解决方案。第五章:成果展示与课题收获,可改进与提高之处。注:每章附有相应章节的心得体会,以便对各个章节做出必要的总结,能够使设计过程更加完整。1.4 小结在单片机数字电子万年历的设计过程之初,本人深知这是一个成熟的课题。市面上研究成果无数,各种方案应有尽有。因此把课题设计得有独创性是很难的。通过本课题,能够熟悉单片机、提高c语言编程能力、熟练使用某些传感器、对单片机基本功能和某些协议有更好的理解,独立完成课题全部任务,便是有意义的目标。因此直到最终实物成型,这样的过程对自己还是很有益的第2章课题设计方案选择2.1 单片机电子万年历系统概述本系统采用国产价廉且性能够用的STC89C52作为主要控制芯片;采用DS1302时钟芯片获得精确的时钟数据;通过默认精度DS18B20温度传感器测量室温;通过液晶LCM12864显示万年历数据,年月日时分秒周、农历、干支纪年、闹钟和温度同时显示在12864液晶屏上;以四个独立按键作为万年历调时输入,四个按键分别起到选择、加减和确认功能;通过蜂鸣器电路实现整点和半点报时,蜂鸣器也同时具有闹钟的闹铃功能。系统框架如下2.1图所示:图2-1 系统总体框图2.2 单片机方案选择单片机是单片机电子万年历系统的核心,采用什么样的单片机,对编程和硬件电路的设计影响极大。本课题最终确定使用51系列单片机STC89C52,这款单片机显然不是性能最好或者说最适合做万年历产品的单片机,如果万年历产品商用,51单片机也不是首选。但针对本课题,由于51系列单片机与所学知识结合紧密,所以能够轻松入手,愉快编程,尽管它存在一些缺点,本课题还是采用了STC89C52。2.3 计时方案选择单片机控制电子万年历的计时方案选择对系统性能有重要影响,其方案选择直接影响时间数据的精度和稳定性,对资源占用情况也各不相同。已知可选方案有如下两种。方案一:纯软件设计方法。利用51单片机的两个定时器资源,通过写程序实现。定时器产生1s中断,产生60次中断为一分钟,分钟变量加一;分钟变量遇60归零,同时给小时变量加一,以此类推,一直到年变量。此方案缺点显著。假设使用定时器的16位工作方式,由于每次中断都需要重装初值,重装初值占用两条c语句的时间,该时间产生的累计误差较大;即便使用8位自动重装方式,由于中断服务子程序占用一定时间,使每次定时溢出并不总是发生在前一次中断服务子程序结束之时,同样会产生累计误差。此外,由于软件计时,存在断电数据丢失的问题,每次重新打开单片机系统,计时就要重新开始。方案二:将单片机只做控制器使用,计时由专用时钟芯片完成。本方案采用Dallas 公司的专用串行时钟芯片DS1302实现。DS1302精确度很高,误差小于10ms/年;可直接读取时间数据,包括年月日时分秒等,模块化程度高,编程实现容易。在外加电源甚至是电容的情况下,可在断电条件下工作,单片机断电后仍然保持时钟数据正常走时,外加3v纽扣电池甚至可运行一年。此外,该芯片封装为双列直插8引脚,小巧且价格亲民。由于两方案对比优缺点明显,故本次电子万年历毫无意外地选择了DS1302.2.4显示方案选择方案一:数码管显示。做电子时钟,数码管肯定是首先被考虑的方案,但对于多功能电子万年历来说,数码管显然不具备显示阴历和天干地支等功能,考虑显示汉字问题,数码管方案不可行。方案二:液晶LCD1602显示方案,1602液晶既能显示时钟也能显示汉字,满足了数字电子万年历对附加功能的需要。同时,它耗电量小,体积小,重量轻,显示界面友好,显示信息丰富,美观的外形也使得该方案值得选择。但1602一屏不能完全显示数字电子万年历的全部功能,强行在一屏显示会使文字和数字略显拥挤。分两屏显示或者设置按键切换显示又使得万年历的操作略感复杂。方案三:液晶LCD12864显示方案,12864兼具1602的优点,功耗低,显示界面友好,价格可以接受,显示信息更加丰富,美观大气,而其带字库的类型使汉字显示变得更加方便,编程操作简单。一屏恰好将本课题基本功能和附加功能完美呈现,因此,12864显示方案脱颖而出。2.5温度传感器方案选择方案一:热敏电阻方案。该方案成本很低,但热敏电阻输出电压,需要将电压数据进行分析,再转换为温度,且温度测量结果精确度不高。另外,热敏电阻方案的外围电路复杂,编程也不容易,显示温度范围受热敏电阻本身特性影响,误差较大。方案二:数字测温芯片DS18B20。可以说,DS18B20在温度传感器领域应用广泛,其良好可靠的性能得到业内公认。目前为止,性价比如它的温度传感器并不多见。DS18B20抗干扰能力强;精度可调,从0.0625到0.5摄氏度不等,且测温范围由-55摄氏度到125摄氏度;此外还拥有温度报警功能。DS18B20通过单总线协议与单片机通信,同一条线上可挂多个芯片,可扩展性好。由于是数字芯片,编程相对简单。因此,本课题采用DS18B20作为温度传感器。2.6按键方案选择方案一:矩阵键盘方案。如果数字电子万年历的每一个调节位使用一个单独的按键,那么将有13个按键之多,这样看来,矩阵键盘似乎是首选。但矩阵键盘要求单片机不停扫描按键端口,一定程度上占用资源较多。另外,13个按键的万年历看起来过于复杂,也不够美观。方案二:独立按键方案。独立按键相对矩阵键盘来说,减少了资源占用,但是要求单个按键要功能复用。这样的复用软件设计并不困难,复用后减少了硬件电路,使得交互键盘看起来简洁大方。故,本课题采用四按键独立键盘,分别为换调节位按键、增按键、减按键、确认按键。2.7 报时方案选择报时方案根据扬声器的类型大体也有两种方案一:扬声器方案。录制特定的音乐实现报时和闹钟。最初考虑使用该方案能使万年历产品更加人性化,更接近商用产品。但扬声器方案功耗相对较大,且发声程序要占用51单片机的有限ROM,同时播放音乐过程中不得不占用cpu,可能导致程序无法正常工作。因此华而不实的扬声器方案不可行。方案二:有源蜂鸣器方案。蜂鸣器分两种,有源和无源。无源蜂鸣器需要一定频率方波驱动,而有源蜂鸣器给电即会发声。显然有源蜂鸣器能使编程简洁,在主程序大循环中设置时间标志即可完成定时和报警声。因此本课题采用了这个方案。2.8 课题设计流程说明本课题设计过程为:查资料确定元器件选型模块化编程实验板烧写程序并测试Protues画实物原理图并仿真(最终未仿真)实物焊接完成。 由于实验板能很好的模拟系统运行情况,相当于硬件仿真,且接口与最终成型实物完全一致,避免了protues仿真中因元件引脚分布不同导致的最终焊接布线困难的问题。由于硬件电路简单,不采用PCB制板,仅依靠原理图即可在万用板上完成焊接。2.9小结本章属于元件的选型,可以看出,选的以数字芯片居多,这样力求硬件电路简单,使我能把本课题的主要精力放在编程上。事实也说明,编程和软件调试在整个毕设过程中占用了最长时间,而前期合适的选型也使得硬件电路的焊接和调试仅仅用了三天时间。第3章软件设计部分3.1模块化程序设计简介简单说,模块化程序设计是一种优良的编程方法。它是相对传统的逐条程序输入或者说把所有程序写在一个文件中的做法而言,具有更好的可维护性,降低了程序复杂度,使得编程变得简单,具有很高的可移植性。它把程序分为主程序和子程序,主程序仅用来描述流程,程序主要功能则分为子模块,各个子模块编程封装成子程序提供给主程序调用。子程序可以写在不同的文件中。子程序仅仅对外提供全局变量、要被调用的函数名称和必要的接口信息,也只有这些信息对主程序可见,这样子程序相当于黑盒模式。模块化编程也便于分工合作,在较大程序中应用能提高编程的效率。本课题即采用了这种方法,主程序完成主要流程,子程序负责各个功能模块的实现。3.2主程序流程描述按键读取时间温度扫描按键修改变量报时功能阳历转阴历、干支初始化显示输出结束主程序流程图描述如下图3.1所示NY图3-1 主程序流程图单片机复位后,主程序开始执行。首先进行初始化,对12864和DS1302初始化。然后进入大循环,循环内部首先从DS1302中读取时间数据(包括年月日时分秒)和从DS18B20中读取温度数据。再利用阴阳历转换函数转换出阴历数据,送给12864显示RAM相应位置,利用星期计算子函数得出星期送给12864显示RAM相应位置,利用干支纪年法计算公式将当前干支年份送个12864显示RAM相应位置。接下来扫描按键,如果按键被按下,调整变量并将调整后的数据读入DS1302同时调整后的数据也送给12864显示RAM相应位置。循环不断进行,保持万年历时钟显示。值得注意的是,大循环完成一次的时间应小于1s,这样秒数据变化才能显示出来,如果循环内cpu完成的操作过多,以至于超出1s,秒位数据变化就会跳变。另外一点,大循环内的各个模块先后顺序可以适当调整。3.2 各子程序设计本节将详细介绍各个子程序设计调试过程,包括出现的一些问题和相应解决方案。其中按照模块化编程方法,要单独写.c子程序文件和相应.h头文件,头文件中只需描述对外的接口、需要调用的函数以及某些外部声明的函数。主函数中只要包含相应的子程序的头文件,即可实现调用。值得注意的是,为了防止重复包含造成的编译错误,习惯上在头文件格式为如下程序:#ifndef _XXXX_H_#define _XXXX_H_#endif3.2.1DS1302时钟子程序DS1302的操作方法应严格按照其数据手册中说明的时序进行。这里涉及到重要的一点就是时序的理解,也称为传输协议,在时钟同步的前提下,按照器件的通信协议,可以对器件进行相应的操作。用c语言编程,能够很容易地将各个模块程序封装成对应的子函数。DS1302具有两种读写模式,字节模式和突发模式。本课题采用single byte transfer模式进行传输,每个操作命令以字节为单位,每次读写数据前先写控制命令。DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,BCD码转转十进制才能直接使用,否则会出现数据错误。课题用到的7个相关寄存器、读写控制字以及寄存器数据范围见表3-1(图表来源于数据手册)。图3-2 主要寄存器及读写命令由上表可知,各个寄存器的操作命令,读写由最后以为决定,而数据范围由右侧可见。其中年份为00-99,基于此,本课题电子万年历可显示时间定为2000年到2099年。其实在此处也可以跨世纪显示,即软件定义溢出操作。值得注意的是,星期并不能通过读取DS1302来得到,需要软件采用某种算法得出。 本次软件设计中,将时间数据年月日时分秒六位写到数组time_buf1中,该数组也具有时钟初始化功能,即通过设置time_buf1的2到6位来定义上电复位后显示的年月日时分秒。3.2.2 LCD12864显示子程序12864液晶分为带字库型和不带字库型两种。不带字库液晶实际上可理解为点阵,通过绘制“点阵”中的点来“画出”需要的汉字。需要用到多少种汉字就“画”多少种汉字。而带字库点阵是将常见的8000多个汉字做成一个固定的汉字表放在12864的存储器中,当需要用某一个汉字时,采用查表法获得这个汉字。同时,带字库12864也可以自己绘制“汉字”,显示ASCII码。显然,带字库液晶能使显示更方便。带字库LCD12864(以下默认简称12864)每个汉字占16x16点阵,12864能显示4行,每行显示8个汉字。12864同样有两种操作方法,串行和并行。本课题选择了并行方法。同样,12864的操作方法也是根据厂商提供的数据手册里提供的时序图严格操作,分清写入命令和写入数据,即可使12864显示出所需要的东西。12864操作时序(以写资料到12864中为例)如下图3.2所示:图3-3写数据或命令到12864时序图之所以称为写资料,是因为可写入的资料包括数据和命令两类,写命令和写数据不同,要严格按照数据手册中规定的方式操作。比如上图写资料到12864中,其中RS、R/W、E为12864引脚,采用并行模式,RS先置为1,同时R/W置,延时Tas后使能引脚E置为1,持续Tpm时间,同时数据位DB0到DB7在E置1时延时Tr时间后传输。这样完成一次写入。以上延时时间典型值需参考数据手册,因厂商不同可能略有不同。需要说明的是,如果将带字库12864的每一行分为16个位置,要特定位置显示一个符号,那么汉字只能出现在偶奇位置,而不能出现在奇偶位置,比如说第0和第1两位显示一个汉字可以,但是第1和第2两位无法通过查表的方法显示一个汉字。同样查表法读ASCII码时,虽然某个符号如阿拉伯数字“1”占用1/16个位置,但是依然服从汉字的规则,只能出现在偶奇位置,其中奇数位置什么也不显示。这是由于带字库12864对显示RAM的地址分配引起的。显示RAM地址分配如下表3-2所示:表3-1 带字库12864显示RAM地址由上表知,通过查表法进行单字符或者汉字的显示总是出现在显示RAM任一地址上。这样,要想实现任意字符或汉字显示在任意一个或两个字符位置,就要使用其他方法。本课题采用的方法是整行赋值,即使一行只改变一个字符,也要对整行进行重新扫描,进而获得一个字符的变化,当然这样做的带来的不可避免的缺点是扫描时间有所延长。12864中本课题应用的主要函数是单行扫描函数,比如用下述函数实现第一行的扫描:void dplay1(void)int i;12864Writecommand(0x80,1);for(i=0;i16;i+)12864WriteData(str1i);先写输入字符要显示的位置,从0x80开始,显示在第一行,然后循环16次,将str1数组中的值依次输出在相应位置,连续两个字符宽度显示一个汉字。每次只需改变str1数组的值(注意此值不是汉字或者ASCII码的查表坐标,而是相应的ASCII型的字符),赋值方法可以是str1=“2014年6月4日7度”,而要改变的数字则给某个数组元素赋值再把数组放在特定行扫描即可。其中,12864Writecommand和12864WriteData分别为写命令和写数据函数,依据12864操作时序如上图3.2封装而成。掌握了12864的字符显示,单片机万年历的显示部分工作就基本完成了。3.2.3DS18B20温度传感器子程序温度传感器DS18B20内部有低温系数晶体振荡器和高温系数晶体振荡器,其计数值给两个计数器,计数器处理后给温度寄存器。详细原理有请参考18B20数据手册。温度传感器通过单总线协议通信,即通过DQ数据端进行输入输出控制。本课题只用到一个DS18B20,且使用默认精度,即四位小数,没个小数位表示0.0625摄氏度,每完成一次温度转换耗时为750ms。默认精度由12位数据格式表示,占两个字节,两字节中高4位表示为符号位,负值采用补码形式表示,数据输出处理需要把补码转换。其数据字节定义如下图3-3所示:图3-4 温度传感器数据字节定义考虑到电子万年历的显示精度往往到1摄氏度即可,因此温度传感器子程序将后四位小数部分进行了四位右移,并未考虑四舍五入进位问题,因此最终程序有1摄氏度左右的误差。温度传感器主要函数如下:unsigned int Readwendu(void) unsigned char a=0;unsigned int b=0,m=0;Init_DS18B20();Writeonechar(0xCC); / 跳过读取序号列号的操作Writeonechar(0x44); / 启动温度转换DelayMs(10);Init_DS18B20();Writeonechar(0xCC); /跳过读取序号列号的操作Writeonechar(0xBE); /读取温度寄存器(共9个)中前两个温度寄存器a=Readonechar(); /先读低位b=Readonechar(); /再读高位b=8; m=a+b; /高低位组合为一个无符号整形数据return(m);此函数将被主函数反复调用,用来获得室温。其中读取字节、初始化等程序均依据元件手册中相应操作时序定义并封装成相应子函数。3.2.4 独立按键子程序本课题采用四个独立按键,四个独立按键为轻触开关,功能分别为选择调整位K1、加一K2、减一K3、确认K4。需要调整的位包括年、月、日、时、分、秒、闹钟开关、闹钟的时、分、秒共10位。这就要求调整位的判断依赖某个计数值,通过判断计数值来确定调整位。也就是按一下,计数为1,再按计数为2,以此类推。计数值程序如下:void key_count()State_Set=1;if(State_Set=0) DelayMs(2);while(State_Set=0)if(count=11)count=0;else count+; break;while(State_Set=0); /松手检测逻辑其中,选择调整位K1定义为State_Set,首句“State_Set=1”,表示要读取该位先写入1,这是考虑到单片机准双向口的要读先写特性。每次按下K1,检测K1是否为0,为0则增加计数。需要说明的按键部分关键问题是按键的消抖,消抖一般有两种方法。一种是判断延时再判断,即先判断键值,延时数毫秒后再判断键值,两次判断一致就认为已消除抖动,这种方法在本课题中难以应用,不仅是因为延时时间难以把握,更重要的是本课题程序循环时间较长,有可能按键按下了但主程序没走到此处,这样按键就不得不一直处于按下状态,一直处于按下状态又存在重复计数而不能走到正确的调整位的问题。另一种方法是松手检测方法,即没有松手时程序停止等待,松手后程序跳出按键程序,“while(State_Set=0);”表示按下的0状态等待,1状态跳出,这样就解决了重复计数和忽视计数的问题。需要在每个按键程序中都加入松手检测语句。按键加减和确认与此函数相似,不再赘述。对于调整位某一位调整的方法,以调整年为例。相应子函数如下:void set_year() uchar temp;Ds1302_Read_Time();dotemp=time_buf11; temp=key_up(temp,99,0);temp=key_down(temp,99,0);temp=(temp/10)4)+(temp)%10);DelayMs(30);Ds1302_Write_Byte(0x8e,0x00); /写入允许Ds1302_Write_Byte(0x8c,temp); /写入新的年数Ds1302_Write_Byte(0x8e,0x80); /禁止写入Ds1302_Read_Time();str1fuzhi(); /此条保证闪烁调整时间时时间在变化dplay1();DelayMs(500);str1fzkongy();dplay1();DelayMs(500);key_sure();key_count();while(count=1);上述程序流程为读取时钟芯片时间数据,然后将改变后的年数值写入DS1302,在显示即可。为了获得调整位显示时更好的可视化效果。调整某位时,为了让某位闪烁,需要改变显示数组str的值,不断扫描,直到调整程序退出时不再闪烁。即上述程序中“str1fuzhi();”完成赋值,“dplay1();”完成第一行显示,再通过“str1fzkongy();”和“dpaly1();”完成第一行空下年数据所在位置的显示,如此循环,调整的年位出现了闪烁的效果。需要说明的是,考虑到调整各位这一过程并不需要时分秒实时变化,因此当进入按键状态时,除需要闪烁的相关位置变化外,其他数值不变。闹钟和整点报时功能此时也是无效的。3.2.5 阳历转阴历显示程序阴历转阳历的算法问题,可以说是单片机设计电子万年历中较难的问题。阴历,即农历是诞生于我国古代延续至今的一种计时方法,该方法以对天体运行的观测为依据制定历法,每个月29天或30天,通过设置闰月的方法使阴历年与公历年保持相对稳定,每两三年加入一个闰月,而闰月在几月,每月多少天,均有实际天文观测确定,无明显规律可循。阳历转阴历的程序,最直接的算法是特定公式来推导。但是阳历转阴历的公式涉及天文学,算法极其复杂,51单片机不能胜任。因此实际上大部分万年历采用了查表法来实现阴阳历转换。这就使万年历显示的时间不可能是无限的,依据表的范围确定。本课题也采用了查表法,涉及的阴阳历转换时间为2000年到2099年这一百年时间。本部分查表法输出为月日信息,纪年信息由于算法简单故单列子程序。月日信息数据表数据结构为每年数据占用三个字节。数据结构如下表3-3所示:表3-2 农历信息数据表结构闰月月份信息BIT3BIT2BIT1BIT0BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0BIT7春节阳历月份信息春节阳历日期上表中第一个字节前两位为闰月信息,表明闰月在几月,0表示无闰月;第一个字节BIT3-BIT0、第二个字节BIT7-BIT0、第三个字节BIT7表示农历十三个月每月大小月信息,1表示该月有30天,0表示该月29天;第三个字节BIT6-BIT5,表示春节在哪个月;第三个字节BIT4-BIT0表示春节所在的阳历日期。表格数据来源于互联网,经过抽查验证证明该数据表是正确的。该部分子程序主要是对数据表的操作,输入农历年月日信息,输出农历年月信息。将转换后的信息赋值给显示数组,即可完成阴阳历转换对应的显示操作。3.2.6干支纪年子程序干支纪年是中国农历的纪年方法,用十天干“甲、乙、丙、丁、戊、己、庚、辛、壬、癸”和十二地支“子、丑、寅、卯、辰、巳、午、未、申、 酉、戌、亥”按特定规律组合搭配,形成从甲子到癸亥共60组词汇表示年份信息,即60年为一个循环,这就是通常人们所说的“六十年一个甲子”。干支纪年的规律很明显,有固定公式可以表达这种阳历年转阴历年的算法。天干算法为“(2000+当前年份(后两位)-3)%10-1”,所得为数字0-9,通过查询数组tiangan=甲乙丙丁戊已庚辛壬癸可得年干;地支算法为“(2000+当前年份(后两位)-3)%12-1”,所得数字为0-11,通过查询数组dizhi=子丑寅卯辰巳午未申酉戌亥可得年支。天干地支合并即可完成2000到2099年任意年对应的干支纪年信息。3.2.7 星期计算子程序由于DS1302不能直接读取星期数据,因此需要单独的算法计算星期信息。计算公历年某月某日是星期几的算法也有固定规律。如基姆拉尔森计算公式、蔡勒公式等。本程序采用蔡勒公式,蔡勒公式可以方便得计算出某天的星期情况。虽然泰勒公式的范围有限,只适合1582年10月15日之后的情形,但对本课题万年历设计范围来说,还是足够用的。蔡勒公式算法公式为:其中,w代表星期,输出0-6,通过给数组weektable=日一二三四五六赋值得到准确的星期数据;y为年(后两位);c为世纪-1(比如21世纪则c等于20);m为月,注意每年第一二月作为上一年第十三、十四月处理,即遇到一二月需要加12处理;d为日。3.2.8 延时子程序延时子程序为Ms级延时和us级延时。本程序中延时采用了软件延时方法,未采用定时器和中断,因为在12M晶振下,本系统能够正常工作,延时子程序的误差对万年历系统正常工作影响甚微。因此,程序中的延时为粗略延时,仅为满足功能。3.3程序调试的常见问题说明本课题程序编写和调试时间了一个月左右的时间,可以说程序设计是此次单片机万年历系统设计的重点。程序调试过程中,产生过各种各样的问题,其中大多数问题是一些小问题,比如防重复包含语句书写错误导致调用函数提示重新定义错误,比如某个符号的中英文切换导致的奇怪的错误等。以下说明一些比较重要的问题。第一,由于STC89C52单片机默认使用最小模式,变量默认为data格式,即变量存储在RAM的前128个字节,导致变量过多超出128个字节时报错,无法编译连接。解决办法是采用51单片机其他的模式,比如变量定义在idata区,即指定为间接寻址,使得可用RAM超出128字节,小于256字节;或者只读变量定义在ROM中也能节省宝贵的RAM空间。第二,c语言编程的特殊性导致的错误。c语言是高级语言,编程具有可移植性高,编程简单,不用考虑底层寄存器细节等优点,但是keil等编译软件最终仍然要完成把高级语言通过编译器编译成机器语言的过程。个别c语句逻辑正确语法无误,但是不实现功能。问题可能就出在编译后与硬件脱节上。比如,闹钟程序要判断一个较长的逻辑,语句“if(al_sec=time_buf16)&(al_hour=time_buf14)&(al_min=time_buf15)&alarm)”,该条程序逻辑正确,但是闹钟不响。原因就在于当闹钟的秒时间到时,判断语句不能马上判断出,秒时间过去后,再判断出的条件已经不具备了。因此,本条语句要改成先判断秒位,如果秒位为所定时间,那么再判断其他逻辑的与。第三,cpu占用问题。最初我把闹钟和整点半点报时的程序写得过长,每次报时时cpu就得去执行驱动蜂鸣器的程序,这时cpu被占用,12864扫描不能继续,导致报时结束后才接着显示,造成数秒内时间卡住不动的情形。经过反复修改,最终学会,可以通过设置时间标志的方法来解放cpu的占用。比如闹钟该响时,给时间标志赋值,然后根据时间标志驱动蜂鸣器。第四,keil软件提示不准确,有警告。错误提示可以用来修改程序,但某些错误较多甚至大片错误往往是由于某些小错误造成的,比如“”的中英文字符,忘记了一个大括号等。警告并不一定会影响最终程序运行,但是即便无警告无错误,也只能保证程序无语法问题。所以把警告也改完,读懂每个警告,有助于消除某些后续可能出现的错误,保证功能的正确实现,使程序设计者更好把握程序设计过程。3.4实验板仿真程序仿真一般情况下采用英国的protues软件,但当protues软件中缺乏特定型号元件的仿真模型时,protues仿真就很难实现了。Protues支持自建封装和原理图模型,但是建立仿真模型与前者不同,自建封装或者原理图只不过是“画”一个像某个元件的元件,而仿真模型简历要求输入输出程序,往往涉及到高级语言编程。而本课题设计中采用了带中文字库12864,带字库12864仿真模型在protues官网和12864厂商网站均不提供,因此无法用protues仿真,本课题的仿真应用的是单片机实验板。实验板更接近硬件仿真,可以说在实验板上程序通过了,将来焊接成品就有了一定的保证。实验板仿真效果如图3-5所示:图3-5 开发板仿真效果图3.5 小结本章主要介绍了单片机电子万年历的程序设计,给出了自己程序设计和调试过程中遇到的问题和解决的方案。程序设计耗时最长,收获也最丰富。遇到问题解决问题的过程就是提高的过程。其中,阴阳历转换程序相对较难,最终从互联网上找到一张数据表和操作方法,否则这部分将无法完成。一个成熟的产品,多阅读文献,多参考前人的做法,会使程序设计中某些问题便于解决。而C语言的好处更在于这种天然的可移植性。第4章硬件设计部分4.1硬件设计整体框架由于本课题较成熟,难度适中,焊接也较方便,因此采用9x15万用板焊接,既锻炼了动手能力,也避免了画pcb板图和交给厂家制作这些不必要的过程。整体框架如图4-1:STC89C52单片机晶振与复位电路蜂鸣器驱动电路DS18B20测温电路DS1302时钟芯片12864显示电路按键电路图4-1 单片机电子万年历系统整体框架4.2单片机最小系统设计单片机最小系统是单片机工作的必备条件。复位电路采用手动复位,晶振为12Mhz,典型晶振处电容30pF。电源和接地省略。连接图如下图4-2所示:图4-2 单片机最小系统4.3外围电路设计4.3.1温度传感器电路温度传感器接线图如下图4-3所示:图4-3 温度传感器电路4.3.2时钟电路DS1302时钟芯片为双列直插8引脚,其引脚需要接晶振32768hz,双电源供电,备用3v电源接VCC2,为单片机断电后时钟继续走提供条件。其典型外部电路如下图4-4所示:图4-4 时钟芯片连接电路4.3.3按键电路与蜂鸣器电路按键部分电路如下图4-5:图4-5 独立按键电路蜂鸣器不可以由单片机引脚直接驱动,单片机电流驱动能力不足,因此电路设计为三极管与蜂鸣器配合实现。电路如下图4-6:图4-6 蜂鸣器驱动电路4.3.4 12864显示电路12864与P0口连接,由于P0口为准双向口,所以外部接上拉排阻,然后接到12864。接法简单,不再赘述。4.4 小结电路焊接只用一天就完成了,期间最大的问题在于蜂鸣器最初未设置驱动电路。焊接完成后烧写程序直接可用,这说明,数字电路的可靠性较高。焊接中发生的问题在于焊锡丝质量较差,而电烙铁功率在30w,导致焊锡丝不能完全融化,焊点不够美观。第5章结论5.1课题成果5.1.1 焊接实物图展示实物焊接在15x9的万用板上,简单布局如下图所示,其中右侧按键依次是复位、调整、加一、减一、确认按钮。下图分别附上接液晶前后的实物图。图5-1 实物图正面(未接液晶)图5-2 实物图正面(接液晶)5.1.2上电实物图展示万年历第一行显示年月日和温度信息;第二行显示时分秒和星期;第三行显示农历干支纪年和农历月日信息;第四行显示闹钟。正点和半点蜂鸣器发声报时。如下图所示。图5.4 上电万年历展示5.2 可改进部分本课题虽然实现了万年历的基本功能,但是仍然有些小问题没有解决。比如按键扫描时候单个按键不够灵敏,不能按下去马上有反应,如果这样的产品商用,一定是失败的。如果让扫描速度更快,按键反映更灵敏,效果将更好。其次,加一减一对调节60秒或者60分钟来说要按键60次,显然太麻烦了,有必要改成按下去不松手能快速增减。第三蜂鸣器报时是简单的发声示意,如果能播放音乐,将更人性化。再者,温度增减并未设置报警功能,可以加入报警功能。其他可以改善的地方即是优化程序,降低功耗。这样,对于单片机万年历这个课题,将有更好的结果。5.3 课题收获通过本次毕业设计,对通信协议、c语言单片机编程、keil调试、protues仿真等常用软件和方法有了一定了解,锻炼了自己的基本实践能力,对所学知识有了更感性的认识。做一个成功的产品是不容易的,软件类的看不出成果的产品更甚。完整的毕设过程,使自己学会了如何去查阅资料,怎么查资料,为什么查资料;学会了如何去学习,如何去读书,如何去更快地学会实践性强的东西。单片机电子万年历这个课题很成熟,自己做的过程中也体会到前人开创性成果取得的不易。今后的学习科研都要以这样的方法和心态去学习,争取能在软硬件设计方面做出一定的成果。致谢经过近一个学期的工作,收集资料、读书学习、编写和调试程序、焊接实物到最后论文写作,一个圆满的大学生活即将结束了。在我的毕业设计终于进入尾声之时,有很多的话要说。首先,感谢我的毕业设计指导老师徐利娜老师的支持和信任,她给了我充分的自由时间,让我不至于因为压力而对毕业设计敷衍了事,让我能有时间学习自己喜欢的东西,从而对自己培养独立的学习精神大有裨益。在毕业设计的整个过程中,对曾今教过我单片机、c语言、数字电路的老师们倍感谢意,至今回想起他们的某些话,深感这些学习方法的重要,比如从数据手册和元件手册来学习元件,从操作时序来理解通信协议,从实际应用中提高自己知识水平,从编程实践中提高编程水平等等。在此,还要感谢在互联网上提供各种问题解决方案的不知名前辈们,当我遇到简单的甚至某些低级问题的时候,点开搜索引擎,总能找到一些有意义的启示。大学四年,我为自己是通信人而骄傲,感谢每一个关心和信任我的同学老师,一个完整的毕业设计,离不开所有这些人的支持。最后,再次感谢我的毕设老师,衷心感谢评阅论文和参与答辩的专家、教授。参考文献1 郭天祥. 新概念51单片机C语言教程 电子工业出版社,20092 谭浩强C程序设计(第二版)清华大学出版社,19993 肖炎根,舒望 基于实时钟芯片的电子万年历的设计.电子技术,20074 阎石. 数字电子技术基础(第五版). 清华大学出版社,19835 何立明单片机高级教程应用与设计.北京:北京航天航空大学出版社,20006 林志奇,郎建军,李会杰.基于Proteus的单片机可视化软硬件仿真M.北京:北京航空航天大学出版社,20067 靳达.单片机应用系统开发实例导航M. 北京:人民邮电出版社,20038 刘彦华,邢鹏康. 数字技术与应用.基于AT89S51单片机的万年历设计与实现天津市电子仪表信息研究所.20109 周民标.适用于51系列单片机的一种万年历优化算法.北京:电子世界,200210V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerandThermoelectricModulesBasedonthePeltierEffectJ,200211 Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriersJ. TQM Journal. 2008附 录源程序清单1、主程序#include#include ds1302.h#include delay.h#include 12864.h#include 18b20.h#include ganzhi.h#include zhuanhuan.h#incl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离谱医生考试题及答案
- 课件显示作图过程
- 2025年中国拔罐器数据监测报告
- 客服管家考试题及答案
- 绞盘机司机数字化技能考核试卷及答案
- 井矿盐制盐工专项考核试卷及答案
- 多维地理信息采集员知识考核试卷及答案
- 旅游团队领队晋升考核试卷及答案
- 静脉抽血考试题及答案
- 河北石家庄市42中7年级下册数学期末考试专项练习试题(含答案解析)
- 情侣自愿转账赠与协议书范本
- 光伏组件回收再利用建设项目可行性研究报告写作模板-拿地申报
- 舞蹈培训机构用工合同
- 自检自查表范表
- 高空蜘蛛人施工专项施工方案
- 游泳池水循环净化项目方案
- 幕墙工程-技术标
- (2024年)医疗法律法规知识培训课件
- 降低留置针卷边品管圈课件
- 部编语文四年级上册教材解读与集体备课
- 4s店装修合同范本正规范本(通用版)
评论
0/150
提交评论