基于单片机的时钟设计方案吴怀志_第1页
基于单片机的时钟设计方案吴怀志_第2页
基于单片机的时钟设计方案吴怀志_第3页
基于单片机的时钟设计方案吴怀志_第4页
基于单片机的时钟设计方案吴怀志_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

YanChengInstituteofTechnologyYanChengInstituteofTechnology课程设计说明书课程名称单片机应用设计设计题目基于单片机的时钟设计专业M自动化101学生姓名吴怀志班级101学号1061417108完成日期201312/1/——2013/12/12盐城工学院电气学院盐城工学院电气学院课程设计任务书姓名:吴怀志院(系):电气工程学院专业:M自动化101班号:101任务起至日期2013年12月01日至201312年月12日课程设计题目:《基于单片机的时钟设计》已知技术参数和设计要求:(1)AT89C51单片机(2)DS1302定时器(3)DS1232看门狗(4)LCD1602液晶显示(5)电池供电(6)Altium软件预期设计效果:设计一个基于单片机的电子时钟,要求能够实现时、分、秒.工作计划安排:2013年12月1日-2日:收集和课程设计有关的资料,熟悉课题任务何要求2013年12月3日-4日:总体方案设计2013年12月5日—8日:硬件电路设计2013年12月9日—11日:软件设计2013年12月12日:整理书写设计说明书2013年12月13日:答辩同组设计者及分工:独立完成!!!!!!成绩评定:_____________指导教师签字:______年月日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字AT89C51;电子万年历;

