1、基于单片机的作息时间控制器系统设计94资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。重庆三峡学院基于单片机的作息时间控制器系统设计学院( 系) : 电子与信息工程学院 年级专业: 级电信( 仪器仪表) 学 号: 学生姓名: 文 静 指导教师: 谢 辉 教师职称: 教 授 成 绩: 制作日期 年 10 月 29 日目录摘要1关键词1第一章引 言21.1 课题背景21.1.1 选题背景2第二章 设计方案论证22.1 设计要求22.2 设计方案选择32.2.1 方案一: 数字电路设计的作息时间控制器系统32.2.2 方案二: 基于单片机的作息时间控制器系统设计32.2.3 方案确定32
2、.3 基本方案42.3.1 设计课题简要概述42.3.2 系统软硬件划分42.3.3 单片机选型42.4 总体设计框图4第三章 硬件电路设计53.1 基本原理概述53.2 主要原件参数及功能简介53.2.1 主控器STC89C5253.2.2 DS130263.3 单元电路的设计73.3.1显示电路设计73.3.2 键盘接口电路设计83.3.3 响铃电路设计83.4 总体运行进程9第四章 软件电路设计及流程图94.1 基本原理概述94.1.1 中断服务程序设计104.1.2 显示程序设计和按键判断与按键处理程序设计104.2 流程图114.2.1 系统主程序流程图114.2.2 系统定时中断流
3、程图12第五章 系统程序设计135.1 程序设计概要135.2 源程序清单13第六章 作息时间器硬件原理图60第七章 实训总结61参考文献62附录63附录1 原理电路图63附录2元件清单64附录3 实物图64基于单片机的作息时间控制器系统设计重庆三峡学院电子与信息工程学院 文 静摘要基于单片机的作息时间器系统, 是以一片8位单片机为核心的实时时钟及控制系统。我们知道单片机的外接石英晶体振荡器能提供稳定、 准确的基准频率, 并经12分频后向内部定时器提供实时基准频率信号, 设定定时器工作在中断方式下, 连续对此频率信号进行分频计数, 便可得秒信号, 再对秒信号进行计数便可得到分、 时等实时时钟信
4、息。如果石英晶体振荡器的频率信号为6MHZ, 设定定时器定时工作方式1下, 定时器为3CBOH, 则定时器每100ms产生1次中断, 在定时器的中断定时处理程序中, 每10次中断, 则向秒计数器加1, 秒计数器计数到60则向分计数器进位( 并建立分进位标志) , 分计数器计数到60, 则向时计数器进位, 如此周而复始的连续计数, 便可获得时、 分、 秒的信号, 建立一个实时时钟。接下来便能够进行定时处理和打铃输出, 当主程序检测到有分进位标志时, 便开始比较当前时间( 小时与分、 存放在RAM中) 与信息时间表上的作息时间( 小时与分, 存放在ROM) 是否相同, 如有相同者, 则进行报时处理
5、并控制打铃, 如有不相同则返回主程序, 如此便实现了报时控制的要求。关键词单片机、 时间设置电路、 计时电路、 显示电路、 定时打铃控制电路第一章 引 言1.1 课题背景1.1.1 选题背景随着科技的不断发展, 各种芯片都得到了很好的发展, 80C51 同样如此, 从开始的无人问津到现在的随处可见, 红绿灯, 记分牌, 电子秒表, 遥控器, 电饭煲, 电视等只要是电子产品, 都会和芯片有关, 其实芯片并不是什么神秘的高科技, 它只是里面装了一些己编好的程序而己而这里要介绍的是用汇编语言来编程的一个系统, 它能够让一个学校或企业集团实现打铃自动化, 总之, 一个需要时间系统的机构实现自动提醒功能
6、。当今时代是一个新技术层出不穷的时代, 在电子领域特别是自动化智能控制领域, 传统的分立元件或数字逻辑电路构成的控制系统, 正以前所未有的速度被单片机智能控制系统所取代。单片机具有体积小、 功能强、 成本低、 应用面广等优点, 能够说, 智能控制与自动控制的核心就是单片机。当前, 一个学习与应用单片机的高潮正在工厂、 学校及企事业单位大规模地兴起。而本文是用STC89C52单片机设计的一个自动打铃系统。第二章 设计方案论证2.1 设计要求它能够作为时钟电路来显示时间, 进行设置, 定时打铃。按照自顶向下设计方法划分自动打铃系统的功能。可分为: 时间设置电路, 计时电路, 显示电路和定时打铃控制
7、电路等。以江苏信息职业技术学院的打铃情况设计内容时间起床6:30早自习7:30-8:10第一节课8:20-9:00第二节课9:10-9:50第三节课10:00-10:40第四节课10:50-11:30第五节课13:30-14:10第六节课14:20-15:00第七节课15:20-16:00第八节课16:10-16:50晚自习19:00-20:30熄灯22:302.2 设计方案选择2.2.1 方案一: 数字电路设计的作息时间控制器系统利用函数信号发生器来进行脉冲信号输出, 利用74160N来设置十进制和六进制的进位输出。利用数码显示器来显示时间, 利用或门、 与门、 非门、 与非门、 等电路元件
8、进行组合实现打铃的控制。2.2.2 方案二: 基于单片机的作息时间控制器系统设计单片机内部存储器设三个字节分别存放时钟的时、 分、 秒信息。利用定时器与软件结合实现1秒定时中断, 没产生一次中断, 存储器内相应的秒值加1; 若秒值达到60, 则将其清零, 并将相应的分字节值加1; 若分值达到60, 则清零分字节, 并将时字节值加1; 若时值达到24, 则将时字节清零。建立完一个实时时钟后接下来进行定时处理和打铃输出, 当主程序检测到有分进位标志时, 便开始比较当前时间与信息时间表上的作息时间是否相同, 相同者, 则进行报时处理并控制打铃, 不相同则返回主程序。2.2.3 方案确定方案一的设计只
9、能事先设定打铃时间不能完全自动打铃, 且在修改打铃时间上存在一定的困难。而方案二中的设计能完全实现自动化, 诠释了我们这次毕业设计的主题。并在修改打铃时间上有了很大的方便, 只需修改一部分程序便能实现不同的需要。因此我选择方案二进行设计。2.3 基本方案2.3.1 设计课题简要概述作息时间控制器系统装置用于工厂、 学校等地的时间控制, 本设计是按照学校作息时问设定的, 模拟了电了钟显示时、 分、 秒。还根据学校的作息时间按时打铃, 本系统有4 个按钮, 分别用来调时、 调分、 秒和强制打铃及强制关铃, 以保证始终与标准时间相吻合。首先设计出本系统的硬件基本框图, 根据框图设计电气原理图, 简要
10、概述基本原理, 按照设计技术参数设计出各部分程序。2.3.2 系统软硬件划分由于需要最小系统设计, 因此, 极大地介于系统的硬件成本, 所有能用软件实现的功能都用软件完成, 如按键的去抖, 采用延时, 显示部分用动态显示等, 这样硬件部分的设计能够采用单片机最小系统, 所谓最小系统时仅有程序存储器和时钟及复位电路的单片机系统。2.3.3 单片机选型根据课题的具体内容, 任务要求, 计时、 校时、 定时、 键盘显示等功能, 经多方面考虑, 所选系统选项用与MSC-51单片机完全兼容的STC89C52 低功耗单片机。2.4 总体设计框图图一 整体框图第三章 硬件电路设计3.1 基本原理概述本系统主
11、要由主控模块, 时钟模块, 显示模块, 键盘接口模块等4 部分构成。经过内部定时产生中断, 从而使驱动电铃打铃。设定51 单片机工作在定时器工作方式1 , 每100ms产生一次中断, 利用软件将基准100ms 单元进行累加, 当定时器产生10 次中断就产生lS 信号, 这是秒单元加1 。同理, 对分单元和时单元计数从而产生秒, 分, 时的值, 经过六位七段显示器进行显示。由于动态显示法需要数据所存等硬件, 接口较复杂, 考虑显示只有六位, 且系统没有其它浮躁的处理程序, 所有采用动态扫描LED 的显示, 但为了能更好的区分, 年月日, 时分秒, 在时间间隔中间加入间隔符号, 因此采用8位数码管
12、。本系统采用四个按键, 当时钟时间和设置时间一直时, 驱动程序动作, 进行打铃, 每次打铃30S3.2 主要原件参数及功能简介3.2.1 主控器STC89C52STC89C52 公司生产的STC89C52 单片机用高性能的静态89C51 设计, 由先进工艺制造, 并带有非易失性FLASH 程序存储器, 它是 种高性能、 低功耗的8 位CMOS 微处理芯片, 市场应用最多, 主要特点有: 有4K 的FLASH 程序存储器256 字节内部RAM电源控制模式: 时钟可停止和恢复, 空闲模式, 掉电模式6个中断源4个中断优先级4个8位I/O口全双工增强型UART2个16位定时、 计数器图二 STC89
13、C523.2.2 DS13021) 性能特性DS1302与单片机之间能简单地采用同步串行的方式进行通信, 仅需用到三个口线: 1.RSE复位,2.I/O数据线, 3.SCLK 串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低, 保持数据和时钟信息时功率小十1mW 。提供秒分时日日期。月年的信息, 每月的天数和闰年的天数可自动调整时钟,操作可经过AM/PM 指示决定采用24 或12 小时格式。 2) 管脚描述XI XZ 32.768KHz 晶振管脚GND 接地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1, Vcc
14、2 电源供电管脚DS1302 串行时钟芯片8 脚 DIPDS1302S 串行时钟芯片8 脚 SOIC 200milDS1302Z 串行时钟芯片8 脚 SOIC 150mil图三 DS13023.3 单元电路的设计3.3.1显示电路设计显示部分采用普通的STC89C52显示图四 显示电路显示部分采用2块4位数码管, 即8位共阳数码显示, 由STC89C52芯片对该数码管传送数据。而在P2口接入8个三极管对数码管的位控进行控制。该显示采用的是动态显示, 段控和位控都经过反相器, 显示的字形代码是共阳的显示代码, 位控信号输出时是高电平有效, 在校时时, 采用的是点亮小数点信位调节器标志, 哪位小数
15、点亮表示调整的是该位的值。3.3.2 键盘接口电路设计由于键盘只有四个, 采用独立式按钮, 用查询法完成读健功能。图五 按键电路 各键功能已写入程序, 在使用按键的时候, 根据有无按键否, 一一进行判断, 软件中采用if嵌套模式, 因此使各按键的功能具有多样性和课重复使用性。因本次实训的课题, 为实现, 年月日, 时分秒等时间的调试, 系统使用5只按键, 4 只按键用来调整时间, 且其中一只在不设置时间的情况下可为强制打铃, 另一只单独连接, 可实行复位和强制结束打铃。经过选择键选择调整位, 选中位闪烁, 按增加键为选中位加1, 按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打
16、铃。3.3.3 响铃电路设计响铃电路用到了蜂鸣器、 三极管、 1K电阻。蜂鸣器两端分别接地和三极管。三极管一段电源另一端与电阻相连并接入STC89C52的P3.7接口。图六 响铃电路3.4 总体运行进程首先实现24小时制电子钟, 在8位数码管显示, 显示为时分秒, 实现的格式为: 23-59-59。到达预定时间启动蜂鸣器开始打铃, 打铃的方式分为起床、 熄灯和上下课铃两种。系统使用5只按键, 4 只按键用来调整时间, 且其中一只在不设置时间的情况下可为强制打铃, 另一只单独连接, 可实行复位和强制结束打铃。经过选择键选择调整位, 选中位闪烁, 按增加键为选中位加1, 按减少键为选中位减1。按强
17、制打铃按钮是实现强制打铃或者强制关闭打铃。第四章 软件电路设计及流程图4.1 基本原理概述主程序首先是初始化部分, 主要是计时单元清零, 中断初始化, 堆栈指针初始化, 启动定时器工作, 然后是调用显示子程序。主程序的起始存储地址是0000H单元, 但由于本系统用了定时器T0的中断, 中断服务程序入口地址为000BH, 因此从0000H单元起存放一条短调转指令AJMP, 使真正的主程序从0300H单元开始存放。4.1.1 中断服务程序设计单片机内部的定时/计数器T0定时100ms, 即0.1s, 10次中断即为1秒, 60秒为1分, 60分为1小时, 24小时为一天, 如此循环, 从而实现计时
18、功能。编写中断服务程序关键要注意: 1.现场保护, 本系统中是累加器A和程序状态字PSW值的保护。2.计时处理时采用的确十进制, 因此时, 分, 秒单元加1后要进行十进制调整, 即要执行DAA指令, 还要注意的是时计到24就回零, 分和秒计到60就回零。3.中断返回前的现场恢复。4.1.2 显示程序设计和按键判断与按键处理程序设计显示采用的是动态显示, 段控和位控都经过反相器, 显示的字形代码是共阳的显示代码, 位控信号输出时是高电平有效, 在校时时, 采用的是点亮小数点信位调节器标志, 哪位小数点亮表示调整的是该位的值。显示子程序的第一部分是拆字, 显示缓冲区是2FH2AH; 第二部分是查字
19、型码, 输出段控和位控信号, 由于采用的是动态显示, 因此每出输出一位的段控和位控信号要延时一定的时间, 使LED显示器显示的字符时稳定的。按键判断程序有编写时应注意按键的去抖动, 该系统采用的是延时去抖动的方法, 延时是经过调用子程序来实现的, 每个按键按下后都要等待释放后再返回。按键处理程序中的按键式校时的, 因此进入按键处理程序后就关闭定时中断, 对于动能键注意设置显示标志。4.2 流程图4.2.1 系统主程序流程图图7 主程序流程图4.2.2 系统定时中断流程图图8 中断流程图第五章 系统程序设计5.1 程序设计概要程序名称: 基于单片机的作息时间器系统设计说明: 实现24 小时制电子
20、钟, 8 位数码管显示, 显示时分秒显示格式: 23-59-59( 小时十位如果为0 则不显示) 。到预定时问启动蜂鸣器模拟打铃, 蜂鸣器BEEP: P3.7。打铃方式分起床、 熄幻铃和上、 下课铃两种。系统使用5只按键, 4 只按键用来调整时间, 且其中一只在不设置时间的情况下可为强制打铃, 另一只单独连接, 可实行复位和强制结束打铃。键SET_KFY: PI.0; 经过选择键选择要调的时间, 选中位闪烁。可调整年月日, 时分秒, 周期和预设闹钟时间。键SET_KFY:PI.1; 经过选择键选择调整位, 选中位闪烁, 且在1键选择到设置闹钟时间时可跳出预设闹钟时间。增加键ADD_KEY: P
21、I.2; 按一次使选中位加1。减少键DEC_KEY: PI.3; 按一次使选中位位。1, 且具有强制打铃效果5.2 源程序清单#include /调用单片机头文件#define uchar unsigned char /无符号字符型 宏定义变量范围0255#define uint unsigned int /无符号整型 宏定义变量范围065535#include eeprom52.h/数码管段选定义 0 1 2 3 4 5 6 7 8 9uchar code smg_du=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa,0x20,0x28, 0x30,0x25,
22、0xe4,0x23,0x64,0x74,0xff; /断码/数码管位选定义uchar code smg_we=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/数码管位选定义uchar dis_smg8 = 0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa;uchar smg_i = 8; /显示数码管的个位数bit flag_200ms ;bit flag_100ms ;bit flag_500ms; /500ms标志位sbit beep = P37; /蜂鸣器定义bit flag_beep_en;uint clock_value
23、; /用作闹钟用的uchar flag_s = 0x03;/控制数码管闪烁的变量uchar flag_nl; /农历 阳历显示标志位uchar menu_1,menu_2,menu_i;sbit dat0 = B0;sbit dat1 = B1;sbit dat2 = B2;sbit dat3 = B3;sbit dat4 = B4;sbit dat5 = B5;sbit dat6 = B6;sbit dat7 = B7;uchar daling_geshu=0;uchar fen1,shi1; /第1个打铃的时间 起床uchar fen2,shi2; /第2个打铃的时间 早自习uchar f
24、en3,shi3; /第3个打铃的时间 早自习下 uchar fen4,shi4; /第4个打铃的时间 第一节上课 uchar fen5,shi5; /第5个打铃的时间 第一节下课 uchar fen6,shi6; /第6个打铃的时间 第二节上课 uchar fen7,shi7; /第7个打铃的时间 第二节下课 uchar fen8,shi8; /第8个打铃的时间 第三节上课 uchar fen9,shi9; /第9个打铃的时间 第三节下课 uchar fen10,shi10; /第10个打铃的时间 第四节上课 uchar fen11,shi11; /第11个打铃的时间 第四节下课 uchar
25、 fen12,shi12; /第12个打铃的时间 第五节上课 uchar fen13,shi13; /第13个打铃的时间 第五节下课uchar fen14,shi14; /第14个打铃的时间 第六节上课uchar fen15,shi15; /第15个打铃的时间 第六节下课uchar fen16,shi16; /第16个打铃的时间 第七节上课uchar fen17,shi17; /第17个打铃的时间 第七节下课uchar fen18,shi18; /第18个打铃的时间 第八节上课uchar fen19,shi19; /第19个打铃的时间 第八节下课uchar fen20,shi20; /第20个
26、打铃的时间 晚自习上课uchar fen21,shi21; /第21个打铃的时间 晚自习下课uchar fen22,shi22; /第22个打铃的时间 熄灯uchar fen23,shi23; /第23个打铃的时间 uchar fen24,shi24; /第24个打铃的时间 uchar fen25,shi25; /第25个打铃的时间 uchar fen26,shi26; /第26个打铃的时间 #include ds1302.h/*把数据保存到单片机内部eeprom中*/void write_eeprom()SectorErase(0x );byte_write(0x , fen1); /第1个
27、打铃的时间byte_write(0x , shi1);byte_write(0x , fen2); /第2个打铃的时间byte_write(0x , shi2);byte_write(0x , fen3); /第3个打铃的时间byte_write(0x , shi3);byte_write(0x , fen4); /第4个打铃的时间byte_write(0x , shi4);byte_write(0x , fen5); /第5个打铃的时间byte_write(0x , shi5);byte_write(0x , fen6); /第6个打铃的时间byte_write(0x , shi6);byt
28、e_write(0x , fen7); /第7个打铃的时间byte_write(0x , shi7);byte_write(0x , fen8); /第8个打铃的时间byte_write(0x , shi8);byte_write(0x , fen9); /第9个打铃的时间byte_write(0x , shi9);byte_write(0x , fen10); /第10个打铃的时间byte_write(0x , shi10);byte_write(0x2020, fen11); /第11个打铃的时间byte_write(0x2021, shi11);byte_write(0x2022, fe
29、n12); /第12个打铃的时间byte_write(0x2023, shi12);byte_write(0x2024, fen13); /第13个打铃的时间byte_write(0x2025, shi13);byte_write(0x2026, fen14); /第14个打铃的时间byte_write(0x2027, shi14);byte_write(0x2028, fen15); /第15个打铃的时间byte_write(0x2029, shi15); byte_write(0x2030, fen16); /第16个打铃的时间byte_write(0x2031, shi16);byte_
30、write(0x2032, fen17); /第17个打铃的时间byte_write(0x2033, shi17);byte_write(0x2034, fen18); /第18个打铃的时间byte_write(0x2035, shi18);byte_write(0x2036, fen19); /第19个打铃的时间byte_write(0x2037, shi19);byte_write(0x2038, fen20); /第20个打铃的时间byte_write(0x2039, shi20);byte_write(0x2040, fen21); /第21个打铃的时间byte_write(0x204
31、1, shi21);byte_write(0x2042, fen22); /第22个打铃的时间byte_write(0x2043, shi22);byte_write(0x2044, fen23); /第23个打铃的时间byte_write(0x2045, shi23);byte_write(0x2046, fen24); /第24个打铃的时间byte_write(0x2047, shi24);byte_write(0x2048, fen25); /第25个打铃的时间byte_write(0x2049, shi25);byte_write(0x2050, fen26); /第26个打铃的时间b
32、yte_write(0x2051, shi26);byte_write(0x2058, a_a);/*把数据从单片机内部eeprom中读出来*/void read_eeprom()fen1 = byte_read(0x ); /第1个打铃的时间shi1 = byte_read(0x );fen2 = byte_read(0x ); /第2个打铃的时间shi2 = byte_read(0x );fen3 = byte_read(0x ); /第3个打铃的时间shi3 = byte_read(0x );fen4 = byte_read(0x ); /第4个打铃的时间shi4 = byte_read
33、(0x );fen5 = byte_read(0x ); /第5个打铃的时间shi5 = byte_read(0x );fen6 = byte_read(0x ); /第6个打铃的时间shi6 = byte_read(0x );fen7 = byte_read(0x ); /第7个打铃的时间shi7 = byte_read(0x );fen8 = byte_read(0x ); /第8个打铃的时间shi8 = byte_read(0x );fen9 = byte_read(0x ); /第9个打铃的时间shi9 = byte_read(0x );fen10 = byte_read(0x );
34、/第10个打铃的时间shi10 = byte_read(0x );fen11 = byte_read(0x2020); /第11个打铃的时间shi11 = byte_read(0x2021);fen12 = byte_read(0x2022); /第12个打铃的时间shi12 = byte_read(0x2023);fen13 = byte_read(0x2024); /第13个打铃的时间shi13 = byte_read(0x2025);fen14 = byte_read(0x2026); /第14个打铃的时间shi14 = byte_read(0x2027);fen15 = byte_re
35、ad(0x2028); /第15个打铃的时间shi15 = byte_read(0x2029);fen16 = byte_read(0x2030); /第16个打铃的时间shi16 = byte_read(0x2031);fen17 = byte_read(0x2032); /第17个打铃的时间shi17 = byte_read(0x2033);fen18 = byte_read(0x2034); /第18个打铃的时间shi18 = byte_read(0x2035);fen19 = byte_read(0x2036); /第19个打铃的时间shi19 = byte_read(0x2037);
36、fen20 = byte_read(0x2038); /第20个打铃的时间shi20 = byte_read(0x2039);fen21 = byte_read(0x2040); /第21个打铃的时间shi21 = byte_read(0x2041);fen22 = byte_read(0x2042); /第22个打铃的时间shi22 = byte_read(0x2043);fen23 = byte_read(0x2044); /第23个打铃的时间shi23 = byte_read(0x2045);fen24 = byte_read(0x2046); /第24个打铃的时间shi24 = byt
37、e_read(0x2047);fen25 = byte_read(0x2048); /第25个打铃的时间shi25 = byte_read(0x2049);fen26 = byte_read(0x2050); /第26个打铃的时间shi26 = byte_read(0x2051);a_a = byte_read(0x2058);/*开机自检eeprom初始化*/void init_eeprom()read_eeprom();/先读if(a_a != 25)/新的单片机初始单片机内问eeproma_a = 25;write_eeprom(); /保存数据/控制数码管闪烁的函数void smg_s(uchar dat)B = dat;if(dat0 = 1)dis_smg0 = 0xff;if(dat1 = 1)dis_smg1 = 0xff;if(dat2 = 1)dis_smg2 = 0xff;if(dat3 = 1)dis_smg3 = 0xff;if(dat4 = 1)dis_smg4 = 0xff;if(dat5 = 1)dis_smg5 = 0xff;if(dat6 = 1)dis_smg6 = 0xff;if(dat7 = 1)dis_smg7 = 0xff;/*延时函数*