51单片机电子日历课程设计
基于单片机C51的万年历课程设计报告
课程设计说明书课程名称:《单片机技术》设计题目:基于单片机的万年历设计院(部):电子信息与电气工程学院学生:学号:专业班级:电子信息工程10-1指导教师:2013年 05 月 17 日课程设计任务书万年历设计摘要:以AT89S52为主控芯片设计了一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能。
本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。
温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。
时间和闹钟的值由按键调整设置,采用通用的二十四小时制。
关键词:单片机;液晶显示屏;温度传感器;时钟芯片目录1. 设计背景 (1)1.1 概述 (1)1.2 万年历设计目的 (1)2.设计方案 (2)2.1 按键控制模块设计与论证 (2)2.2 时钟模块设计与论证 (2)2.3 显示模块模块设计与论证 (3)3. 方案实施 (4)3.1系统整体框图 (4)3.2原理图设计 (4)3.2.1 单片机最小系统模块 (4)3.2.2 电源模块 (5)3.2.3 时钟芯片DS1302模块 (6)3.2.4温度采集DS18B20模块 (6)3.2.5 闹钟模块 (7)3.2.6 LCD1602显示模块 (8)3.2.7 按键模块 (9)3.3 软件设计 (9)3.4 系统仿真 (10)3.5系统制作 (11)4. 结果与结论 (12)4.1 结果 (12)4.2 结论 (12)5. 收获与致 (13)6. 参考文献 (14)7. 附件 (15)7.1 原理图 (15)系统电路图如图7.1所示: (15)7.2 元器件清单 (15)7.3 实物图 (16)7.3.1 正常工作 (16)7.3.2 调试状态 (17)7.3.3 闹钟设置状态 (18)1. 设计背景1.1 概述如今万年历已经在人们生活中广泛的使用,它不仅是记录日期和时间的工具,而且也成为了一种装饰品。
基于51单片机的万年历设计
基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。
51 单片机作为核心控制器,负责整个系统的运行和数据处理。
时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。
二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。
2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。
3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。
4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。
三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。
然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。
接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。
2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。
3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。
4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
51单片机课程设计——电子万年历
电子万年历的设计学院计算机与控制工程学院专业班级自动化学生姓名指导教师2010年6月25日引言随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。
为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。
第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。
第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。
第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。
商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。
本设计主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、LED 动态扫描显示屏显示。
AT89C51单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。
基于单片机C51的万年历课程设计报告
课程设计说明书课程名称:《单片机技术》设计题目:基于单片机的万年历设计院(部):电子信息与电气工程学院学生:学号:专业班级:电子信息工程10-1指导教师:2013年 05 月 17 日课程设计任务书万年历设计摘要:以AT89S52为主控芯片设计了一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能。
本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。
温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。
时间和闹钟的值由按键调整设置,采用通用的二十四小时制。
关键词:单片机;液晶显示屏;温度传感器;时钟芯片目录1. 设计背景 (1)1.1 概述 (1)1.2 万年历设计目的 (1)2.设计方案 (2)2.1 按键控制模块设计与论证 (2)2.2 时钟模块设计与论证 (2)2.3 显示模块模块设计与论证 (3)3. 方案实施 (4)3.1系统整体框图 (4)3.2原理图设计 (4)3.2.1 单片机最小系统模块 (4)3.2.2 电源模块 (5)3.2.3 时钟芯片DS1302模块 (6)3.2.4温度采集DS18B20模块 (6)3.2.5 闹钟模块 (7)3.2.6 LCD1602显示模块 (8)3.2.7 按键模块 (9)3.3 软件设计 (9)3.4 系统仿真 (10)3.5系统制作 (11)4. 结果与结论 (12)4.1 结果 (12)4.2 结论 (12)5. 收获与致 (13)6. 参考文献 (14)7. 附件 (15)7.1 原理图 (15)系统电路图如图7.1所示: (15)7.2 元器件清单 (15)7.3 实物图 (16)7.3.1 正常工作 (16)7.3.2 调试状态 (17)7.3.3 闹钟设置状态 (18)1. 设计背景1.1 概述如今万年历已经在人们生活中广泛的使用,它不仅是记录日期和时间的工具,而且也成为了一种装饰品。
基于51单片机电子闹钟或万年历的设计课程设计
目录目录. (1)1. ..................................................................... 工程背景. 31.1工程研究地目地和意义. (3)1.2课题研究地内容 (3)2.方案地选择和和论证. (4)2.1单片机型号地选择. (4)2.2按键地选择. (4)2.3显示器地选择. (4)2.4计时部分地选择. (5)2.5发音部分地设计. (5)2.6电路设计最终方案 (5)3.AT89C52 单片机简介 (6)3.1单片机基本特性 (6)3.2单片机内部结构图 (6)3.3单片机I/O 引脚结构. (6)3.3.1P0 口 (6)3.3.2P1 口 (7)3.3.3P2 口 (7)3.3.4P3 口 (7)3.4单片机最小系统板 (8)4.数字电子钟地设计原理和方法. (9)4.1设计原理. (9)4.2硬件电路地设计. (9)4.2.1DS1302 时钟芯片 (9)4.2.21602 液晶简介. (11)4.2.3蜂鸣器驱动电路. (12)4.2.4独立键盘电路. (13)5. ......................................................................... 软件部分地设计. 145.1程序流程图 (14)5.1.1系统总流程图. (14)5.1.2DS1302 时钟程序流程图 (15)5.1.3LCD 显示程序流程图 (16)5.2程序地设计 (17)5.2.1 DS1302 读写程序 (17)5.2.2液晶显示程序 (17)7.心得体会. (20)参考文献. (21)附录一系统原理图. (22)附录二系统程序. (23)1. 工程背景1.1工程研究地目地和意义20 世纪末,电子技术获得了飞速地发展,在其推动下,现代电子产品几乎渗透了社会地各个领域,有力地推动了社会生产力地发展和社会信息化程度地提高,同时也使现代电子产品性能进一步提高,产品更新换代地节奏也越来越快. 时间对人们来说总是那么宝贵,工作地忙碌性和繁杂性容易使人忘记当前地时间.忘记了要做地事情,当事情不是很重要地时候,这种遗忘无伤大雅. 但是,一旦重要事情,一时地耽误可能酿成大祸. 例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成地. 而钟表地数字化给人们生产生活带来了极大地方便. 数字钟是通过数字电路实现时,分,秒数字显示地计时装置,广泛用于个人家庭、车站、码头办公室等公共场所, 成为人们日常生活中不可少地必需品. 由于数字集成电路地发展和石英晶体振荡器地广泛应用,使得数字钟地精度, 远远超过老式钟表, 钟表地数字化给人们生产生活带来了极大地方便,而且大大地扩展了钟表原先地报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气地自动启用等. 所有这些,都是以钟表数字化为基础地. 因此,研究数字钟及扩大其应用,有着非常现实地意义.1.2 课题研究地内容本论文主要研究基于单片机地万年历设计.当程序执行后,LCD显示即时时间、年月日、星期.设置4个操作键:K1,时间调整键;K2,上调键;K3,下调键;K4,闹钟设置键本设计地主要内容:1 、了解单片机技术地发展现状,熟悉万年历各模块地工作原理;2、选择适当地芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;3、熟悉单片机使用方法和C语言地编程规则,编写出相应模块地应用程序. 设计目标:使基于AT89C52单片机地万年历实现以下三个功能:a.具有年、月、日、星期、时、分、秒等功能;b.具备年、月、日、星期、时、分、秒校准功能;2. 方案地选择和和论证2.1单片机型号地选择通过对多种单片机性能地分析,最终认为AT89C52是最理想地电子时钟开发芯片.AT89C51是一种带4K字节闪烁可编程可擦除只读存储器地低电压,高性能CMOS 位微处理器,器件采用ATMEI高密度非易失存储器制造技术制造,与工业标准地MCS-51指令集和输出管脚相兼容•由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEI地AT89C52是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程序存储器和1000次擦写循环,数据保留时间为10年,是最好地选择.2.2按键地选择方案一:4X4矩阵式键盘.如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂.方案二:独立式按键. 如果设置过多按键,将会占用较多I/O 口,而且会给布线带来不便,因此,此方案适用于按键较少地情况. 如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单.由于并不需要经常修改时间和设置闹铃时间,而且方案二地程序简单,按键少、成本低,因此,选择方案二.2.3显示器地选择方案一:采用LED数码管动态扫描丄ED数码管价格适中,对于显示数字合适, 采用动态扫描法与单片机连接时, 虽然占用地单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示.方案二:采用点阵式数码管显示,点阵式数码管是由八行八列地发光二极管组成,对于显示文字比较适合, 若采用在显示数字显得太浪费, 且价格也相对较高, 所以在此也不用此种作为显示.方案三:采用1602液晶显示屏, 该液晶显示屏地显示功能强大, 内置192种字符,可显示大量符号、数字, 清晰可见, 而且功率消耗小寿命长抗干扰能力强所以在此设计中采用1602液晶显示屏.2.4 计时部分地选择方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数. 采用此种方案虽然减少芯片地使用,节约成本,但是,实现地时间误差较大, 所以不采用此方案.方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能地时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高, 位地RAM做为数据暂存区,工作电压2.5V〜5.5V范围内,2.5V时耗电小于300nA. 所以本设计采用DS1302时钟芯片.2.5发音部分地设计通过三极管放大后驱动蜂鸣器工作,再通过软件产生地时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本.2.6电路设计最终方案综上各方案所述,对此次作品地方案选定:采用AT89C52乍为主控制芯片,DS1302时钟芯片计时,LCD1602乍为显示模块.3.AT89C52单片机简介3.1单片机基本特性8位地CPU,片内有振荡器和时钟电路,工作频率为0〜24MHz片内有256字节数据存储器RAM片内有8K字节程序存储器ROM个8 位地并行I/O 口(P0、P1、P2、P3)1个全双工串行通讯口3个16位定时器/计数器(T0、T1、T2)可处理6个中断源,两级中断优先级3.2单片机内部结构图图3-1单片机内部结构图3.3单片机I/O引脚结构3.3.1P0 口P0 口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口.作为输出口用时,每位能吸收电流地方式驱动8个TTL逻辑门电路,对端口P0写“ T时,可作为高阻抗输入端用•在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻.在Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻.3.3.2P1 口P1 是一个带内部上拉电阻地8 位双向I/O 口,P1 地输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路.对端口写“ 1”,通过内部地上拉电阻把端口拉到高电平,此时可作输入口. 作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2地外部计数输(P1.0/T2 )和输入(P1.1/T2EX),Flash 编程和程序校验期间,P1 接收低8 位地址.3.3.3P2 口P2 是一个带有内部上拉电阻地8 位双向I/O 口,P2 地输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路. 对端口P2 写“1”,通过内部地上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).在访问外部程序存储器或16 位地址地外部数据存储器(例如执行MOVX @DPT 指令)时,P2 口送出高8位地址数据.在访问8位地址地外部数据存储器(如执行MOVX@R旨令)时,P2 口输出P2锁存器地内容.Flash编程或校验时,P2亦接收高位地址和一些控制信号.3.3.4P3 口P3 口是一组带有内部上拉电阻地8位双向I/O 口.P3 口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对P3 口写入“ T时,它们被内部上拉电阻拉高并可作为输入端口.此时,被外部拉低地P3 口将用上拉电阻输出电流(IIL ).P3 口除了作为一般地I/O 口线外,更重要地用途是它地第二功能P3 口还接收一些用于Flash 闪速存储器编程和程序校验地控制信号.U1 ATS9S52PL 0 JPl i 2Pl 3PT7~4PL4PL?X'CC 101Pl 0vcc Pl.l POOPl.2POL Pl.J P0.2 P1.4M3 Pl 5 MOS!P0,4 Pl 6 AHSJO PG. 5 ?1 7SCK P06 KST P0.7 P3.0RXD EAWP P3 LTM).4JLEPRUG pj.zwfo PSEN p^j^rri P2.7 P3,4J T0P2.6 pj.5m P2.5P>4 P3.7/KD P23 XTAL2P2.2 XTAU P2.L GND P2.0J" 236 PO 3 TT PO7JoTOF—』PS.5 1^P3.6 16■.? 17 ~Is~r?~20匕序2625 P2.4 24 p:.S 23 P2 2 22 PT1 21 P2 03.4单片机最小系统板仅仅一个单片机是没有办法工作地,要想使单片机正常功能,单片机需要有电源电路、复位电路、晶振.电源电路给单片机提供电源,复位电路使得单片机具备复位功能,晶振地作用产生原始地时钟频率,这个频率经过频率发生器地放大或缩小后就成了电脑中各种不同地总线频率.单片机最小系统是保证单片机正常工作地最基本单位.图3-2单片机最小系统板P3.0 10 直1 JP3.2 11 PTHU.0592M4.数字电子钟地设计原理和方法4.1设计原理根据上述方案设计出系统整体框图如下所示图4-1系统原理图为使时钟走时与标准时间一致,校时电路是必不可少地,键盘模块用来校正液晶上显示地时间;AT89C52单片机通过输出各种电脉冲信号来驱动控制各部分正常工作;而系统地时间数据则最终通过液晶模块显示出来.4.2硬件电路地设计4.2.1DS1302时钟芯片DS1302是DALLAS^司推出地涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM通过简单地串行接口与单片机进行通信.图4.5所示为DS1302地引脚排列,其中VCC伪后备电源,VCC2为主电源.所以在主电源关闭地情况下,也能保持时钟地连续运行.DSX1和DSX2是振荡源,外接32.768KHZ晶振用来为芯片提供计时脉冲.RST是复位/片选线,通过把RST输入驱动置高电平来启动所有地数据传送.RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据地传送手段.当RST为高电平时,所有地数据传送被初始化,允许对DS1302进行操作.如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态.上电行动时,在VCC大于等于2.5V之前,RST必须保持低电平•在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向).SCLK始终是输入端.时钟芯片DS1302地工作原理:⑴DS1302地控制字节DS1302控制字节地高有效位(位7)必须是逻辑1,如果它为0,贝U不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元地地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(2)数据输入输出(I/O )在控制指令字输入后地下一个SCLK时钟地上升沿时,数据被写入DS1302数据输入从低位即位0开始.同样,在紧跟8位地控制指令字后地下一个SCLK脉冲地下降沿读出DS1302地数据,读出数据时从低位0位到高位7.(3)DS1302地寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放地数据位为BCD码形式•“CH是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行•“WP是写保护位,在任何地对时钟和RAM地写操作之前,“ WP必须为0.当“ WP为1时,写保护位防止对任一寄存器地写操作•此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关地寄存器等.时钟突发寄存器可一次性顺序读写除充电寄存器外地所有寄存器内容.DS1302与RAM相关地寄存器分为两类:一类是单个RAM 单元,共31个,每个单元组态为一个8位地字节,其命令控制字为C0H H FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下地RAM寄存器,此方式下可一次性读写所有地RAM地31个字节,命令控制字为FEH写)、FFH 读).4.2.21602 液晶简介本设计中由于要对时间进行显示,所以选择液晶显示屏1602模块作为输出.1602字符型LCD®常有14条引脚线或16条引脚线地LCD多出来地2条线是背光电源线•它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高地性价比.1602液晶模块内部地字符发生存储器(CGRO已经存储了160个不同地点阵字符图形,这些字符有:阿拉伯数字、英文字母地大小写、常用地符号、和日文假名等,每一个字符都有一个固定地代码•管脚功能如表4-1所示:LCD1602主要管脚介绍:RS为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器.R/W为读写信号线端,高电平时进行读操作,低电平时进行写操作•当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS 为高电平R/W为低电平时可以写入数据.E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令.将L1602地RS端和P2.0,R/W端和P2.1, E 端和P2.2 相连,当RS=0 时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据.当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端.当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示地示数.图4-3为1602液晶.4.2.3蜂鸣器驱动电路发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本424独立键盘电路实现键盘控制地方法有多种,在本系统中,我们采用了AT89C52单片机来进行控制,因为单片机可以很好地解决键抖动•由若干个按键组成一个键盘,其电路结构可分为独立式键盘和矩阵式键盘两种.本设计采用地是独立式键盘.键盘地工作方式可分为编程控制方式和中断控制方式.CPU在一个工作周期内,利用完成其他任务地空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应地键处理程序.这种方式为编程扫描方式.由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使CPU经常处于工作状态,在进行本次设计中,涉及到了调整时间、设置闹钟、上调、下调四个功能.因此采用独立式键盘.如下图所示:5.软件部分地设计5.1程序流程图5.1.1系统总流程图系统总流程图如图5-1所示.流程图分析:首先系统初始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间等数据送入液晶屏显示;在修改时间模式下设置时间完成后再送数据到液晶屏显示•图5-1系统总流程图5.1.2DS1302时钟程序流程图时钟流程图如图5-2所示.流程图分析:DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片地数据送入液晶屏显示.这时若有设置键按下时,进行时间修改,完成后将数据送入时钟芯片;若没有按键按下,则直接存入EPRO M送入液晶屏显示•开始图5-2时钟流程图5.1.3LCD显示程序流程图显示程序流程图如图5-3.流程图分析:首先对1602显示屏进行初始化(初始化大约持续10ms左右),然后检查忙信号,若BF=0,则获得显示RAM 地地址,写入相应地数据显示;若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=O为止.Y结束图5-3 LCD显示程序流程图5.2程序地设计521 DS1302读写程序DS1302是SPI总线驱动方式.它不仅要向寄存器写入控制字,还需要读取相应寄存器地数据.要想与DS1302通信,首先要先了解DS1302地控制字.DS1302地控制字如图5-4所示.图5-4 DS1302 地控制字控制字总是从最低位开始输出.在控制字指令输入后地下一个SCLK寸钟地上升沿时,数据被写入DS1302数据输入从最低位(0位)开始.同样,在紧跟8位地控制字指令后地下一个SCLK脉冲地下降沿,读出DS1302地数据,读出地数据也是从最低位到最高位.数据读写时序如图5-5、5-6所示.RST图5-5单字节读RST曲丄fTfLfLfnbfLTLjTfnLFLfnJTfLfUmjn I/O —(刖示]AO I Al I A2 I A3 ] A斗I R/日1 X 00 | | 口2 | | D斗 | 口弓| 口帘|D7 >图5-6单字节写5.2.2液晶显示程序1602通过D0~D7地8位数据端传输数据和指令,其模块内地控制器有11 条控制指令.当液晶显示屏地接口电路与单片机系统I/O按照并行数据传输方式连接完成以后,即可以对AT89C52单片机进行编程.在液晶屏完成显示之前首先要对液晶进行初始化.程序见附录二.6.实验结果此电子闹钟设计是利用Proteus仿真软件进行仿真,基本上实现了课程设计要求实现地功能.硬件部分设置了地三个按键K1、K2、K3 K4.K1键为调整时间功能键,K4 为设置闹钟功能键,K2、K3分别为上调和下调键.当按键K4第一次按下时,停止计时进入闹钟1地时设置,当按键K4第二、第三次按下时,分别进入闹钟1地分设置和秒设置,当按K4第四次按下时,退出闹钟设置,正常显示当前时间.当按下K1键时进入时间调整模式,K1按下第一次进入年调整,K1按下第二次进入月调整,K1按下第三次进入日调整;当K1按下第四、五、六次时,分别进入时、分、秒调整,K1按下第七次时时间调整完毕,退出时间调整功能,显示器正常显示时间.下面是程序运行结果截图图6-2调整时间后显示图上图6-1表示程序启动时将时间初始化为2015年01月10日00时00分00秒;之后进行了调整,将时间调整为操作地当前时间如图6-2所示,2015年01月10日11时59分15秒;图6-3表示是将闹钟设置为13时00分29秒.7. 心得体会通过自己地不懈努力,我终于完成了毕业设计任务书上地任务要求. 功能上基本达标:时钟地显示、调时功能、闹铃功能. 其精确度完全可以满足日常生活显示时间地需要;调时功能,方便快捷;校时功能保证了时钟准确和可靠性硬件设施合乎要求,软件设计可以配合硬件实现要求地功能. 但是由于时间比较短,前期设计出现部分不足:如位选闪烁功能不能实现、闹钟地开启与关闭、间断蜂鸣声等. 这些只是软件设计时相应功能部分还不完善造成.不过经仔细思考和程序地完善,最终将软件设计改进,并完全可以很好实现所有要求地功能.可见技术在不断进步,机械式时钟已经被淘汰,取而代之地是具有高度准确性和直观性且无机械装置,具有更长地使用寿命等优点地数字时钟. 数字时钟更具人性化,更能提高人们地生活质量,更受人们欢迎.无可否认机械时代已经过去,电子时代已经到来. 做为新时代地我们,更应该提高自身能力,适应新时代地发展. 知识来自实践,多去生活中探询所需要地. 对于上述所提到地研究课题,我们应尽量考虑到人地因素,增强时钟地实用性和操作性,为使用者提供切实地方便,营造一种舒适地生活氛围. 所以,在设计地时候,应该从多方面、多角度去考虑问题,而且应该进一步提高时钟地质量.另外,在本次设计地过程中,我发现很多地问题,虽然以前没有做过这样地设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法地设计,需要有很巧妙地程序算法,虽然以前写过几次程序,但我觉地写好一个程序并不是一件简单地事,比如写一个程序看其功能很少认为编写程序简单,但到编程地时候才发现一些细微地知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解地,更谈不上掌握.从这次地课程设计中,我们真真正正地意识到,在以后地学习中,要理论联系实际,把我们所学地理论知识用到实际当中,学习单机片机更是如此,程序只有在经常地练习地过程中才能提高,我想这就是我在这次课程设计中地最大收获.参考文献[1]张友德,赵志英,涂时亮. 《单片微型机原理、应用与实验》[M]. 上海:复旦大学出版社,2008.[2]赵亮,侯国锐•《单片机C语言编程与实例》[M].北京:人民邮电出版社,2003.[3]高鹏,安涛,寇怀成. 《电路设计与制版——protel99 入门与提高》[M]. 北京:人民邮电出版社,2006.[4]谭浩强.《C程序设计(第三版)》[M].北京:清华大学出版社,2005.[5]李朝青. 《单片机原理及接口技术》[M]. 北京:北京航空航天大学出版社,2004.[6]康光华,《电子技术基础—模拟部分(第五版)》[M]. 北京:高等教育出版社,2005.附录一系统原理图LCD1RUZ1f-UZZERR1U3RESPACK^eL :P5EN ALE 丽*3V 马 VCCB.1AT&3C52 <TEXT>r.VCC1 VCC2X1 Or$CLkraX2DSI^DZTEXTSa->XIAL1 XIAL2pi.DrraPi.irr2EXP12 P13PI.4 PI.5 P1.B PI.7LM010LPO'D/ADaro.2MD £ TOrSMKP0/WAD4 P0.5/AD5 FO-BWOa PO.7WD7P2.UAQP2.2/A10P2.3/A11P2.A/A12 P2.5/A13 P2.6/A14 P2.7/A1I6P3.Q>RX& P3.1/TXD F3 2ANT0 P33^NiTTP3.-VT0 P3.5/T1 P3.BWR P3.7JR&SQpFXA 飞e10DATA=dat&0x01OII 取出 dat 地第 0 位数据写入 1302 低位在sbit SCLK=PMO 。
基于51单片机电子万年历设计
基于51单片机电子万年历设计大连民族学院机电信息工程学院自动化系单片机系统课程设计报告题目:电子万年历专业:自动化班级:106学生姓名:指导教师:设计完成日期:2012年11月30日1任务分析和性能指标1.1任务分析设计一个具有报时功能、停电正常运行(来电无需校时)、闹钟功能、带有年月日、时分秒及星期显示的电子日历。
电子万年历是日常生活中常见的小型电子产品,其形式多种多样,小到带有日期的电子腕表,大到公共场所悬挂的大型电子日历,此外,眼下我们还常能在宾馆、饭店等场所见到一种带有年、月、日、时、分、秒、星期甚至节气等信息的电子日历牌。
电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外部都可分为显示和校准两部分。
为使电子日历协调工作,整个系统从功能上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期的计算以及人机交互的管理等。
1.2性能指标实时时钟(RTC:Real Time Clock)是系统的核心,其运行精度直接影响产品质量。
实时时钟的实现有两种方案可选,一是利用单片机系统时钟和中断完成时间和日期的计算;二是利用专用时钟芯片。
前者不用附加芯片,系统简单,但是累计误差较大,只有短时计时才可使用。
长时间计时一般都采用后者。
后者采用32.768KHz晶体振荡器振作为脉冲源,内部的15位计数器刚好产生标准秒脉冲。
该类芯片除时钟计时外,还有年月日和星期的计算功能,并且还可计算闰年。
芯片初始化后可脱离CPU自动运行,有些芯片内部带有电池,出厂时芯片即开始运行。
专用时钟芯片的种类很多,与CPU的通信方式有并行,也有串行。
常见的芯片有DALLAS 公司生产的DS1302和DS12C887,前者为串行,需要外加后备电池;后者为并行,芯片内置锂电池和晶体振荡器,无外加电源的情况下可运行10年。
此外,还有许多时钟芯片,如Epson、Holtek、深圳兴威帆等公司都推出自己的时钟芯片。
这次我们选用的芯片是DS12C887。
基于51单片机的电子日历的应用设计与实现
摘要摘要随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒信息,还具有时间校准等功能。
本设计以数字集成电路技术为基础,单片机技术为核心。
软件设计采用模块化结构,C语言编程。
系统通过LCD显示数据,可以显示公历日期(年、月、日、时、分、秒)以及星期。
在内容安排上首先描述系统硬件工作原理,着重介绍了各硬件接口技术和各个接口模块;其次,详细的阐述了程序的各个模块和实现过程。
具体实现功能:(1)显示年月日时分秒及星期信息(2)具有可调整日期和时间功能关键词:万年历单片机DS1302目录目录摘要 (I)第一章方案论证 (1)1.1单片机芯片的选择方案和论证 (1)1.2显示模块选择方案和论证 (1)1.3时钟芯片的选择方案和论证 (1)1.4电路设计最终方案决定 (2)第二章系统的硬件设计与实现 (3)2.1 总体电路 (3)2.2单片机主控制模块的设计 (3)2.2.1 AT89S52的介绍 (3)2.2.2 单片机主控制模块介绍 (5)2.3 时钟模块设计 (5)2.3.1 DS1302的性能特性 (5)2.3.2 DS1302数据操作原理 (6)2.3.3 DS1302与AT89S52接口电路设计 (7)2.4显示模块的设计 (8)2.4.1 LCM1602介绍 (8)2.4.2 LCM1602与单片机的接口 (9)第三章系统的软件设计 (11)3.1程序总体描述 (11)3.2模块程序描述 (11)第四章PROTEUS仿真 (13)4.1 PROTEUS工作界面 (13)4.2 PROTEUS功能仿真 (13)第五章测试与结果分析 (15)5.1测试仪器 (15)5.2硬件测试 (15)5.3软件测试 (16)5.4 测试结果分析与结论 (16)5.4.1 测试结果分析 (16)5.4.2 测试结论 (16)第六章总结与展望 (17)致谢 (19)参考文献 (21)附录1 系统电路图 (23)附录2 系统程序 (24)第一章方案论证第一章方案论证1.1单片机芯片的选择方案和论证方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
毕业设计(论文)-基于51单片机的电子日历的设计
3.3时钟模块设计
实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
它是一种一种高性能、低功耗、带RAM的实时时钟电路,可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
当主电源Vcc发生故障而突然下降到一定低电压或断电时,第2功能Vpd将为片内RAM提供电源以保护片内RAM中的信息不丢失。
ALE/PROG:地址锁存允许信号输入端。在存取外存储器时,用于锁存低8位地址信号。当单片机正常工作后,ALE端就周期性地以时钟振荡频率的1/6固定频率向外输出正脉冲信号。此引脚的第2功能PROG是对片内带有4K字节EPROM的8751固外程序时,作为编程脉冲输入端。
Vcc:接+5V 电源
Vss:接地
XTAL1和XTAL2:时钟引脚,外接晶体引线端。当使用芯片内部时钟时,此两引脚端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
RST/Vpq:RST是复位信号输入端,Vpd是备用电源输入端。当RST输入端保持2个机器周期以上高电平时,单片机完成复位初始化操作。
随着微电子技术的高速发展,人类用于计时的工具也在不断发展更新,单片机技术的出现使得万年历有了新的发展方向。
单片机以其体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。目前世界上单片机年产量已达十多亿片,通常是当年微处理器产量的4-5倍以上。用最少的芯片就能实现最强大的功能,这是将来电子产品的主流方向,它将无可置疑地一步步取代其它同类产品,其数量之大和应用面之广,是其它任何类型的计算机所无法比拟的。
51单片机万年历课程设计报告
一、设计任务:1、设计任务:设计并制作一个数字钟。
2、设计要求:●显示年月日时分秒及星期信息●具有可调整日期和时间功能●增加闰年计算功能●显示部分由LCD1602完成二、方案论证:1.显示部分:显示部分是本次设计的重要部分,一般有以下两种方案:方案一:采用LED显示,分静态显示和动态显示。
对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。
而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。
方案二:采用LCD显示。
LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。
鉴于上述原因,我们采用方案二。
2.数字时钟:数字时钟是本设计的核心的部分。
根据需要可采用以下两种方案实现:方案一:方案完全用软件实现数字时钟。
原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。
而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
方案二:方案采用Dallas公司的专用时钟芯片DS1302。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。
单片机课程设计--基于51单片机的万年历
单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。
万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。
本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。
二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。
2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。
3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。
4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。
(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。
然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。
2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。
3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。
三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。
晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。
(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。
数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。
(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。
单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。
基于51单片机的电子万年历系统的设计
参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。
单片机课程设计--基于51单片机的万年历
单片机课程设计报告万年历的设计基于51单片机的万年历摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。
在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。
万年历的设计过程在硬件与软件方面进行同步设计。
硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。
在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。
显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。
软件方面主要包括日历程序、时间调整程序,显示程序等。
程序采用C语言编写。
所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
一、设计要求基本要求:1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”;2,具有日历功能;③时间可以通过按键调整。
发挥部分:④具有闹钟功能(可以设定多个)。
二:总体设计电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用时不需要额外的外围电路。
80c51单片机的课程实训设计(电子万年历)
烟台南山学院单片机课程设计题目电子万年历姓名:所在学院:所学专业:班级:学号:指导教师:完成时间:2010-12-22单片机课程设计任务书一、基本情况学时:2周学分:2学分适应班级:08电气工程二、课程设计的意义、性质、目标、要求1.意义课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练。
进行课程设计可以让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实处,能够开发简单的系统,也进一步激发了学生再深一步学习的热情,因此课程设计是必不少的,是非常必要的。
2.性质课程设计是提高学生单片机技术应用能力以及文字总结能力的综合训练环节,是配合单片机课程内容掌握、应用得的专门性实践类课程。
3.目标通过典型实际问题的实际,训练学生的软硬件的综合设计、调试能力以及文字组织能力,建立系统设计概念,加强工程应用思维方式的训练,同时对教学内容做一定的扩充。
4.要求(1)课程设计的基本要求单片机课程设计的主要内容包括:理论设计与撰写设计报告等。
其中理论设计又包括选择总体方案,硬件系统设计、软件系统设计;硬件设计包括单元电路,选择元器件及计算参数等;软件设计包括模块化层次结构图,程序流程图。
程序设计是课程设计的关键环节,通过进一步完善程序设计,使之达到课题所要求的指标。
课程设计的最后要求是写出设计总结报告,把设计内容进行全面的总结,若有实践条件,把实践内容上升到理论高度。
(2)课程设计的教学要求单片机课程设计的教学采用相对集中的方式进行,以班为单位全班学生集中到设计室进行。
做到实训教学课堂化,严格考勤制度,在实训期间(两周)累计旷课达到6节以上,或者迟到、早退累计达到8次以上的学生,该课程考核按不及格处理。
在实训期间需要外出查找资料,必须在指定的时间内方可外出。
课程设计的任务相对分散,每3—5名学生组成一个小组,完成一个课题的设计。
小组成员既有分工、又要协作,同一小组的成员之间可以相互探讨、协商,可以互相借鉴或参考别人的设计方法和经验。
基于51单片机电子万年历设计
摘要 (I)Abstract (II)第一章引言 (1)第二章单片机 (2)2.1 什么是单片机 (2)2.1.1 概述 (2)2.1.2 单片机的基本结构 (2)2.2 单片机的历史及发展趋势 (2)2.2.1 早期阶段 (3)2.2.2 早期发展 (3)2.2.3 中期发展 (4)2.2.4当前趋势 (4)2.3 应用范围 (4)2.4 主流的单片机产品 (4)第三章设计要求及方案选定 (5)3.1设计要求 (5)3.2 系统基本方案 (5)3.2.1单片机芯片的选择 (5)3.2.2显示模块的选择 (5)3.2.3 时钟芯片的选择 (5)3.2.4 电路设计最终方案决定 (6)第四章系统的硬件设计 (7)4.1 总的设计框架 (7)4.2 晶振电路模块 (7)4.3 复位电路模块 (8)4.4 显示模块 (8)4.5 按键电路模块 (9)第五章系统的软件设计及仿真 (11)5.1系统的软件设计 (11)5.1.1 主程序 (11)5.1.2 时间计时子程序 (12)5.1.3 显示子程序 (14)5.1.4 时间调整子程序 (14)5.2 Proteus仿真 (15)作品总结 (18)参考文献(References) (19)致谢 (20)附录一系统电路图 (21)附录二系统程序清单 (22)摘要随着微电子技术的快速发展,单片机的应用越来越广泛。
它有着体积小、功能全、性价比高等诸多优点,在多个测控领域的应用中扮演着很重要的角色。
单片机开发技术已成为现代专业技术人员必须掌握的一门技术。
电子万年历,是一种被广泛应用的日常计时工具。
本设计目标是利用单片机设计一个电子万年历,要求可以实现日期和时间的显示并且具有可调整日期和时间的功能。
文章的主要部分是硬件设计和软件编程。
硬件部分主要由AT89C51单片机、晶振电路、复位电路、数码管显示电路以及调时按键电路等组成。
在本文中选择使用AT89C51单片机,该单片机功耗小、低成本,且适合于许多比较复杂的控制应用场合。
51单片机电子万年历设计带有proteus仿真
湖南文理学院课程设计课程名称:单片机课程设计设计题目:电子万年历教学院部:电气与信息工程学院专业班级:自动化09101班指导教师:张晓虎(学生姓名:邵泽学号: 0120完成时间: 2012 年6月12日报告成绩:{摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。
该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。
万年历的设计过程在硬件与软件方面进行同步设计。
硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。
在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。
显示器使用液晶LCD1602。
软件方面主要包括日历程序、液晶驱动程序,显示程序等。
程序采用汇编语言编写。
所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。
关键词时钟电钟,DS1302,液晶LCD1602,单片机Abstract:…Electronic calendar is a very extensive daily timing tool for modern society is more and more popular. It can be to year, month, day, Sunday, when, minutes, and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. For digital electronic calendar using intuitive digital display, can also shows that year, month, day, Sunday, when the information such as, minutes and seconds, still have time calibration etc. Function. The AT89C52 single chip microcomputer as circuit adopts core, power consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 to 5 V voltage power supply. The design process of the calendar in the hardware and software design of synchronization. Mainly by AT89C52 single chip microcomputer hardware part, liquid crystal display circuit, reset circuit, clocking circuit on the circuit circuit and serial download circuit etc. The processor on the choice of the single chip microcomputer AT89C52 use, the single chip microcomputer suitable for many more complex control applications. Use of liquid crystal display LCD1602. Software is mainly including calendar program, liquid crystal driver, show program, etc. Program using assembly language. All programming, after the completion of Keil C51 software in commissioning, make sure no, after Proteus software embedded in within the singlechip microcomputer simulation.Key words DianZhong clock, DS1302, liquid crystal LCD1602, microcontroller目录1设计要求与方案论证 (3)设计要求 (3)系统基本方案选择和论证 (3)单片机芯片的选择方案和论证 (3)"时钟芯片的选择方案和论证: (4)电路设计最终方案决定 (5)2系统的硬件设计与实现 (5)电路设计框图 (5)系统硬件概述 (5)主要单元电路的设计 (5)单片机主控制模块的设计 (6)时钟电路模块的设计 (6)}显示模块电路 (7)串口下载电路 (8)复位电路 (9)稳压电路 (10)3系统的软件设计 (11)程序流程框图 (11)子程序的设计 (11)读写DS1302子程序 (11)】读写LCD1602子程序 (12)4软件测试及分析 (14)分析与结论 (14)调试分析 (14)调试和结论 (15)5总结 (15)1设计要求与方案论证设计要求—①能够显示年、月、日、时、分。
基于-51单片机的万年历设计
单片机课程设计题目基于51单片机的万年历设计学生专业班级学号院(系)指导教师完成时间目录1课程设计的目的12课程设计的任务与要求1 2.1设计任务12.2设计要求13单片机发展概况14设计原理与功能说明44.1设计思想44.2总体电路图54.3时钟模块64.4液晶显示模块64.5按键模块75系统测试75.1硬件测试75.2软件测试86总结8参考文献10附录一:总体电路原理图11附录二:主程序12附录三:元器件清单27 附录四:实物图281课程设计的目的1.通过制作万年历,可以对单片机这门课程更好的认识。
2.理论与实践结合,提高自己的动手能力。
3.学会与合作者更好的交流学习,共同进步和提高。
4.能够增长查阅资料的能力,视野更加开阔。
5.拓展其他学科的联系,全面发展。
6.培养自我发现问题,解决问题的能力。
2课程设计的任务与要求2.1设计任务1.可以去学校图书馆或者网上,搜集整理相关的资料,做好前期理论准备,为以后设计电路,看懂电路图做理论支持。
2.构想万年历电路图,并且具有可行性,画出电路图。
3.列举电路所需的电子元件,仔细对比所需的元件的参数,通过去电子元件经销商或者网购购买。
2.2设计要求1.显示年、月、日、时、分、秒。
2.可通过键盘自动调整时间。
3.计时精度:月误差小于20秒。
3单片机发展概况单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段:第一阶段(1976-1978):初级单片机微处理阶段。
该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址围 4KB,但是没有串行口。
第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址围可达 64KB。
第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。
基于51单片机电子万年历设计
一、引言电子万年历是一种以数字形式实时显示日期、星期和时间等信息的电子设备。
在现代人日常生活中,万年历是一种常见的小型电子产品。
本文将基于51单片机设计一款简单实用的电子万年历。
二、设计原理1.时钟模块:采用DS1302实时时钟模块。
DS1302通过三线式串行接口与51单片机进行通信,可以实时获取日期、星期和时间等信息。
2.显示模块:使用数码管显示日期、星期和时间等信息。
共使用四块共阳数码管,采用数码管模块进行驱动,通过IO口进行数据传输。
3.按键模块:设计四个按键,分别为设置、上、下和确定。
通过按键来调整日期、星期和时间等信息。
4.闹钟功能:加入闹钟功能,可以设定闹钟时间,到达设定时间时,会有提示音。
5.温湿度传感器:加入温湿度传感器,可以实时监测环境温湿度,并在数码管上进行显示。
6.外部电源:由于51单片机工作电压较高,需要使用外部电源进行供电。
三、硬件设计1.电源电路:使用稳压电源芯片LM7805进行5V稳压,将稳压后的电压供给单片机和各个模块。
2.时钟模块:DS1302模块与单片机通过串行通信进行连接。
时钟模块上的时钟信号、数据信号和复位信号分别与单片机的IO口相连。
3.数码管显示模块:共有四块共阳数码管,通过595芯片进行驱动。
单片机的IO口与595芯片的串行、时钟和锁存引脚相连,595芯片的输出引脚与数码管的各段相连。
4.按键模块:通过电阻分压来实现按键功能,按下按键时,相应的IO口会被拉低。
5.闹钟功能:使用蜂鸣器来产生提示音,通过IO口与单片机相连。
6.温湿度传感器:使用DHT11温湿度传感器。
传感器的数据引脚通过IO口与单片机相连。
四、软件设计1.时钟显示:通过DS1302获取日期、星期和时间等信息,将其转化为数码管需要的编码格式,并通过595芯片进行显示。
2.按键操作:对按键进行扫描,根据按键的不同操作进行相应的处理。
例如按下设置键进行日期和时间的设置,按下上下键进行数值的变化,按下确定键进行数值的确认。
基于51单片机的电子万年历设计
课程设计报告书目录设计报告书目录一、设计目的 (1)二、设计思路 (1)三、设计过程 (1)3.1、系统方案论证 (1)3.2、电子万年历流程图设计 (2)四、系统调试与结果 (6)五、主要元器件与设备 (6)六、课程设计体会与建议 (7)6.1、设计体会 (7)6.2、设计建议 (7)七、参考文献 (8)八、源程序清单与注释 (10)一、设计目的1、熟悉单片机各部件的组成及其功能。
2、掌握时钟芯片显示时间和调试的方法。
3、掌握温度传感器的工作原理及其调试方法。
4、掌握数码管的显示方法。
二、设计思路1、利用单片机的时钟芯片来实现时间信息显示。
2、利用四个按键实现时间的调整功能。
3、利用温度传感器来实现温度显示。
4、利用单片机对各个数据进行处理并保证各模块正常工作。
5、单片机处理后的数据送入显示模块显示。
三、设计过程3.1系统方案论证数字万年历的总体方框图如图1所示:图1 数字万年历总体方框图其工作原理为:时间模块利用时钟芯片可以读取到高精度的年、月、日、时、分、秒信息。
按键部分采用四个按键实现时间的调整功能,即设置、加1、减1、切换四个按键。
温度采集模块利用温度传感器采集温度信息。
单片机使用AT89C52单片机,将读取的时间信息、按键信息和温度信息送入单片机机进行数据处理,同时单片机控制保证着各模块芯片的正常工作,单片机将经过处理后的时间温度信息送显示模块显示。
显示模块使用17个LED显示管,可以显示年、月、日、星期、时、分、秒和温度。
3.2、电子万年历流程图设计3.2.1、电子万年历系统的主程序流程图如图2所示:图2 电子万年历系统的主程序流程图电子万年历系统总的电路连接如附图1所示。
3.2.2、时间程序设计因为使用时钟芯片为DS12C887,阳历程序只需从DS12C887各寄存器中读出年,月,日,时,分,秒等数据,再处理即可。
在首次对DS12887进行操作之前必须对它进行初始化,然后DS12C887中读出数据,再经处理后送给显示缓冲单元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机电子日历课程设计程序代码:/****************************************************************************//* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能 *//* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关 *//* 功能键B: 设置位数字-1 闹钟模式下为闹钟开关 *//* 功能键C:设置模式及设置位选择秒表模式下为清零键 */ /* 功能键D:在四种工作模式下切换设置闹钟开关 *//* 曹宇 03电子 0201029 *//* 2006.6.3 更新 *//****************************************************************************/#include#include/***************这里设置程序初始化时显示的时间****************/#define SET_HOUR 12 /*设置初始化小时*/#define SET_MINUTE 00 /*设置初始化分钟*/#define SET_SECOND 00 /*设置初始化秒数*//*************************系统地址****************************/#define BASE_PORT 0x8000 /*选通基地址*/#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/#define LED_SEG BASE_PORT+4 /*数码管段选地址*/#define LED_BIT BASE_PORT+2 /*数码管位选地址*/#define LED_ON(x) XBYTE[LED_BIT]=(0x01<#define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*//**************在设置模式下对秒分时的宏定义*****************/#define SECOND 0 /*对应数码管右边两位*/#define MINUTE 1 /*对应数码管中间两位*/#define HOUR 2 /*对应数码管左边两位*//********************定义四种工作模式***********************/#define CLOCK clockstr /*时钟模式*/#define ALART alartstr /*闹钟模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*//****************以下是所有子函数的声明*********************/void sys_init(void); /*系统的初始化程序*/void display(void); /*动态刷新一次数码管子程序*/void clockplus(void); /*时间加1S的子程序*/void update_clockstr(void); /*更新时间显示编码*/void update_alartstr(void); /*更新闹钟时间的显示编码*/void update_datestr(void); /*更新日期显示编码*/void update_timerstr(void); /*更新秒表时间的显示编码*/void deley(int); /*延时子程序*/void update_dispbuf(unsigned char *); /*更新显示缓冲区*/unsigned char getkeycode(void); /*获取键值子程序*/void keyprocess(unsigned char); /*键值处理子程序*/unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*//*功能键功能子函数*/void Akey(void); /*当前设置位+1 开关闹钟开关秒表*/void Bkey(void); /*当前设置位-1 开关闹钟 */void Ckey(void); /*设置位选择秒表清零*/void Dkey(void); /*切换四种工作模式*//**********************全局变量声明部分*********************/unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/unsigned char ledchar[3]={0x5c,0x54,0x71};/*o n f*///unsigned char key[24]={ /* 键值代码数组对应键位:*/// 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE RESET*/// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */struct{ /*时间结构体变量*/unsigned char s;unsigned char m;unsigned char h;}clock={SET_SECOND,SET_MINUTE,SET_HOUR};struct{ /*闹铃时间结构体变量*/unsigned char m;unsigned char h;}alart={SET_MINUTE,SET_HOUR};struct{ /*日期结构体变量*/unsigned int year;unsigned char month;unsigned char day;}date={6,1,1};struct{ /*秒表时间结构体变量*/unsigned char ms;unsigned char s;unsigned char m;}timer={0,0,0};unsigned char dispbuf[6]; /*显示缓冲区数组*/unsigned char clockstr[6]; /*时间显示的数码管编码数组*/unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/unsigned char datestr[6]; /*日期显示的数码管编码数组*/unsigned char timerstr[6]; /*秒表显示的数码管编码数组*/unsigned int itime=0,idot; /*定时器0中断计数*/unsigned char itime1=0; /*定时器1中断计数*/sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/bdata bit IsSet=0; /*设置模式标志位 0:正常走时 1:设置模式*/bdata bit Alart_EN=0; /*闹铃功能允许位 0:禁止闹铃 1:允许闹铃*/bdata bit IsBeep=0; /*响铃标志位 0:未响铃 1:正在响铃*/ unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/ unsigned char *CurrentMode; /*标志当前正设置的功能,如CurrentMode=CLOCK或CurrentMode=ALART等*/void timerplus(void);/**************************函数部分*************************/void main(void){sys_init();while(1){XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下 */while((XBYTE[KEY_LINE]&0x0f)==0x0f) /*检测是否有键按下,无则一直进行LED的刷新显示*/{if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m)) {IsBeep=1;}else{ IsBeep=0;P3_1=0;}display();}keyprocess(getkeycode()); /*有键按下时得到键值,并送入键值处理程序*/display(); /*可要可不要*/}}void sys_init(void){TMOD=0x22; /*定时器0和1都设置为工作方式2,基准定时250×2=500us=0.5ms*/TH0=6; /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/TH1=6;TL1=6;ET0=1;ET1=1;EA=1;TR0=1;update_clockstr(); /*初始化时钟显示编码数组*/update_alartstr(); /*初始化闹钟显示编码数组*/update_datestr(); /*初始化日期显示编码数组*/update_timerstr(); /*初始化秒表显示编码数组*/update_dispbuf(clockstr);/*初始化显示缓冲数组*/CurrentMode=CLOCK; /*默认的显示摸式为时钟*/P3_1=0; /*蜂鸣器接线引脚复位*/}void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/ {itime++;if(itime==1000){if(IsSet) /*在设置模式下,对正在设置的位闪烁显示*/{dispbuf[SetSelect*2]=0; /*对正在设置的位所对应的显示缓冲区元素赋0,使LED灭*/dispbuf[SetSelect*2+1]=0;}if(IsBeep) P3_1=!P3_1; /*闹钟模式时,产生峰鸣器响脉冲*/if(CurrentMode==CLOCK){dispbuf[2]=dispbuf[2]&0x7f;dispbuf[4]=dispbuf[4]&0x7f;}}if(itime==2000) /*两千次计数为1S 2000×0.5ms=1s*/{itime=0; /*定时1s时间到,软计数清零*/clockplus(); /*时间结构体变量秒数加1 */update_clockstr(); /* 更新时间显示编码数组 */if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用时间编码数组更新显示缓冲区 */}}void timer1(void) interrupt 3 using 2 /*定时器1中断服务器,用来产生1/100秒定时*/{idot++;if(++itime1==20) /*20*0.5ms=10ms*/{itime1=0;timerplus();update_timerstr();if(CurrentMode==TIMER){update_dispbuf(timerstr);dispbuf[2]=dispbuf[2]&0x7f; /*关闭小数点的显示*/dispbuf[4]=dispbuf[4]&0x7f;if(idot<1000) /*闪烁显示小数点*/{dispbuf[2]=dispbuf[2]|0x80;dispbuf[4]=dispbuf[4]|0x80;}else{dispbuf[2]=dispbuf[2]&0x7f;dispbuf[4]=dispbuf[4]&0x7f;}}}if(idot==2000) idot=0;}/*功能模块子函数*/void clockplus(void) /*时间加1s判断分,时子函数*/{if(++clock.s==60) /*秒位判断*/{clock.s=0;if(++clock.m==60) /*分位判断*/{clock.m=0;if(++clock.h==24) /*时位判断*/{clock.h=0;if(++date.day==(getmonthdays(date.year,date.month)+1)){date.day=1;if(++date.month==13) date.month=1;}}}}}void timerplus() /*秒表1/100秒位加1,判断秒、分子程序*/{if(++timer.ms==100){timer.ms=0;if(++timer.s==60){timer.s=0;if(++timer.m==60){timer.m=0;}}}}void update_clockstr(void) /*更新时钟显示代码数组clockstr*/{clockstr[0]=led[clock.s%10]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/clockstr[2]=led[clock.m%10]; /*以下类推*/clockstr[3]=led[(int)(clock.m/10)];clockstr[4]=led[clock.h%10];clockstr[5]=led[(int)(clock.h/10)];}void update_alartstr(void) /*更新闹钟显示代码数组alartstr*/{ /*右边两位显示on:闹钟开启 of:闹钟关闭*/if(Alart_EN) alartstr[0]=ledchar[1];/*显示字母n*/else alartstr[0]=ledchar[2]; /*显示字母f*/alartstr[1]=ledchar[0]; /*显示字母o*/alartstr[2]=led[alart.m%10];alartstr[3]=led[(int)(alart.m/10)];alartstr[4]=led[alart.h%10];alartstr[5]=led[(int)(alart.h/10)];}void update_datestr(void) /*更新日期显示代码数组datestr*/{datestr[0]=led[date.day%10];datestr[1]=led[(int)(date.day/10)];datestr[2]=led[date.month%10];datestr[3]=led[(int)(date.month/10)];datestr[4]=led[date.year%10];datestr[5]=led[(int)(date.year/10)];}void update_timerstr(void) /*更新秒表显示代码数组timerstr*/{timerstr[0]=led[timer.ms%10];timerstr[1]=led[(int)(timer.ms/10)];timerstr[2]=led[timer.s%10];timerstr[3]=led[(int)(timer.s/10)];timerstr[4]=led[timer.m%10];timerstr[5]=led[(int)(timer.m/10)];}void display(void) /*刷新显示六位LED一次*/{unsigned char i;for(i=0;i<6;i++){LED_ON(i); /*选通相应位*/XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/deley(50); /*延时显示*/LED_OFF; /*写LED全灭段码*/}}void update_dispbuf(unsigned char *str) /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/{dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/dispbuf[1]=str[1];dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/dispbuf[3]=str[3];dispbuf[4]=str[4]|0x80;dispbuf[5]=str[5];}void deley(int i) /*延时子函数*/{while(i--);}unsigned char getkeycode(void) /*键盘扫描子程序,返回获得的键码*/{unsigned char keycode; /*键码变量,一开始存行码*/unsigned char scancode=0x20; /*列扫描码*/unsigned char icolumn=0; /*键的列号*/display(); /*用刷新数码管显示的时间去抖*/XBYTE[KEY_COLUMN]=0x00;keycode=XBYTE[KEY_LINE]&0x0f; /*从行端口读入四位行码*/while((scancode&0x3f)!=0) /*取scancode的低六位,只要没变为全0,则执行循环*/{XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*给列赋扫描码,第一次为011111*/if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*检测按键所在的列跳出循环*/scancode=scancode>>1; /*列扫描码右移一位*/icolumn++; /*列号加1*/}keycode=keycode<<4; /*把行码移到高四位*/keycode=keycode|icolumn; /*由行码和列码组成键码*///等待按键放开XBYTE[KEY_COLUMN]=0x00;while((XBYTE[KEY_LINE]&0x0f)!=0x0f) display();return keycode;}void keyprocess(unsigned char keycode) /*键值处理函数*/{switch (keycode){case 0x73: Akey();break;case 0xB3: Bkey();break;case 0xD3: Ckey();break;case 0xE3: Dkey();break;default: break;}update_dispbuf(CurrentMode);}unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天数*/{unsigned char days;switch (month){case 4:case 6:case 9:case 11:days=30;break;case 2: if(year%4==0) days=29;else days=28;break;default:days=31;break;}return days;}/*功能键子函数部分*/void Akey(void) /*对当前设置位进行加一操作,如果设置秒位,则给秒位清零*/{if(CurrentMode==TIMER) /*秒表模式下启闭走时*/{ TR1=!TR1;return;}if(!IsSet) return; /*如果不是设置模式退出*/switch (SetSelect){case SECOND:if(CurrentMode==CLOCK){clock.s=0; /*如果当前被设置位是秒位,则清零秒位*/ update_clockstr();}if(CurrentMode==ALART){Alart_EN=!Alart_EN;update_alartstr();}if(CurrentMode==DATE){if(++date.day==(getmonthdays(date.year,date.month)+1)) date.day=1;update_datestr();}if(CurrentMode==TIMER){TR1=!TR1;}break;case MINUTE:if(CurrentMode==CLOCK){if(++clock.m==60) clock.m=0; /*如果当前被设置分位,则分位加1*/update_clockstr();}if(CurrentMode==ALART){if(++alart.m==60) alart.m=0;update_alartstr();}if(CurrentMode==DATE){if(++date.month==13) date.month=1;update_datestr();}break;case HOUR: if(CurrentMode==CLOCK){if(++clock.h==24) clock.h=0; /*如果当前被设置时位,则时位加1*/update_clockstr();}if(CurrentMode==ALART){if(++alart.h==24) alart.h=0;update_alartstr();}if(CurrentMode==DATE){if(++date.year==100) date.year=0;update_datestr();}break;default: break;}update_dispbuf(CurrentMode);}void Bkey(void) /*对当前设置位进行减一操作,如果设置秒分,则给秒位清零,类比Akey()函数*/{if(!IsSet) return;switch (SetSelect){case SECOND:if(CurrentMode==CLOCK){clock.s=0;update_clockstr();}if(CurrentMode==ALART){Alart_EN=!Alart_EN;update_alartstr();}if(CurrentMode==DATE){if(--date.day==0x00)date.day=getmonthdays(date.year,date.month);update_datestr();}break;case MINUTE:if(CurrentMode==CLOCK){if(--clock.m==0xff) clock.m=59;update_clockstr();}if(CurrentMode==ALART){if(--alart.m==0xff) alart.m=59;update_alartstr();}if(CurrentMode==DATE){if(--date.month==0x00) date.month=12; update_datestr();}break;case HOUR: if(CurrentMode==CLOCK){if(--clock.h==0xff) clock.h=23;update_clockstr();}if(CurrentMode==ALART){if(--alart.h==0xff) alart.h=23;update_alartstr();}if(CurrentMode==DATE){if(--date.year==0xffff) date.year=99;update_datestr();}break;default: break;}update_dispbuf(CurrentMode);}void Ckey(void) /*正常走时模式和设置模式的切换*/{if(CurrentMode==TIMER){TR1=0; /*初始化定时器1设置,停止秒表记时*/TH1=6;TL1=6;timer.ms=0; /*初始化秒表数组*/timer.s=0;timer.m=0;update_timerstr();}else{if(IsSet==0) /*在非秒表模式下,第一次按下C键进入设置模式,设置时位*/{IsSet=1; /*置位标志位,进入设置模式 */SetSelect=HOUR;return;} /*第二次按C键设置分位,第三次按键设置秒位,第四次按键完成退出设置*/if(SetSelect==0) /*按到第四次,即设置完秒位后,将标志位IsSet置0,完成设置*/ {IsSet=0; /*复位标志位,进入正常走时模式*/return;}if(SetSelect>0) SetSelect--; /*设置位的标志变量SetSelect=0:时位 1:分位 2:秒位*/}}void Dkey(void) /*工作状态切换:时钟、闹钟、日期、秒表*/{if(CurrentMode==CLOCK) /*切换至闹钟,同时开关闹钟*/{ CurrentMode=ALART;Alart_EN=!Alart_EN;update_alartstr();return;}if(CurrentMode==ALART) /*切换至日期*/{ CurrentMode=DATE;return;}if(CurrentMode==DATE) /*切换至秒表,同时关闭设置模式*/ {CurrentMode=TIMER;IsSet=0;return;}if(CurrentMode==TIMER) /*切换至时钟*/{CurrentMode=CLOCK;return;}}。