毕业设计(论文)基于AT89S51单片机的多功能时钟设计_第1页
毕业设计(论文)基于AT89S51单片机的多功能时钟设计_第2页
毕业设计(论文)基于AT89S51单片机的多功能时钟设计_第3页
毕业设计(论文)基于AT89S51单片机的多功能时钟设计_第4页
毕业设计(论文)基于AT89S51单片机的多功能时钟设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录1 绪 论11.1 发展现状、目的及意义11.2 设计内容12 系统总体设计22.1 总体框架设计22.2 设计与运行环境22.3 硬件功能描述23 系统硬件设计33.1 主控模块at89s5133.1.1 at89s51引脚图33.1.2 at89s51功能33.2 实时时钟芯片ds130253.2.1 ds1302引脚功能53.2.2 ds1302内部结构图63.2.3 ds1302的数据输入输出63.2.4 ds1302的寄存器63.3 电源模块的设计73.4 独立按键模块73.5 显示模块83.6 复位电路模块83.7闹铃模块94 系统软件设计104.1 主程序设计104.2 主

2、程序流程图104.3 读ds1302中断及闹铃检测流程图115 结 论12致 谢12参考文献14附 录15281 绪论1 绪 论1.1 发展现状、目的及意义单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机具有体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器cpu随机存储器ram、只读存储器rom、多种i/o口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、a/d转换器等电路)集

3、成到一块硅片上构成的一个小而完善的计算机系统。单片机在出现时,intel公司就给其单片机取名为嵌入式微控制器(embedded microcontroller)。单片机的最明显的优势,就是可以嵌入到各种仪器、设备中。这一点是巨型机和网络不可能做到的。单片机在内部已集成了越来越多的部件,这些部件包括一般常用的电路,例如:定时器,比较器,a/d转换器,d /a转换器,串行通信接口,watchdog电路,lcd控制器等。 随着半导体工艺技术的发展及系统设计水平的提高,单片机还会不断产生新的变化和进步,最终人们可能发现:单片机与微机系统之间的距离越来越小,甚至难以辨认。同时,随着人们生活节奏的加快,时

4、钟已经成为人们日常生活中的必需品,许多家用电器都带着时钟模块,而人们也不再满足于仅仅具有时间显示功能的时钟,对时钟功能的要求也越来越全面,单片机以其强大的功能成为多功能电子时钟的首选,为电子时钟的功能扩展提供了强大的支持,实现一物多用,提高电子时钟的使用价值。当然们不再满足于电子时钟的计时显示功能时语音时钟在社会生活中已经得到了广泛应用,本文探讨的系统即为其中一种,给出的实现方案和系统设计过程中实现的单片机模拟单线总线通信方式,单片机模拟spi通信方式,有一定参考价值。此外,文中探讨的系统也对传统的语音时钟做了扩充,增加了数字温度计模块。本设计详细介绍了该系统的组成和基本原理,中带你介绍了硬件

5、设计的思想和软件设计的思路,保证在系统功能齐全,性能良好的前提下,最大限度的简化电路,降低系统的整体成本,提高系统的可靠性!1.2 设计内容基于单片机的多功能时钟设计,主要探讨了一种带数字温度计的语音时钟的实现方案。本方案采用单片机at89s51作为控制单元,与数字温度芯片ds18b20接口获得温度数据,与实时时钟芯片ds1302接口获得时间/日历数据,通过与液晶模块ocm12864-1接口显示温度,时间和日历。按键中断模块包含四个按键,分别与单片机int0,int1,t0,t1引脚连接,实现四个外部中断源,用以调整时间和闹钟,开关闹钟和控制语音报时。语音报时通过语音芯片isd4003-4和扬

6、声器实现。2 系统总体设计2 系统总体设计2.1 总体框架设计系统结构如图2-1所示。本方案采用单片机at89s51作为控制单元,与数字温度芯片ds18b20接口获取温度数据,与实时时钟芯片ds1302接口获取时间/日历数据,通过与液晶模块ocm12864-1接口显示温度、时间和日历。图1中的按键中断模块包含了四个按键,分别与单片机的int0,int1,t0,t1连接,实现四个外部中断源,用以调整时间和闹钟,开关闹钟和控制语音报时。图2-1 系统结构图2.2 设计与运行环境数字钟的程序设计和调试均在keil uvision2环境下完成的。设计并完成的程序下载至stc89c52单片机后,即可初始