DS1302目录1电子钟的工作原里....。...。。。...。。.。。...。....。..。.....。.。...。...。。..。。..。..。。..。。...。。。...。。。..。..。。..。...。.。..。....。。..。。.。.。.。。....。12系统硬件设计及电路元件...。。..。.....。...。.。.....。。...。。......。.....。.。.。.........。。。...。.....。.。.。。。.....。.。。。。。...。...........1AT89C51芯片。。。....。。............。....。。.。..。..。。..。.。.....。。。。。..。。。.。。........。.....。...。...。..。.。.。。。...。.。。...。.。...。.。.2DS1302芯片...。。.。...。。。.。.....。。..。。。.....。......。。。。..。......。。..。..。。。..。..。。.。。..。......。...。..。..。.。....。.。。.。...。.....3LCD1602ﻩ液晶显示.。。....。..。.。.。.。.。...。..。.。..。。.。.....。..。。。。。.。...。....。..。..。。.。.。。...。。.。。..。..........。......。。.。....3系统软件电路设计。。....。。....。..。.....。。......。.......。...。。.。。..。...。.。.。...。.。。..。..。..。.。。.........。。。.。.。.。。。....。.。........。..。.1系统流程图及源代码设计....。.。.。。....。.。。.。..。。...。.。。。...。.。..。。。..。..。..。。。........。.......。。。..。..。....。..。..。。....。1主程序流程图设计...。。.。.。。..。。。。。......。.。。......。..。..。。.。...。.。..。。.。。。。。.。。。。。.....。.。。...。.。.....3子程序源代码设计。.。.。...。.....。。..。....。.....。..。....。。.。。。...。。...。。.。.。.....。。.....。....。。。。....。.3设计原理图.。.......。......。。.。。.。....。..。。。.....。。.。。。。...。.。...。。.。...。.....。..。.。....。.....。..........。.4心得体会。.。.。.....。.。.。.。。.。......。。。。。。.....。....。.。。......。.。。.....。.。..。.。...。....。..。......。...。..。。。.......。....。..。..。.。.。......。5参考文件.。。......。.。.。...。..。.....。。.。。...。..。.。..。.。。.。..。......。....。.....。。。...。....。..。。.....。.。...。.......。。。。.。.....。。。。。.。..。。6附件....。...。。...。。...。...。。..。..。。。..。...。。.。......。。..。.。.。..。.....。。。。。..。...。。.。。.。.。。..。。..。..。。。.....。。..。.。..。..。..。。............1程序代码.。......。....。.。。.。......。...........。..。。。。.。。。......。。。.。.。。.。.....。。.。。。.。..。..。.。。。。.。....。.。。...。.。。。。。.。。。.....。....2程序原理图。。....。。......。.。。.。...。。。.。.。.。..。....。。...。......。。。。.。............。.。。。..。.。.......。.。。...........。.......。。。......第1章电子时钟的工作原理本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,用C语言程序来控制整个时钟的显示,使得编程变得更容易,这样通过五个模块:芯片、显示屏、看门狗、电源、时钟即可满足设计要求第1章电子时钟的工作原理本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,用C语言程序来控制整个时钟的显示,使得编程变得更容易,这样通过五个模块:芯片、显示屏、看门狗、电源、时钟即可满足设计要求。此设计原理图框图如图1-1所示,此电路包括以下五个部分:单片机、时钟电路、看门狗、液晶屏、电源模块、时钟振荡电路.AT89C51主控模块AT89C51主控模块DS1232时钟电路时钟振荡模块DS1302看门狗LCD1602显示模块电源模块图1—1主电路设计框图本设计采用C语言程序设计,使单片机控制数码管显示年、月、日、时、分、秒,当秒计数满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数.时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在LCD上显示。第2章系统硬件电路设计及元件2.1AT89C51芯片AT89C51是美国ATMEL公司生产的8位FlashROM单片机。其最突出的优点是片内ROM为FlashROM,可擦写1000次以上,应用并不复杂的通用ROM写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM二级保密系统。因此可灵活应用于各种控制领域。AT89C51包含以下一些功能部件:(1)一个8位CPU;(2)一个片内振荡器和时钟电路;(3)4KBFlashROM;(4)128B内RAM;(5)可寻址64KB的外ROM和外RAM控制电路;(6)两个16位定时/计数器;(7)21个特殊功能寄存器;(8)4个8位并行I/O口;(9)一个可编程全双工串行口;(10)5个中断源,可设置成2个优先级。AT89C51单片机一般采用双列直插DIP封装,共40个引脚,图2-1为其引脚排列图。40个引脚大致可分为4类:电源、时钟、控制各I/O引脚。图2—1AT89C51引脚图2.1.1电源电池供电2.1.2时钟XTAL1、XTAL2—-晶体振荡电路反相输入端和输出端。2。1.3控制线控制线共有4根,其中3根是复用线.所谓复用线是指具有两种功能,正常使用时是一种功能,在某种条件下是另一种功能。源.2.2DS1302芯片DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能.工作电压宽达2.5~5。5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32。768KHz的晶振。DS1302包含以下一些功能部件:(1)实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;(2)用于高速数据暂存的31×8位RAM;(3)最少引脚的串行I/O;(4)2。5~5.5V电压工作范围;(5)2.5V时耗电小于300nA;(6)用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;(7)简单的3线接口;(8)可选的慢速充电(至VCC1)的能力。2。2.1DS1302数据操作原理DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数.DS1302的内部结构图如图2-2所示。图2-2DS1302内部结构图2。2.2DS1302的引脚图及功能DS1302的引脚图如图2-3所示。图2-3DS1302引脚图DS1302各引脚功能:SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次CE提供结束单字节或多字节数据传输的方法。引脚功能如表2-2所示:表2-2DS1302引脚功能说明引脚号名称功能1VCC1备份电源输入2X132.768KHz晶振输入3X232.768KHz晶振输出4GND地5RST控制移位寄存器/复位6I/O数据输入/输出7SCLK串行时钟8VCC2主电源输入2。2.3DS1302的寄存器1、DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如表2—3所示:表2-3DS1302的日历、时钟寄存器及其控制字寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H00--59CH10SECSEC分寄存器82H83H00--59010MINMIN时寄存器84H85H01-12或00-2312/24010HRHR日寄存器86H87H01-28,29,30,310010DATEDATE月寄存器88H89H01-—1200010MMONTH周寄存器8AH8BH01--0700000DAY年寄存器8CH8DH00—-9910YEARYEAR控制8EH8FH-WP0000000秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式.当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作.2、DS1302的工作模式寄存器所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如表2-4所示:表2-4突发模式寄存器工作模式寄存器读寄存器写寄存器时钟突发模式CLOCKBURSTBFHBEHRAM突发模式RAMBURSTFFHFEH3、DS1302还有涓流充电寄存器等。2。2。4DS1302的控制字DS1302的控制字如下表所示:表2—5控制字(即地址及命令字节)765432101RAMA4A3A2A1A0RD控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作.控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。2。2.5DS1302时序CE输入驱动高启动所有的数据传输。CE输入有两个功能.首先,CE打开控制逻辑,允许访问的移位寄存器的地址/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法.一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,所有的I/O引脚变为高阻抗状态,数据传输终止。对于数据输入:开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的上升沿输入。数据输入位0开始。对于数据输出:开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入,命令字节的最后一位被写入.当CE仍为高时。如果还有额外的SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的能力.2.3LCD1602液晶显示LCD1602是一种用5x7点阵图形来显示字符的液晶显示器模块,它显示的容量为2行16个字共32个字符.它由若干个5×7或者5×11点阵字符位组成,每个点阵字符位都可以显示一个字符.模块采用数字式接口,能够方便地与单片机等控制类芯片进行通信。由于其具有体积小、重量轻、显示质量高、功耗低等诸多优点而被广泛用于智能化仪器仪表的显示器件。2.3.1LCD1602引脚及功能LCD1602的引脚如图2-7所示:图2-7LCD1602引脚图LCD1602引脚功能表如下表2-7所示:表2—7LCD1602引脚功能表编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符图有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

