1、基于单片机的智能电子钟系统设计姓 名:李永健、王海、吕军梅、巩珍珍 课题组的分工或贡献:每人完成的百分比或者每人负责的内容课 程 名 称: MCS-51 单片机应用设计指 导 教 师:李林2014 年 12 月基于单片机的智能电子钟系统设计李永健、王海、吕军梅、巩珍珍(信息科学与工程学院)摘要:电子钟是一种利用数字电路来显示时间的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。 本设计通过以单片机芯片 STC89C51 为核心,通过软件编程完成时钟及定时的基本功能,温度芯片 DS18B20 完成温度测量功能。采用了六位数码管动态显示时、分、秒,
2、两个 LED 灯分别指示上下午,同时还有两个 LED 灯每半秒分别闪烁一次。通过 4 个外部按键可以控制小时和分钟的定时和定闹以及报警。此电子钟具有性能优越,操作简单等优点。关键词:智能电子钟、STC89C51、LED 数码管、DS18B20目录1、项目目的2、项目要求3、基本原理4、设计方案(一)系统整体设计思想(二 ) 电子钟计时(三 ) 数码管显示(四 ) 调时(五 ) 定闹、报警(六 ) 温度采集五、结论六、参考文献七、附录一附录二1、项目目的1. 掌握单片机各个功能模块(并行 I/O 口、中断系统、定时器/计数器)的工作原理、性能和特点;2、掌握单片机外围电路的设计方法和仿真方法;3
3、、掌握单片机外围电路的调试方法;4、掌握单片机外围电路设计报告的撰写方法;5、培养团队合作精神、项目组织与管理、交流表达能力;6、培养责任感和职业道德。二、项目要求本课程三级项目要求学生使用 MCS-51 系列单片机设计并制作一个具有时间显示、按键调时、闹钟报警、温度测量、遥控和自动调时等功能的软硬件系统,可实现六项基本功能分别如下:1) 时间显示:采用六个数码管显示当前时间:小时、分钟、秒。2) 温度显示:采用两个数码管显示当前环境温度。3) 上下午指示:采用两个发光二极管来指示上下午。4) 半秒提示:采用两个发光二极管,每隔半秒闪烁。5) 调时功能:采用三个按键(K1-K3)来调整时间,步
4、骤如下:a)按下 K1 键,开始调小时,同时 2 个小时数码管闪烁。b)按下 K2 键,小时加;按下 K3 键,小时减。c)小时调整好后,再按下 K1 键,开始调分钟,同时分钟数码管闪烁。d)按下 K2 键,分钟加;按下 K3 键,分钟减。e)调整好分钟后,再按下 K1 键,调时结束。6) 闹钟功能:采用三个按键(K2-K4)来调整闹钟,步骤如下:a)按下 K4 键,开始调小时,同时 2 个小时数码管闪烁。b)按下 K2 键,小时加;按下 K3 键,小时减。c)小时调整好后,再按下 K4 键,开始调分钟,同时分钟数码管闪烁。d)按下 K2 键,分钟加;按下 K3 键,分钟减。e)调整好分钟后,
5、再按下 K4 键,定闹结束。闹钟定时的时间到后,蜂鸣器/扬声器发出提示音;用户需按 K2-k4 键来取消闹钟警告。3、基本原理利用软件编程借助于定时器/计数器 0 实现间隔为 1s 的定时功能,格式为秒,分,时,在其中断服务程序中实现对小时、分钟、秒单元数值的调整。主程序通过不断循环调用调时子程序,实现整个功能。利用嵌套在调时子程序中的显示子程序实现上下午指示和半秒闪烁。利用温度芯片 DS18B20 来测量温度。4、设计方案(一)系统整体设计思想总体设计框图:电源STC89C52单片机DS18B20温度芯片LED 灯指示(上下午、半秒)8 片数码管显示按键(k1k4)报警通过定时器/计数器 0
6、 实现 1s 的计时,将它设计成内部中断,即每计满 1s产生中断信号,主程序转去执行定时器 0 的中断服务程序,按照时间规则改变相应 RAM 存储单元的数值。在主程序里首先不断检测是否有按键按下,如果没有,则不断调用显示子程序,否则,根据按下的是哪个键可以转去执行相应的程序段,分别实现小时和分钟的加和减以及闹钟定时,而每次执行结束都会调用显示子程序,保证数码管的稳定显示,同时也可以实时根据存储单元数值的不同显示。而闹钟的倒计时则利用定时器/计数器 1 的计时来实现,同样为 1s 计时,只不过是在中断服务程序中实现对存储单元的按规则递减,同样的即使显示就可以实现倒计时功能,到达 00:00:00
7、 时就可以调用报警子程序,实现报警。(1)RAM 单元分配(21H).0 指示即将显示的是十位还是个位20H #0AH,定时器/计数器 0 或 1 计满 10 次为 1s19H #05H,定时器/计数器 0 或 1 计满 5 次为 0.5s18H #05H,显示子程序内部执行次数29H #01010101B30H 小时的 BCD 码31H 分钟的 BCD 码32H 秒的 BCD 码TH0 #3CH,T0 计数初值,可计时 100msTL0 #0B0HTH1 #3CH,T1 计数初值,可计时 100msTL1 #0B0H(2) 循环执行部分:HERE: LCALL ADJUSTAJMP HERE
8、 ;反复调用ADJUST 程序可以实现所有功能(3)主程序的初始化部分: MAIN: SETB P3.0 CLRP3.1 MOVTMOD,#01H ;设 T0 方式 1,定时 CLRA ;A 清零 MOV30H, A ;“时”单元清零 MOV31H, A ;“分”单元清零 MOV32H, A ;“秒”单元清零 SETB ET0 ;允许中断 SETB ET1SETB EA ;CPU 开中断MOVTH0, #3CH ;给 T0 装入计数初值,可计时 100msMOVTL0, #0B0H ;MOVTH1, #3CH ;给 T1 装入计数初值MOVTL1, #0B0HSETB TR0 ;启动计数(二)
9、时间显示模块(1)物理连接P0.0P0.7 接数码管的 adp(片选码)P2.0P2.5 接数码管的 16(段选码)时间显示:采用六个数码管显示两位的小时,分钟,秒(2) 流程图:(3)动态显示的核心在于依次选中一块数码管,并在此之前将相应数码管要显示的数字的段码送到端口,进行相应的延时后关闭数码管选通信号。不断执行上述过程就可以实现较为稳定的动态显示。每次进入主程序都首先判断是否到了 1s,到了则继续执行,否则,返回中断。为了在显示完秒之后还能继续显示小时的十位,必须有一个用来计数的单元,用以区分当前显示的是小时还是分钟,还是秒,并以此作为仅次于显示次数 N 的循环。对每一个单元(30H32
10、H)的两位 BCD 码的显示,用一位(21H).0 来指示即将显示的是十位还是各位,据此控制刚才所说的单元指示数值是否用该加一或者重新初始化。由此在 DISPLAY 子程序中有 3 重循环。调用入口参数为 30H32H 单元的数值。(4)半秒提示:采用两个发光二极管,每隔半秒闪烁。中断 5 次就是半秒,并在相应的分支里设置 P3.6 和 P3.7,保证二者同时取反即可。这可以放在显示子程序内部,保证时间显示和半秒闪烁的同步,同时可以节约计数器。(5)上下午指示:采用两个发光二极管来指示上下午。只要判断 30H 单元的内容与 11H 相比较就可以知道是上午还是下午了,在分支语句里控制相应的灯亮了
11、就行。如上所述,将它放置在显示子程序里较为方便。时间显示模块的仿真结果(3)按键模块ADJUST 的主体部分就是检测是否有按键按下,如果没有只是调用显示子程序,而有的话转去执行相应的分支语句。为了防止干扰,我们便写了一个延时 5ms 左右的子程序,若是经过延时后,按键信号依然有效,则认定是有效信号,否则为干扰,返回程序起始点重新检测。K1 可以控制实现定时,所以定时器计数器依然是 0 在起作用,在其分支语句里根据按键次数使指针指向不同的单元(小时、分钟),然后检测K2K3 的信号到来。在 K2K3 的分支语句里实现指针所指向单元的加一或者减一,但是注意要按照时间规则来,对加一或者减一结果进行调整,否则可能出错。对单元的加一或者减一直接反映到显示子程序和定时器计数器0 或者 1 的 16 位计数单元里,所以,每次更改后的值就相当于对时间确定调节,并从该处继续计时,这样就实现了调时功能。时分秒上午半秒提示