7、化时钟芯片ds1302从而开始计时,系统开始正常运行。2.3 硬件功能描述(1)本设计采用ds1302实时时钟芯片来进行计时,并将1302的数据输入单片机进行处理,送入lcd1602液晶显示屏进行显示。(2)用四个电位按键来实现对电子时钟的调试工作,当按第一下总控键时进入中断程序,即时钟的调整状态,有两个电位按键分别来调整时钟的加和减;第四个按键用来调整时分秒日月年,按一下调整秒,连按两下调整分,按三下调整时,四下调整日,五下调整月,六下调整年,七下退出时间设置。(3)用一个按键和其他部件组成的复位电路与芯片连接来实现整个程序及硬件的重新复位功能。3 系统硬件设计3 系统硬件设计数字钟的电路主

8、要有电源模块、显示模块、按键模块、复位电路模块、时钟芯片模块、主控芯片stc89c52模块和闹铃模块等7大模块组成。3.1 主控模块at89s51at89s51是51系列单片机的一个型号,它是atmel公司生产的。at89s51是一个低电压,高性能cmos 8位单片机,片内含8k bytes的可反复擦写的flash只读程序存储器和256 bytes的随机存取数据存储器(ram),器件采用atmel公司的高密度、非易失性存储技术生产,兼容标准mcs-51指令系统,片内置通用8位中央处理器和flash存储单元,功能强大的at89s51单片机可为您提供许多较复杂系统控制应用场合。at89s51有40

9、个引脚,32个外部双向输入/输出(i/o)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,at89s51可以按照常规方法进行编程,但不可以在线编程(s系列的才支持在线编程)。其将通用的微处理器和flash存储器结合在一起,特别是可反复擦写的flash存储器可有效地降低开发成本。at89s51有pdip、pqfp/tqfp及plcc等三种封装形式,以适应不同产品的需求。3.1.1 at89s51引脚图at89s51引脚图如图3-1:图3-1 at89s51引脚图3.1.2 at89s51功能at89s51为40 脚双列直插封装的8 位通用微处理器,采用

10、工业标准的c51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主ic 内部寄存器、数据ram及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号ir的接收解码及与主板cpu通信等。at89s51的主要管脚有:(1) xtal1(19 脚)和xtal2(18 脚):振荡器输入输出端口,外接12mhz 晶振。rst/vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。vcc(40 脚)和vss(20 脚)为供电端口,分别接+5v电源的正负端;p0p3:为可编程通用i/o 脚,其功能用途由软件定义,在本设计中,p0 端

11、口(3239 脚)被定义为n1 功能控制端口,分别与n1的相应功能管脚相连接,13 脚定义为ir输入端,10 脚和11脚定义为i2c总线控制端口,分别连接n1的sdas(18脚)和scls(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板cpu 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。(2) p0 口:p0 口是一组8 位漏极开路型双向i/o 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个ttl逻辑门电路,对端口p0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8

12、位)和数据总线复用,在访问期间激活内部上拉电阻。在flash 编程时,p0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。p1 口:p1 是一个带内部上拉电阻的8 位双向i/o 口, p1 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。与at89c51 不同之处是,p1.0 和p1.1 还可分别作为定时/计数器2 的外部计数输入(p1.0/t2)和输入(p1.1/t2ex), p2 口:p2 是一个

13、带有内部上拉电阻的8 位双向i/o 口,p2 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对端口p2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。在访问外部程序存储器或16 位地址的外部数据存储器(例如执行movx dptr 指令)时,p2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行movx ri 指令)时,p2 口输出p2 锁存器的内容。flash 编程或校验时,p2亦接收高位地址和一些控制信号。 p3 口:p3 口是一组带有内部上拉电阻的8 位双

14、向i/o 口。p3 口输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对p3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的p3 口将用上拉电阻输出电流(iil)。p3 口除了作为一般的i/o 口线外,更重要的用途是它的第二功能 ,p3 口还接收一些用于flash 闪速存储器编程和程序校验的控制信号。 (3) rst:复位输入。当振荡器工作时,rst引脚出现两个机器周期以上高电平将使单片机复位。 (4) ale/prog:当访问外部程序存储器或数据存储器时,ale(地址锁存允许)输出脉冲用于锁存地址的低8 位字节。一般情况下,ale 仍以时钟振荡频率的1

