1、重庆三峡学院基于单片机作息时间控制器系统设计学院(系): 电子与信息工程学院 年级专业: 级电信(仪器仪表) 学 号: 学生姓名: 文 静 指引教师: 谢 辉 教师职称: 教 授 成 绩: 制作日期 年 10 月 29 日目录摘要1核心词1第一章引 言21.1 课题背景21.1.1 选题背景2第二章 设计方案论证22.1 设计规定22.2 设计方案选取32.2.1 方案一:数字电路设计作息时间控制器系统32.2.2 方案二:基于单片机作息时间控制器系统设计32.2.3 方案拟定32.3 基本方案42.3.1 设计课题简要概述42.3.2 系统软硬件划分42.3.3 单片机选型42.4 总体设计
2、框图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 系统定期中断流程图12第五章 系统程序设计135.1 程序设计概要135.2 源程序清单13第六章 作息时间器硬件原理图60第七章
3、 实训总结61参照文献62附录63附录1 原理电路图63附录2元件清单64附录3 实物图64基于单片机作息时间控制器系统设计重庆三峡学院电子与信息工程学院 文 静摘要基于单片机作息时间器系统,是以一片8位单片机为核心实时时钟及控制系统。咱们懂得单片机外接石英晶体振荡器能提供稳定、精确基准频率,并经12分频后向内部定期器提供实时基准频率信号,设定定期器工作在中断方式下,持续对此频率信号进行分频计数,便可得秒信号,再对秒信号进行计数便可得到分、时等实时时钟信息。如果石英晶体振荡器频率信号为6MHZ,设定定期器定期工作方式1下,定期器为3CBOH,则定期器每100ms产生1次中断,在定期器中断定期解
4、决程序中,每10次中断,则向秒计数器加1,秒计数器计数到60则向分计数器进位(并建立分进位标志),分计数器计数到60,则向时计数器进位,如此周而复始持续计数,便可获得时、分、秒信号,建立一种实时时钟。接下来便可以进行定期解决和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间(小时与分、存储在RAM中)与信息时间表上作息时间(小时与分,存储在ROM)与否相似,如有相似者,则进行报时解决并控制打铃,如有不相似则返回主程序,如此便实现了报时控制规定。核心词单片机、时间设立电路、计时电路、显示电路、定期打铃控制电路第一章 引 言1.1 课题背景1.1.1 选题背景随着科技不断发展,各种芯片都
5、得到了较好发展,80C51 同样如此,从开始无人问津到当前随处可见,红绿灯,记分牌,电子秒表,遥控器,电饭煲,电视等只要是电子产品,都会和芯片关于,其实芯片并不是什么神秘高科技,它只是里面装了某些己编好程序而己而这里要简介是用汇编语言来编程一种系统,它可以让一种学校或公司集团实现打铃自动化,总之,一种需要时间系统机构实现自动提示功能。当今时代是一种新技术层出不穷时代,在电子领域特别是自动化智能控制领域,老式分立元件或数字逻辑电路构成控制系统,正此前所未有速度被单片机智能控制系统所取代。单片机具备体积小、功能强、成本低、应用面广等长处,可以说,智能控制与自动控制核心就是单片机。当前,一种学习与应
6、用单片机高潮正在工厂、学校及企事业单位大规模地兴起。而本文是用STC89C52单片机设计一种自动打铃系统。第二章 设计方案论证2.1 设计规定它可以作为时钟电路来显示时间,进行设立,定期打铃。按照自顶向下设计办法划分自动打铃系统功能。可分为:时间设立电路,计时电路,显示电路和定期打铃控制电路等。以江苏信息职业技术学院打铃状况设计内容时间起床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
7、:50晚自习19:00-20:30熄灯22:302.2 设计方案选取2.2.1 方案一:数字电路设计作息时间控制器系统运用函数信号发生器来进行脉冲信号输出,运用74160N来设立十进制和六进制进位输出。运用数码显示屏来显示时间,运用或门、与门、非门、与非门、等电路元件进行组合实现打铃控制。2.2.2 方案二:基于单片机作息时间控制器系统设计单片机内部存储器设三个字节分别存储时钟时、分、秒信息。运用定期器与软件结合实现1秒定期中断,没产生一次中断,存储器内相应秒值加1;若秒值达到60,则将其清零,并将相应分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零
8、。建立完一种实时时钟后接下来进行定期解决和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间与信息时间表上作息时间与否相似,相似者,则进行报时解决并控制打铃,不相似则返回主程序。2.2.3 方案拟定方案一设计只能事先设定打铃时间不能完全自动打铃,且在修改打铃时间上存在一定困难。而方案二中设计能完全实现自动化,诠释了咱们这次毕业设计主题。并在修改打铃时间上有了很大以便,只需修改一某些程序便能实现不同需要。因而我选取方案二进行设计。2.3 基本方案2.3.1 设计课题简要概述作息时间控制器系统装置用于工厂、学校等地时间控制,本设计是按照学校作息时问设定,模仿了电了钟显示时、分、秒。还依照学
9、校作息时间准时打铃,本系统有4 个按钮,分别用来调时、调分、秒和强制打铃及强制关铃,以保证始终与原则时间相吻合。一方面设计出本系统硬件基本框图,依照框图设计电气原理图,简要概述基本原理,按照设计技术参数设计出各某些程序。2.3.2 系统软硬件划分由于需要最小系统设计,因而,极大地介于系统硬件成本,所有能用软件实现功能都用软件完毕,如按键去抖,采用延时,显示某些用动态显示等,这样硬件某些设计可以采用单片机最小系统,所谓最小系统时仅有程序存储器和时钟及复位电路单片机系统。2.3.3 单片机选型依照课题详细内容,任务规定,计时、校时、定期、键盘显示等功能,经多方面考虑,所选系统选项用与MSC-51单
10、片机完全兼容STC89C52 低功耗单片机。2.4 总体设计框图图一 整体框图第三章 硬件电路设计3.1 基本原理概述本系统重要由主控模块,时钟模块,显示模块,键盘接口模块等4 某些构成。通过内部定期产生中断,从而使驱动电铃打铃。设定51 单片机工作在定期器工作方式1 ,每100ms产生一次中断,运用软件将基准100ms 单元进行累加,当定期器产生10 次中断就产生lS 信号,这是秒单元加1 。同理,对分单元和时单元计数从而产生秒,分,时值,通过六位七段显示屏进行显示。由于动态显示法需要数据所存等硬件,接口较复杂,考虑显示只有六位,且系统没有其她浮躁解决程序,所有采用动态扫描LED 显示,但为
11、了能更好区别,年月日,时分秒,在时间间隔中间加入间隔符号,因而采用8位数码管。本系统采用四个按键,当时钟时间和设立时间始终时,驱动程序动作,进行打铃,每次打铃30S3.2 重要原件参数及功能简介3.2.1 主控器STC89C52STC89C52 公司生产STC89C52 单片机用高性能静态89C51 设计,由先进工艺制造,并带有非易失性FLASH 程序存储器,它是 种高性能、低功耗8 位CMOS 微解决芯片,市场应用最多,重要特点有:有4K FLASH 程序存储器256 字节内部RAM电源控制模式:时钟可停止和恢复,空闲模式,掉电模式6个中断源4个中断优先级4个8位I/O口全双工增强型UART
12、2个16位定期、计数器图二 STC89C523.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 串行时钟Vcc
13、1,Vcc2 电源供电管脚DS1302 串行时钟芯片8 脚 DIPDS1302S 串行时钟芯片8 脚 SOIC 200milDS1302Z 串行时钟芯片8 脚 SOIC 150mil图三 DS13023.3 单元电路设计3.3.1显示电路设计显示某些采用普通STC89C52显示图四 显示电路显示某些采用2块4位数码管,即8位共阳数码显示,由STC89C52芯片对该数码管传送数据。而在P2口接入8个三极管对数码管位控进行控制。该显示采用是动态显示,段控和位控都通过反相器,显示字形代码是共阳显示代码,位控信号输出时是高电平有效,在校时时,采用是点亮小数点信位调节器标志,哪位小数点亮表达调节是该位值
14、。3.3.2 键盘接口电路设计由于键盘只有四个,采用独立式按钮,用查询法完毕读健功能。图五 按键电路 各键功能已写入程序,在使用按键时候,依照有无按键否,一一进行判断,软件中采用if嵌套模式,因而使各按键功能具备多样性和课重复使用性。因本次实训课题,为实现,年月日,时分秒等时间调试,系统使用5只按键,4 只按键用来调节时间,且其中一只在不设立时间状况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。通过选取键选取调节位,选中位闪烁,按增长键为选中位加1,按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打铃。3.3.3 响铃电路设计响铃电路用到了蜂鸣器、三极管、1K电阻。蜂
15、鸣器两端分别接地和三极管。三极管一段电源另一端与电阻相连并接入STC89C52P3.7接口。图六 响铃电路3.4 总体运营进程一方面实现24小时制电子钟,在8位数码管显示,显示为时分秒,实现格式为:23-59-59。到达预定期间启动蜂鸣器开始打铃,打铃方式分为起床、熄灯和上下课铃两种。系统使用5只按键,4 只按键用来调节时间,且其中一只在不设立时间状况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。通过选取键选取调节位,选中位闪烁,按增长键为选中位加1,按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打铃。第四章 软件电路设计及流程图4.1 基本原理概述主程序一方面是初
16、始化某些,重要是计时单元清零,中断初始化,堆栈指针初始化,启动定期器工作,然后是调用显示子程序。主程序起始存储地址是0000H单元,但由于本系统用了定期器T0中断,中断服务程序入口地址为000BH,因而从0000H单元起存储一条短调转指令AJMP,使真正主程序从0300H单元开始存储。4.1.1 中断服务程序设计单片机内部定期/计数器T0定期100ms,即0.1s,10次中断即为1秒,60秒为1分,60分为1小时,24小时为一天,如此循环,从而实现计时功能。编写中断服务程序核心要注意:1.现场保护,本系统中是累加器A和程序状态字PSW值保护。2.计时解决时采用确十进制,因而时,分,秒单元加1后
17、要进行十进制调节,即要执行DAA指令,还要注意是时计到24就回零,分和秒计到60就回零。3.中断返回前现场恢复。4.1.2 显示程序设计和按键判断与按键解决程序设计显示采用是动态显示,段控和位控都通过反相器,显示字形代码是共阳显示代码,位控信号输出时是高电平有效,在校时时,采用是点亮小数点信位调节器标志,哪位小数点亮表达调节是该位值。显示子程序第一某些是拆字,显示缓冲区是2FH2AH;第二某些是查字型码,输出段控和位控信号,由于采用是动态显示,因此每出输出一位段控和位控信号要延时一定期间,使LED显示屏显示字符时稳定。按键判断程序有编写时应注意按键去抖动,该系统采用是延时去抖动办法,延时是通过
18、调用子程序来实现,每个按键按下后都要等待释放后再返回。按键解决程序中按键式校时,因此进入按键解决程序后就关闭定期中断,对于动能键注意设立显示标志。4.2 流程图4.2.1 系统主程序流程图图7 主程序流程图4.2.2 系统定期中断流程图图8 中断流程图第五章 系统程序设计5.1 程序设计概要程序名称:基于单片机作息时间器系统设计阐明:实现24 小时制电子钟,8 位数码管显示,显示时分秒显示格式:23-59-59(小时十位如果为0 则不显示)。到预定期问启动蜂鸣器模仿打铃,蜂鸣器BEEP:P3.7。打铃方式分起床、熄幻铃和上、下课铃两种。系统使用5只按键,4 只按键用来调节时间,且其中一只在不设
19、立时间状况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。键SET_KFY:PI.0;通过选取键选取要调时间,选中位闪烁。可调节年月日,时分秒,周期和预设闹钟时间。键SET_KFY:PI.1;通过选取键选取调节位,选中位闪烁,且在1键选取到设立闹钟时间时可跳出预设闹钟时间。增长键ADD_KEY:PI.2;按一次使选中位加1。减少键DEC_KEY:PI.3;按一次使选中位位。1,且具备强制打铃效果5.2 源程序清单#include /调用单片机头文献#define uchar unsigned char /无符号字符型 宏定义变量范畴0255#define uint unsigned
20、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,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,
21、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; /用作闹钟用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;
22、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 fen3,shi3; /第3个打铃时间 早自习下 uchar fen4,shi4; /第4个打铃时间 第一节上课 uchar fen5,shi5; /第5个打铃时间 第一节下课 uchar fen6,shi6; /第6个打铃时间 第二节上课 uchar fen7,shi7; /第7个打铃时间 第二节下课 uch
23、ar fen8,shi8; /第8个打铃时间 第三节上课 uchar fen9,shi9; /第9个打铃时间 第三节下课 uchar fen10,shi10; /第10个打铃时间 第四节上课 uchar fen11,shi11; /第11个打铃时间 第四节下课 uchar fen12,shi12; /第12个打铃时间 第五节上课 uchar fen13,shi13; /第13个打铃时间 第五节下课uchar fen14,shi14; /第14个打铃时间 第六节上课uchar fen15,shi15; /第15个打铃时间 第六节下课uchar fen16,shi16; /第16个打铃时间 第七节
24、上课uchar fen17,shi17; /第17个打铃时间 第七节下课uchar fen18,shi18; /第18个打铃时间 第八节上课uchar fen19,shi19; /第19个打铃时间 第八节下课uchar fen20,shi20; /第20个打铃时间 晚自习上课uchar fen21,shi21; /第21个打铃时间 晚自习下课uchar fen22,shi22; /第22个打铃时间 熄灯uchar fen23,shi23; /第23个打铃时间 uchar fen24,shi24; /第24个打铃时间 uchar fen25,shi25; /第25个打铃时间 uchar fen2
25、6,shi26; /第26个打铃时间 #include ds1302.h/*把数据保存到单片机内部eeprom中*/void write_eeprom()SectorErase(0x);byte_write(0x,fen1); /第1个打铃时间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(
26、0x,fen5); /第5个打铃时间byte_write(0x,shi5);byte_write(0x,fen6); /第6个打铃时间byte_write(0x,shi6);byte_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(0x,
27、fen11); /第11个打铃时间byte_write(0x2021,shi11);byte_write(0x2022,fen12); /第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
28、,fen16); /第16个打铃时间byte_write(0x2031,shi16);byte_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
29、,fen21); /第21个打铃时间byte_write(0x2041,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
30、,fen26); /第26个打铃时间byte_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 = byt
31、e_read(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); /第10个打铃时间sh
32、i10 = byte_read(0x);fen11 = byte_read(0x); /第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_read(0x2028); /第15个打铃时间
33、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);fen20 = byte_read(0x2038);
34、 /第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 = byte_read(0x2047);fen25 = byte_rea
35、d(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_
36、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;/*延时函数*/void delay_uint(uint q)while(q-);/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for(i=0;i
37、q;i+)for(j=0;j120;j+);/*独立按键程序*/uchar key_can; /按键值void key() /独立按键程序static uchar key_new;key_can = 20; /按键值还原P3 |= 0x78; /相应按键IO口输出为1if(P3 & 0x78) != 0x78)/按键按下delay_1ms(1); /按键消抖动if(P3 & 0x78) != 0x78) & (key_new = 1)/确认是按键按下key_new = 0;switch(P3 & 0x78)case 0x8e: key_can = 1; break; /得到按键值case 0x68: key_can = 2; break; /得到