LCD1602液晶模块内部的控制器共有11条控制指令,如表2-8所示:表2—8LCD1602控制命令表指令RSR/WD8D7D6D5D4D3D2D1清显示0000000001光标返回000000001*置输入模式00000001I/DS显示开/关控制0000001DCB光标或字符移位000001S/CR/L**置功能00001DLNF**置字符发生存贮器地址0001字符发生存贮器地址置数据存贮器地址001显示数据存贮器地址(ADD)读忙标志或地址01BF计数器地址(AC)写数到CGRAMD或DRAM10要写的数从CGRAMD或DRAM读数11读出的数据它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平,0为低电平)。指令1:清显示,指令码01H,光标复位到地址00H位置.指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标。B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线。N:低电平时为单行显示,高电平时双行显示。F:低电平时显示5X7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:高电平时为8位总线,低电平时为4位总线)。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读出忙信号和光标地址.BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙,模块就能接收相应的命令或者数据。指令10:写数据.指令11:读数据。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志位是不是为低电平,是低电平则表示不忙,否则此指令失效.要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。表2—9为LCD1602的内部显示地址。表2—9LCD1602的内部显示地址123·····141516第一行80H81H82H·····8DH8EH8FH第二行0C0H0C1H0C2H·····0CDH0CEH0CFH系统软件电路设计3.1系统流程图及源代码设计3。1.1主程序流程图设计液晶屏通信引脚定义液晶屏通信引脚定义DS1302通信引脚定义数据设定引脚定义开始引脚定义地址定义程序开始初始化液晶屏读取DS1302程序数据分离送显示缓存日历显示子程序数据存储地址显示数据缓冲地址初始化液晶屏幕显示初始画面清液晶屏幕显示空白读DS1302程序分离数据子程序写指令到液晶屏读数据到液晶屏图3—1主程序流程图图3—1主程序流程图YYYYYYYNNNNNNNNY3.1。2子程序流程图设计YYYYYYYNNNNNNNNYDS1302定时器中断子程序流程图开始开始给定时器再次赋值判断是否计满18次秒加1,判断是否等于60分加1,秒置0,判断分是否等于60时加1,分置0,判断时是否等于24日加1,时置0,判断该年是否为闰年判断日是否到月底月加1,日置1,判断月是否等于12年加1,月置1,判断年是否为100执行年、月、日、时、分、秒的显示结束图3—2DS1302中断流程图程序主要实现对DS1302写保护、充电,对年、月、日、时、分、秒等寄存器的读写操作。在读写操作子程序中都执行了关中断指令,因为在串行通信时对时序要求比较高,而且在此是用I/O口软件模拟串行时钟脉冲,所以在通信过程中最好保证传输的连续性,不要允许中断,如图3-2所示。LCD1602流程图程序主要实现对信息的显示,包括年、月、日、时、分、秒等信息,在这里要注意它的读写控制指令。其流程图如图3—3所示。开始RW和E都置零开始RW和E都置零设置点阵8位数据接口,两行显示开显示,不显示光标地址指针加一,画面不一定刷新,全部清零给地址,从第一行开始写显示第一行数据给第二行地址,显示第二行数据结束图3—3LCD1602初始化流程图3.1。3子程序源代码设计详见附录一3.1.3设计原理图详见附录二四心得体会