15、/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ale 脉冲。对flash 存储器编程期间,该引脚还用于输入编程脉冲(prog)。如有必要,可通过对特殊功能寄存器(sfr)区中的8eh 单元的d0 位置位,可禁止ale 操作。该位置位后,只有一条 movx 和movc指令才能将ale 激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ale 禁止位无效。 (5) psen:程序储存允许(psen)输出是外部程序存储器的读选通信号,当at89s51 由外部程序存储器取指令(或数 据)时,每个机器周期两次psen 有效,即输出两

16、个脉冲。在此期间,当访问外部数据存储器,将跳过两次psen信号。(6) ea/vpp:外部访问允许。欲使cpu 仅访问外部程序存储器(地址为0000hffffh),ea 端必须保持低电平(接地)。需注意的是:如果加密位lb1 被编程,复位时内部会锁存ea端状态。如ea端为高电平(接vcc端),cpu 则执行内部程序存储器中的指令。flash 存储器编程时,该引脚加上+12v 的编程允许电源vpp,当然这必须是该器件是使用12v 编程电压vpp。 (7) xtal1:振荡器反相放大器的及内部时钟发生器的输入端。 (8) xtal2:振荡器反相放大器的输出3.2 实时时钟芯片ds1302ds130

17、2由美国dallas公司推出的具有涓细电流充电能力的低功耗实时时钟电路,它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。ds1302 存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。ds1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。3.2.1 ds1302引脚功能ds1302的引脚排列,其中vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大者供电。当vcc2大于vcc10.2v时,vcc2给ds1302供电。当vcc2小于vcc1

18、时,ds1302由vcc1供电。x1和x2是振荡源,外接32.768khz晶振。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中rst置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电运行时,在vcc>2.0v之前,rst必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。i/o为串行数据输入输出端(双向),sclk为时钟输

19、入端。3.2.2 ds1302内部结构图ds1302内部结构图如图3-2:图3-2 ds1302内部结构图3.2.3 ds1302的数据输入输出在控制指令字输入后的下一个sclk时钟的上升沿时数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位至高位7,数据读写时序如图3-3所示:图3-3 ds1302的数据输入输出3.2.4 ds1302的寄存器ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。其日历、时间寄存器及其控制字见表1.1。此外,ds1302

20、还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 ds1302与ram相关的寄存器分为两类,一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0h-fdh,其中奇数为读操作,偶数为写操作;再一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。表1.1 ds1302日历、时间寄存器及其控制字寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80h81h00-59ch10secsec分寄存器82

21、h83h00-59010minmin时寄存器84h85h00-12/2412/24010hrhr日寄存器86h87h00-28/29/30/310010datedate月寄存器88h89h00-1200010mmonth周寄存器8ah8bh01-0700000date年寄存器8ch8dh01-9910yearyear3.3 电源模块的设计电源模块采用7805进行稳压,保证+5v电压的稳定输出,进一步提高系统的抗干扰能力和稳定性。电源模块的设计如图3-4所示:图3-4 电源模块的设计3.4 独立按键模块系统有三个独立按键,独立按键s1、s2、s3分别接至单片机p3.2、p3.3、p3.4口。s1

22、用来功能选择,其功能可以用按键次数n来表示:n=1:校准计时的小时位 n=2:校准计时的分钟位n=3:校准闹铃的小时位 n=1:校准闹铃的分钟位 n=5:退出 s2主要功能用来进行加一操作。在有功能选择的情况下,无论选中那一种功能操作,按下s2即进行一次加一操作,在没有功能选择的情况下,系统不响应此按键的任何操作。 s3用来控制闹铃的开或者关,在任意时间只要按下此键即可打开(或关闭)闹铃,在按键一次就可以关闭(或打开)闹铃。闹铃模块的设计如图3-5所示:图3-5 闹铃模块的设计3.5 显示模块 一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。同时显示模

23、块提供了良好的人机交互平台。常用的显示模式有led 7段数码管显示、点阵显示和液晶显示。液晶显示屏(lcd)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。但由于液晶其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。鉴于led 7段数码管成本低,也比较容易实现的特点,最终确定使用共阴极数码管来显示。 本系统显示模块电路由一块74hc573、一块74hc138芯片和两个四位一体7段数码管组成。74hc573用来驱动数码管,74hc573的q0q7分别接四位一体数码管的adp。74hc138控制位选。显

