课程设计电子万历DSC+温度B+LCD显示+闹钟(共26页).doc
精选优质文档-倾情为你奉上西南科技大学电子专业综合设计报告设计名称: 基于单片机的多功能电子万年历系统设计姓 名: 学 号: 班 级: 指导教师: 起止日期: 西南科技大学信息工程学院制专心-专注-专业综 合 设 计 任 务 书学生班级: 学生姓名: 学号: 设计名称: 基于单片机的多功能电子万年历系统设计 起止日期: 指导教师: 设计要求:基本要求:1.查阅有关资料,掌握单总线的基本通信协议及C语言的编程方法;2.用STC89C52微控制器控制DS12CR887和DS18B20的工作方式,完成多功能电子万年历系统的设计,显示部分采用LCD12864。要求日期可显示农历,并能提示农历节日和阳历节日;要求电子万年历具有闹钟功能并能实时显示当前环境温度;3.对系统的工作的可靠性进和稳定性行分析,得出结论;4.撰写设计报告。综 合 设 计 学 生 日 志时间设计内容2013.11.23熟悉题目,对研究题目做分析,具体划分为几个模块2013.11.24LCD12864显示屏的显示模块的实现2013.11.25DS18B20温度传感器模块的研究2013.11.26对DS18B20和LCD12864联合设计温度显示系统2013.11.27阅读DS12CR887的数据手册,了解芯片的功能实现2013.11.28根据DS12CR887数据手册完成基本的驱动程序2013.11.30在C52单片机最小系统的的基础上搭建电子万年历硬件系统,完成芯片焊接及连线2013.12.1上网查阅阳历转换阴历的相关算法2013.12.2完成阳历转换阴历相关算法在单片机的程序设计以及节日的显示程序2013.12.3设计程序实现在LCD12864上显示时间,日期,农历,节日,温度等功能2013.12.4完成闹钟程序设计2013.12.5调试硬件系统和软件系统解决系统BUG2013.12.6完成课程设计报告基于单片机的多功能电子万年历系统设计摘要:电子万年历是一种通过STC52C89RC单片机编程来对不同电子芯片件进行控制、执行、数据读取、和读取的数据结果的显示的电子产品。其主要功能是显示公历日期、农历日期、当前时间、节假日显示、闹钟和实时温度等许多功能,并能够进行时间的调节和设定闹钟。电子万年历广泛应用于各种公共场所、商业场合和居民家庭。由于其走时准确、误差极小、外观时尚等特点受到了广泛的欢迎。我的设计就是用目前我们掌握的相关知识,如:单片机、模拟电路、数字电路等,进行一个简单电子万年历的设计和开发调试。关键词: 单片机;温度测量;实时时钟MCU-based design of electronic calendar systemAbstract: Electronic calendar is a kind of by STC52C89RC micro-controller programming for different electronic chip control, execution, read data, and display the data according to the results of electronic products.Its main function is to show the real-time calendar date, date of the lunar calendar, the current time, holiday, alarm clock and many functions such as real-time temperature, and adjust time and set the alarm clock. Electronic calendar is widely used in various public places, business and households.Walking because of its characteristics such as accurate, little error, fashion appearance was widely welcomed.My design is using at the moment we grasp the relevant knowledge, such as MCU, analog circuit, digital circuit, etc., for a simple design and development of the electronic calendar debugging.Keywords: Micro controller, Temperature measurement, Real-time clock 目 录一 设计目的和意义1二 控制要求1三 方案设计与论证1 3.1 时钟芯片的选定1 3.2 温度芯片2 3.3 液晶显示屏3 3.3 主控芯片3四 系统设计3 4.1 系统框架3 4.2 系统具体模块设计4 4.2.1 单片机核心控制模块4 4.2.2 实时时钟电路模块4 4.2.3 数字温度传感器模块10 4.2.4 显示屏模块13 4.2.5 农历模块15 4.3 软件设计流程16五 设计结果及分析18 5.1 电路原理图18 5.2 软件调试18 5.2.1 软件调试过程18 5.3 硬件调试18结束语19参考文献20一、设计目的和意义随着电子技术的不断发展,单片机技术在设计中所体现在出来的优势越来越明显,它不仅是电子信息类专业的一个重要部分,而且在其它类专业工程中也是不可缺少的。广泛地应用于家电、工业过程控制、仪器仪表、智能武器、航空和空间飞行器等领域发展更是迅速,已成为新一代一些电子设备不可缺少的核心部件。目前世界上单片机年产量已达十多亿片,通常是当年微处理器产量的4-5倍以上。用最少的芯片就能实现最强大的功能。可以想见,这是将来电子产品的主流方向,它将无可置疑地一步步取代其它同类产品,其数量之大和应用面之广,是其它任何类型的计算机所无法比拟的。单片机是应工业测控需要而诞生的。它把计算机最基本的功能电路,如CPU、程序存储器、数据存储器、I/O接口、定时、计数器、中断系统等集成到一块芯片上,形成单片形态的计算机。单片机通常以最小系统运行,在家用电器中和常用的智能仪器仪表中常常可以“单片”工作,同时单片机在我们日常生活中也经常见到,如电子表、舞厅里的一些灯光的控制、一些招牌灯光的控制、工厂一些自动控制等。将来只要有自动控制方面的都会离不开单片机的开发和使用,对于现代的自动化控制起着举足轻重的作用。为了顺应形势发展的需要,我们学习了单片机课程,此次用液晶显示万年历和时间设置以及显示测温度的数据对单片机的学习起到了很好的巩固作用,尤其是对C语言程序的设计。二、 控制要求显示公历19012099年日历;能够显示公历日期对应的农历日期以及节假日显示;星期自动对应,闰年、大、小月份自动调整;采用24小时制;自动显示温度,温度显示精确到0.1;要求具有闹钟功能,在设定的闹钟时间点蜂鸣器响起;时钟精度小于等于正负0.2秒天;没有外接电源的情况下保持时钟运行十年以上;实现按键控制调时电子万年历的年、月、日、时、分、星期、以及24小时制时间显示、定时闹钟。三、设计方案论证3.1 时钟芯片的选定DS12CR887的功能简介:DS12CR887实时时钟芯片功能丰富,可以用来直接代替IBM-PC上的时钟日历芯片DS12887,同时,它的管脚也和MCB、DS12887相兼容(芯片引脚图如图1所示)。由于DS12CR887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12CR887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24 小时制两种模式。在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12CR887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12CR887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12CR887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。基于以上优点我们决定选用DS12CR887芯片来完成我们的设计。图1 DS12C887芯片3.2 温度芯片DS18B20是数字式温度传感器,采用单总线通信协议。DS18B20具有体积小,硬件开销低,抗干扰能力强,精度高附加功能强,封装形式多样等特点(芯片如图2所示)。适合各种狭小空间内设备的数字测温和控制。同时单线可挂接多个元件,因为每个元件都有唯一的一个64位光刻ROM编码,家族码为28H,可以多个也可单个操作。电压测量范围是3.0V到5.5V。内部含有EEPROM,其报警上、下限温度值和设定的分辨率倍数在芯片掉电的情况不丢失。并且内部带有AD转换电路,技术较为成熟,所以采用此芯片最为合适。图2 DS18B20芯片3.3 液晶显示屏在显示方面,由于这次设计的万年历系统需要显示中文的农历、节假日等各种信息,为了便于控制、显示中文字符,我们选择了带有中文字库的基于Sitronix公司的ST7920芯片的液晶显示屏LCD12864。3.4 主控芯片STC89C52单片机作为核心控制体,该单片机具有高可靠,超低价,低功耗,无法解密等优点。该单片机属于双列直插式封装的DIP40口管脚。具有4个输入输出端口,分别为PORT0,PROT1,PROT2,PROT3,其中P0口是一组8位漏极开路型双向IO口,校验时,要求接上拉电阻。其他三个内部有30K的电阻,所以不用再外接电阻。此单片机具有6个中断,其中包括三个定时器中断,二个外部中断,一个串口中断,为全双工通信口。内部有静态非易失E2PROM和看门狗。片内含8Kbytes的可反复檫写的只读程序存储器(E2PROM)和256bytes的随机存取数据存储器(RAM),功能强大,适合许多较为复杂的控制应用场合。相比较其他芯片来说比较适合学生试验所用,故采用此单片机作为核心控制芯片。四、 系统设计4.1 系统框架此设计即液晶上显示年、月、日、时、分、秒、星期及温度,电路包括以下几个部分:键盘、单片机、温度传感器、显示电路以及蜂鸣器警报电路。图3 系统框架各部分说明:键盘用来校正,调节液晶上显示的时间。单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。温度传感器用来采集温度值。单片机发送的信号经过显示电路通过译码最终在液晶上显示出来。时钟芯片给单片机提供时间信息单片机可以对时钟芯片里面的内容进行修改警报器能够对闹钟定时时间做出提醒4.2 系统具体模块设计4.2.1 单片机核心控制模块核心控制器件选用STC89C52单片机。STC89C52单片机为40管脚双列直插芯片,它是一种高性能,低功耗的8位CMOS微处理器芯片,市场应用最多。而且价格便宜,控制方便,便于应用有4个I/O口分别为P1,P2,P3,P4。其中每一个管脚都能做独立的输入输出管脚,它的第9脚位复位管脚,接上电容和上拉电阻再带个开关构成复位电路。18,19管脚接外部晶振和两个微调电容构成外部晶振电路。单片机,复位电路,晶振,5V电源构成单片机最小系统。其中与AT89S52单片机管脚相兼容。4.2.2 实时时钟电路模块时钟模块选用DS12CR887芯片,DS12CR887芯片能够自动产生世纪,年,月,日,星期,时,分,秒信息,闰年补偿至2100年,具有闹钟功能。内部自带锂电池,在外部掉电时信息不丢失,并且能精确走10年之久。同时DS12CR887能自动检测电源故障和切换电路,有工业级温度范围。此芯片可以广泛应用于对环境要求严格的控制系统中。如嵌入式系统,电表,安全系统,网络集线器,网桥,路由器。D12C887电路图,工作电源采用5V。第一管脚(MOT)是Motorola或Intel总线时序选择端,利用此引脚选择两种总线类型中的一种,连接到VCC时选择Motorola总线时序,接GND或悬空选择Intel总线时序。该引脚内部有一个下拉电阻。D0到D7为双向地址/数据复用总线。地址于总线周期的开始发送到总线上。并由AS信号的下降沿锁存到DS12CR887中。所写的数据由DS信号的下降沿(Motorola时序)或R/W信号的上升沿(Intel时序)锁存。读周期中,DS12CR887于DS信号的后期(Motorola时序中DS和R/W均为高,Intel时序中DS为低、R/W为高)将数据发送到总线上。读周期结束后,总线恢复到高阻状态,同时DS在Motorola时序中变低,在Intel时序中变高。12脚为GND。13脚叫CS片选信号输入,片选信号低电平有效,在访问DS12CR887的总线周期内必须保持低电平Intel时序中的DS和R/W信号工作期间,CS必须保持有效,在CS信号无效情况下,总线操作将锁存地址,不能访问芯片。当VCC低于Vpf电压时,DS12CR887内部通过禁止CS输入来拒绝访问,此举旨在断电时保护RTC数据和RAM数据。所以在访问期间CS片选信号应保持低电平。14管脚AS地址选通输入。有低变为高的地址选通脉冲用来分离总线信号。在AS信号的下降沿,地址锁存到DS12CR887内,无论CS信号是否有效,AS的下一个上升沿都将清除地址,地址选通信号必须先于每个读或写访问。如果在CS信号无效的情况下执行了读或写操作,则必须在CS信号有效时且在读或写访问之前,从新发送一次地址选通信号。15管脚R/W读/写输入。R/W引脚有两种操作模式,在MOT引脚接VCC的Motorola时序中,R/W电平用来指示当前周期是读还是写。DS为高时,R/W为高电平表示读周期,R/W为低电平则表示写周期,在MOT引脚接GND的Intel时序中,R/W为低电平有效,在此模式下,R/W引脚与普通RAM的写时能信号(WE)工作方式类似,在信号的上升沿锁存数据。17管脚DS数据选通或读输入,DS引脚根据MOT引脚电平有两种模式,MOT引脚接VCC时,选择Motorola总线时序,此模式下,总线周期的后期DS为正脉冲,称作数据选通脉冲,在读周期中,DS表明DS12CR887将要驱动双向总线,在写周期,DS信号的下降沿使使DS12CR887锁存所写的数据,当MOT接GND时,选择Intel总线时序,DS表示读取DS12CR887数据驱动总线的时间周期,此模式下,DS引脚与普通RAM的输出使能信号(OE)工作方式类似。18管脚RESET-复位输入,低电平有效RESET引脚对时钟、日历或RAM不起作用,上电时可将RESET引脚首先保持低电平,以等待电源稳定下来,保持低电平时间可根据应用需要而定,但是,如果上电时使用RESET信号,RESET保持低电平时间应当超过200ms,以保证控制DS12CR887上电时的内部定时器结束,当RESET为低电平,而且VCC大于VPF时,将产生以下操作:A周期性中断使能(PIE)位清0;B闹钟中断使能(AIE)位清0;C更新结束中断使能(UIE)位清0;D周期中断标志(PF)位清0;E闹钟中断标志(AF)位清0;F更新结束中断标志(UF)位清0;G中断请求状态标志(IRQF)位清0;H IRQ引脚置为高阻状态;I直到RESET恢复为高电平才能访问器件;J方波使能(SQWE)位清0。在典型应用中,将RESET与VCC连接。使得DS12CR887在进入或退出电源失效状态时不影响任何控制寄存器的值。19管脚IRQ中断请求输出。DS12CR887的IRQ引脚低电平有效,可用作处理器的中断请求输入,只要引起中断的状态位置位,并且相应中断使能位也置位,IRQ将一直保持低电平。处理器程序通常读取C寄存器来清除IRQ引脚输出,RESET引脚也会清除未处理的中断,没有中断发生时IRQ为高阻状态,可将多个中断器件接到一条IRQ总线上,只要他们均为漏极开路输出,IRQ引脚为漏极开路输出,需要使用一个上拉电阻与VCC相连。23脚SQW方波输出,因为我们此实验中不需要方波输出,故不接。VCC主电源的DC电源引脚。VCC在正常范围时,可访问器件的所有功能,并能进行数据读写,如果VCC低于VPF,则禁止读和写。DS12CR887采用的是并行通信协议,8位同时传递,对应到D0D7八位端口。D0到D7接P0口,作为地址/数据选通复用总线。并行通信控制简单,传输速度快,适合近距离传输。图4 INTEL总线写时序图5 INTEL总线读时序Intel总线如所示,编写程序如图时序图所示。因为其时序延时都为纳秒级的,软件执行一句简单语句为微秒级。所以在编写程序是可直接跳过,不用做软件延时。对此相对降低了软件编写的难度。DS12CR887的读写操作代码:void ds_write(unsigned char add,unsigned char date)/写DS12CR887的数据DS_CS=0;DS_DS=1;DS_RW=1;DS_AS=1;Ds_Bus=add;/读入写数据的地址 DS_AS=0;DS_RW=0;Ds_Bus=date;/读入数据DS_RW=1;DS_AS=1;DS_CS=1;unsigned char ds_read(unsigned char add)/读取DS12CR887的数据unsigned char z;DS_CS=0;DS_RW=1;DS_DS=1;DS_AS=1;Ds_Bus=add;/读入从芯片读取数据的地址DS_AS=0;DS_DS=0;Ds_Bus=0xff;/将数据总线全部置高电平z=Ds_Bus;/读取数据DS_DS=1;DS_AS=1;DS_CS=1;return z;DS12CR887有4个控制寄存器,在任何时间都可以进行访问,即使处于更新周期,这里主要使用寄存器A和寄存器B。寄存器A字节的内容表1:表1 寄存器A内容BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0UIPDV2DV1DV0RS3RS2RS1RS0UIP:更新标志位。为只读位且不受复位操作的影响,为1时,表示即将发生的数据更新;为0时,表示至少244US不会更新数据。当UIP为0时,可以获得所有时钟、日历、闹钟信息。将寄存器B中的SET位置1可以限制任何数据更新操作,并且清除UIP位。DV2、DV1、DV0:此3位为010时将打开晶振,并开始计时。RS3、RS2、RS1、RS0:用于设置周期性中断产生的时间周期和输出方波的频率。寄存器B字节的内容表2:表2 寄存器B内容BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0SETPIEAIEUIESQWEDM24/12DSESET:设置位,可读写,不受复位操作影响。为0时,不处于设置状态,芯片进行正常时间数据更新;为1时,抑制数据更新,可以通过程序设定时间和日历信息。PIE:周期性中断使能位,可读写,复位时清除此位。为1时,允许寄存器C中的周期中断标志位PF,驱动/IRQ引脚为低产生中断信号输出,中断信号产生的周期由RS3RE0决定。AIE:闹钟中断使能位,可读写。为1时,允许寄存器C中的闹钟中断标志位AF、闹钟发生时就会通过/IRQ引脚产生中断输出。UIE:数据更新结束中断使能位,可读写。复位或者SET位为1时清除此位。为1时允许寄存器C中的更新结束标志UF,更新结束时就会通过/IRQ引脚产生中断输出。SQWE:方波使能位,可读写,复位时清除此位。为0时,SQW引脚保持低电平;为1时,SQW引脚输出方波信号,其频率由RS3RS0决定。DM:数据模式位,可读写,不受复位操作影响。为0时,设置时间、日历信息为二进制数据;为1时,设置为BCD码数据。24/12:时间模式设置为,可读写,不受复位操作影响。为0时,设置为12小时模式;为1时,设置为24小时模式。DSE:为1时,会引起两次特殊的时间更新;4月的第一个星期日凌晨1:59:59会直接更新到3:00:00,10月的最后一个星期日凌晨1:59:59会直接更新到1:00:00;为0时,时间信息正常更新,此位可读写,不受复位操作影响。在使用DS12CR887时钟芯片前需要对芯片的寄存器进行初始化操作,初始化代码如下:void ds_int()DS_AS=0;DS_DS=0;DS_RW=0;ds_write(0x0a,0x20);/DS12CR887寄存器A,开启时钟振荡器ds_write(0x0b,0x22);/初始化寄存器B,设置数据模式为二进制,24小时制,使用闹钟/中断,关闭夏令时通过软件编程将读到的信息显示到12864液晶中,显示世纪,年,月,日,星期,小时,分,秒。通过设置按键可以进行时间调节,在调节时间时时钟暂时停止走,再通过功能键回到正常工作状态中,并且具有闹钟设定功能,但在设定闹钟时期内部时间仍然在走。当时,分,秒,相符时通过蜂宁器进行报警,再设置按键关闭闹钟。实现随意控制闹钟的开启和关闭。4.2.3 数字温度传感器模块数字温度传感器选用DS18B20,采用单总线通信协议。DS18B20主要特性有:1、 适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数据线供电。2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。5、温范围55125,在-10+85时精度为0.5。6、可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。8、测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。由于采用单总线数据传输方式,DS18B20的数据I/O均由同一条线完成,因此,对读写的操作时序要求严格。为了保证DS18B20的严格I/O时序。需要做较精确的延时。其读操作时序如图6,写操作时序如图7,初始化程序如图8。图6 读操作时序图7 写时序图图8 初始化时序DS18B20的读写操作以及初始化代码:void Init_DS18B20(void)unsigned char x=0;DQ = 1;/DQ复位Delay(8);/稍做延时DQ = 0;/单片机将DQ拉低Delay(80);/精确延时 大于 480usDQ = 1;/拉高总线Delay(14);x=DQ;/稍做延时后 如果x=0则初始化成功 x=1则初始化失败Delay(20);unsigned char ReadOneChar(void)/读一个字节函数unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)DQ = 0; / 给脉冲信号dat>>=1;/DAT向右移一位,读取下一位数据DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat);void WriteOneChar(unsigned char dat)/写一个字节函数unsigned char i=0;for (i=8; i>0; i-)DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;/将dat向右移一位,依次写入每一位数据4.2.4 显示屏模块LCD12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16×16点阵)、128个字符(8×16点阵)及64×256点阵显示RAM(GDRAM)。主要技术参数和显示特性:电源:VDD: 3.3V+5V(内置升压电路,无需负压);显示内容:128列×64行与MCU接口:8位或4位并行/3位串行配置LED背光;多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等,本次设计采用八位并行连接,写数据时序图如图9:图9 12864写数据时序LCD12864写指令、写数据以及初始化代码:void write_com(unsigned char cmdcode)/写指令到LCD(底层)chk_busy();LCM_RS=0;LCM_RW=0;LCM_EN=1;/写指令将RS,RW拉低,EN拉高Lcd_Bus=cmdcode;/读取数据到总线Delay(5);/做一定延时LCM_EN=0;/利用EN下降沿将总线数据写入到显示屏中Delay(5);void write_data(unsigned char Dispdata)/写数据到LCD(底层)chk_busy();LCM_RS=1;LCM_RW=0;/写数据将RS拉高,RW为零LCM_EN=1;Lcd_Bus=Dispdata;/将显示数据写入到总线上Delay(5);LCM_EN=0;/利用EN下降沿将总线数据写入到显示屏中Delay(5);void lcm_init()/初始化LCD屏(被调用层)write_com(0x30); /选择8bit数据流Delay(5);write_com(0x0c); /开显示(无游标、不反白)Delay(5);write_com(0x01); /清除显示,并且设定地址指针为00HDelay(5);4.2.5 农历转换本设计采用查表的方法实现农历与公历的转换,公历年对应的农历数据,每年三字节,格式第一字节BIT7-4位表示闰月月份,值为0为无闰月,BIT3-0对应农历第1-4月的大小,第二字节BIT7-0对应农历第5-12月大小,第三字节BIT7表示农历第13个月,大小月份对应的位为1表示本农历月大(30天),为0表示小(29天);第三字节BIT6-5表示春节的公历月份,BIT4-0表示春节的公历日期。部分转换代码如下。0x09,0x2d,0x47,/20080x5C,0x95,0xBA,/20090x0A,0x95,0x4e,/20100x0B,0x4A,0x43,/20110x4B,0x55,0x37,/20120x0A,0xd5,0x4A,/20130x95,0x5A,0xBf,/20140x04,0xBA,0x53,/20150x0A,0x5B,0x48,/20160x65,0x2B,0xBC,/20174.3 软件设计流程整体过程分为时钟芯片模块、键盘模块、蜂鸣器、显示屏和主控芯片五个模块相互协作运行,主程序完成对所有模块的初始化和每个模块的循环运行流程。其中初始化过程完成各个端口的初始化,和每个芯片的初始化设置。进入主循环后首先显示时间温度等各种数据,打开闹钟。键盘扫描程序,在显示主界面按下A进入闹钟调节界面,按下D进入时间设置界面。在闹钟设置界面中D为退出,B/C为加减,多次按A为选择。在时间设置界面中A为退出,B/C为加减,多次按D为选择。在闹钟1或者闹钟2时间到后蜂鸣器响起,按B/C解除闹钟。如果在键盘扫描没有扫描到按键,则所有标志位为允许,维持主界面内容。软件设计流程图如图10。图10 主程序流程五、设计结果及分析5.1 电路原理图图11 完整电路原理图5.2 软件调试5.2.1 软件调试过程电子万年历与数字式温度传感器功能强大,芯片简化了硬件电路设计的同时也无形加大了软件编写的复杂程度,为方便程序的调试和提高效率,故将软件编写分模块进行,先将实时时钟模块一步步调试,按照时序图将读写函数写好后,依次调试显示秒部分,并准时走,然后编程实现分钟、小时、年、月、日等信息的读取与显示的,按照一定顺序完成各个模块的调试最开始液晶屏显示不稳定,有一些乱码。经检查发现有些发生地址重叠的冲突,写按键部分程序是发现调节好后在最后刷新屏幕时调节好的时间没有读取到,还有闹钟不能实现闹钟报警功能,不断调节,不断烧写进学习板,然后看结果,最终发现时没有将调节好的时间读取到寄存器中。调试过程中还有一个问题就是我想添加一个闹钟响起后按下B或者C按键是闹钟停止,第一次烧写进去发现按键按住闹铃不响,松开按键后闹铃依然继续响,所以后面分析程序后加上了铃声控制的标志位flag,当按键按下后标志位置0,这样按键抬起后闹钟不再继续响。加上温度传感器部分后发现在调节时间时出现乱码和不稳定现象,光标乱跳的现象。经过不断检查软件,发现在按键调节时软件读取温度值的标志位是允许的,也就是说它在调节时间时又在动态显示周围环境中的温度值,这样会导致光标不稳定的现象。这个问题得到很好的解决。在软件编写的过程中遇到非常多的问题,远远不止这些,这里只是选取设计过程中比较典型的几个问题。5.3 硬件调试首先单片机最小系统的设计几乎都是统一的,DS12CR887,DS18B20接线灵活,IO口的设置具有多样性,万年历用液晶显示。用杜邦线将芯片与单片机学习板按照电路原理图连接好,经过不断的软件,硬件的反复修改,最终实现了软件编写的目标功能。硬件调试过程中有出现一个问题,有一个问题就是屏幕显示时出现有乱码情况,仔细检查电路后发现是屏幕并口数据线有两条线接错,调整后得以纠正。最初在HL-1型开发板上调试DS12CR887模块时,出现芯片数据无法写入和读取的问题,经过查阅DS12CR887的DATASHEET后发现问题可能处在HL-1型开发板的VCC电压不足4.25V不能驱动DS12CR887芯片,遂将平台转移到单片机最小系统上进行,经过程序测试后方可以读写数据。结束语这次的课程设计,是我第一次设计并完成一个完整的项目,从最开始的结构构思,模块设计,软件设计到最后的硬件电路搭建,系统性的完成了这个多功能电子万年历的设计。最开始接到题目的时候感觉一头雾水觉得无从下手,因为以前自学过51单片机,不过但是设计的都是一些小模块,没有将这么多模块组合起来完成的设计,而且已经很久没有接触过单片机编程,对于C语言方面有点生疏,所以最开是还是觉得这个设计比较难。刚开始还是在网上查找了一些解决方案,得到了很多参考方案,渐渐的自己也有点谱了,就开始去重新学习一些关于单片机方面的知识,回顾了以前写的一些程序,看有没有对这次设计有所帮助的东西。然后开始对DS12CR887和DS18B20芯片的芯片手册进行分析研究,全英文的芯片手册阅读起来有些难度,在侯宝临老师和网上相关资料的指导下还是基本看懂了芯片手册上本次设计需要的内容,于是参照芯片手册的相关内容完成了相关芯片的读写操作模块和初始化程序。软件程序编写过程可谓是相当漫长,由于这个设计比较大,代码非常长有将近一千两百行代码,这个对于我来说确实是一次考验,从来没有做过这么复杂的项目,刚开始还在纠结该从哪一个模块开始下手。后来慢慢的淡定下来了,本来成功就是靠慢慢积累的,我开始从最简单的模块基本功能实现开始设计程序,比如显示屏,我先编写最简单的代码显示一句“Hello World!”开始,慢慢的到显示不断变化的字符,由简单到复杂的设计过程。完成了各个最基本的设计之后,然后再考虑如何将这么多模块相互联系起来,比如如何用按键调节DS12CR887中的时间调节和如何将温度显示到屏幕上去等等,渐渐的完善系统使系统的功能越来越丰富。通过这次的学习课程设计的过程,自己也感受颇多,很多东西有想法只是一小部分,关键在于自己肯不肯实际动手去做。做研究设计这方面的工作靠的就是坚持不谢的毅力和拼搏的精神。以前自学单片机,开始很多东西都没有概念,需要一步步建立,为此也花费了大量的时间,不过到后期忙于各种专业课学习,这方面的东西又荒废了,这次做这个设计又重新一遍遍的看书,加上有硬件支持,最终做出了这个成品。相信在今后的不断学习中,会收获更多,同时也很感谢学校能够提供这样一个学习平台。在此也感谢我的指导老师侯宝临老师提供的的技术指导,我才能顺利完成这次设计。参考文献1 ,元器件规格书网 20132 Z, 元器件规格书网 20133 林国清, J, 国外电子元器件20024 彭希南, ,19995 郑琪, 基于51单片机的万年历及温度显示系统 J, 硅谷20106 刘德全, 可调家用万年历的单片机原理 J, 宁夏师范学院学报20087 郭天祥, 新概念51单片机C语言教程 M, 2009