创作时间:二零二一年六月三十日
按时闹钟设计之欧侯瑞魂创作
创作时间:二零二一年六月三十日
摘要:
本设计目的是利用单片机设计制作一个简易的按时闹铃时钟, 可
以放在宿舍或教室使用, 在夜晚或黑暗的场所也可以使用.可以设
置现在的时间以及闹铃的时间而且显示出来, 若时间到则发出一
阵声响.
本次设计的按时闹钟在硬件方面就采纳了AT89C52芯片, 用
6位LED数码管进行显示.LED用P0口进行驱动, 采纳的是静态扫
描显示, 能够比力准确显示时时—分分—秒秒.通过五个功能按键
可以实现对时间的修改、按时和闹铃终止, 闹钟设置的时间到时
蜂鸣器可以发作声响.在软件方面用C51编程.整个按时闹钟系统
能完成时间的显示, 调时和设置闹钟、停止响铃等功能, 并经过
系统仿真后获得了正确的结果.
关键词:按时闹钟;蜂鸣器;AT89C52;74HC245;
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
目录
第1章 绪论1
1.2.1设计要求:1
1.2.2设计任务:1
第2章 系统总体设计2
系统设计需求
总体设计方案
第3章 系统硬件设计4
3.2.3 74HC245芯片7
??????LED显示模块??
??????按键模块??
第4章 系统软件设计11
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
第5章 系统测试13
?? 测试环境 ??
????测试步伐 ??
???? 测试环境的构建 ??
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
结论15
致谢16
参考文献17
附录18
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
第1章 绪论
本次课程设计的主题是按时闹钟, 其基础部份是一个数字钟.电路系统由秒信号发生
器、“时、分、秒”计数器、显示器组成.其中秒信号发生器是整个系统的时基信号, 它直接决
定计时系统的精度, 这里用51单片机的按时器来实现.利用按时器获得每一秒的时刻,然后在
法式中, 我们就可以给秒进行逐秒赋值, 满60秒则进位为1分, 满60分则进位为1小时, 满
24小时则时间重置实现一天24小时的循环.译码显示电路将“时”、“分”、“秒”计数器的输出
状态送到七段显示译码器译码, 通过一个六位八段数码管显示出来.
这里利用51单片机的相关知识, 来实现电子闹钟的相关功能.实验使用了AT89C52、
74HC245等芯片, 通过单片机的P0、P3管脚来驱动数码管显示出相应的时刻.本文将讲述
AT89C52、74HC245等芯片的基本功能原理, 偏重点介绍该电子闹钟的设计.
1.2.1设计要求:
使用6位七段LED显示器来显示现在的时间;显示格式为“时时分分秒秒”;具有4个
按键来做功能设置, 可以设置现在的时间及显示闹铃设置时间;时间到则发出一阵声
响, 可通过按键复位;对单片机系统设计的过程进行总结, 认真书写课程设计陈说并按
时上交.
1.2.2设计任务:
利用51单片机结合七段LED显示器设计一个简易的按时闹铃时钟, 可以放在宿舍或教
室使用, 由于用七段LED显示器显示数据, 在夜晚或黑暗的场所也可以使用.可以设置现
在的时间及显示闹铃设置时间, 若时间到则发出一阵声响.
论文分别叙述从硬件和软件上实现该设计的过程.第2章为总体设计方案.第3章主要介
绍设计实现需要解决的硬件问题.依次介绍所使用的各种硬件的使用方法, 并附上仿真电路
图和文字说明.第4章从软件的角度说明实现该设计需要解决的问题.
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
第2章 系统总体设计
系统要求实现以下功能:
1.当电源接通时, 系统能正确显示以后时间.
2.以后时间与实时时间有误差时, 可以通过键盘调整以后时间.
3.系统允许进行闹钟设置, 开启闹钟功能时, 当设置的闹钟时间与以后时间一致的时
候, 系统通过蜂鸣器发出警报声而且可以通过按键停止.
功能组成:
本次设计中的计时功能很容易实现, 难点在于时钟功能和闹钟功能的切换和时间的设置.
该电子闹钟设计对51单片机按时器0装初值, 使其初值对应50ms, 按时器0的中断次数达
到20次就刚好为1s, 当秒部份计数到60时置零, 并向分部份进一;当分部份计数到60时
置零, 并向时部份进一, 那时部份计数到24时置零, 从而满足时钟的正常工作.
在设计过程中, 我发现通过4个按键来完成一个闹钟的基础功能虽然可以实现, 可是用
户用起来就会很麻烦, 因为有的键必需有多种功能和分歧的触发方式, 我认为可以增加少许
按键来方便用户快速了解到我们的闹钟是如何进行控制的.所以本次设计设置5个键依次对
其进行“时间校准”、“闹钟设置”、“秒分时切换/终止警报”、“加1按钮”、“减1按钮”.“秒分
时切换/终止报警”键在调时状态中, 起时分秒切换的作用, 在非调试状态下, 起闹钟终止的作
用.
当用户按下“时间校准”的按钮后, 法式会关闭T0按时器, 之后时钟停止工作, 此时数码
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
管会显示以后静止的时间, 说明已经进入时间校准的界面了.在完成时间校准后, 翻开T0按
时器, 时钟会在设置好的时间上继续工作走秒.
当用户按下“闹钟设置”按钮后, 会将以后时间复制出来提供给按时界面, 注意此时我们
的时钟仍然在继续工作, 只是数码管显示的是按时模式的静止时间.当设置好后, 此时用户设
置的时间只要没有触发过闹铃, 再次按“闹钟设置”按钮就能检查并修改, 即闹钟会保管下用
户最后一次未被触发的闹钟时间.
当正常工作的时钟时刻达到了预设的闹铃时刻, 蜂鸣器发出警报声, 屏幕会闪烁并显示
以后时间.考虑到用户可能已经被提醒而不想继续被闹铃声干扰, 还提供了一个能够终止闹
铃的功能, 此功能与“时分秒切换”功能共用同一按键, 按下后时钟继续正常工作, 且闹钟功能
又可以重新设置.
本设计在Keil编程环境下, 使用C语言进行编程的编纂.编纂胜利后, 通过仿真软件Proteus
进行仿真测试.
LED显示屏×1
主控芯片:AT89C52
闹钟提示:蜂鸣器
人机交互:按键×5
晶振:12KHz×1
排阻:RESPACK8×1
电容:10nf×2
总线收发器:74HC245×2
第3章 系统硬件设计
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
系统硬件模块主要分为以下几个模块:
1.主控模块:控制其他子模块.
2.时钟模块:为系统提供实时时间.
3.显示模块:显示系统时间信息.
4.按键模块:用户通过按键进行人机交互, 修改实时时间、设置闹钟时间和终止闹钟报
警.
5.闹钟模块:在所设闹钟时间发出警报声.
(1).AT89C52简介
AT89C52是一个低电压, 高性能CMOS 8位单片机, 片内含8k bytes的可反复擦写的
Flash只读法式存储器和256 bytes的随机存取数据存储器(RAM), 器件采纳ATMEL公司的
高密度、非易失性存储技术生产, 兼容标准MCS51指令系统, 片内置通用8位中央处置器和
Flash存储单位, AT89C52单片机在电子行业中有着广泛的应用.
AT89C52有40个引脚, 32个外部双向输入/输出(I/O)端口, 同时内含2个外中断口, 3个
16位可编程按时计数器,2个全双工串行通信口, 2 个读写口线, AT89C52可以依照惯例方法
进行编程, 也可以在线编程.其将通用的微处置器和Flash存储器结合在一起, 特别是可反复
擦写的 Flash存储器可有效地降低开发本钱.AT89C52有PDIP、PQFP/TQFP及PLCC等三种封
装形式, 以适应分歧产物的需求.
AT89C52引脚图如图3.2.1:
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
(2).工作原理
AT89C52为8 位通用微处置器, 采纳工业标准的C51内核, 在内部功能及管脚排布
上与通用的8xc52 相同, 其主要用于会聚调整时的功能控制.功能包括对会聚主IC 内部
寄存器、数据RAM及外部接口等功能部件的初始化, 会聚调整控制, 会聚测试图控制,
红外遥控信号IR的接收解码及与主板CPU通信等.主要管脚有:XTAL1(19 脚)和
XTAL2(18 脚)为振荡器输入输出端口, 外接12MHz 晶振.RST/Vpd(9 脚)为复位输入
端口, 外接电阻电容组成的复位电路.VCC(40 脚)和VSS(20 脚)为供电端口, 分别接
+5V电源的正负端.P0~P3 为可编程通用I/O 脚, 其功能用途由软件界说, 在本设计中, P0
端口(32~39 脚)被界说为N1 功能控制端口, 分别与N1的相应功能管脚相连接, 13 脚
界说为IR输入端, 10 脚和11脚界说为I2C总线控制端口, 分别连接N1的SDAS(18
脚)和SCLS(19脚)端口, 12 脚、27 脚及28 脚界说为握手信号功能端口, 连接主板
CPU 的相应功能端, 用于以后制式的检测及会聚调整状态进入的控制功能.
P0 口:
P0 口是一组8 位漏极开路型双向I/O 口, 也即地址/数据总线复用口.作为输出口
用时, 每位能吸收电流的
方式驱动8 个TTL逻辑门电路, 对端口P0 写“1”时, 可作为高阻抗输入端用.在访问外部
数据存储器或法式存储器时, 这组口线分时转换地址(低8 位)和数据总线复用, 在访
问期间激活内部上拉电阻.
在Flash编程时, P0 口接收指令字节, 而在法式校验时, 输出指令字节, 校验时, 要求外接
上拉电阻.
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
P1 口:
P1 是一个带内部上拉电阻的8 位双向I/O 口, P1 的输出缓冲级可驱动(吸收或输
出电流)4 个TTL 逻辑门电路.对端口写“1”, 通过内部的上拉电阻把端口拉到高电平, 此
时可作输入口.作输入口使用时, 因为内部存在上拉电阻, 某个引脚被外部信号拉低时会
输出一个电流(IIL).与AT89C51 分歧之处是, P1.0 和P1.1 还可分别作为按时/计数器2 的
外部计数输入(P1.0/T2)和输入(P1.1/T2EX), Flash 编程和法式校验期间, P1 接收低
8 位地址.
P2 口:
P2 是一个带有内部上拉电阻的8 位双向I/O 口, P2 的输出缓冲级可驱动(吸收或
输出电流)4 个TTL 逻辑门电路.对端口P2 写“1”, 通过内部的上拉电阻把端口拉到高电
平, 此时可作输入口, 作输入口使用时, 因为内部存在上拉电阻, 某个引脚被外部信号拉
低时会输出一个电流(IIL).在访问外部法式存储器或16 位地数据存储器(例如执行
MOVX @DPTR 指令)时, P2 口送出高8 位地址数据.在访问8 位地址的外部数据存储器
(如执行MOVX@RI 指令)时, P2 口输出P2锁存器的内容.Flash编程或校验时, P2亦
接收高位地址和一些控制信号.
P3 口:
P3 口是一组带有内部上拉电阻的8 位双向I/O 口.P3 口输出缓冲级可驱动(吸收
或输出电流)4 个TTL 逻辑门电路.对P3 口写入“1”时, 它们被内部上拉电阻拉高并可作
为输入端口.此时, 被外部拉低的P3 口将用上拉电阻输出电流(IIL).P3 口除作为一般
的I/O 口线外, 更重要的用途是它的第二功能P3 口还接收一些用于Flash闪速存储器
编程和法式校验的控制信号.
RST:
复位输入.当振荡器工作时, RST引脚呈现两个机器周期以上高电平将使单片机复
位.
ALE/PROG:
当访问外部法式存储器或数据存储器时, ALE(地址锁存允许)输出脉冲用于锁存
地址的低8 位字节.一般情况下, ALE 仍以时钟振荡频率的1/6 输出固定的脉冲信号, 因
此它可对外输出时钟或用于按时目的.要注意的是:每当访问外部数据存储器时将跳过
一个ALE 脉冲.对Flash存储器编程期间, 该引脚还用于输入编程脉冲(PROG).如有需
要, 可通过对特殊功能寄存器(SFR)区中的8EH 单位的D0 位置位, 可禁止ALE 把持.
该位置位后, 只有一条MOVX 和MOVC指令才华将ALE 激活.另外, 该引脚会被微弱拉
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
高, 单片机执行外部法式时, 应设置ALE 禁止位无效.
PSEN:
法式贮存允许(PSEN)输出是外部法式存储器的读选通信号, 当AT89C52 由外部
法式存储器取指令(或数据)时, 每个机器周期两次PSEN 有效, 即输出两个脉冲.在此
期间, 当访问外部数据存储器, 将跳过两次PSEN信号.
EA/VPP:
外部访问允许.欲使CPU 仅访问外部法式存储器(地址为0000H—FFFFH), EA 端
必需坚持低电平(接地).需注意的是:如果加密位LB1 被编程, 复位时内部会锁存EA
端状态.如EA端为高电平(接Vcc端), CPU 则执行内部法式存储器中的指令.Flash存
储器编程时, 该引脚加上+12V 的编程允许电源Vpp, 固然这必需是该器件是使用12V编
程电压Vpp.
XTAL1:
振荡器反相放年夜器及内部时钟发生器的输入端.
XTAL2:
振荡器反相放年夜器的输出端.
利用芯片内部的振荡电路, 在XTAL1、XTAL2的引脚上外接按时元件, 内部振荡器便能发
生自激振荡.按时元件可以采纳石英晶体和电容组成的并联谐振电路, 如图3.2.2所示.
晶振可以在1.2~12MHZ之间任选, 甚至可以达到24MHz, 可是频率越高功耗也就越年
夜.和晶振并联的电容C1、C2的年夜小对振荡频率有微小影响, 可以起到频率微调作用.
时钟电路如图3.2.2:
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
3.2.3 74HC245芯片
电路中用74HC245芯片充任总线收发器, 作用是放年夜信号, 它具有典范的CMOS型三
态缓冲门电路.由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力, 如果负
载超越其负载能力, 一般应加驱动器.
引脚界说:
1引脚DIR:未输入输出端口转换用, 当它为高电平“1”时, 信号由“A”端口输入“B”端口输出;
当它为低电平“0”时, 信号由“B”端口输入“A”端口输出.
29引脚: “A”端口输入输出端, 每个端口与“B”端口对应.
1118引脚:“B”端口输入输出端, 每个端口与“A”端口对应.
10引脚:GUD, 电源地.
20引脚:VCC, 电源正极.
74HC245引脚图如图3.2.3(1) :
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
图3.2.3(1)
仿真电路图如图3.2.3(2):
图3.2.3(2)
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
3.3 LED显示模块
本次课程设计采纳了6位数码管显示电路.在6位LED显示时,为了简化电路,降低本钱,
采纳静态显示的方式, 6个LED显示器共用一个8位的I/O, 6位LED数码管的位选线分别由
相应的P2. 0~P2. 5控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0
口.译码显示电路将“时”、“分”、“秒”计数器的输出状态经七段显示译码器译码, 通过6位
LED七段显示器显示出来.达到按时电路时根据计时系统的输出状态发生脉冲信号, 然后去触
发音频发生器实现闹铃.校时电路时用来对“时”、“分”、“秒”显示数字进行校对换整的.
LED仿真电路图如图3.3:
图
3.4 按键模块
按键模块共设置了五个按键, 功能分别如下:
(1).时间校准键“CLOCK”: 自锁开关, 按下后进入校准设置, 再次按下后退出.
(2).闹钟设置键“ALARM CLOCK”: 自锁开关, 按下后进入闹钟设置, 再次按下后退出.
另外可供用户对已经设置的闹钟时间进行检查或修改.
(3). 秒分时切换/终止报警键“SWITCH/STOP”: 按钮开关, 在按下“CLOCK”或“ALARM CLOCK”键
时, 为时分秒切换功能, 默认是“秒”, 再次按下是“分”, 然后是“时”之后是“秒”, 以此类推.在
“CLOCK”或“ALARM CLOCK”键未按下时, 为终止报警功能.
(4).时间增加键“+”:按钮开关, 可以在进入校准设置和闹钟设置后, 进行加一把持.
(5).时间减少键“”: 按钮开关, 可以在进入校准设置和闹钟设置后, 进行减一把持.
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
按键模块仿真电路图如图3.4:
闹铃指示设置有声和光两种形式.声音形式的关键元件是蜂鸣器.蜂鸣器有无源和有源两
种, 前者需要输入声音频率信号才华正常发声, 后者则只需外加适当直流电源电压即可, 本次
设计我们使用的是后者.闹钟电路是用比力器来比力计时系统和按时系统的输出状态, 如果
计时系统和按时系统的输出状态相同, 则发出一个脉冲信号, 再和一个高频信号混合, 送到放
年夜电路驱动扬声器发声, 从而实现按时闹响的功能.
蜂鸣器仿真电路图如图3.5:
第4章 系统软件设计
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
该部份主要分为实时时钟模块、LED显示模块、键盘中断模块、闹钟模块.实时时钟部
份主要包括实时时间的读写, 时间的修改.LED显示模块主要包括显示屏的初始化, 显示的命
令字.键盘中断模块包括各键的界说和作用, 按键的消抖, 各按键跳转的子法式分配.闹钟模块
包括闹钟时间的设置, 以及对蜂鸣器启动和停止条件的设置和处置.
主法式包括三个部份.一是主函数部份, 负责系统的初始化把持;从中断服务取得实时
时间;判断闹钟时间是否与实时时间相等并在相等时发出警报声.第二部份是按时中断部份,
分两种情况:负责处置从中断服务获得的时间数据并送至LED显示缓冲显示, 或者显示闹钟
设置界面并显示闹钟时间的设置过程.第三部份是外部中断, 主要界说5个按键的作用, 分配
每一个按键跳转的子法式.第三部份负责时间和日期的修改, 闹钟时间的设置, 停止蜂鸣器鸣
叫的功能.
断系统在单片机应用系统中起着十分重要的作用, 是现代嵌入式控制系统广泛采纳的一
种适时控制技术, 能对突发事件进行及时处置, 从而年夜年夜提高系统对外部事件的处置能
力.正是有了中断技术, 单片机才得以能够普及.因此, 中断技术是单片机的一项重要技术, 掌
握中断技术能开发出灵活、高效的单机片应用系统.
要让单机片停止以后的法式去执行其他法式, 需要向它发出请求信号, CPU接收到中断
请求信号后才华发生中断.让CPU发生中断的信号称为中断源(又称中断请求源).单片机
提供5个中断源, 其中两个为外部中断请求源INT0(P3.2)和INT1(P3.3), 两个片内按时
器/计数器T0和T1的溢出请求中断源TF0和TF1, 1个片内串行口发送或接收中断请求源T1
和R1.
单片机内的CPU工作时, 如果一个中断源向它发出中断请求信号, 它就会发生中断.可是,
如果同时有两个中断源发出中断请求信号, CPU就会优先接收级别高的中断请求源, 然后再
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
接收优先级别低的中断请求.表4.3.2列出5个自力中断请求源由其硬件结构决定的自然优
先级排列顺序.
中断源自然优先级中断入口地址中断编号
外部中断INT0高0003H0
按时器T0000BH1
外部中断INT10013H2
按时器T1001BH3
串行口通信中断0023H4
R1或T1
表4.3.2 单片机中断源的自然优先级、入口地址及中断编号
对应于单片机的5个自力中断源, 应有相应的中断服务法式.这些中断服务法式有专门
规定的寄存位置, 即表4.3.2的中断入口地址.当有了中断请求后, CPU可以根据入口地址迅
速找到中断服务法式并开始执行, 年夜年夜提高执行效率.
↓
低
主法式见附录.
第5章 系统测试
Proteus仿真模拟软件.
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
(1).在Proteus软件中绘制好按时闹钟仿真模拟电路图.
(2).将Keil编译器生成的.hex文件载入AT89C52芯片.
(3).在Proteus软件中, 点击左下角的“play”按钮启动按时闹钟.如下图, “play”按钮在第一
个.
图5.3.1(3)仿真电路运行控制按钮
详细测试内容如下:
按时闹钟是否能正确显示时间;是否能正确显示闹钟设置时的界面;是否能正确显示
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
时间调整时的界面.
(1).显示时间
点击“play”键之后, 时钟系统开始走时, 如图5.5.2(1):
图5.3.2(1)
经测试, 显示结果达到预期要求.
(2).时间调整测试
如果用户发现时间运行分歧毛病, 要对时间进行修改和调整, 就需要进入时间修改的界
面.预期可以对时、分、秒进行调整和修改.系统能正确显示时间修改的界面.用户可以完成
时间的修改.
经测试, 该部份运行正常.
(3).闹钟设置测试
在系统能正确显示时间之后, 用户若想设置闹钟, 可以通过按键完成闹钟时间的设置.设
置时间到后蜂鸣器报警, 按下“STOP”键后警报停止
经测试, 该部份能正常运行.
结论:通过以上对仿真项目的全面测试, 可知仿真部份运行正常.
通过以上测试, 证明本设计基本实现系统所有要求, 即能够正确显示时间信息, 能够对以
后时间进行调整和修改, 而且能够设定闹钟并在所设置的闹钟时间发出警报声, 通过按键可
以停止警报.
结论
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
该系统采纳单机片AT89C52作为核心芯片, 结合一些其他外围设备, 一起构成了一款能
够显示时间而且能够对其进行修改和设置按时闹钟的按时闹钟系统.
该系统采纳数码管显示屏, 能够清晰显示时间信息, 而且能够友好的引导用户进行时间
的修改以及闹钟的设置.可以通过各个寄存地址对时间进行读写把持, 即读取时间和修改时
间.利用蜂鸣器为用户提供闹铃功能, 能够在设按时间发出警报声提醒用户.采纳按键较少的
自力式键盘供人机交互, 把持简双方便.可以通过键盘修改时间, 也可以设置闹铃时间和修改
闹铃时间, 另外, 在闹铃时间与系统时间一致, 蜂鸣器鸣叫时, 可以通过按键中断警报声.总之,
该按时闹钟系统完成了市场上一般闹钟应有的功能, 能够显示时间和设置闹钟, 可以给用户
提供时间信息.
该设计也存在一些缺点, 就是实际生产时投入资金会比市场上一般闹钟价格昂贵, 如果
进行包装, 价格还会上升一些.另外, 外观不如市场销售的闹钟美观.
致谢
衷心感谢雷俊红老师的指导.
参考文献
[1] 李强, 51系列单片机应用软件编程技术[M].北京:北京航空航天年夜学出书社, .4:
134138.
[2] 薛慧芳.MCS51单机片串行口的一口多用[J].南京化工年夜学学报(自然科学版), 1998,
S1:8486.
[3] 王东锋, 王会良, 董冠强.单机片C语言应用100例[M].北京:电子工业出书社, .3:
218219, 148152.
[4] 楼然苗, 李光飞.单片机课程设计指导(第2版)[M].北京:北京航空航天年夜学出书
社, .1:285289.
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
附录:
系统电路图如下:
系统电路图
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
系统法式如下:
#include
sbit btnTime = P1^0;
sbit btnClock = P1^1;
sbit btnSwitch = P1^2;
sbit btnUp = P1^3;
sbit btnDown = P1^4;
sbit pin1 = P2^0;
sbit pin2 = P2^1;
sbit pin3 = P2^2;
sbit pin4 = P2^3;
sbit pin5 = P2^4;
sbit pin6 = P2^5;
sbit pinBuz = P2^6;
unsigned char timer = 0,c,min,hour,count = 0,s = 60,m = 60,h = 24,flag = 0;
unsigned char code numbers[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delayMs(unsigned int k){
unsigned int i,j;
for(i = k;i>0;i)
for(j = 110;j>0;j);
}
void timeChange(){
c++;
if(c == 60){
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
c = 0;
min++;
if(min == 60){
min = 0;
hour++;
if(hour == 24)
hour = 0;
}
}
}
void showTime(unsigned char zs,unsigned char zm, unsigned char zh){
pin1 = 1;
P0 = numbers[zh/10];
delayMs(5);
pin1 = 0;
pin2 = 1;
P0 = numbers[zh%10]&0x7f;
delayMs(5);
pin2 = 0;
pin3 = 1;
P0 = numbers[zm/10];
delayMs(5);
pin3 = 0;
pin4 = 1;
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
P0 = numbers[zm%10]&0x7f;
delayMs(5);
pin4 = 0;
pin5 = 1;
P0 = numbers[zs/10];
delayMs(5);
pin5 = 0;
pin6 = 1;
P0 = numbers[zs%10];
delayMs(5);
pin6 = 0;
}
void tTime(){
unsigned char st,mt,ht;
if(btnTime == 0){
delayMs(10);
if(btnTime == 0){
st = c,mt = min,ht = hour;
TR0 = 0;
while(btnTime == 0){
showTime(st,mt,ht);
if(btnSwitch == 0){
delayMs(10);
if(btnSwitch == 0){
创作时间:二零二一年六月三十日
while(!btnSwitch);
count++;
if(count == 3)
count = 0;
}
}
if(btnUp == 0){
delayMs(10);
if(btnUp == 0){
while(!btnUp);
switch(count){
ca 0:st++;if(st == 60)st = 0;break;
ca 1:mt++;if(mt == 60)mt = 0;break;
ca 2:ht++;if(ht == 24)ht = 0;break;
default:;
}
}
}
if(btnDown == 0){
delayMs(10);
if(btnDown == 0){
while(!btnDown);
switch(count){
ca 0:
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
if(st>0)
st;
el
st = 0;
break;
ca 1:
if(mt>0)
mt;
el
mt = 0;
break;
ca 2:
if(ht>0)
ht;
el
ht = 0;
break;
default : ;
}
}
}
}
TR0 = 1;
c = st,min = mt,hour = ht;
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
}
}
创作时间:二零二一年六月三十日
showTime(c,min,hour);
}
void tClock(){
if(btnClock == 0){
delayMs(50);
if(btnClock == 0){
if(flag == 0){
s = c;
m = min;
h = hour;
}
flag = 1;
while(btnClock == 0){
showTime(s,m,h);
if(btnSwitch == 0){
delayMs(10);
if(btnSwitch == 0){
while(!btnSwitch);
count++;
if(count == 3)
count = 0;
}
创作时间:二零二一年六月三十日
}
if(btnUp == 0){
delayMs(10);
if(btnUp == 0){
while(!btnUp);
switch(count){
ca 0:
s++;
if(s == 60)
s = 0;
break;
ca 1:
m++;
if(m == 60)
m = 0;
break;
ca 2:
h++;
if(h == 24)
h = 0;
break;
default:;
}
}
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
}
if(btnDown == 0){
delayMs(10);
if(btnDown == 0){
while(!btnDown);
switch(count){
ca 0:
if(s>0)
s;
el
s = 0;
break;
ca 1:
if(m>0)
m;
el
m = 0;
break;
ca 2:
if(h>0)
h;
el
h = 0;
break;
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
default:;
}
}
}
}
}
}
}
创作时间:二零二一年六月三十日
void buzzer(){
if((hour == h)&&(min == m)&&(c == s)){
int i;
for(i = 1;i<30;i++){
if(btnSwitch == 0){
delayMs(20);
if(btnSwitch == 0){
break;
}
}
pinBuz = 1;
delayMs(450);
showTime(c,min,hour);
pinBuz = 0;
delayMs(300);
showTime(c,min,hour);
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
}
flag = 0;
}
}
void init(){
TMOD = 0x01;
TH0 = (6553645872)/256;
TL0 = (6553645872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
pinBuz = 0;
}
void main(){
init();
while(1){
tTime();
tClock();
buzzer();
}
}
void T0_ms() interrupt 1{
TH0 = (6553645872)/256;
TL0 = (6553645872)%256;
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
timer++;
if(timer == 20){
timer = 0;
timeChange();
}
}
创作时间:二零二一年六月三十日
创作时间:二零二一年六月三十日
本文发布于:2023-05-27 14:26:04,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1685168765181167.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:定时闹钟设计 课程设计报告.doc
本文 PDF 下载地址:定时闹钟设计 课程设计报告.pdf
留言与评论(共有 0 条评论) |