24、示模块的设计如图3-6所示:图3-6 显示模块的设计3.6 复位电路模块复位电路主要的功能是是整个系统初始化,在每次上电时系统自动初始化,如果在程序运行的过程中程序没有响应或者需要进行一次初始化,这是可以通过按复位开关来实现需要的有效操作。复位电路模块的设计如图3-7所示:图3-7 复位电路模块的设计3.7闹铃模块闹铃模块由蜂鸣器和蜂鸣器的驱动组成。在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。闹铃模块的设计如图3-8所示:图3-8 闹铃模块的设计4 系统软件设计4 系统软件设计4.1 主程序设计包含主程序设计、语音芯片录放音程序设计、实时时钟程序设计、温度芯片程序设计、

25、液晶显示程序设计五部分。该数字电子时钟程序设计如下:(1)在程序头将设计中的一些io口进行分配并注释。(2)初始化程序,对单片机的io口设置为输入输出等,对1302,1602的参数进行设置,如设定时钟运行为24小时制;将一些未到时钟设计功能的功能端口关闭等。(3)开始主程序进行程序扫描,先扫初始化字子程序初始化ds1302和lcd1602,启动时钟芯片进行计时,初始化1602的显示方式,将分配好的时分秒等数字调入到显示子程序中。>显示子程序通过分配的空间对应口将ds1302时钟芯片的数据显示相应的时分秒,年月日等。>进入按键扫描,判断按键是否有变动,若有就根据设计程序对相应的按键按

26、入次数而进行实现相应的功能。如进入时间调整,中断进入、退出等。>最后返回主程序头重新依次扫描。显示过程设有消隐,按键通过软件去斗。(4)子程序部分。在主程序的调用下依据不同的子程序工能而编写子程序,有多级嵌套。这些子程序包括显示子程序、延时子程序、时间计数子程序、按键处理子程序、调时间子程序等。4.2 主程序流程图主程序流程图如图4-1所示:图4-1 主程序流程图4.3 读ds1302中断及闹铃检测流程图读ds1302中断及闹铃检测流程图如图4-2所示:图4-2 读ds1302中断及闹铃检测流程图5 结 论5 结 论通过这次毕业设计,不仅将以前的知识来个总结,而且也学到了新知识。这应该也

27、是为什么学校要让我们做毕业设计的原因吧。出去工作了,工作对不对口还说不定,如果把两年学习的知识忘的一干二净了,那太对不起自己更对不起父母和老师!当我做我的毕业论文“基于ds1302数字时钟电路的设计”的时候就感觉到以前的知识都忘的差不多了,不过庆幸的事,以前打了好基础,在做之前把以前的知识在认真的看一遍也差不多。不过,这次我用的方法跟以前大不相同。语音芯片isd4003-4和数字温度芯片ds18b20这两方面知识,我在大三的时候学过一点,但是那是一心想出去,就没有认真的去学。做毕业论文的时候是从今年刚开始的,所以时间还是比较充足的,跟指导老师商讨,确定下来题目,压力是比较大的,语音芯片isd4

28、003-4和数字温度芯片ds18b20这两方面知识是从没接触过的,但是也考虑到时间的充足就想给自己一个机会,锻炼自己,所以刚开始得先学习语音芯片isd4003-4和数字温度芯片ds18b20这两方面知识,还要弄懂,理解及其运用它们。语音芯片isd4003-4和数字温度芯片ds18b20这两方面知识。在遇到问题的时候能够及时的发现问题并解决问题。在做的过程中也阅读了大量相关书籍,提高总结的动手能力,和自学能力,为以后的工作打下良好的基础。在做论文的过程中,论文格式是让我很头疼的问题,对于论文格式的问题还是请教了老师和在网络搜索到方法。通过这次设计我也摆脱了单纯的理论知识学习状态,和实际的设计的结

29、合锻炼了我的综合运用所以的专业基础知识,解决实际问题的能力。通过这次毕业设计,我相信单片机的发展前景非常广阔。致 谢致 谢在论文完成之际,我首先向关心帮助和指导我的指导老师表示衷心的感谢并致以崇高的敬意!在论文工作中,遇到了很多的问题,比如格式,比如内容一直得到老师的亲切关怀和悉心指导,使我自己在论文写作上面有很大的进步,也感觉到老师的良苦用心,因为之前感觉自己在论文完成上的很大不足在老师的帮助下得到了很大的改进,即使是在外地实习期间老师依然在无时无刻的不在关心着我们,对我们的不定期打扰也能悉心的接受并耐心帮助,驱除了我们心中的小小罪恶感!老师以其渊博的学识、严谨的治学态度、求实的工作作风和他

