![基于单片机的时钟日历设计_第1页](http://file4.renrendoc.com/view/7802ade0663330bb6af34aa8c2e5fca4/7802ade0663330bb6af34aa8c2e5fca41.gif)
![基于单片机的时钟日历设计_第2页](http://file4.renrendoc.com/view/7802ade0663330bb6af34aa8c2e5fca4/7802ade0663330bb6af34aa8c2e5fca42.gif)
![基于单片机的时钟日历设计_第3页](http://file4.renrendoc.com/view/7802ade0663330bb6af34aa8c2e5fca4/7802ade0663330bb6af34aa8c2e5fca43.gif)
![基于单片机的时钟日历设计_第4页](http://file4.renrendoc.com/view/7802ade0663330bb6af34aa8c2e5fca4/7802ade0663330bb6af34aa8c2e5fca44.gif)
![基于单片机的时钟日历设计_第5页](http://file4.renrendoc.com/view/7802ade0663330bb6af34aa8c2e5fca4/7802ade0663330bb6af34aa8c2e5fca45.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE基于单片机的万年历设计系部:电子与通信工程系班级:姓名:学号:指导教师:2012年10月7日
声明本人所呈交的论文(设计)《基于单片机的万年历设计》是我在指导教师的指导和查阅相关著作下独立进行分析研究所取得的成果。除文中已经注明引用的内容外,本论文不包含其他个人已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。作者签名:日期:
摘要论文的研究工作是以单片机技术为背景展开的,并且详细介绍了通过AT89C51单片机控制LCM1602液晶的显示情况,以及单片机与时钟电路、温度传感器之间的通信。以软件形式对系统进行控制,使得系统控制更具灵活与方便。本文在深入分析单片机技术的基础上,解析了LCM显示的单片机控制技术和新型温度传感器DS18B20单片机控制应用,以及LCD显示在各种电子显示中的优势,同时阐述了其在日常显示系统中的应用;并且以Proteus与KeiluVision4软件为基础,编写了AT89C51单片机对LCM1602显示控制的软件,绘制其原理图,并使用Proteus软件与KeiluVision4软件建立联合仿真。论文主要论述了原理图各个模块的作用,控制软件的各个模块的编程。在设计的过程中,以显示日历、时间、温度为主要目的,并能够实现时间调整功能。经过一系列的前提准备,到最后的仿真成功,将理论联系实际,使本设计可以在实际中应用,方便经济实用。【关键词】温度传感器、单片机、万年历[Abstract]Thesisresearchworkisbasedonsingle-chiptechnologyexpandthebackground,anddescribedindetailbythetheAT89C51microcontrollercontrolLCM1602LCDdisplay,aswellassingle-chipclockcircuits,temperaturesensorcommunication.Intheformofasoftwaretocontrolthesystem,makingthesystemmoreflexiblecontrolandconvenience.Inthispaper,basedonin-depthanalysisofsingle-chiptechnology,analyticaltheLCMdisplaySCMcontroltechnologyandanewtemperaturesensorDS18B20MCUcontrolapplications,andtheLCDdisplayadvantagesinavarietyofelectronicdisplay,atthesametimedailydisplaysystem;andtoProteusandKeiluVision4software-basedwriteatheAT89C51microcontrollerLCM1602displayControlsoftware,drawitsschematicandtheestablishmentofajointsimulationusingtheProteussoftware,KeiluVision4software.Thesisdiscussestheroleofthevariousmodulesoftheschematicdiagram,thecontrolofthevariousmodulesofthesoftwareprogramming.Inthedesignprocess,themainpurposeistodisplayacalendar,time,temperature,andbeabletoachievetimeadjustmentfunction.Theseriespremisepreparationtothefinalsuccessofthesimulation,theorywithpractice,sothatthedesigncanbeappliedinpractice,andtofacilitateeconomicalandpractical.[Keywords]thetemperaturesensor、Singlechipmicrocomputer、Perpetualcalendar目录一、引言 1(一)课题背景及研究概述 1(二)单片机控制系统简介 1(三)课题的建立及论文完成的主要要求 1二、开发工具软件介绍 2(一)KeiluVision4软件简介 2(二)Proteus软件简介 2(三)KeiluVision4与Proteus软件联合仿真 2三、系统硬件设计实现 3(一)电路设计框图 3(二)单片机控制系统 31、单片机系统功能介绍 32、AT89C51引脚说明 33、单片机最小系统 5(三)主要模块设计实现 61、LCD显示模块 62、时钟芯片DS1302接口设计模块 73、温度传感器DS18B20设计模块 94、按键控制模块 9四、软件设计 10(一)万年历显示程序 101、流程图 102、源程序代码 11(二)温度转换程序 111、流程图 112、源程序代码 11(三)按键扫描程序 121、程序结构 122、程序功能 12(四)主程序 121、程序流程图: 122、源程序代码。 13五、仿真 13(一)调试联合仿真 13(二)仿真结果 13六、总结 13致谢 14参考文献 15附录一:系统电路 16附录二:源程序 17附录三:温度转换子程序 30PAGE2一、引言(一)课题背景及研究概述随着电子技术的发展,人类不断研究,不断创新纪录。万年历以电脑软件或者电子产品形式出现,目前已经不再局限于以书本形式。万这种年历被称为电子万年历。与书本形式的万年历相比,电子万年历应用越来越广泛,时间显示采用电子时钟已经成为一种时尚。目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求。本文提出了一种基于AT89C51单片机的万年历设计方案,利采用一个LCD显示。本方案以AT89C51单片机作为主控核心,与时钟芯片DS1302、温度芯片DS18B20、按键、LCD显示等模块组成硬件系统。在硬件系统中设有4个独立按键和一个LCD显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、选择时间、温度显示等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。(二)单片机控制系统简介AT89C51是一个低电压,高性能的单片机,内含可反复擦写的Flash只读程序存储器,在电子行业中有着广泛的应用。并且,只要在单片机的外围适当加一些必要的扩展电路及通道接口,就可以构成各种应用系统,如工业控制系统、数据采集系统、自动控制系统、自动测试系统、检测监视系统、智能仪表、功能模块等。因此单片机广泛应用于便携式智能产品与家电消费品,以及工业控制,国防装备等领域。总之,单片机控制系统具有功能多样、电路简洁、成本低廉、体积小巧等诸多优点,符合电子技术的发展趋势。(三)课题的建立及论文完成的主要要求本文主要包括以下内容:1、单片机最小控制系统、LCM1602液晶显示模块、DS18B20温度传感器模块、DS1302时钟芯片模块和按键模块的建立。2、编制单片机与各子模块之间的通信程序。实现对LCM1602液晶显示当前时间及温度,按键调节作用,以及按键提示音的控制。3、用Proteus绘制整个控制系统原理图,使用Keil编译调试程序。可替代实际硬件进行仿真。二、开发工具软件介绍(一)KeiluVision4软件简介Keil4系列开发系统兼容单片机,C语言软件。和汇编相比,C语言在结构性、功能上、可维护性、可读性上有明显的优势,并能产生HEX文件,因而易学易用。使用过汇编语言,再使用C来开发,体会更加深刻。在研究大型软件时更能体现C语言的优势。Keil软件提供功能强大的集成开发调试工具和丰富的库函数,语句生成的汇编代码容易理解。而且,该软件不但可以进行程序编译,而且还可以通过其内嵌模块模拟51单片机,实现在不需要连接硬件仿真器的条件下,通过数据线连接硬件系统对项目进行实时仿真。另外,可以与Proteus单片机仿真软件联合实现虚拟硬件仿真。(二)Proteus软件简介Proteus嵌入式系统仿真与开发平台是一款可以实现模拟电路、数字电路、PCB设计微控制器系统仿真等功能的EDA软件。所有的工作先在虚拟环境下进行。提供数码管、显示屏、LED、开关、键盘等。避免了传统电子电路设计中方案更换带来的多次购买元器件及制板,在节省设计时间和金钱的同时,提高了设计效率与质量。Proteus软件可以仿真AT89C51系列单片机,可以直接在电路原理图上进行硬件的模拟仿真,进行程序的调试,并提供进行测试与分析的逻辑分析仪,模拟示波器等模拟仪器及仿真图表。它是目前最好的仿真单片机及外围器件的工具。(三)KeiluVision4与Proteus软件联合仿真Proteus软件与Keil软件之间的联合虚拟仿真,指Keil软件把Proteus软件打开的单片机电路看成一个模拟的硬件电路,使用Keil软件对程序进行编译、调试时连接Proteus软件中的模拟单片机系统,模拟单片机的系统状态和Keil软件对程序调试实时变化。这样,可实现用Proteus软件与KeiluVision4软件联合虚拟硬件仿真。Proteus软件与KeiluVision软件的联合仿真在实际的单片机系统开发中被普遍应用。用Proteus软件与KeiluVision软件联合仿真像实物一样调试,同时在屏幕上可以直观地看到电路输出状态,比较容易读懂并理解所调试的程序,提高学习效率,同时降低了学习所需的硬件成本。
三、系统硬件设计实现(一)电路设计框图(如图1)温度采集电路时钟电路按键调整电路单片机最小系统温度采集电路时钟电路按键调整电路单片机最小系统AT89C51单片机LCD显示电路图1电路设计框图1、单片机系统功能介绍AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。单片机正常工作时,都需要有一个时钟电路和一个复位电路。本设计中选择了内部时钟方式和按键电平复位电路,来构成单片机的最小电路。复位是单片机的初始化操作,单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路来实现。其主要工作特性是:4k字节可编程Flash存储器八个中断源与MCS-51单片机产品兼容全静态操作:0Hz~33Hz三级加密程序存储器32个可编程I/O口线全双工UART串行通道低功耗空闲和掉电模式掉电后中断可唤醒看门狗定时器双数据指针1000次擦写周期掉电标识符三个16位定时器/计数器PAGE282、AT89C51引脚说明AT89C51有40个引脚,如图2所示:图2AT89C51芯片P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口接收低8位地址字节。P1口的第二功能如下:P1.0T2(定时器/计数器T2的外部计数输入),时钟输出P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5MOSI(在系统编程用)P1.6MISO(在系统编程用)P1.7SCK(在系统编程用)P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR),P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。flash编程和校验时,P3口也接收一些控制信号。P3口的二功能如下:P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2INTO(外中断0)P3.3INT1(外中断1)P3.4TO(定时/计数器0)P3.5T1(定时/计数器1)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。RST——复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。3、单片机最小系统根据系统设计要求,结合性能分析,通过查阅相关资料及自己的努力思考,把单片机最小系统设计为图3:图3单片机最小系统图3单片机最小系统(1)复位电路按键手动复位是通过使复位端经电阻与VCC接通而实现的。(2)时钟振荡电路考虑系统运行速度,采用12MHZ的石英晶振,并使用两个小电容作为微调电容。(三)主要模块设计实现1、LCD显示模块(1)方案选择:方案一:采用动态显示方法,动态显示模块的硬件制作简单,段扫描和位扫描各占用一个端口,总需占用单片机24个端口,采用间断扫描法功耗小、硬件成本低及整个硬件系统体积相对减小。方案二:采用LCD的方法,具有硬件制作简单可直接与单片机接口,显示内容多,功耗小,成本低等优点,LCM1602可显示32个字符,采用LCD的缺点是亮度不够。比较以上两种方案:方案一硬件简单、功耗小;方案二硬件简单,显示内容多,功耗小,成本低等。本系统设计要求达到功耗小、体积小、成本低,显示信息多等要求,权衡两种方案,选择方案二。(2)LCM1602的接口信号说明:如表1:表1LCM1602的接口信号编号引脚符号功能说明编号引脚符号功能说明1VSS电源地9D2DATAI/O2VDD电源正极10D3DATAI/O3VL液晶显示偏压信号11D4DATAI/O4RS数据/命令选择端12D5DATAI/O5R/W读/写选择端(H/L)13D6DATAI/O6E使能信号14D7DATAI/O7D0DATAI/O15BLA背光正极8D1DATAI/O16BLK背光负极(3)基本操作时序:读状态:RS=L,RW=H,E=H写指令:RS=L,RW=L,D0~D7=指令码,E=高脉冲读数据:RS=H,RW=H,E=H写数据:RS=H,RW=L,D0~D7=数据,E=高脉冲(4)LCM1602与AT89C51的接口电路:如图4所示:图4LCM1602与单片机接口电路LCD的D0~D7分别接单片机的的P0口,作为数据线,因为P0口内部没有上拉电阻,所以外部另外加上10K的上拉电阻;P2.0—P2.2分别接LCD的RS、RW、E三个控制管脚;RV1用来调节LCD的显示灰度;BLK、BLA为背光的阴极和阳极,接上相应电平即点亮背光灯(图中未画出)。2、时钟芯片DS1302接口设计模块(1)方案选择:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是液晶显示不连续,实现的时间误差较大。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V~5.5V范围内,功耗电小。综合考虑制作难度及精度,故采用方案二。(2)DS1302接口说明:如表2表2接口说明X1,X232.768kHz晶振引脚GND地线RST复位端I/O数据输入/输出端口SCLK串行时钟端口VCC1慢速充电引脚VCC2电源引脚(3)DS1302与AT89C51的接口电路:如图5所示DS1302时钟芯片内主要包括控制逻辑电路、振荡器、移位寄存器。DS1302与单片机系统的数据通信依靠SCLK,RST,I/O,三根线即可完成。其工作过程可概括为:首先给系统RST引脚一个高电平1,然后在SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入命令或地址字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。因此,其与单片机之间的数据传送是非常容易实现的。图5DS1302设计DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如图5所示。DS1302的控制字:控制字的位7必须置1,若为0则不能对DS1302进行读写数据。对于位6,若对时间进行读/写时,CK=0,对程序进行读/写时RAM=1。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;进行写操作时,该位为0。控制字节总是从最低位开始输入/输出的。DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,“WP”必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。3、温度传感器DS18B20设计模块(1)方案选择方案一:采用热敏电阻或AD590,再经AD转换得到数字信号,精度较准,但价格昂贵,电路较复杂。方案二:采用数字式温度传感器DS18B20,它能通过单片机直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式,但准确度不高。综合考虑,采用方案二,用DS18B20温度芯片,采用单总线访问,降低成本、降低制作难度且可节省单片机宝贵的I/O口资源。(2)DS18B20与AT89C51的接口电路:如图6所示图6DS18B20接口电路该系统中采用数字式温度传感器DS18B20,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,用P2.3与DS18B20的DQ口连接,Vcc接电源,GND接地。4、按键控制模块按键及按键提醒接口电路如图7所示图7按键控制模块SET键:按下SET键进入时间校准状态,按一下进入秒调整,两下分调整,依此类推可进行各年月日,时分秒以及星期的校准UP键:当SET键按下时,UP进行SET选定项(如:小时)的加操作;DOWN键:当SET键按下时,DOWN进行SET选定项(如:小时)的减操作;按键蜂鸣器提示(第一次按动设置键长鸣一响;后面按动设置键或上调键、下调键都是短鸣一响)(四)完整系统原理图见附录一。四、软件设计整个软件系统采用C语言编程,主要实现以下功能:1) LCD的驱动2) 时间数据的采集3) 温度的采集4) 按键的识别处理程序从main()函数开始运行,随后对LCD、DS18B20、DS1302等器件进行初始化操作并对标志位赋初值,随后进入while(1)循环中运行按键扫描程序。等待中断产生。开始初始化读日期、时间写日期、时间开始初始化读日期、时间写日期、时间显示子程序时间修改子程序日期修改子程序显示结果返回开关控制子程序图8万年历显示控制1、流程图如图82、源程序代码参考附录二。(二)温度转换程序为方便程序编写,本程序把温度转换子程序编在DS18B20_3.H文件中。头文件DS18B20_3.H,来源于网网络,十进制温度最后返回到函数ReadTemperature()中,使用时主函数用flag=ReadTemperature()就可将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示。根据单总线操作协议,首先要对DS18B20进行初始化,而初始化有严格的时序控制,如图9所示,即总线控制器(TX)发出一个复位脉冲(至少480us的低电平),然后释放总线进入接收状态,总线由5.1K上拉电阻上拉为高电平,探测到I/O引脚上的上升沿后,DS18B20等待15us~60us后,然后发出一个存在脉冲(60us~240us的低电平信号)。1、流程图开始发跳过读系列号命令开始发跳过读系列号命令启动温度转换初始化DS18B20初始化DS18B20发跳过读系列号命令读取温度寄存器读取温度值结束图9温度转换流程图2、源程序代码见附录三(三)按键扫描程序1、程序结构按键识别程序结构采用:if(***) { delay(10);//调延时,消抖动 if(***) { switch(key1n) { case1:*****;case2:*****;************;}2、程序功能能准确清晰地分析全部的按键情况,具有按键消除抖动功能。和按键蜂鸣器提示(第一次按动设置键长鸣一响;后面按动设置键或上调键、下调键都是短鸣一响)开始液晶屏、时钟芯片、温度传感器初始化开始液晶屏、时钟芯片、温度传感器初始化按键扫描。等待中断产生YN温度读取转换显示温度、时间日期图10主程序流程图(四)主程序1、程序流程图:如图102、源程序代码。见附录二。五、仿真(一)调试联合仿真模拟系统硬件电路调试比较简单,首先检查电路接线是否正确,然后用检查软件I/O口的定义是否与硬件电路的I/O口连线是否对应。系统软件调试可以先调试液晶显示程序,再编写定时器中断函数,在液晶上显示出正确的时间,随后调试时间调整函数。接下来分别进行DS18B20温度显示程序的调试,调试到液晶能显示温度值,在环境温度有变化时,显示温度能改变就说明已能正确读取温度数据。最后调试报警温度函数,直到实现设计任务的要求为止。(二)仿真结果使用KeiluVision4软件调试编译源程序,生成目标代码HEX文件,然后在Proteus软件中的虚拟单片机系统。模拟仿真观看设计结果:液晶显示结果如图11。通过此项设计设计,本系统能完成以下功能:1、显示公历日期功能(年、月、日、时、分、秒)2、通过按键可随时调校年、月、日或时、分、星期3、可动态完整显示年份4、上电蜂鸣器提示(长鸣)、按键时蜂鸣器短鸣。图11液晶显示结果六、总结论文首先对本设计作了简要描述,对软件、硬件进行简单的描述。随后提出了不同的设计方案,经过论证最后确定该设计采用时钟模块、显示模块、键盘接口模块、温度测量模块等模块组成,接着分别从硬件系统和软件系统两方面对基于单片机的电子万年历设计作了详细论述,另外还简要介绍了一下系统的调试。在整个设计过程中,硬件方面主要设计了AT89C51单片机的最小系统、DS1302接口电路、DS18B20接口电路、LCM1602显示;软件方面借助各个渠道的资料,主要设计了日期数据读取程序、温度采集程序、按键扫描程序以及LCD显示程序;系统的调试主要是通过Proteus,再借助于Keil以及少许自己搭建的外围电路实现的;再此过程中,分步调试时显示出了日期及时间,还有实时温度,集中调试达到预期效果。但在此过程中培养了自己的动手能力。此万年历具有读显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。经过本次毕业设计,使我对大学所学专业知识的进行了系统的总结。综合运用所学知识发现、提出、分析和解决实际问题致谢首先感谢学校在毕业之际给我们一个可能让我们把所有的知识总结起来的机会,通过这次毕业设计,使我对以前所学的知识有了一个整体上的概括,也让我们具体了解到了每个元件在电路中的具体作用,了解到了它的功能、结构。其次我要衷心的感谢授课老师对我专业知识的教导和指导老师的帮助。为我提供了大量而又详实的资料给我,使我从困惑迷茫的初期走向论文的顺利完成,在完成论文的同时也深受启发和教育,使我受益终生。最后接受我最诚挚的谢意!
参考文献【1】刘训非,陈希.《单片机技术及应用》.北京:清华大学出版社2010【2】杨宁,胡学军.《单片机与控制技术》.北京:北京航空航天大学出版社.2005年【3】余西存,曹国华.《单片机原理及接口技术》.西安:西安电子科技大学出版,2000年.【4】沈卫红,编著.《基于单片机的智能系统设计与实现》.北京:电子工业出版社2005年【5】王越明,编著.《电子万年历的设计》.黑龙江:黑龙江科技信息出版社2004年
附录一:系统电路附录二:源程序#include<reg51.h>#include"DS18B20_3.H"//温度传感器#defineuintunsignedint#defineucharunsignedcharuchara,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;//flag用于读取头文件中的温度值,和显示温度值#defineyh0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)sbitrs=P2^0;sbiten=P2^2;sbitrw=P2^1;sbitled=P2^6;//LCD的背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbitIO=P1^1;sbitSCLK=P1^0;sbitRST=P1^2;sbitACC0=ACC^0;sbitACC7=ACC^7;//校时按键与C51的引脚连接定义sbitkey1=P1^5;//设置键sbitkey2=P1^6;//加键sbitkey3=P1^7;//减键sbitbuzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响ucharcodetab1[]={"20--"};//年显示的固定字符ucharcodetab2[]={"::"};//时间显示的固定字符//延时函数,后面经常调用voiddelay(uintxms)//延时函数,有参函数{ uintx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}/********液晶写入指令函数与写入数据函数**************/write_1602com(ucharcom)//****液晶写入指令函数****{ rs=0;//数据/指令选择置为指令 rw=0;//读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchardat)//***液晶写入数据函数****{ rs=1;//数据/指令选择置为数据 rw=0;//读写选择置为写 P0=dat;//送入数据 delay(1); en=1;//en置高电平,为制造下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令}lcd_init()//***液晶初始化函数****{ write_1602com(0x38);//设置液晶工作模式16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); } write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 }}/***************DS1302有关子函数********************/voidwrite_byte(uchardat)//写一个字节{ ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1; }}ucharread_byte()//读一个字节{ RST=1; for(a=8;a>0;a--) { ACC7=IO; SCLK=1; SCLK=0; ACC=ACC>>1; } return(ACC);}voidwrite_1302(ucharadd,uchardat)//向1302芯片写函数,指定写入地址,数据{ RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;}ucharread_1302(ucharadd)//从1302读数据函数,指定读取数据来源地址{ uchartemp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp);}ucharBCD_Decimal(ucharbcd)//BCD码转十进制函数,输入BCD,返回十进制{ucharDecimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}voidds1302_init()//1302芯片初始化子函数(2012-10-07,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00);//允许写,禁止写保护write_1302(0x80,0x00);//向DS1302内写秒寄存器80H写入初始秒数据00write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07write_1302(0x88,0x10);//向DS1302内写月份寄存器88H写入初始月份数据10write_1302(0x8c,0x12);//向DS1302内写年份寄存器8cH写入初始年份数据12write_1302(0x8e,0x80);//打开写保护}/****************温度显示子函数*******************/voidwrite_temp(ucharadd,uchardat)//向LCD写温度数据,并指定显示位置{ uchargw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码 }/****************时分秒显示子函数****************/voidwrite_sfm(ucharadd,uchardat)//向LCD写时分秒,有显示位置加、现示数据,两个参数{ uchargw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码}/****************年月日显示子函数****************/voidwrite_nyr(ucharadd,uchardat)//向LCD写年月日,有显示位置加数、显示数据,两个参数{ uchargw,sw; gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(yh+add);//设定显示位置为第一个位置+add write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码}voidwrite_week(ucharweek)//写星期函数{ write_1602com(yh+0x0c);//星期字符的显示位置 switch(week) { case1:write_1602dat('M');//星期数为1时,显示 write_1602dat('O'); write_1602dat('N'); break; case2:write_1602dat('T');//星期数据为2时显示 write_1602dat('U'); write_1602dat('E'); break; case3:write_1602dat('W');//星期数据为3时显示 write_1602dat('E'); write_1602dat('D'); break; case4:write_1602dat('T');//星期数据为4是显示 write_1602dat('H'); write_1602dat('U'); break; case5:write_1602dat('F');//星期数据为5时显示 write_1602dat('R'); write_1602dat('I'); break; case6:write_1602dat('S');//星期数据为6时显示 write_1602dat('T'); write_1602dat('A'); break; case7:write_1602dat('S');//星期数据为7时显示 write_1602dat('U'); write_1602dat('N'); break;}}//****************键盘扫描有关函数**********************voidkeyscan(){//key1为功能键(设置键)// if(key1==0) { delay(9);//延时,用于消抖动 if(key1==0)//延时后再次确认按键按下 {buzzer=0;//蜂鸣器短响一次delay(20);buzzer=1; while(!key1); key1n++; if(key1n==9) key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环 switch(key1n) { case1:TR0=0;//关闭定时器 write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标 write_1602com(0x0f);//设置光标为闪烁 temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case2:write_1602com(er+6);//按2次fen位置显示光标 break; case3:write_1602com(er+3);//按动3次,shi break; case4:write_1602com(yh+0x0e);//按动4次,week break; case5:write_1602com(yh+0x0a);//按动5次,ri break; case6:write_1602com(yh+0x07);//按动6次,yue break; case7:write_1602com(yh+0x04);//按动7次,nian break; case8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao数据写入DS1302 write_1302(0x8e,0x80);break; } } }//加键key2 if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零) { if(key2==0)//上调键 { delay(10); if(key2==0) {buzzer=0;//蜂鸣器短响一次delay(20);buzzer=1; while(!key2); switch(key1n) { case1:miao++;//设置键按动1次,调秒 if(miao==60) miao=0;//秒超过59,再加1,就归零 write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x80,temp);//向DS1302内写秒寄存器写入调整后的秒数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+0x09);//指定返回 break; case2:fen++; if(fen==60) fen=0; write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据 temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);//向DS1302内写分寄存器写入调整后的分数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);//写回原来的位置 break; case3:shi++; if(shi==24) shi=0; write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);//写小时寄存器84H写入调整后的小时数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);//光标回位 break; case4:week++; if(week==8) week=1;write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);//写周寄存器8aH写入调整后的周数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);//光标回位 break; case5:ri++; if(ri==32) ri=1; write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据 temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);//写日期寄存器86H写入调整后的日期数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);//光标回位 break; case6:yue++; if(yue==13) yue=1; write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据 temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+7);//光标回位 break; case7:nian++; if(nian==100) nian=0; write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);//写年份寄存器8cH写入调整后的年份数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);//光标回位 break; } } } //减键key3,各句功能参照'加键'注释 if(key3==0) { delay(10);//调延时,消抖动 if(key3==0) {buzzer=0;//蜂鸣器短响一次delay(20);buzzer=1; while(!key3); switch(key1n) { case1:miao--; if(miao==-1) miao=59;//秒数据减到-1时自动变成59 write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x80,temp);//向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+0x09);//写回原来的位置 break; case2:fen--; if(fen==-1) fen=59; write_sfm(5,fen); temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);//向DS1302内写分寄存器写入调整后的分数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);//写回原来的位置 break; case3:shi--; if(shi==-1) shi=23; write_sfm(2,shi); temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);//写小时寄存器写入调整后的小时数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);//光标回位 break; case4:week--; if(week==0) week=7;write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);//写周寄存器8aH写入调整后的周数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);//光标回位 break; case5:ri--; if(ri==0) ri=31; write_nyr(9,ri); temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);//写日期寄存器86H写入调整后的日期数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);//光标回位 break; case6:yue--; if(yue==0) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);//写月份寄存器88H写入调整后的月份数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+7);//光标回位 break; case7:nian--; if(nian==-1) nian=99; write_nyr(3,nian);temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);//写年份寄存器8cH写入调整后的年份数据 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);//光标回位 break; }}}}}voidinit()//定时器、计数器设置函数{ TMOD=0x11;//指定定时/计数器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023三年级语文下册 第一单元 2 燕子配套说课稿 新人教版
- 2024-2025学年高中语文 名著导读 莎士比亚戏剧说课稿 新人教版必修4
- 9古诗三首清明说课稿2023-2024学年统编版语文三年级下册
- Unit 4 Natural Disasters Reading for Writing 说课稿-2024-2025学年高中英语人教版(2019)必修第一册
- Unit 2 lconic Attractions Learning About Language (1)说课稿 2023-2024学年高中英语人教版选择性第四册
- 2025主体信用评级合同
- 2025吊顶劳务承包合同
- 19《夜宿山寺》(说课稿)2024-2025学年部编版语文二年级上册
- 2024-2025学年高中生物 第一章 人体的内环境与稳态 专题1.2 内环境稳态的重要性说课稿(基础版)新人教版必修3001
- 7《压岁钱的使用与思考》(说课稿)-2023-2024学年四年级下册综合实践活动长春版
- 北京市丰台区2024-2025学年九年级上学期期末语文试题(含答案)
- 计划供货时间方案
- 2024年石柱土家族自治县中医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 西藏事业单位c类历年真题
- 2024人教新目标(Go for it)八年级英语下册【第1-10单元】全册 知识点总结
- 七年级英语下学期开学考试(深圳专用)-2022-2023学年七年级英语下册单元重难点易错题精练(牛津深圳版)
- 部编版语文小学二年级下册第一单元集体备课(教材解读)
- 新会中集:集装箱ISO尺寸要求
- 化学品-泄露与扩散模型课件
- 汉语言文学论文6000字
- 树立正确的世界观人生观价值观课件
评论
0/150
提交评论