基于单片机内部定时计数器的数字钟设计
基于单片机的数字钟毕业设计(附程序全)
基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
单片机课堂展示 基于AT89C51单片机的数字时钟设计
CJNE A,#24H,DISH1 MOV HOUR,#00H DISH1:AJMP DISH ;转至时 显示缓冲区设置 KK2:JNB KEY3,KK3 ;判断 KEY3是否按下 JB KEY3,$ ;等待KEY3键释 放 MOV A,R3 RL A MOV DPTR,#KJMP2 JMP @A+DPTR KJMP2:AJMP DISCLK AJMP SDEC AJMP MDEC AJMP HDEC SDEC:MOV A,#9AH ;秒减1 CLR C SUBB A,#01H ADD A,SECOND DA A
3、程序代码
MOV TH0,#0B1H;定时器T0装入 初值20ms MOV TL0,#0E0H SETB ET0 ;T0中断允许 SETB EA ;总中断允许 MOV R2,#50 ;T0中断为1s SETB TR0 ;启动T0 MOV SECOND,#00H MOV MINUTE,#00H MOV HOUR,#08H ;初始化时间8 点00分00秒 MOV A,HOUR 时间值送显示缓 冲区79H~7EH ANL A,#0F0H SWAP A MOV 79H,A
二、设计背景
十一世纪的今天,最具代表性的计时产品就是电子万年历, 它是近代世界钟表业界的第三次革命。 第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率 源使钟表的走时差从分级缩小到秒级,代表性的产品就是带 有摆或摆轮游丝的机械钟或表。 第二次革命是石英晶体振荡器的应用,发明了走时精度更 高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。 第三次革命就是单片机数码计时技术的应用(电子万年 历),使计时产品的走时日差从分级缩小到1/600万秒,从原 有传统指针计时的方式发展为人们日常更为熟悉的夜光数字 显示方式,直观明了,并增加了全自动日期、星期、温度以 及其他日常附属信息的显示功能,它更符合消费者的生活需 求!
基于单片机的多功能数字钟的设计
西南科技大学本科生毕业论文I 基于单片机的多功能数字钟的设计摘要:本设计论文介绍了用AT89C2051单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的计时周期为12小时,显示满刻度为12时59分59秒99毫秒,另外应有校时功能。
电路由时钟脉冲发生器、时钟计数器、译码驱动电路和数字显示电路以及时间调整电路组成。
用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。
根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个12进制(时)的计数器。
构成秒、分、时的计数,实现计时的功能。
显示器件选用LED七段数码管。
在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
针对数字钟会产生走时误差的现象,在电路中就设计有有校准时间功能的电路。
关键词:单片机;AT89C2051;数字钟;计时摘要时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
本设计论文介绍了用AT89C2051单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的计时周期为12小时,显示满刻度为12时59分59秒99毫秒,另外应有校时功能。
基于单片机的定时闹钟设计.
目录目录 (I)一设计题目 (1)二设计要求 (1)三作用与目的 (1)四设备及软件 (2)1.AT89C51单片机 (2)2. Proteus仿真软件 (2)3.Keil软件 (3)五系统设计方案 (4)1 电路的总体原理框图 (4)2 工作原理 (5)六系统硬件设计 (5)1.系统总体设计 (5)2.系统时钟电路设计 (6)3.系统复位电路的设计 (6)4.闹钟指示电路设计 (6)5.电子闹钟的显示电路设计 (6)七系统软件设计 (7)1.主模块的设计 (7)2.基本显示模块设计 (8)3. 时间设定模块设计 (9)4. 闹铃功能的实现 (10)八 Proteus软件仿真 (11)1.本次试验的效果图 (12)2.性能及误差分析: (12)九设计中的问题及解决方法 (13)十设计心得 (14)参考文献 (15)致谢 (16)附录1 系统整体结构电路原理图 (17)附录2 程序清单 (18)基于单片机的定时闹钟设计一设计题目基于单片机的定时闹钟二设计要求1、能显示时时-分分-秒秒。
2、能够设定定时时间、修改定时时间。
3、定时时间到能发出报警声或者启动继电器,从而控制电器的启停。
三作用与目的以单片机为核心的数字时钟是很有社会意义和社会价值的。
钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能数字闹钟通过数字电路实现时、分、秒。
数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。
多功能数字钟的应用非常普遍。
由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行校时、定时等功能。
基于单片机的数字钟毕业设计(附程序全)
基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
基于单片机的数字钟设计
基于单片机的数字钟设计引言20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。
尤其在医院,每次护士都会给病人作皮试,测试病人是否对药物过敏。
注射后,一般等待5分钟,一旦超时,所作的皮试试验就会无效。
手表当然是一个好的选择,但是,随着接受皮试的人数增加,到底是哪个人的皮试到时间却难以判断。
所以,要制作一个定时系统。
提醒容易忘记时间的人。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
基于单片机的定时和控制装置在许多行业有着广泛的应用,数字钟作为其中最基本的一个应用实例,具有结构简单应用广泛的特点。
数字钟中使用了单片机中最为常用的输入输出设备按键开关和数码管;数字钟程序主要应用单片机的定时器和中断实现计时和显示功能。
当今数字种作为一个单元电路被广泛应用于电子表、电子万年历等产品中,带来广泛的经济效益。
目前的单片机产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小。
现在虽然单片机的品种繁多,各具特色,但仍以80C51为核心的单片机占主流。
目前,单片机正朝着高性能和多品种方向发展,趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
基于单片机控制的智能定时闹钟设计(含完整程序仿真图)
摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
基于单片机的定时闹钟设计
定时闹钟的激活机 制
优点: 相比没有激活功能的定时闹钟,设 有激活机制的定时闹钟省去了用户在 不 需要闹铃提示的时候手动去暂停发出 警 报声的定时闹钟的麻烦。
开始
设置闹钟时间
闹钟是否激活? N
Y 闹钟时间= 当前时间? N
Y 蜂鸣器发 出警示声
S4键被 N 按下? Y
结束
图2 闹钟程序流程 图
3 .闹铃响起的条件和停止
1 响起的条件 2 定时闹钟发出警报声需要满足以下两个
条件: 3 系统时间与设定的闹铃时间相等 4 闹铃提示功能被激活,即显示屏上有
“N” 5 的提示信息。 6 闹铃停止的两种方法 7 按一次K4键撤销闹铃提示服务。 8 等待系统时间分位与设定的闹铃时间分
系统仿真电路图
实物图
结束
谢谢观看 !
(2).第二次按K1键, 光标从分位跳到时 位, , 表示当前设置的是闹钟的时位。
(3).当将闹钟的分位和时位均设置完毕 时, 第三次按下K1键, 光标消失, 系统正 常显 示时间和日期等信息。
2 .闹铃的开启
即使系统设有闹铃时间,蜂鸣器也不 一定会在设定时间发出警报声。为避免闹 铃在用户不需要的时候响起,该定时闹钟 系统采用了闹钟激活机制。只有在设置了 闹钟时间并且用户有激活闹铃服务的时候, 蜂鸣器才会在设定时间发出警报声。激活 方式: 按一次K4键。再按一次则会取消。当 闹铃激活时,LCD显示屏上会出现“N”的 提示信息,提示有闹钟提示开启。
图1 实时时钟程序流程 图
图二 1602型LCD的驱动程序流程图
二、 时间和日期的修改
在系统正常运行过程中, 当K1键第一次 被按下时, 关闭定时器(TR0=0), 并且在 时间的秒位出现闪烁的光标, 提示用户现在 更改的是时间的秒位部分。可通过继续按 K1来选择需要调整的其他位, 利用K2进行加 运算, K3进行减运算。直到K1键被第十次按 下的时候, 打开定时器(TR0=1)。系统回 到显示时间和日期的模式下。
基于单片机的数字钟的设计--毕业设计(论文)
毕业设计(论文)题目:基于单片机的数字钟的设计学院:自动化学院专业:自动化起止时间:2010年 3月 21日至2010年 6月 25日摘要这次毕业设计通过对单片机的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它主要通过DP-51PROC单片机综合仿真实验仪实现,通过数码管能够准确显示时间,调整时间,它的计时周期为24小时,从而到达学习、设计、开发软、硬件的能力。
主要实现功能为显示时间,时间校准调时(采用手动按键调时),闹铃功能(设置定时时间,到点后闹铃发出响声)。
通过键盘可以进行校时、定时。
闹铃功能使用I/O 口定时翻转电平驱动的无源蜂鸣器。
本文主要介绍了工作原理及调试过程。
关键词:单片机电子时钟单片机综合仿真实验仪AbstractThe MCU through graduation learning applications to AT89S51 chip as the core, supplemented by the necessary circuitry to design a simple electronic clock, it is mainly through the DP-51PROC Single Chip Experimental Device to achieve, through the digital control can be accurately show time, adjustment time, it's time period is 24 hours, so get to learn, design, development hardware and software capabilities. Main achieved function to show time, the time when calibration transfer (using the manual button adjustment time), alarm clock (set the regular time, the point to issue after the alarm sound). When the keyboard can be school, regularly. Alarm clock using the I / O port level drivers regularly turn passive buzzer.This paper describes the working principle and the debugging process.Keywords:MCU electronics clock DP-51PROC目录摘要 (2)Abstract (3)第一章概述 (5)第二章方案论证与比较 (6)2.1数字时钟方案 (6)2.2数码管显示方案 (6)2.3闹铃方案 (6)2.4校准方案 (7)第三章系统设计 (7)3.1总体设计 (7)3.1.1系统说明 (7)3.2模块设计 (7)3.2.1电源部分 (8)3.2.2复位电路 (8)3.2.3程序下载接口 (8)3.2.4位选部分 (9)3.2.5数码管的连接电路 (9)3.2.6控制部分 (10)3.2.7蜂鸣器驱动电路 (11)第四章原理 (12)4.1系统总体方案选择与说明 (12)4.2工作原理 (13)4.3各单元硬件设计说明及计算方法 (14)4.4软件设计与说明 (14)第五章软件设计 (15)5.1主程序流程 (15)5.2闹铃程序..................................................................................................... 错误!未定义书签。
基于单片机的数字钟设计-(1).
基于单片机的数字钟设计-(1).基于单片机的数字时钟摘要20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
本课题主要研究的是基于单片机的数字钟设计,采用AT89C51单片机作为系统的主控芯片,外接LED显示电路,按键电路,晶振电路,复位电路模块构成一个简单的数字钟。
通过按键电路能对时、分、秒分别进行设置和实时调整,并将结果显示在数码管上。
关键词:数字钟,单片机,数码管AbstractAuthor:cheng dongTutor:wang xinElectronic technology has been developed rapidly in the 20 century,with its modern electronic products, pushed by almost permeated every area of society has vigorously promoted social productive forces development and improvement of social informatization level, also make modern electronic product performance further improved, and the rhythm of upgrade its products is becoming more and more quickly.The most common SCM module is a digital clock, a digital clock is a kind of digital circuit technology implementation, minutes and seconds, the timing device with mechanical clock compared with higher accuracy and intuitive and no mechanical device, has more longer service life, so it has been widely used.This topic research is the digital clock design based on SCM, AT89C51 SCM as the main control chip system, external LED display circuit, key circuits, crystals circuit, reset circuit module constitute a simple digital clock. Through the key circuits can respectively the diffculties, minutes and seconds setting and real-time adjustment, and the result showed that in the digital tube.Key words: digital clock SCM ; digital目录1 引言 (3)2 单片机介绍 (5)3 数字钟硬件设计 (6)3.1 系统方案的确定 (6)3.2功能分析 (7)3.3数字钟设计原理 (7)3.3.1晶振电路 (8)3.3.2复位电路 (9)3.3.3数码显示电路 (10)4.数字钟的软件设计 (12)4.1程序设计内容 (12)4.2 系统设计流程图 (12)4.2.1主程序流程 (12)4.2.2定时器中断流程 (13)4.2.3时间显示流程图 (15)5.系统调试 (16)5.1 Keil C51软件环境简介 (16)5.2 Proteus软件环境简介 (18)5.3 数字钟系统PROTEUS仿真调试结果 (19)参考文献 (21)致谢 (22)内蒙古大学鄂尔多斯学院12级电子信息科学与技术学年论文附录 (25)元件列表 (25)源程序 (26)1 引言在单片机技术日趋成熟的今天,其灵活的硬件电路和软件电路的设计,让单片机得到广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。
基于单片机的多功能数字钟的设计
一、概述现代社会,时间被视为人们生活的重要组成部分。
而数字钟作为时间的一种展现形式,已经成为人们生活中不可或缺的一部分。
基于单片机的多功能数字钟设计,将为人们提供更加准确、便捷、多功能的时间展现方式,满足人们对时间的精准要求,同时也为人们的生活带来更多便利。
二、设计目标1. 实现精准的时间显示功能,包括时、分、秒的显示;2. 实现对日期的显示,包括年、月、日的显示;3. 实现多种报时功能,如定时报时、闹钟报时等;4. 实现多种显示效果,如渐变显示、闪烁显示等;5. 实现对时间的调整功能,包括校时、调整日期等;6. 实现对亮度的调节功能,适应不同环境下的使用需求。
三、设计思路1. 硬件设计1.1 硬件采用单片机作为核心控制器,通过外部晶振提供时钟信号;1.2 采用数码管作为显示设备,通过单片机控制数码管进行时间、日期的显示;1.3 通过按钮、旋钮等输入设备,实现时间调节、报时设置等操作;1.4 通过EEPROM等存储设备,实现时间、设置的存储和读取功能;1.5 通过光敏电阻等光敏传感器,实现对环境光强的检测,调节数码管显示亮度。
2. 软件设计2.1 设计合理的时钟系统,确保时间的准确显示;2.2 设计报时功能模块,实现定时报时、闹钟报时等功能;2.3 设计显示控制模块,实现数字、日期的显示效果控制;2.4 设计操作响应模块,实现对按钮、旋钮等输入设备的操作响应;2.5 设计存储管理模块,实现时间、设置数据的存储和读取功能;2.6 设计光敏控制模块,实现对数码管显示亮度的实时调节。
四、实现方法1. 硬件设计1.1 选择合适的单片机作为核心控制器,根据需要进行外围电路的设计;1.2 选择合适的数码管作为显示设备,设计驱动电路以及显示控制电路;1.3 选择合适的按钮、旋钮等输入设备,设计输入电路以及操作响应电路;1.4 选择合适的EEPROM芯片,设计存储管理电路实现数据的存储和读取;1.5 选择合适的光敏电阻或光敏二极管,设计光敏控制电路实现显示亮度的调节。
利用单片机的定时器设计一个数字时钟
利用单片机的定时器设计一个数字时钟数字时钟是我们日常生活中常见的计时工具,可以准确地显示当前的时间。
而单片机的定时器则可以提供精准的定时功能,因此可以利用单片机的定时器来设计一个数字时钟。
本文将介绍如何使用单片机的定时器来设计一个基于数字显示的时钟,并提供基本的代码实现。
一、时钟电路设计利用单片机设计一个数字时钟,首先需要设计一个合适的时钟电路。
时钟电路一般由电源电路、晶振电路、单片机复位电路和显示电路组成。
1. 电源电路:为电路提供工作所需的电源电压,一般使用稳压电源芯片进行稳定的供电。
2. 晶振电路:利用晶振来提供一个稳定的时钟信号,常用的晶振频率有11.0592MHz、12MHz等。
3. 单片机复位电路:用于保证单片机在上电或复位时能够正确地初始化,一般使用降低复位电平的电路。
4. 显示电路:用于将单片机输出的数字信号转换成七段数码管可以识别的信号,一般使用BCD码和译码器进行实现。
二、单片机定时器的应用单片机的定时器具有精准的定时功能,可以帮助实现时钟的计时功能。
单片机的定时器一般分为定时器0和定时器1,根据具体的应用需求选择使用。
在设计数字时钟时,可以将定时器0配置成定时器模式,设置一个适当的定时时间。
当定时器0计时达到设定时间时,会触发一个中断信号,通过中断处理程序可以实现时钟的计时功能。
以下是一个基于单片机的定时器的伪代码示例:```void Timer0_Init(){// 设置定时器0为工作在定时器模式下// 设置计时时间// 开启定时器0中断}// 定时器0中断处理程序void Timer0_Interrupt_Handler(){// 更新时钟显示}void main(){Timer0_Init();while(1){// 主循环}}```在上述伪代码中,Timer0_Init()函数用于初始化定时器0的相关设置,包括工作模式和计时时间等。
Timer0_Interrupt_Handler()函数是定时器0的中断处理程序,用于处理定时器0计时到达设定时间时的操作,例如更新时钟显示。
用单片机内部的定时计数器来实现电子时钟的方法-
用单片机内部的定时计数器来实现电子时钟的方法-用单片机内部的定时/计数器来实现电子时钟的方法时钟,自从它发明的那天起就成为人类的朋友,但随着时间的推移,科学技术的不段发展,人们对时间计量的精度要求越来越高,怎样让时钟更好的为人们服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断的设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校;数字式电子钟用集成电路计时时,译码代替机械转动,用LED显示器代替指针进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分,秒的校对,片选的灵活性好。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。
本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法一.基本功能1.时间显示功能:显示时,分,秒,且计时初值为12:00:00 2.时间设置功能:可以通过键盘任意设定,修改显示时间二.硬件框图在系统电路中显示器为6个共阳极的LED数码管,用一个BCD七段译码器74LS47驱动数码管(74LS47的输入为BCD码,其输出为集电极开路,可直接驱动七段译码器,具有首尾消零等特点)用3-8译码器的74LS138的输出作为动态扫描数码管的选通信号。
因为采用了上述的两个芯片,所以在对数码管进行扫描显示时。
用单片机内部定时器实现的数字钟智能测控仪器设计
用单片机内部定时器实现的数字钟智能测控仪器设计“智能测控仪器设计”课程项目设计总结报告项目名称:用单片机内部定时器实现的数字钟指导老师:学号:专业年级:完成时间: 2013 年 7 月用单片机内部定时器实现的数字钟摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本文介绍了基于单片机AT89C51的数字钟的设计,详细讨论了它从软件上实现的过程,重点在时钟调整的方式:查询和中断的比较,然后,对数字钟的稳定性和精确性作了相关的讨论。
在文章的最后,给出了采用中断方式实现的数字钟的源程序。
本次设计通过对一个时钟显示、手动校时等功能的时间系统的设计,其中结合了LCD1602显示、单片机定时中断等技术。
关键词:单片机的应用,AT89C51,LCDAbstrct:In recent years along with computer penetration in the social sphere and the large scale integrated circuit development, MCU applications are constantly deepening, because it has strong function, small volume, low power consumption, low price, reliable work, so that the use is convenient wait for a characteristic, thus it is especially suitable for and control of relevant system, more and more widely and its application in automatic control, intelligent instruments, instrumentation, data acquisition, military products and household appliances and other fields, the microcontroller is often used as a core component to use, in accordance with the specific hardware structure, and the specific characteristics of the target application software node, to make perfect. This article introduced based on the single-chip digital clock design, discussed in detail from the software implementation process, heavy in the clock adjustment way: queries and disruption of comparison, and then, on the digital clock madeof the stability and accuracy of closed the discussion. At the end of the article, gives the interrupt mode to achieve digital clock source. This design through to a clock display, manual school functions when the time system design, which combines the LCD1602 display, dynamic scanning, SCM timer interrupt technology.Key words:The application of MCU, AT89C51, LCD1. 项目研究意义与研究现状数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,与机械式时钟相比具有更高的准确性和直观性,装置,具有更长的使用寿命,已得到广泛的使用。
基于单片机的数字钟设计与实现
基于单片机的数字钟设计与实现摘要:本文介绍了基于单片机的数字钟的设计,详细讨论了它从软件上实现的过程,重点在时钟调整的方式:查询和中断的比较,然后,对数字钟的稳定性和精确性作了相关的讨论。
在文章的最后,给出了采用中断方式实现的数字钟的源程序。
关键字:单片机,数字钟,数据缓冲区,中断,定时,消抖一、引言在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。
单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。
二、数字钟硬件框图:三、程序整体设计:定时模块,显示模块,数据调整模块,状态调整模块。
(1)总体介绍:此部分主要介绍定时模块,和显示模块。
定时部分采用经典的定时器定时。
它实现了数字钟的主要部分,和秒表的主要部分,以及产生报时信号,定时设置。
显示模块是实现数字钟的又一重要部分,其模块的的独立程度直接影响到数字钟的可视化程度。
在此部分的设计中,设置专用显示数据缓冲区40h--45h,与分,时及其他数据缓冲区数据区别,在其中存放的是显示段码,而其他缓冲区存放的是时间数据。
在显示时,首先将时间十进制数据转化为显示段码,然后送往数码管显示。
显示段码采用动态扫描的方式。
在要求改变显示数据的类别时,只须改变@R0(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。
(2)数据调整:数据调整有多种方式。
一,可以直接进入相关状态进行有关操作,二,将调整分两步,先进入状态,然后执行操作,这两步分别由两个键控制。
方式一,比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。
如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度(显示部分可以采用8279芯片来控制,可以解决此问题)。
基于单片机内部定时计数器的数字钟设计
/*基于单片机内部定时计数器的数字钟设计1、用单片机内部定时计数器T0进行计时;2、用LCD1062液晶器显示日期、时间;3、具有闰年自动计算功能;4、具有根据年、月、日计算星期功能。
Design:长沙民政职业技术学院,方跃春*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效uchar temp=0;uint year=2011;//定义年变量并赋初值2011年uchar month=05,day=23,week;uchar hour=01,minute=00,second=00;uchar code week_string[7][4]= {"MON","TUE","WED","THU","FRI","SAT","SUN; uchar data month_day[12]={31,0,31,30,31,30,31,31,30,31,30,31};/*--定时计数器T0及中断初始化函数--*/void init(void){ TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开启定时器0中断TR0=1;//启动定时器0}/*----------1ms延时函数----------*/void delay(uint n){ uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}void leapyear() //判断某年是否闰年函数{if((year%400==0)|| (year%100!=0) && (year%4==0)) month_day[1]=29;//闰年2月29天elsemonth_day[1]=28;//平年2月28天}uchar CaculateWeek(int y,char m, char d)//由年、月、日计算星期函数{ uchar w;if(m==1){m=13;y=y-1;}else if(m==2){m=14;y=y-1;}w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;return w;}/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==19){ temp=0;if(second==59){ second=0;if(minute==59){ minute=0;if(hour==23){ hour=0;leapyear();if(day==month_day[month-1]){ day=1;if(month==12){month=1;year++;} else month++;} else day++;} else hour++;}else minute++;}else second++;}else temp++;week=CaculateWeek(year,month,day);//根据年月日计算星期}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){ rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602初始化函数-----*/void LCD1602_init(){ LCD1602_write_com(0x38); //设置液晶显示方式:16x2行,5x7点阵,8位数据总线LCD1602_write_com(0x0c); //设置字符显示开关及光标显示模式:开启字符显示,不显示光标LCD1602_write_com(0x06); //设置数据指针及显示屏移动模式:数据指针增(即光标右移),显示屏不移LCD1602_write_com(0x01); //液晶屏幕清屏}/*-------主函数---------*/void main(){ init();//定时计数器T0及中断初始化LCD1602_init();//LCD1602初始化while(1){ uchar i;LCD1602_write_com(0x80+0x01);//设置第1行显示首地址01LCD1602_write_dat(0x30+year/1000);//输出年千位的字符码LCD1602_write_dat(0x30+(year%1000)/100);//输出年百位的字符码LCD1602_write_dat(0x30+(year%100)/10);//输出年十位的字符码LCD1602_write_dat(0x30+year%10);/输出年个位的字符码LCD1602_write_dat('-');//输出'-'字符码LCD1602_write_dat(0x30+month/10);LCD1602_write_dat(0x30+month%10);LCD1602_write_dat('-');//输出'-'字符码LCD1602_write_dat(0x30+day/10);LCD1602_write_dat(0x30+day%10);LCD1602_write_dat('(');for (i=0;i<3;i++)LCD1602_write_dat(week_string[week][i]);LCD1602_write_dat(')');//输出')'字符码LCD1602_write_com(0x80+0x40+0x04);LCD1602_write_dat(0x30+hour/10);LCD1602_write_dat(0x30+hour%10);LCD1602_write_dat(':');//输出':'字符码LCD1602_write_dat(0x30+minute/10);LCD1602_write_dat(0x30+minute%10);/LCD1602_write_dat(':');/LCD1602_write_dat(0x30+second/10);LCD1602_write_dat(0x30+second%10);}}#include<reg51.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效sbit shift_key=P3^2;//位置移动键sbit up_key=P3^3;//增加键uchar temp=0;uint year=2011;uchar month=05,day=23,week;uchar hour=0,minute=00,second=00;uchar code week_string[7][4]= {"MON","TUE","WED","THU","FRI","SAT","SUN;/ uchar data month_day[12]={31,0,31,30,31,30,31,31,30,31,30,31};/*--定时计数器T0及中断初始化函数--*/void init(void){ TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256; EA=1;//开总中断ET0=1;//开启定时器0中断EX0=1; IT0=1;TR0=1;//启动定时器0}void delay(uint n){ uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){ rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){ rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}void leapyear() //判断某年是否闰年函数{ if (0)month_day[1]=29;//闰年2月29天elsemonth_day[1]=28;//平年2月28天}uchar CaculateWeek(int y,char m, char d)/{ uchar w;if(m==1){m=13;y=y-1;}else if(m==2){m=14;y=y-1;}w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;return w;}/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==19){ temp=0;if(second==59)/{ second=0;if(minute==59){ minute=0;if(hour==23{hour=0;leapyear();if(day==month_day[month-1]){ day=1;if(month==12){ month=1;year++;}else month++;}else day++;}else hour++;} else minute++;}else second++;}else temp++;week=CaculateWeek(year,month,day); }void int0() interrupt 0//外部中断函数,当按下setup键时产生外部中断进入调整状态{ bit flag;uchar setup_bit=0;//setup_bit用于计数移位次数EX0=0;//关闭中断函数do//循环{ if(shift_key==0)//判断移位键是否按下{ delay(1);//延时消抖if(shift_key==0)//确认移位键是否按下{ while(!shift_key);//等待移位键释放if(setup_bit==10)//共12位{ setup_bit=0; //移位计数值返回0LCD1602_write_com(0x0c);//设置不显示光标模式}else{setup_bit++;//移位计数值加1LCD1602_write_com(0x0e);/设置显示光标模式}}}switch(setup_bit)//判断调整哪位,从而确定光标显示位置{ case 1:LCD1602_write_com(0x80+0x44+4);/光标设置到分个位显示位置break;case 2:LCD1602_write_com(0x80+0x44+3);//光标设置到分十位显示位置break;case 3:LCD1602_write_com(0x80+0x44+1);//光标设置到时个位显示位置break;case 4:LCD1602_write_com(0x80+0x44+0);//光标设置到时十位显示位置break;case 5:LCD1602_write_com(0x80+0x01+9);//光标设置到日个位显示位置break;case 6:LCD1602_write_com(0x80+0x01+8);//光标设置到日十位显示位置break;case 7:LCD1602_write_com(0x80+0x01+6);//光标设置到月个位显示位置break;case 8:LCD1602_write_com(0x80+0x01+5);//光标设置到月十位显示位置break;case 9:LCD1602_write_com(0x80+0x01+3);//光标设置到年个位显示位置break;case 10:LCD1602_write_com(0x80+0x01+2);//光标设置到年十位显示位置break;case 11:LCD1602_write_com(0x80+0x01+1);//光标设置到年百位显示位置break;case 12:LCD1602_write_com(0x80+0x01+0);//光标设置到年千位显示位置break;default:break;}if(up_key==0)//判断增加键是否按下{ delay(1);//延时消抖if(up_key==0)//确认增加键是否按下{ while(!up_key);//等待增加键释放flag=1;//增加键已按动}elseflag=0;//增加键未按动}elseflag=0;//增加键未按动if(flag)//若增加键按动{ switch(setup_bit)//判断是哪位,从而调整哪位{case 1:if(minute%10==9)//若分个位为9minute=minute-9;//则分个位清零elseminute++;//否则分个位加1//LCD1602_write_com(0x80+0x44+4);//分个位显示位置LCD1602_write_dat(0x30+minute%10);//写入1602break;case 2:if(minute/10==5)//若分十位为5minute=minute-50;//则分十位清零elseminute=minute+10;//否则分十位加1//LCD1602_write_com(0x80+0x44+3);//分十位显示位置LCD1602_write_dat(0x30+minute/10);//写入1602break;case 3:if(hour%10==3)hour=hour-3;elsehour++;//LCD1602_write_com(0x80+0x44+1);//时个位显示位置LCD1602_write_dat(0x30+hour%10);//写入1602break;case 4:if(hour/10==2)hour=hour-20;elsehour=hour+10;//LCD1602_write_com(0x80+0x44+0);//时十位显示位置LCD1602_write_dat(0x30+hour/10);//写入1602 break;case 5:if(day%10==9)day=day-9;elseday++;//LCD1602_write_com(0x80+0x01+9);//日个位显示位置LCD1602_write_dat(0x30+day%10);//写入1602break;case 6:if(day/10==3)day=day-30;elseday=day+10;//LCD1602_write_com(0x80+0x01+8);//日十位显示位置LCD1602_write_dat(0x30+day/10);//写入1602 break;case 7:if(month%10==9)month=month-9;elsemonth++;//LCD1602_write_com(0x80+0x01+6);//月个位显示位置LCD1602_write_dat(0x30+month%10);//写入1602 break;case 8:if(month/10==1)month=month-10;elsemonth=month+10;//LCD1602_write_com(0x80+0x01+5);//月十位显示位置LCD1602_write_dat(0x30+month/10);//写入1602break;case 9:if(year%10==9)year=year-9;elseyear++;//LCD1602_write_com(0x80+0x01+3);//年个位显示位置LCD1602_write_dat(0x30+year%10);//写入1602break;case 10:if(year%100/10==9)year=year-90;elseyear=year+10;//LCD1602_write_com(0x80+0x01+2);//年十位显示位置LCD1602_write_dat(0x30+year%100/10);//写入1602break;default: break;}}}while(setup_bit!=0);//若所有位未调整完则返回,否则退出调整模式EX0=1;//重新打开外部中断}/*-------LCD1602初始化函数-----*/void LCD1602_init(){LCD1602_write_com(0x38); //设置液晶显示方式:16x2行,5x7点阵,8位数据总线LCD1602_write_com(0x0c); //设置字符显示开关及光标显示模式:开启字符显示,不显示光标LCD1602_write_com(0x06); //设置数据指针及显示屏移动模式:数据指针增(即光标右移),显示屏不移LCD1602_write_com(0x01); //液晶屏幕清屏}/*-------主函数---------*/void main(){init();//定时计数器T0及中断初始化LCD1602_init();//LCD1602初始化while(1){uchar i;LCD1602_write_com(0x80+0x01); //设置第1行显示首地址01LCD1602_write_dat(0x30+year/1000);//输出年千位的字符码LCD1602_write_dat(0x30+(year%1000)/100);//输出年百位的字符码LCD1602_write_dat(0x30+(year%100)/10);//输出年十位的字符码LCD1602_write_dat(0x30+year%10);//输出年个位的字符码LCD1602_write_dat('-');//输出'-'字符码LCD1602_write_dat(0x30+month/10);//输出月十位的字符码LCD1602_write_dat(0x30+month%10);//输出月个位的字符码LCD1602_write_dat('-');//输出'-'字符码LCD1602_write_dat(0x30+day/10);//输出日十位的字符码LCD1602_write_dat(0x30+day%10);//输出日个位的字符码LCD1602_write_dat('(');//输出'('字符码for (i=0;i<3;i++)LCD1602_write_dat(week_string[week][i]);//输出星期英文缩写字符码LCD1602_write_dat(')');//输出')'字符码LCD1602_write_com(0x80+0x40+0x04); //设置第2行显示首地址04LCD1602_write_dat(0x30+hour/10);//输出小时十位的字符码LCD1602_write_dat(0x30+hour%10);//输出小时个位的字符码LCD1602_write_dat(':');//输出':'字符码LCD1602_write_dat(0x30+minute/10);//输出分十位的字符码LCD1602_write_dat(0x30+minute%10);//输出分个位的字符码LCD1602_write_dat(':');//输出':'字符码LCD1602_write_dat(0x30+second/10);//输出秒十位的字符码LCD1602_write_dat(0x30+second%10);//输出秒个位的字符码}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机内部定时计数器的数字钟设计(带时间、日期调节功能)方跃春(副教授)大学城栏目:世界大学城居民新闻空间栏目:方法库共207篇论文| 附件【数字钟调整日期、时间程序流程图.swf 1.swf clock_2.c】收藏到我的学习空间收藏到我的课堂魔方方跃春(副教授) 发表于2011-5-26 1:54:23 阅读(565)评论(3)流程图链接!/*基于单片机内部定时计数器的数字钟设计1、用单片机内部定时计数器T0进行计时;2、用LCD1062液晶器显示日期、时间;3、具有闰年自动计算功能;4、具有根据年、月、日计算星期功能;5、具有时间、日期调整功能。
Design:长沙民政职业技术学院,方跃春*/#include<reg51.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效sbit shift_key=P3^2;//位置移动键sbit up_key=P3^3;//增加键uchar temp=0;//定义定时器溢出计数变量,每隔50ms 产生1次溢出,temp加1uint year=2011;//定义年变量并赋初值2011年uchar month=05,day=23,week;//定义月、日、星期变量,并赋初值5月23日uchar hour=0,minute=00,second=00;//定义时、分、秒变量,并赋初值12时00分00秒uchar codeweek_string[7][4]={"MON","TUE","WED","THU","FR I","SAT","SUN"};//定义星期英文缩写表uchar datamonth_day[12]={31,0,31,30,31,30,31,31,30,31,30 ,31};//定义每月天数表/*--定时计数器T0及中断初始化函数--*/void init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开启定时器0中断EX0=1;//开启外部中断,外部中断用于调整时间 PT0=1;//将定时器0中断设置高优先级,调整时间期不停止计时TR0=1;//启动定时器0}/*----------1ms延时函数----------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*********************公历平年的2月只有28天,公历闰年的2月有29天。
判断公历闰年的算法:①、普通年能被4整除且不能被100整除的为闰年。
如:2011年不是闰年,2012年是闰年...2100年也不是闰年。
②、世纪年能被400整除的是闰年。
如:2000年是闰年,1900年不是闰年。
*********************/void leapyear() //判断某年是否闰年函数{if ((year%400==0) || (year%100!=0) && (year%4==0))month_day[1]=29;//闰年2月29天elsemonth_day[1]=28;//平年2月28天}/*************************由年、月、日计算星期的算法(基姆拉尔森计算公式):W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:计算时要将一月和二月看成是上一年的十三月和十四月。
例:2012-1-10需要换算成2011-13-10来代入公式计算。
**************************/uchar CaculateWeek(int y,char m, char d)//由年、月、日计算星期函数{uchar w;if(m==1){m=13;y=y-1;}else if(m==2){m=14;y=y-1;}w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; return w;}/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==19)//为了加快仿真速度,将temp设为1,实际应为20{temp=0;if(second==59)//为了加快仿真速度,将second设为2,实际应为59{second=0;if(minute==59)//为了加快仿真速度,将minute设为2,实际应为59{minute=0;if(hour==23)//为了加快仿真速度,将hour设为2,实际应为23{hour=0;leapyear();//闰、平年计算 if(day==month_day[month-1] )//判断日期是否到了每月最后一天{day=1;if(month==12){month=1;year++;}else month++;}else day++;}else hour++;}else minute++;}else second++;}else temp++;week=CaculateWeek(year,month,day);//根据年月日计算星期}void int0() interrupt 0//外部中断函数,当按下setup键时产生外部中断进入调整状态{bit flag;uchar setup_bit=0;//setup_bit用于计数移位次数do//循环{if(shift_key==0)//判断移位键是否按下 {delay(1);//延时消抖if(shift_key==0)//确认移位键是否按下{while(!shift_key);//等待移位键释放if(setup_bit==10)//共10位{setup_bit=0; //移位计数值返回0LCD1602_write_com(0x0c);//关闭光标显示goto rep;//转移到中断程序结束处}else{setup_bit++;//移位计数值加1LCD1602_write_com(0x0e);//打开光标显示}}}switch(setup_bit)//判断调整哪位,从而确定光标显示位置{case 1:LCD1602_write_com(0x80+0x44+4) ;//光标设置到分个位显示位置break;case 2:LCD1602_write_com(0x80+0x44+3) ;//光标设置到分十位显示位置break;case 3:LCD1602_write_com(0x80+0x44+1) ;//光标设置到时个位显示位置break;case 4:LCD1602_write_com(0x80+0x44+0) ;//光标设置到时十位显示位置break;case 5:LCD1602_write_com(0x80+0x01+9) ;//光标设置到日个位显示位置break;case 6:LCD1602_write_com(0x80+0x01+8) ;//光标设置到日十位显示位置break;case 7:LCD1602_write_com(0x80+0x01+6) ;//光标设置到月个位显示位置break;case 8:LCD1602_write_com(0x80+0x01+5) ;//光标设置到月十位显示位置break;case 9:LCD1602_write_com(0x80+0x01+3) ;//光标设置到年个位显示位置break;case 10:LCD1602_write_com(0x80+0x01+2) ;//光标设置到年十位显示位置break;default:break;}if(up_key==0)//判断增加键是否按下{delay(1);//延时消抖if(up_key==0)//确认增加键是否按下{while(!up_key);//等待增加键释放flag=1;//增加键已按动}elseflag=0;//增加键未按动}elseflag=0;//增加键未按动if(flag)//若增加键按动{switch(setup_bit)//判断是哪位,从而调整哪位{case 1:if(minute%10==9)//若分个位为9minute=minute-9;//则分个位清零elseminute++;//否则分个位加1LCD1602_write_dat(0x30+min ute%10);//写入1602break;case 2:if(minute/10==5)//若分十位为5minute=minute-50;//则分十位清零elseminute=minute+10;//否则分十位加1LCD1602_write_dat(0x30+min ute/10);//写入1602break;case 3:if(hour%10==9)hour=hour-9;elsehour++;LCD1602_write_dat(0x30+hou r%10);//写入1602break;case 4:if(hour/10==2)hour=hour-20;elsehour=hour+10;LCD1602_write_dat(0x30+hou r/10);//写入1602break;case 5:if(day%10==9)day=day-9;elseday++;LCD1602_write_dat(0x30+day %10);//写入1602break;case 6:if(day/10==3)day=day-30;elseday=day+10;LCD1602_write_dat(0x30+day /10);//写入1602break;case 7:if(month%10==9)month=month-9;elsemonth++;LCD1602_write_dat(0x30+mon th%10);//写入1602break;case 8:if(month/10==1)month=month-10;elsemonth=month+10;LCD1602_write_dat(0x30+mon th/10);//写入1602break;case 9:if(year%10==9)year=year-9;elseyear++;LCD1602_write_dat(0x30+yea r%10);//写入1602break;case 10:if(year%100/10==9)year=year-90;elseyear=year+10;LCD1602_write_dat(0x30+yea r%100/10);//写入1602break;default: break;}}}while(setup_bit!=0);//若所有位未调整完则返回,否则退出调整模式rep:;}/*-------LCD1602初始化函数-----*/void LCD1602_init(){LCD1602_write_com(0x38); //设置液晶显示方式:16x2行,5x7点阵,8位数据总线LCD1602_write_com(0x0c); //设置字符显示开关及光标显示模式:开启字符显示,不显示光标LCD1602_write_com(0x06); //设置数据指针及显示屏移动模式:数据指针增(即光标右移),显示屏不移LCD1602_write_com(0x01); //液晶屏幕清屏}/*-------主函数---------*/void main(){init();//定时计数器T0及中断初始化LCD1602_init();//LCD1602初始化while(1){uchar i;LCD1602_write_com(0x80+0x01); //设置第1行显示首地址01LCD1602_write_dat(0x30+year/1000);//输出年千位的字符码LCD1602_write_dat(0x30+(year%1000)/100 );//输出年百位的字符码LCD1602_write_dat(0x30+(year%100)/10); //输出年十位的字符码LCD1602_write_dat(0x30+year%10);//输出年个位的字符码LCD1602_write_dat('-');//输出'-'字符码 LCD1602_write_dat(0x30+month/10);//输出月十位的字符码LCD1602_write_dat(0x30+month%10);//输出月个位的字符码LCD1602_write_dat('-');//输出'-'字符码 LCD1602_write_dat(0x30+day/10);//输出日十位的字符码LCD1602_write_dat(0x30+day%10);//输出日个位的字符码LCD1602_write_dat('(');//输出'('字符码for (i=0;i<3;i++)LCD1602_write_dat(week_string[week ][i]);//输出星期英文缩写字符码LCD1602_write_dat(')');//输出')'字符码LCD1602_write_com(0x80+0x40+0x04); //设置第2行显示首地址04LCD1602_write_dat(0x30+hour/10);//输出小时十位的字符码LCD1602_write_dat(0x30+hour%10);//输出小时个位的字符码LCD1602_write_dat(':');//输出':'字符码 LCD1602_write_dat(0x30+minute/10);//输出分十位的字符码LCD1602_write_dat(0x30+minute%10);//输出分个位的字符码LCD1602_write_dat(':');//输出':'字符码 LCD1602_write_dat(0x30+second/10);//输出秒十位的字符码LCD1602_write_dat(0x30+second%10);//输出秒个位的字符码}}网友评论评论内容最多输入2000个字符李文2011-6-1 20:44:14 发表程序很详细,下来参考一下。