30、敏捷的思维给我留下了深刻的印象,我将终生难忘再一次向他表示衷心的感谢,感谢他为学生营造的浓郁学术氛围,以及学习、生活上的无私帮助! 值此论文完成之际,谨向指导老师致以最崇高的谢意!在学校的学习生活即将结束,回顾两年多来的学习经历,面对现在的收获,我感到无限欣慰。为此,我向热心帮助过我的所有老师和同学表示由衷的感谢!特别感谢我的同学们对我的学习和生活所提供的大力支持和关心!初来乍到,幸好有他们的领导和帮助,我才能尽快的适应这个陌生而极具吸引力的环境,又因为他们我在其他的方面也能有所发挥,这份信任以及信任带来的自信是什么都取代不了的,我的校园生活多姿多彩多亏了有他们!还要感谢一直关心帮助我成长的室

31、友们!她们给我带来的家的温暖使我在整个学习中有信心和力量战胜困难!在我即将完成学业之际,我深深地感谢我的家人给予我的全力支持!没有她们就没有我的今天,以后的路我会带着他们的祝愿和期望一直骄傲的走下去!最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授!你们的谆谆教导使我在学业上受益匪浅,你们给的建议和意见将是我在学术上得到很大的提高,毕业走进社会后我们的心中只要还留着这份老师给的无私关怀就能坦然面对社会的人情冷暖!参考文献参考文献1王明顺,赵德平.可涓流充电的串行实时时钟芯片ds1302及应用设计j.国外电子元器件,19972高性能、低功耗带ram实时时钟芯片ds1302.ps武汉力

32、源电子股份有限公 司,19993 zymcu at89s51 datasheets4黄明强.ds1302在单片机系统中的应用j.保定师范专科学校学报,2004,175赵海兰,朱剑,赵祥伟.ds1302实时显示时间的原理与应用j.电子技术术,2002,(1)6邓红,张越编著.单片机实验与应用设计教程m.冶金工业出版社,2004,57孙雪梅,范久臣.实时时钟芯片在单片机系统中的应用j.沈阳教育学院学报,2005,7(2)附 录附 录附录1 系统原理图附图1 系统原理图附录2 源程序清单#include "stm8s105c_s.h"uchar n1,n2,n3;uchar u0

33、,u1,u2,u3;uchar table="20 - - " uchar table1=" : : "uchar table2='0','1','2','3','4','5','6','7','8','9'uchar table3="montuewedthufrisatsun"uchar table4=" happy birthday " /16个字符uc

34、har table5="<<<<<to you>>>>>"#define uint unsigned int #define uchar unsigned char #define pb pb_odr#define write_second 0x80 /秒写寄存器地址#define write_minute 0x82/分写寄存器地址#define write_hour 0x84/时写寄存器地址#define write_day 0x86/日写寄存器地址#define write_month 0x88/月写寄存器地址

35、#define write_week 0x8a/周写寄存器地址#define write_year 0x8c/年写寄存器地址#define write_protect 0x8e/写保护字节写寄存器地址#define write_chongdian 0x90 /慢充电寄存器地址#define read_second 0x81/秒读寄存器地址#define read_minute 0x83/分读寄存器地址#define read_hour 0x85/时读寄存器地址#define read_day 0x87/日读寄存器地址#define read_month 0x89/月读寄存器地址#define

36、read_week 0x8b/周读寄存器地址#define read_year 0x8d/年读寄存器地址_bool rs pc_odr:1; /pc作为lcd的控制端,设置为输入_bool rw pc_odr:2;_bool en pc_odr:3;_bool sclk pa_odr:4; /串行时钟,输入输出控制_bool dio pa_odr:5; /三线接口时的数据线_bool id pa_idr:5;_bool ce pa_odr:6; /复位_bool da_od pa_ddr:5;_bool da_cr1 pa_cr1:5;_bool da_cr2 pa_cr2:5;_bool i