通过这次对《基于单片机的电子时钟设计》的设计与制作过程,加强了我们动手、思考和解决问题的能力。

在设计过程中我们利用Altium软件进行原理图及PCB图的绘制,最后再利仿真软件进行检查,看程序是否能显示其功能。在设计过程中让我进一步深刻的学习各种软件的利用以及各种软件给我们带来的便利。

该数字钟通过单片机AT89C51做CPU进行总的控制,基于时钟芯片DS1302产生时间,利用LCD1602进行液晶显示的一个简易的数字钟。LCD1602能够对年、月、日、周、日、时、分、秒进行计时及显示。通过设计后能够熟练的掌握时钟芯片DS1302、LCD1602、AT89C51的的各个引脚及功能,并能够掌握和运用这几个芯片。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我们学也到很多实用的知识,在次我们表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢五参考文献

[1]张义和.例说51单片机[M].北京:人民邮电出版社,2010年

[2]

阎石编著

数字电子技术基础

(第五版)

北京高等教育出版社]

2006.1~550

[3]

蔡明文

冯先成主编

单片机课程设计

华中科技大学出版社

2007。3

[4]陈明萤

编著

8051单片机课程设计实训教材

清华大学出版社

2004

[5]

康华光

编著

模拟电子技术基础(第五版)

高等教育出版社

2006

[6

]黄智伟

编著

全国大学生电子设计竞赛电路(第一版)航空航天大学出版社