37、d1 pg_idr:0; /将pd6引脚设置我外部中断的输入引脚_bool id2 pd_idr:5;_bool id3 pg_idr:1;_bool id4 pd_idr:6;/键盘的输入/shfm_key(void) uchar lshi;uchar an=0,n=0;doif(!id1)delay(6);if(!id1)while(!id1);lshi=1;an+;if(an=1)write_ds1302(write_second,0x80); /先暂停时钟秒u2=read_ds1302(read_second );u2=(u2&0x70)>>4)*10+(u2&am

38、p;0x0f);write_sfm(6,u2); lcd_wcom(0x80+0x40+7);lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标if(an=2)u1=read_ds1302(read_minute);u1=(u1&0x70)>>4)*10+(u1&0x0f);write_sfm(3,u1); lcd_wcom(0x80+0x40+4); /显示分lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标if(an=3)u0=read_ds1302(read_hour);u0=(u0&0x

39、70)>>4)*10+(u0&0x0f);write_sfm(0,u0); lcd_wcom(0x80+0x40+1); /显示时lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标if(an=4)n3=read_ds1302(read_day);n3=(n3&0x70)>>4)*10+(n3&0x0f);write_sfm1(8,n3); lcd_wcom(0x80+9); /显示日lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标if(an=5)n2=read_ds1302(rea

40、d_month);n2=(n2&0x70)>>4)*10+(n2&0x0f);write_sfm1(5,n2); lcd_wcom(0x80+6); /显示月lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标 if(an=6)n1=read_ds1302(read_year);n1=(n1&0x70)>>4)*10+(n1&0x0f);write_sfm1(2,n1);lcd_wcom(0x80+3); /显示年lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标if(an=7

41、)lshi=0;an=0;write_ds1302(write_second,0x00); /从新开启时钟lcd_wcom(0x38);lcd_wcom(0x0c);n=1; switch(an)case1:if(id2=0)delay(4);if(id2=0) while(!id2);_asm("nop");jia_key(write_second,read_second,6,1);_asm("nop");if(id3=0) /秒的减 delay(4);if(id3=0) while(!id3);_asm("nop");jia_ke

42、y(write_second,read_second,6,0);_asm("nop");break;case 2 :if(id2=0) /分的加delay(4);if(id2=0)while(!id2);_asm("nop");jia_key(write_minute ,read_minute,3,1);_asm("nop");if(id3=0) /分的减delay(4);if(id3=0) while(!id3);_asm("nop");jia_key(write_minute ,read_minute,3,0)

43、;_asm("nop"); break;case 3 :if(id2=0) /时的加 delay(4);if(id2=0) while(!id2);_asm("nop");hjia_key(write_hour,read_hour,0,1);_asm("nop"); if(id3=0) /小时的减 delay(4);if(id3=0) while(!id3);_asm("nop");hjia_key(write_hour,read_hour,0,0);_asm("nop"); break;cas

44、e 4: if(id2=0) /日的加 delay(4);if(id2=0) while(!id2);_asm("nop");rjia_key(write_day,read_day,8,1);_asm("nop");if (id3=0) /日的减 delay(4);if(id3=0) while(!id3);_asm("nop");rjia_key(write_day,read_day,8,0);_asm("nop");break;case 5: if(id2=0) /月的加delay(4);if(id2=0) w

45、hile(!id2);_asm("nop");yjia_key(write_month ,read_month,5,1);_asm("nop"); if(id3=0) /月的减 delay(4);if(id3=0) while(!id3);_asm("nop");yjia_key(write_month ,read_month,5,0);_asm("nop"); break;case 6:if(id2=0) /年的加 delay(4);if(id2=0) while(!id2);_asm("nop&quo

46、t;);njia_key(write_year,read_year,2,1);_asm("nop"); if(id3=0) /年的减delay(4);if(id3=0) while(!id3);_asm("nop");njia_key(write_year,read_year,2,0);_asm("nop"); break; while(lshi=1);_asm("nop");return(n);return(n); void write_ds1302(uchar addr,uchar dat)uchar i ;p

47、c_ddr |=0xff;pc_cr1 |=0xff;pc_cr2 |=0x00;ce = 0; /先复位sclk = 0; /清零,保持io口的低电平,以待数据的写入ce = 1; /置1,开始写数据/发送地址for(i =0;i<8;i+)dio= addr&0x01; /将一位bcd码的数据送给io口addr=addr >>1; /右移一位sclk =1; /产生上升沿,发送数据sclk =0;/发送数据for(i=0;i<8;i+) dio= dat&0x01; /将一位bcd码的地址数据送给io口dat =dat>>1;sclk=1

48、; /产生上升沿,发送数据delay(1);sclk=0;ce = 0;/读操作/read_ds1302(uchar addr) uchar i;uchar k;uchar dat;da_od=0;da_cr1=0;da_cr2=0;ce=0;sclk=0;ce=1;/发送地址for(i=0;i<8;i+)sclk=0;delay(10);if(addr&0x01)dio=1;else dio=0;addr>>=1;sclk=1;delay(2);da_od=0;da_cr1=0;da_cr2=0;/读取数据/for(k=0;k<8;k+) dat>>

49、;=1;sclk=1;delay(2);sclk=0;delay(2); if(id=0)dat&=0x7f;else dat |= 0x80 ;sclk=1;ce=0;return(dat);/io口的初始化/void gpio_init(void) pc_ddr |=0x0f;pc_cr1 |=0x0f;pc_cr2 |=0x00;pg_ddr |=0x00;pg_cr1 |=0x03;pg_cr2 |=0x00;pd_ddr |=0x1c;pd_cr1 |=0x0f;exti_cr1|=0x00;itc_spr2|=0x30;pd_cr2 |=0x40;pa_ddr |=0xff

50、;pa_cr1 |=0xff;pa_cr2 |=0x00;pb_ddr |=0xff;pb_cr1 |=0xff;pb_cr2 |=0x00;/延时函数/void delay(uint n) uint x,y; for(x=n;x>0;x-) for(y=110;y>0;y-); /1602写命令函/void lcd_wcom(uchar com)rs=0; /选择指令寄存器 rw=0; /选择写 pb=com; /把命令字送入pbdelay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,命令送入1602的8位数据口 en=0; /1602写数据函数

51、 /void lcd_wdat(uchar dat) rs=1; /选择数据寄存器 rw=0; /选择写 pb=dat; /把要显示的数据送入p2 delay(5); /延时一小会儿,让1602准备接收数据 en=1; /使能线电平变化,数据送入1602的8位数据?en=0; /1602初始化函数/void lcd_init(void) uchar a,k;delay(15); /等待电源稳定lcd_wcom(0x38); /8位数据,双列,5*7字形 lcd_wcom(0x0c); /开启显示屏,关光标,光标不闪烁 lcd_wcom(0x06); /显示地址递增,即写一个数据后显示位置右移一

52、位 lcd_wcom(0x01); /清屏 /显示第一行/lcd_wcom(0x80);for(a=0;a<15;a+)lcd_wdat(tablea);delay(5);/显示第二行/lcd_wcom(0x80+0x40);for(k=0;k<8;k+) lcd_wdat(table1k);delay(5);/年月日时分秒输入的子函数/秒分的加减子函数/输入/void jia_key(uchar rd,uchar wd,uchar fd,uchar fen)u1=read_ds1302(wd);_asm("nop");u1=(u1&0x70)>&

53、gt;4)*10+(u1&0x0f);if(fen=1) u1+;if(u1=60) u1=0;else u1-;if(u1+1)=0) u1=59;if(u1>59) u1=59;write_ds1302(rd,(u1/10)<<4 | (u1%10);/秒write_sfm(fd,u1); lcd_wcom(0x80+0x40+fd);/显示分lcd_wcom(0x38);lcd_wcom(0x0f);/显示功能开,有光标/时的加减子函数/输入/void hjia_key(uchar rd,uchar wd,uchar fd,uchar shi)u0=read_d

54、s1302(wd);u0=(u0&0x70)>>4)*10+(u0&0x0f);if(shi=1) u0+;if(u0=24)u0=0;else u0-;if(u0+1)=0) u0=23; if(u0>23) u0=23; write_ds1302(rd,(u0/10)<<4 | (u0%10); /秒_asm("nop");write_sfm(fd,u0);lcd_wcom(0x80+0x40+fd); /显示分_asm("nop");lcd_wcom(0x38);lcd_wcom(0x0f); /显示功能开,有光标lcd_wcom(0x80+0x40+fd);/日的加减子函数/输入/void rjia_key(uchar rd,uchar

温馨提示

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

评论

0/150

提交评论