2006.36[7]李可为。数字钟电路及应用[M].电子工业出版社,1996.[8]夏继强,沈德金.单片机实验与实践教程(二)[M]北航出版社,2001.[9]张红润,蓝清华。单片机应用技术教程[M]清华大学出版社,1997.。[10]周立功。单片机实验与实践[M]北京航空航天大学出版社,2004.[11]李朝青.单片机原理及接口技术[M].北京航空航天大学出版社,1994。附录一/*****************************************************程序名称:基于单片机和时钟芯片DS1302的电子时钟程序功能:时钟芯片采用DS1302ﻩﻩﻩ显示采用液晶屏LCD1602***************************************************/#include〈reg51。h>//包含单片机寄存器的头文件#include<intrins.h>//包含_nop_()函数定义的头文件#defineucharunsignedchar#defineuintunsignedint/***********************************************************************以下是DS1302芯片的操作程序************************************************************************/ucharcodedigit[10]={”0123456789"};//定义字符数组显示数字sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在P1。1引脚sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在P1.1引脚sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.1引脚/*****************************************************函数功能:延时若干微秒入口参数:n***************************************************/voiddelaynus(ucharn){uchari;for(i=0;i<n;i++);}/*****************************************************函数功能:向1302写一个字节数据入口参数:x***************************************************/voidWrite1302(uchardat){uchari;SCLK=0;ﻩ //拉低SCLK,为脉冲上升沿写入数据做好准备delaynus(2); ﻩ//稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{ﻩDATA=dat&0x01;ﻩ//取出dat的第0位数据写入1302 delaynus(2);//稍微等待,使硬件做好准备ﻩﻩSCLK=1;//上升沿写入数据 ﻩdelaynus(2);ﻩ//稍微等待,使硬件做好准备ﻩ SCLK=0;ﻩ//重新拉低SCLK,形成脉冲ﻩﻩdat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 }ﻩ}/*****************************************************函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据***************************************************/voidWriteSet1302(ucharCmd,uchardat){RST=0;//禁止数据传递SCLK=0;//确保写数居前SCLK被拉低ﻩRST=1;//启动数据传输ﻩdelaynus(2);//稍微等待,使硬件做好准备 Write1302(Cmd);//写入命令字ﻩWrite1302(dat);//写数据ﻩSCLK=1;//将时钟电平置于已知状态ﻩRST=0;//禁止数据传递}/*****************************************************函数功能:从1302读一个字节数据入口参数:x***************************************************/ucharRead1302(void){ uchari,dat; delaynus(2);//稍微等待,使硬件做好准备ﻩfor(i=0;i〈8;i++)//连续读8个二进制位数据ﻩ{ﻩﻩdat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位ﻩﻩif(DATA==1)//如果读出的数据是1ﻩﻩdat|=0x80;//将1取出,写在dat的最高位ﻩ SCLK=1;//将SCLK置于高电平,为下降沿读出ﻩﻩdelaynus(2);//稍微等待 ﻩSCLK=0;//拉低SCLK,形成脉冲下降沿 ﻩdelaynus(2);//稍微等待ﻩ}ﻩ returndat;//将读出的数据返回}/*****************************************************函数功能:根据命令字,从1302读取一个字节数据入口参数:Cmd***************************************************/ucharReadSet1302(ucharCmd){uchardat;RST=0;//拉低RSTSCLK=0;//确保写数居前SCLK被拉低RST=1;//启动数据传输Write1302(Cmd);//写入命令字dat=Read1302();//读出数据SCLK=1;//将时钟电平置于已知状态RST=0;//禁止数据传递returndat;//将读出的数据返回}/*****************************************************函数功能:1302进行初始化设置***************************************************/voidInit_DS1302(void){ﻩWriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值ﻩﻩﻩﻩﻩ ﻩﻩﻩﻩ//'/'除法运算,取整;’%’取模运算,取余 ﻩ ﻩﻩﻩ ﻩﻩﻩﻩ//数据前四位为十位,后四位为个位,详见寄存器表ﻩWriteSet1302(0x82,((0/10)〈<4|(0%10)));//根据写分寄存器命令字,写入分的初始值ﻩWriteSet1302(0x84,((12/10)〈<4|(12%10)));//根据写小时寄存器命令字,写入小时的初始值ﻩWriteSet1302(0x86,((01/10)<〈4|(01%10)));//根据写日寄存器命令字,写入日的初始值ﻩWriteSet1302(0x88,((06/10)〈〈4|(06%10)));//根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根据写小时寄存器命令字,写入小时的初始值}/*******************************************************************************以下是对液晶模块的操作程序*******************************************************************************/sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2。1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/voiddelay1ms(){unsignedchari,j;ﻩﻩfor(i=0;i<10;i++)ﻩfor(j=0;j〈33;j++) ;ﻩ }/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/voiddelaynms(unsignedcharn){unsignedchari; for(i=0;i<n;i++) delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitBusyTest(void){bitresult;ﻩRS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读写_nop_();//空操作_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给resultE=0;//将E恢复低电平returnresult;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/voidWriteInstruction(uchardictate){while(BusyTest()==1);//如果忙就等待ﻩRS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令ﻩRW=0;ﻩE=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置"0"ﻩ_nop_();ﻩ_nop_();//空操作两个机器周期,给硬件反应时间ﻩP0=dictate;//将数据送入P0口,即写入指令或地址ﻩ_nop_();ﻩ_nop_();ﻩ_nop_();ﻩ_nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平ﻩ_nop_(); _nop_();ﻩ_nop_();ﻩ_nop_();//空操作四个机器周期,给硬件反应时间ﻩE=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/voidWriteAddress(ucharx){WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/voidWriteData(uchary){while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据ﻩRW=0;ﻩE=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置"0"ﻩP0=y;//将数据送入P0口,即将数据写入液晶模块ﻩ_nop_(); _nop_();ﻩ_nop_();_nop_();//空操作四个机器周期,给硬件反应时间ﻩE=1;//E置高电平 _nop_(); _nop_();ﻩ_nop_();ﻩ_nop_();//空操作四个机器周期,给硬件反应时间ﻩE=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/voidLcdInitiate(void){delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口ﻩdelaynms(5);//延时5ms,给硬件一点反应时间WriteInstruction(0x38);ﻩdelaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功ﻩdelaynms(5);//延时5ms,给硬件一点反应时间ﻩWriteInstruction(0x0c);//显示模式设置:显示开,无光标,光标不闪烁 delaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置:光标右移,字符不移ﻩdelaynms(5);//延时5ms,给硬件一点反应时间ﻩWriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除ﻩdelaynms(5);//延时5ms,给硬件一点反应时间}/**************************************************************以下是1302数据的显示程序**************************************************************//*****************************************************函数功能:显示秒入口参数:x***************************************************/voidDisplaySecond(ucharx){uchari,j;ﻩﻩ//j,k,l分别储存温度的百位、十位和个位 i=x/10; ﻩ //取十位ﻩj=x%10; ﻩﻩ //取个位ﻩWriteAddress(0x49);ﻩ//写显示地址,将在第2行第7列开始显示ﻩWriteData(digit[i]);//将百位数字的字符常量写入LCDﻩWriteData(digit[j]);//将十位数字的字符常量写入LCDﻩdelaynms(50);ﻩ//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示分钟入口参数:x***************************************************/voidDisplayMinute(ucharx){ﻩuchari,j;ﻩ ﻩ//j,k,l分别储存温度的百位、十位和个位ﻩi=x/10; ﻩﻩﻩ //取十位 j=x%10;ﻩﻩﻩﻩﻩ//取个位 WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示ﻩWriteData(digit[i]);ﻩ//将百位数字的字符常量写入LCDﻩWriteData(digit[j]); //将十位数字的字符常量写入LCD delaynms(50);ﻩ//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示小时入口参数:x***************************************************/voidDisplayHour(unsignedcharx){ﻩuchari,j;ﻩﻩﻩ//j,k,l分别储存温度的百位、十位和个位ﻩi=x/10; ﻩ ﻩﻩ//取十位 j=x%10;ﻩﻩﻩﻩ //取个位ﻩWriteAddress(0x43);ﻩ//写显示地址,将在第2行第7列开始显示 WriteData(digit[i]);//将百位数字的字符常量写入LCDﻩWriteData(digit[j]);//将十位数字的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示日入口参数:x***************************************************/voidDisplayDay(ucharx){ uchari,j;ﻩﻩ//j,k,l分别储存温度的百位、十位和个位ﻩi=x/10;ﻩﻩﻩ //取十位 j=x%10;ﻩﻩﻩ //取个位ﻩWriteAddress(0x0c);//写显示地址,将在第2行第7列开始显示ﻩWriteData(digit[i]);//将百位数字的字符常量写入LCDﻩWriteData(digit[j]);//将十位数字的字符常量写入LCDﻩdelaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示月入口参数:x***************************************************/voidDisplayMonth(ucharx){ uchari,j;ﻩﻩﻩ//j,k,l分别储存温度的百位、十位和个位ﻩi=x/10;ﻩﻩ ﻩﻩ//取十位ﻩj=x%10;ﻩﻩﻩﻩﻩ//取个位ﻩWriteAddress(0x09);ﻩ//写显示地址,将在第2行第7列开始显示ﻩWriteData(digit[i]);//将百位数字的字符常量写入LCDﻩWriteData(digit[j]);//将十位数字的字符常量写入LCDﻩdelaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示年入口参数:x***************************************************/voidDisplayYear(ucharx){ﻩuchari,j;ﻩﻩﻩ//j,k,l分别储存温度的百位、十位和个位ﻩi=x/10; ﻩﻩﻩ //取十位ﻩj=x%10;ﻩﻩﻩﻩﻩ//取个位ﻩWriteAddress(0x06);//写显示地址,将在第2行第7列

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论