• 1.41 MB
  • 2022-04-22 13:43:02 发布

基于单片机的作息时间控制器系统设计.doc

  • 65页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'基于单片机的作息时间控制器系统设计摘要基于单片机的作息时间器系统,是以一片8位单片机为核心的实时时钟及控制系统。我们知道单片机的外接石英晶体振荡器能提供稳定、准确的基准频率,并经12分频后向内部定时器提供实时基准频率信号,设定定时器工作在中断方式下,连续对此频率信号进行分频计数,便可得秒信号,再对秒信号进行计数便可得到分、时等实时时钟信息。如果石英晶体振荡器的频率信号为6MHZ,设定定时器定时工作方式1下,定时器为3CBOH,则定时器每100ms产生1次中断,在定时器的中断定时处理程序中,每10次中断,则向秒计数器加1,秒计数器计数到60则向分计数器进位(并建立分进位标志),分计数器计数到60,则向时计数器进位,如此周而复始的连续计数,便可获得时、分、秒的信号,建立一个实时时钟。接下来便可以进行定时处理和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间(小时与分、存放在RAM中)与信息时间表上的作息时间(小时与分,存放在ROM)是否相同,如有相同者,则进行报时处理并控制打铃,如有不相同则返回主程序,如此便实现了报时控制的要求。关键词单片机、时间设置电路、计时电路、显示电路、定时打铃控制电路 第一章引言1.1课题背景1.1.1选题背景随着科技的不断发展,各种芯片都得到了很好的发展,80C51同样如此,从开始的无人问津到现在的随处可见,红绿灯,记分牌,电子秒表,遥控器,电饭煲,电视等只要是电子产品,都会和芯片有关,其实芯片并不是什么神秘的高科技,它只是里面装了一些己编好的程序而己.而这里要介绍的是用汇编语言来编程的一个系统,它能够让一个学校或企业集团实现打铃自动化,总之,一个需要时间系统的机构实现自动提醒功能。当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未有的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。而本文是用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:50晚自习19:00-20:30熄灯22:302.2设计方案选择2.2.1方案一:数字电路设计的作息时间控制器系统利用函数信号发生器来进行脉冲信号输出,利用74160N来设置十进制和六进制的进位输出。利用数码显示器来显示时间,利用或门、与门、非门、与非门、等电路元件进行组合实现打铃的控制。2.2.2方案二:基于单片机的作息时间控制器系统设计单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,没产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。建立完一个实时时钟后接下来进行定时处理和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间与信息时间表上的作息时间是否相同,相同者,则进行报时处理并控制打铃,不相同则返回主程序。2.2.3方案确定方案一的设计只能事先设定打铃时间不能完全自动打铃,且在修改打铃时间上存在一定的困难。而方案二中的设计能完全实现自动化,诠释了我们这次毕业设计的主题。并在修改打铃时间上有了很大的方便,只需修改一部分程序便能实现不同的需要。因此我选择方案二进行设计。 2.3基本方案2.3.1设计课题简要概述作息时间控制器系统装置用于工厂、学校等地的时间控制,本设计是按照学校作息时问设定的,模拟了电了钟显示时、分、秒。还根据学校的作息时间按时打铃,本系统有4个按钮,分别用来调时、调分、秒和强制打铃及强制关铃,以保证始终与标准时间相吻合。首先设计出本系统的硬件基本框图,根据框图设计电气原理图,简要概述基本原理,按照设计技术参数设计出各部分程序。2.3.2系统软硬件划分由于需要最小系统设计,因此,极大地介于系统的硬件成本,所有能用软件实现的功能都用软件完成,如按键的去抖,采用延时,显示部分用动态显示等,这样硬件部分的设计可以采用单片机最小系统,所谓最小系统时仅有程序存储器和时钟及复位电路的单片机系统。2.3.3单片机选型根据课题的具体内容,任务要求,计时、校时、定时、键盘显示等功能,经多方面考虑,所选系统选项用.与MSC-51单片机完全兼容的STC89C52低功耗单片机。2.4总体设计框图图一整体框图 第三章硬件电路设计3.1基本原理概述本系统主要由主控模块,时钟模块,显示模块,键盘接口模块等4部分构成。通过内部定时产生中断,从而使驱动电铃打铃。设定51单片机工作在定时器工作方式1,每100ms产生一次中断,利用软件将基准100ms单元进行累加,当定时器产生10次中断就产生lS信号,这是秒单元加1。同理,对分单元和时单元计数从而产生秒,分,时的值,通过六位七段显示器进行显示。由于动态显示法需要数据所存等硬件,接口较复杂,考虑显示只有六位,且系统没有其他浮躁的处理程序,所有采用动态扫描LED的显示,但为了能更好的区分,年月日,时分秒,在时间间隔中间加入间隔符号,因此采用8位数码管。本系统采用四个按键,当时钟时间和设置时间一直时,驱动程序动作,进行打铃,每次打铃30S3.2主要原件参数及功能简介3.2.1主控器STC89C52STC89C52公司生产的STC89C52单片机用高性能的静态89C51设计,由先进工艺制造,并带有非易失性FLASH程序存储器,它是·种高性能、低功耗的8位CMOS微处理芯片,市场应用最多,主要特点有:有4K的FLASH程序存储器256字节内部RAM电源控制模式:时钟可停止和恢复,空闲模式,掉电模式6个中断源4个中断优先级4个8位I/O口全双工增强型UART2个16位定时、计数器 图二STC89C523.2.2DS13021)性能特性DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:1.RSE复位,2.I/O数据线,3.SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小十1mW。提供秒分时日日期。月年的信息,每月的天数和闰年的天数可自动调整时钟,操作可通过AM/PM指示决定采用24或12小时格式。2)管脚描述XIXZ32.768KHz晶振管脚GND接地RST复位脚I/O数据输入/输出引脚 SCLK串行时钟Vcc1,Vcc2电源供电管脚DS1302串行时钟芯片8脚DIPDS1302S串行时钟芯片8脚SOIC200milDS1302Z串行时钟芯片8脚SOIC150mil图三DS13023.3单元电路的设计3.3.1显示电路设计显示部分采用普通的STC89C52显示图四显示电路 显示部分采用2块4位数码管,即8位共阳数码显示,由STC89C52芯片对该数码管传送数据。而在P2口接入8个三极管对数码管的位控进行控制。该显示采用的是动态显示,段控和位控都经过反相器,显示的字形代码是共阳的显示代码,位控信号输出时是高电平有效,在校时时,采用的是点亮小数点信位调节器标志,哪位小数点亮表示调整的是该位的值。3.3.2键盘接口电路设计由于键盘只有四个,采用独立式按钮,用查询法完成读健功能。图五按键电路各键功能已写入程序,在使用按键的时候,根据有无按键否,一一进行判断,软件中采用if嵌套模式,因此使各按键的功能具有多样性和课重复使用性。因本次实训的课题,为实现,年月日,时分秒等时间的调试,系统使用5只按键,4只按键用来调整时间,且其中一只在不设置时间的情况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。通过选择键选择调整位,选中位闪烁,按增加键为选中位加1,按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打铃。3.3.3响铃电路设计响铃电路用到了蜂鸣器、三极管、1K电阻。蜂鸣器两端分别接地和三极管。三极管一段电源另一端与电阻相连并接入STC89C52的P3.7接口。 图六响铃电路3.4总体运行进程首先实现24小时制电子钟,在8位数码管显示,显示为时分秒,实现的格式为:23-59-59。到达预定时间启动蜂鸣器开始打铃,打铃的方式分为起床、熄灯和上下课铃两种。系统使用5只按键,4只按键用来调整时间,且其中一只在不设置时间的情况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。通过选择键选择调整位,选中位闪烁,按增加键为选中位加1,按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打铃。第四章软件电路设计及流程图4.1基本原理概述 主程序首先是初始化部分,主要是计时单元清零,中断初始化,堆栈指针初始化,启动定时器工作,然后是调用显示子程序。主程序的起始存储地址是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后要进行十进制调整,即要执行DAA指令,还要注意的是时计到24就回零,分和秒计到60就回零。3.中断返回前的现场恢复。4.1.2显示程序设计和按键判断与按键处理程序设计显示采用的是动态显示,段控和位控都经过反相器,显示的字形代码是共阳的显示代码,位控信号输出时是高电平有效,在校时时,采用的是点亮小数点信位调节器标志,哪位小数点亮表示调整的是该位的值。显示子程序的第一部分是拆字,显示缓冲区是2FH—2AH;第二部分是查字型码,输出段控和位控信号,由于采用的是动态显示,所以每出输出一位的段控和位控信号要延时一定的时间,使LED显示器显示的字符时稳定的。按键判断程序有编写时应注意按键的去抖动,该系统采用的是延时去抖动的方法,延时是通过调用子程序来实现的,每个按键按下后都要等待释放后再返回。按键处理程序中的按键式校时的,所以进入按键处理程序后就关闭定时中断,对于动能键注意设置显示标志。 4.2流程图4.2.1系统主程序流程图图7主程序流程图 4.2.2系统定时中断流程图图8中断流程图 第五章系统程序设计5.1程序设计概要程序名称:基于单片机的作息时间器系统设计说明:实现24小时制电子钟,8位数码管显示,显示时分秒显示格式:23-59-59(小时十位如果为0则不显示)。到预定时问启动蜂鸣器模拟打铃,蜂鸣器BEEP:P3.7。打铃方式分起床、熄幻铃和上、下课铃两种。系统使用5只按键,4只按键用来调整时间,且其中一只在不设置时间的情况下可为强制打铃,另一只单独连接,可实行复位和强制结束打铃。键SET_KFY:PI.0;通过选择键选择要调的时间,选中位闪烁。可调整年月日,时分秒,周期和预设闹钟时间。键SET_KFY:PI.1;通过选择键选择调整位,选中位闪烁,且在1键选择到设置闹钟时间时可跳出预设闹钟时间。增加键ADD_KEY:PI.2;按一次使选中位加1。减少键DEC_KEY:PI.3;按一次使选中位位。1,且具有强制打铃效果5.2源程序清单#include//调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义变量范围0~255#defineuintunsignedint//无符号整型宏定义变量范围0~65535#include"eeprom52.h"//数码管段选定义0123456789 ucharcodesmg_du[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa,0x20,0x28,0x30,0x25,0xe4,0x23,0x64,0x74,0xff};//断码//数码管位选定义ucharcodesmg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选定义uchardis_smg[8]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa};ucharsmg_i=8;//显示数码管的个位数bitflag_200ms;bitflag_100ms;bitflag_500ms;//500ms标志位sbitbeep=P3^7;//蜂鸣器定义bitflag_beep_en;uintclock_value;//用作闹钟用的ucharflag_s=0x03;//控制数码管闪烁的变量ucharflag_nl;//农历阳历显示标志位ucharmenu_1,menu_2,menu_i;sbitdat0=B^0;sbitdat1=B^1; sbitdat2=B^2;sbitdat3=B^3;sbitdat4=B^4;sbitdat5=B^5;sbitdat6=B^6;sbitdat7=B^7;uchardaling_geshu=0;ucharfen1,shi1;//第1个打铃的时间起床ucharfen2,shi2;//第2个打铃的时间早自习ucharfen3,shi3;//第3个打铃的时间早自习下ucharfen4,shi4;//第4个打铃的时间第一节上课ucharfen5,shi5;//第5个打铃的时间第一节下课ucharfen6,shi6;//第6个打铃的时间第二节上课ucharfen7,shi7;//第7个打铃的时间第二节下课ucharfen8,shi8;//第8个打铃的时间第三节上课ucharfen9,shi9;//第9个打铃的时间第三节下课ucharfen10,shi10;//第10个打铃的时间第四节上课ucharfen11,shi11;//第11个打铃的时间第四节下课ucharfen12,shi12;//第12个打铃的时间第五节上课ucharfen13,shi13;//第13个打铃的时间第五节下课ucharfen14,shi14;//第14个打铃的时间第六节上课ucharfen15,shi15;//第15个打铃的时间第六节下课ucharfen16,shi16;//第16个打铃的时间第七节上课 ucharfen17,shi17;//第17个打铃的时间第七节下课ucharfen18,shi18;//第18个打铃的时间第八节上课ucharfen19,shi19;//第19个打铃的时间第八节下课ucharfen20,shi20;//第20个打铃的时间晚自习上课ucharfen21,shi21;//第21个打铃的时间晚自习下课ucharfen22,shi22;//第22个打铃的时间熄灯ucharfen23,shi23;//第23个打铃的时间ucharfen24,shi24;//第24个打铃的时间ucharfen25,shi25;//第25个打铃的时间ucharfen26,shi26;//第26个打铃的时间#include"ds1302.h"/******************把数据保存到单片机内部eeprom中******************/voidwrite_eeprom(){SectorErase(0x2000);byte_write(0x2000,fen1);//第1个打铃的时间byte_write(0x2001,shi1);byte_write(0x2002,fen2);//第2个打铃的时间byte_write(0x2003,shi2);byte_write(0x2004,fen3);//第3个打铃的时间byte_write(0x2005,shi3);byte_write(0x2006,fen4);//第4个打铃的时间byte_write(0x2007,shi4); byte_write(0x2008,fen5);//第5个打铃的时间byte_write(0x2009,shi5);byte_write(0x2010,fen6);//第6个打铃的时间byte_write(0x2011,shi6);byte_write(0x2012,fen7);//第7个打铃的时间byte_write(0x2013,shi7);byte_write(0x2014,fen8);//第8个打铃的时间byte_write(0x2015,shi8);byte_write(0x2016,fen9);//第9个打铃的时间byte_write(0x2017,shi9);byte_write(0x2018,fen10);//第10个打铃的时间byte_write(0x2019,shi10);byte_write(0x2020,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,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,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,fen26);//第26个打铃的时间byte_write(0x2051,shi26);byte_write(0x2058,a_a);}/******************把数据从单片机内部eeprom中读出来*****************/voidread_eeprom(){ fen1=byte_read(0x2000);//第1个打铃的时间shi1=byte_read(0x2001);fen2=byte_read(0x2002);//第2个打铃的时间shi2=byte_read(0x2003);fen3=byte_read(0x2004);//第3个打铃的时间shi3=byte_read(0x2005);fen4=byte_read(0x2006);//第4个打铃的时间shi4=byte_read(0x2007);fen5=byte_read(0x2008);//第5个打铃的时间shi5=byte_read(0x2009);fen6=byte_read(0x2010);//第6个打铃的时间shi6=byte_read(0x2011);fen7=byte_read(0x2012);//第7个打铃的时间shi7=byte_read(0x2013);fen8=byte_read(0x2014);//第8个打铃的时间shi8=byte_read(0x2015);fen9=byte_read(0x2016);//第9个打铃的时间shi9=byte_read(0x2017);fen10=byte_read(0x2018);//第10个打铃的时间shi10=byte_read(0x2019);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_read(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);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=byte_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初始化*****************/voidinit_eeprom(){read_eeprom();//先读if(a_a!=25)//新的单片机初始单片机内问eeprom{a_a=25;write_eeprom();//保存数据}}//控制数码管闪烁的函数voidsmg_s(uchardat){B=dat;if(dat0==1)dis_smg[0]=0xff;if(dat1==1)dis_smg[1]=0xff;if(dat2==1) dis_smg[2]=0xff;if(dat3==1)dis_smg[3]=0xff;if(dat4==1)dis_smg[4]=0xff;if(dat5==1)dis_smg[5]=0xff;if(dat6==1)dis_smg[6]=0xff;if(dat7==1)dis_smg[7]=0xff;}/***********************延时函数************************/voiddelay_uint(uintq){while(q--);}/***********************1ms延时函数*****************************/voiddelay_1ms(uintq){uinti,j;for(i=0;i=4){if(menu_1%2==0)////设置分flag_s=0x03;else////设置时flag_s=0x18; }if(menu_1>55)//回到正常显示{menu_1=0;flag_s=0;}}if(key_can==2)//选择键{flag_200ms=1;if((menu_1==1)||(menu_1==2))//设置时间{menu_2++;if(menu_2>3)menu_2=1;if(menu_2==2)flag_s=0x18;if(menu_2>=3)flag_s=0xc0;}if(menu_1>3)//回到正常显示{menu_1=0;flag_s=0;} }if(menu_1==1)//{if(menu_2==1)//设置秒{if(key_can==3)//加set_ds1302time(1,&miao,0x60);if(key_can==4)//减set_ds1302time(0,&miao,0x60);}if(menu_2==2)//设置分{if(key_can==3)//加set_ds1302time(1,&fen,0x60);if(key_can==4)//减set_ds1302time(0,&fen,0x60);}if(menu_2==3)//设置时{if(key_can==3)//加set_ds1302time(1,&shi,0x24);if(key_can==4)//减set_ds1302time(0,&shi,0x24); }write_time();//把时间写进去}if(menu_1==2)//设置年月日{if(menu_2==1)//设置日{if(key_can==3)//加set_ds1302time(1,&ri,0x32);if(key_can==4)//减set_ds1302time(0,&ri,0x32);}if(menu_2==2)//设置月{if(key_can==3)//加set_ds1302time(1,&yue,0x13);if(key_can==4)//减set_ds1302time(0,&yue,0x13);}if(menu_2==3)//设置时{if(key_can==3)//年set_ds1302time(1,&nian,0x99);if(key_can==4)//减set_ds1302time(0,&nian,0x99); }write_time();//把时间写进去}if(menu_1==3)//设置星期{if(menu_2==1)//设置星期{if(key_can==3)//加set_ds1302time(1,&week,0x8);if(key_can==4)//减set_ds1302time(1,&week,0x8);write_time();//把时间写进去}}if((menu_1==4)||(menu_1==5))//设置第1打铃时间{if(menu_1==4){if(key_can==3)//加set_ds1302time(1,&fen1,0x60);if(key_can==4)//减set_ds1302time(0,&fen1,0x60);}if(menu_1==5){ if(key_can==3)//加set_ds1302time(1,&shi1,0x24);if(key_can==4)//减set_ds1302time(0,&shi1,0x24);}}if((menu_1==6)||(menu_1==7))//设置第2打铃时间{if(menu_1==6){if(key_can==3)//加set_ds1302time(1,&fen2,0x60);if(key_can==4)//减set_ds1302time(0,&fen2,0x60);}if(menu_1==7){if(key_can==3)//加set_ds1302time(1,&shi2,0x24);if(key_can==4)//减set_ds1302time(0,&shi2,0x24);}}if(menu_1==8)//设置第3打铃时间{ if(key_can==3)//加set_ds1302time(1,&fen3,0x60);if(key_can==4)//减set_ds1302time(0,&fen3,0x60);}if(menu_1==9){if(key_can==3)//加set_ds1302time(1,&shi3,0x24);if(key_can==4)//减set_ds1302time(0,&shi3,0x24);}if(menu_1==10)//设置第4打铃时间{if(key_can==3)//加set_ds1302time(1,&fen4,0x60);if(key_can==4)//减set_ds1302time(0,&fen4,0x60);}if(menu_1==11){if(key_can==3)//加set_ds1302time(1,&shi4,0x24);if(key_can==4)//减set_ds1302time(0,&shi4,0x24); }if(menu_1==12)//设置第5打铃时间{if(key_can==3)//加set_ds1302time(1,&fen5,0x60);if(key_can==4)//减set_ds1302time(0,&fen5,0x60);}if(menu_1==13){if(key_can==3)//加set_ds1302time(1,&shi5,0x24);if(key_can==4)//减set_ds1302time(0,&shi5,0x24);}if(menu_1==14)//设置第6打铃时间{if(key_can==3)//加set_ds1302time(1,&fen6,0x60);if(key_can==4)//减set_ds1302time(0,&fen6,0x60);}if(menu_1==15){if(key_can==3)//加 set_ds1302time(1,&shi6,0x24);if(key_can==4)//减set_ds1302time(0,&shi6,0x24);}if(menu_1==16)//设置第7打铃时间{if(key_can==3)//加set_ds1302time(1,&fen7,0x60);if(key_can==4)//减set_ds1302time(0,&fen7,0x60);}if(menu_1==17){if(key_can==3)//加set_ds1302time(1,&shi7,0x24);if(key_can==4)//减set_ds1302time(0,&shi7,0x24);}if(menu_1==18)//设置第8打铃时间{if(key_can==3)//加set_ds1302time(1,&fen8,0x60);if(key_can==4)//减set_ds1302time(0,&fen8,0x60);} if(menu_1==19){if(key_can==3)//加set_ds1302time(1,&shi8,0x24);if(key_can==4)//减set_ds1302time(0,&shi8,0x24);}if(menu_1==20)//设置第9打铃时间{if(key_can==3)//加set_ds1302time(1,&fen9,0x60);if(key_can==4)//减set_ds1302time(0,&fen9,0x60);}if(menu_1==21){if(key_can==3)//加set_ds1302time(1,&shi9,0x24);if(key_can==4)//减set_ds1302time(0,&shi9,0x24);}if(menu_1==22)//设置第10打铃时间{if(key_can==3)//加set_ds1302time(1,&fen10,0x60); if(key_can==4)//减set_ds1302time(0,&fen10,0x60);}if(menu_1==23){if(key_can==3)//加set_ds1302time(1,&shi10,0x24);if(key_can==4)//减set_ds1302time(0,&shi10,0x24);}if(menu_1==24)//设置第11打铃时间{if(key_can==3)//加set_ds1302time(1,&fen11,0x60);if(key_can==4)//减set_ds1302time(0,&fen11,0x60);}if(menu_1==25){if(key_can==3)//加set_ds1302time(1,&shi11,0x24);if(key_can==4)//减set_ds1302time(0,&shi11,0x24);}if(menu_1==26)//设置第12打铃时间 {if(key_can==3)//加set_ds1302time(1,&fen12,0x60);if(key_can==4)//减set_ds1302time(0,&fen12,0x60);}if(menu_1==27){if(key_can==3)//加set_ds1302time(1,&shi12,0x24);if(key_can==4)//减set_ds1302time(0,&shi12,0x24);}if(menu_1==28)//设置第13打铃时间{if(key_can==3)//加set_ds1302time(1,&fen13,0x60);if(key_can==4)//减set_ds1302time(0,&fen13,0x60);}if(menu_1==29){if(key_can==3)//加set_ds1302time(1,&shi13,0x24);if(key_can==4)//减 set_ds1302time(0,&shi13,0x24);}if(menu_1==30)//设置第14打铃时间{if(key_can==3)//加set_ds1302time(1,&fen14,0x60);if(key_can==4)//减set_ds1302time(0,&fen14,0x60);}if(menu_1==31){if(key_can==3)//加set_ds1302time(1,&shi14,0x24);if(key_can==4)//减set_ds1302time(0,&shi14,0x24);}if(menu_1==32)//设置第15打铃时间{if(key_can==3)//加set_ds1302time(1,&fen15,0x60);if(key_can==4)//减set_ds1302time(0,&fen15,0x60);}if(menu_1==33){ if(key_can==3)//加set_ds1302time(1,&shi15,0x24);if(key_can==4)//减set_ds1302time(0,&shi15,0x24);}if(menu_1==34)//设置第16打铃时间{if(key_can==3)//加set_ds1302time(1,&fen16,0x60);if(key_can==4)//减set_ds1302time(0,&fen16,0x60);}if(menu_1==35){if(key_can==3)//加set_ds1302time(1,&shi16,0x24);if(key_can==4)//减set_ds1302time(0,&shi16,0x24);}if(menu_1==36)//设置第17打铃时间{if(key_can==3)//加set_ds1302time(1,&fen17,0x60);if(key_can==4)//减set_ds1302time(0,&fen17,0x60); }if(menu_1==37){if(key_can==3)//加set_ds1302time(1,&shi17,0x24);if(key_can==4)//减set_ds1302time(0,&shi17,0x24);}if(menu_1==38)//设置第18打铃时间{if(key_can==3)//加set_ds1302time(1,&fen18,0x60);if(key_can==4)//减set_ds1302time(0,&fen18,0x60);}if(menu_1==39){if(key_can==3)//加set_ds1302time(1,&shi18,0x24);if(key_can==4)//减set_ds1302time(0,&shi18,0x24);}if(menu_1==40)//设置第19打铃时间{if(key_can==3)//加 set_ds1302time(1,&fen19,0x60);if(key_can==4)//减set_ds1302time(0,&fen19,0x60);}if(menu_1==41){if(key_can==3)//加set_ds1302time(1,&shi19,0x24);if(key_can==4)//减set_ds1302time(0,&shi19,0x24);}if(menu_1==42)//设置第20打铃时间{if(key_can==3)//加set_ds1302time(1,&fen20,0x60);if(key_can==4)//减set_ds1302time(0,&fen20,0x60);}if(menu_1==43){if(key_can==3)//加set_ds1302time(1,&shi20,0x24);if(key_can==4)//减set_ds1302time(0,&shi20,0x24);} if(menu_1==44)//设置第21打铃时间{if(key_can==3)//加set_ds1302time(1,&fen21,0x60);if(key_can==4)//减set_ds1302time(0,&fen21,0x60);}if(menu_1==45){if(key_can==3)//加set_ds1302time(1,&shi21,0x24);if(key_can==4)//减set_ds1302time(0,&shi21,0x24);}if(menu_1==46)//设置第22打铃时间{if(key_can==3)//加set_ds1302time(1,&fen22,0x60);if(key_can==4)//减set_ds1302time(0,&fen22,0x60);}if(menu_1==47){if(key_can==3)//加set_ds1302time(1,&shi22,0x24); if(key_can==4)//减set_ds1302time(0,&shi22,0x24);}if(menu_1==48)//设置第23打铃时间{if(key_can==3)//加set_ds1302time(1,&fen23,0x60);if(key_can==4)//减set_ds1302time(0,&fen23,0x60);}if(menu_1==49){if(key_can==3)//加set_ds1302time(1,&shi23,0x24);if(key_can==4)//减set_ds1302time(0,&shi23,0x24);}if(menu_1==50)//设置第24打铃时间{if(key_can==3)//加set_ds1302time(1,&fen24,0x60);if(key_can==4)//减set_ds1302time(0,&fen24,0x60);}if(menu_1==51) {if(key_can==3)//加set_ds1302time(1,&shi24,0x24);if(key_can==4)//减set_ds1302time(0,&shi24,0x24);}if(menu_1==52)//设置第25打铃时间{if(key_can==3)//加set_ds1302time(1,&fen25,0x60);if(key_can==4)//减set_ds1302time(0,&fen25,0x60);}if(menu_1==53){if(key_can==3)//加set_ds1302time(1,&shi25,0x24);if(key_can==4)//减set_ds1302time(0,&shi25,0x24);}if(menu_1==54)//设置第26打铃时间{if(key_can==3)//加set_ds1302time(1,&fen26,0x60);if(key_can==4)//减 set_ds1302time(0,&fen26,0x60);}if(menu_1==55){if(key_can==3)//加set_ds1302time(1,&shi26,0x24);if(key_can==4)//减set_ds1302time(0,&shi26,0x24);}}/*************数码管显示**************/voiddis_xianshi(ucharshi,ucharfen){dis_smg[0]=smg_du[fen%16];//显示分dis_smg[1]=smg_du[fen/16];//dis_smg[2]=0x7f;//dis_smg[3]=smg_du[shi%16];//显示秒dis_smg[4]=smg_du[shi/16];//dis_smg[5]=0xff;//dis_smg[6]=smg_du[daling_geshu%10];dis_smg[7]=smg_du[daling_geshu/10];}/************菜单处理函数****************/ voidmenu_dis(){if((menu_1==1))//选设置时分秒{if(flag_500ms==1){dis_smg[0]=smg_du[miao%16];//显示秒dis_smg[1]=smg_du[miao/16];//dis_smg[2]=0x7f;dis_smg[3]=smg_du[fen%16];//显示分dis_smg[4]=smg_du[fen/16];//dis_smg[5]=0x7f;dis_smg[6]=smg_du[shi%16];//显示秒dis_smg[7]=smg_du[shi/16];//smg_i=8;}elsesmg_s(flag_s);}if((menu_1==2))//选设置年月日{if(flag_500ms==1){dis_smg[0]=smg_du[ri%16];//显示日dis_smg[1]=smg_du[ri/16];// dis_smg[2]=0xfe;dis_smg[3]=smg_du[yue%16];//显示月dis_smg[4]=smg_du[yue/16];//dis_smg[5]=0xfe;dis_smg[6]=smg_du[nian%16];//显示年dis_smg[7]=smg_du[nian/16];//smg_i=8;}elsesmg_s(flag_s);}if((menu_1==3))//设置星期和闹钟的开和关{smg_i=8;if(flag_500ms==1){dis_smg[0]=smg_du[week%16];//显示星期dis_smg[1]=smg_du[week/16];//dis_smg[2]=0xff;dis_smg[3]=0xff;dis_smg[4]=0xff;dis_smg[5]=0xff;dis_smg[6]=0xff;dis_smg[7]=0xff;} elsesmg_s(flag_s);}if((menu_1==4)||(menu_1==5))//设置第1打铃时间{daling_geshu=1;if(flag_500ms==1){dis_xianshi(shi1,fen1);//显示}}if((menu_1==6)||(menu_1==7))//设置第2打铃时间{daling_geshu=2;if(flag_500ms==1)dis_xianshi(shi2,fen2);//显示}if((menu_1==8)||(menu_1==9))//设置第3打铃时间{daling_geshu=3;if(flag_500ms==1)dis_xianshi(shi3,fen3);//显示}if((menu_1==10)||(menu_1==11))//设置第4打铃时间{ daling_geshu=4;if(flag_500ms==1)dis_xianshi(shi4,fen4);//显示}if((menu_1==12)||(menu_1==13))//设置第5打铃时间{daling_geshu=5;if(flag_500ms==1)dis_xianshi(shi5,fen5);//显示}if((menu_1==14)||(menu_1==15))//设置第6打铃时间{daling_geshu=6;if(flag_500ms==1)dis_xianshi(shi6,fen6);//显示}if((menu_1==16)||(menu_1==17))//设置第7打铃时间{daling_geshu=7;if(flag_500ms==1)dis_xianshi(shi7,fen7);//显示}if((menu_1==18)||(menu_1==19))//设置第8打铃时间{daling_geshu=8; if(flag_500ms==1)dis_xianshi(shi8,fen8);//显示}if((menu_1==20)||(menu_1==21))//设置第9打铃时间{daling_geshu=9;if(flag_500ms==1)dis_xianshi(shi9,fen9);//显示}if((menu_1==22)||(menu_1==23))//设置第10打铃时间{daling_geshu=10;if(flag_500ms==1)dis_xianshi(shi10,fen10);//显示}if((menu_1==24)||(menu_1==25))//设置第11打铃时间{daling_geshu=11;if(flag_500ms==1)dis_xianshi(shi11,fen11);//显示}if((menu_1==26)||(menu_1==27))//设置第12打铃时间{daling_geshu=12;if(flag_500ms==1) dis_xianshi(shi12,fen12);//显示}if((menu_1==28)||(menu_1==29))//设置第13打铃时间{daling_geshu=13;if(flag_500ms==1)dis_xianshi(shi13,fen13);//显示}if((menu_1==30)||(menu_1==31))//设置第14打铃时间{daling_geshu=14;if(flag_500ms==1)dis_xianshi(shi14,fen14);//显示}if((menu_1==32)||(menu_1==33))//设置第15打铃时间{daling_geshu=15;if(flag_500ms==1)dis_xianshi(shi15,fen15);//显示}if((menu_1==34)||(menu_1==35))//设置第16打铃时间{daling_geshu=16;if(flag_500ms==1)dis_xianshi(shi16,fen16);//显示 }if((menu_1==36)||(menu_1==37))//设置第17打铃时间{daling_geshu=17;if(flag_500ms==1)dis_xianshi(shi17,fen17);//显示}if((menu_1==38)||(menu_1==39))//设置第18打铃时间{daling_geshu=18;if(flag_500ms==1)dis_xianshi(shi18,fen18);//显示}if((menu_1==40)||(menu_1==41))//设置第19打铃时间{daling_geshu=19;if(flag_500ms==1)dis_xianshi(shi19,fen19);//显示}if((menu_1==42)||(menu_1==43))//设置第20打铃时间{daling_geshu=20;if(flag_500ms==1)dis_xianshi(shi20,fen20);//显示} if((menu_1==44)||(menu_1==45))//设置第21打铃时间{daling_geshu=21;if(flag_500ms==1)dis_xianshi(shi21,fen21);//显示}if((menu_1==46)||(menu_1==47))//设置第22打铃时间{daling_geshu=22;if(flag_500ms==1)dis_xianshi(shi22,fen22);//显示}if((menu_1==48)||(menu_1==49))//设置第23打铃时间{daling_geshu=23;if(flag_500ms==1)dis_xianshi(shi23,fen23);//显示}if((menu_1==50)||(menu_1==51))//设置第24打铃时间{daling_geshu=24;if(flag_500ms==1)dis_xianshi(shi24,fen24);//显示}if((menu_1==52)||(menu_1==53))//设置第25打铃时间 {daling_geshu=25;if(flag_500ms==1)dis_xianshi(shi25,fen25);//显示}if((menu_1==54)||(menu_1==55))//设置第26打铃时间{daling_geshu=26;if(flag_500ms==1)dis_xianshi(shi26,fen26);//显示}if(menu_1!=0)if(flag_500ms==0)smg_s(flag_s);}/*************打铃函数***************/voidclock_dis(){staticucharmm,value;if(flag_100ms==1)//100ms执行一次{flag_100ms=0;{ if((week==1)||(week==2)||(week==3)||(week==4)||(week==5))if(miao==0)if(((fen==fen1)&&(shi==shi1)&&(shi1!=0))||((fen==fen2)&&(shi==shi2)&&(shi2!=0))||//第2个打铃时间判断((fen==fen3)&&(shi==shi3)&&(shi3!=0))||//第3个打铃时间判断((fen==fen4)&&(shi==shi4)&&(shi4!=0))||//第4个打铃时间判断((fen==fen5)&&(shi==shi5)&&(shi5!=0))||//第5个打铃时间判断((fen==fen6)&&(shi==shi6)&&(shi6!=0))||//第6个打铃时间判断((fen==fen7)&&(shi==shi7)&&(shi7!=0))||//第7个打铃时间判断((fen==fen8)&&(shi==shi8)&&(shi8!=0))||//第8个打铃时间判断((fen==fen9)&&(shi==shi9)&&(shi9!=0))||//第9个打铃时间判断((fen==fen10)&&(shi==shi10)&&(shi10!=0))||//第10个打铃时间判断((fen==fen11)&&(shi==shi11)&&(shi11!=0))||//第11个打铃时间判断((fen==fen12)&&(shi==shi12)&&(shi12!=0))||//第12个打铃时间判断((fen==fen13)&&(shi==shi13)&&(shi13!=0))||//第13个打铃时间判断((fen==fen14)&&(shi==shi14)&&(shi14!=0))||//第14个打铃时间判断 ((fen==fen15)&&(shi==shi15)&&(shi15!=0))||//第15个打铃时间判断((fen==fen16)&&(shi==shi16)&&(shi16!=0))||//第16个打铃时间判断((fen==fen17)&&(shi==shi17)&&(shi17!=0))||//第17个打铃时间判断((fen==fen18)&&(shi==shi18)&&(shi18!=0))||//第18个打铃时间判断((fen==fen19)&&(shi==shi19)&&(shi19!=0))||//第19个打铃时间判断((fen==fen20)&&(shi==shi20)&&(shi20!=0))||//第20个打铃时间判断((fen==fen21)&&(shi==shi21)&&(shi21!=0))||//第21个打铃时间判断((fen==fen22)&&(shi==shi22)&&(shi22!=0))||//第22个打铃时间判断((fen==fen23)&&(shi==shi23)&&(shi23!=0))||//第23个打铃时间判断((fen==fen24)&&(shi==shi24)&&(shi24!=0))||//第24个打铃时间判断((fen==fen25)&&(shi==shi25)&&(shi25!=0))||//第25个打铃时间判断((fen==fen26)&&(shi==shi26)&&(shi26!=0))//第26个打铃时间判断)flag_beep_en=1;//打铃蜂鸣器响的标志位if(flag_beep_en==1)//打铃以被打开{ clock_value++;beep=~beep;//蜂鸣器叫3秒//15秒后自动关闭闹钟value++;if(value>=10){value=0;mm++;if(mm>=15){mm=0;flag_beep_en=0;beep=1;}}}}}}/*************定时器0初始化程序***************/voidtime_init(){EA=1;//开总中断TMOD=0X01;//定时器0、工作方式1 ET0=1;//开定时器0中断TR0=1;//允许定时器0定时}/*************时钟显示***************/voidinit_1602_ds1302(){staticucharvalue;smg_i=8;value++;if(value<=5*2)//2秒{dis_smg[0]=smg_du[miao%16];//显示秒dis_smg[1]=smg_du[miao/16];//dis_smg[2]=0x7f;dis_smg[3]=smg_du[fen%16];//显示分dis_smg[4]=smg_du[fen/16];//dis_smg[5]=0x7f;dis_smg[6]=smg_du[shi%16];//显示秒dis_smg[7]=smg_du[shi/16];//}elseif(value<=5*4)//2秒{dis_smg[0]=smg_du[ri%16];//显示日dis_smg[1]=smg_du[ri/16];// dis_smg[2]=0xfe;dis_smg[3]=smg_du[yue%16];//显示月dis_smg[4]=smg_du[yue/16];//dis_smg[5]=0xfe;dis_smg[6]=smg_du[nian%16];//显示年dis_smg[7]=smg_du[nian/16];//}elseif(value<=5*6)//2秒{dis_smg[0]=smg_du[week%16];//显示星期dis_smg[1]=smg_du[week/16];//dis_smg[2]=0xff;dis_smg[3]=0xff;dis_smg[4]=0xff;//dis_smg[5]=0xff;//dis_smg[6]=0xff;//dis_smg[7]=0xff;//}elsevalue=0;}/*****************主函数********************/voidmain(){ init_ds1302();//ds1302初始化time_init();//定时器初始化init_eeprom();//开始初始化保存的数据flag_s=0;while(1){key();//按键程序if(key_can<10){key_with();if(menu_1==0)//手动打铃{if(key_can==4)flag_beep_en=1;}}if(flag_200ms==1){flag_200ms=0;if(menu_1==0){read_time();//读时间init_1602_ds1302();//显示时钟} }menu_dis();//设置的对应的显示处理clock_dis();//打铃函数delay_1ms(1);}}/*************定时器0中断服务程序***************/voidtime0_int()interrupt1{staticuintvalue;staticucharii;TH0=0xF8;TL0=0x30;//2ms12Mvalue++;if((value%50)==0)//100msflag_100ms=1;if(value%100==0){flag_200ms=1;}if(value>=250){value=0; flag_500ms=~flag_500ms;}P0=0xff;//消隐P2=smg_we[ii];//位选P0=dis_smg[ii];//段选ii++;if(ii>=smg_i)ii=0;}程序结束第六章作息时间器硬件原理图 第七章实训总结完成作息时间器设计的实训我能综合运用电子技术课程中的所学到的理论知识来完成自动打铃机的设计和分析电路,学会了在虚拟的环境下创建电路,计算和调整参数,我能灵活的应用AltiumDesign软件画图,并且掌握了一定的单片片机知识,通过这门课的设计我还有以下几点收获:1、有利于基础知识的掌握通过这次设计我亲手做,自己思考,将理论知识上升到实践的高度,从而进一步打破了单片机的神秘面纱。2、有利于逻辑思维的锻炼。在许多常规可生的日常学习中我们不难发现这样一个现象,不少学生的思维常处于混乱的状态,写作文来前言不搭后语,解起数学题来步骤混乱,这些都是缺乏思维训练的结果,程序设计是公认的,最能直接有效的训练学生的创造思维,培养分析问题解决问题的能力的方法之一。即使见到陌生的程序,从任务分析,确定算法界面布局,缩写代码到调试运行,都能顺利完成。整个过程需要我们有条理的构思,这之间有猜测设计,判断思维的抽象思维训练,又有分析问题解决问题,预测日标等能力的培养。 参考文献【1】沈红卫。基于单片机的智能系统设计与实现。电子工业出版社。2005。【2】张志良。单片机原理与控制技术。机械工业出版社。2009。【3】孙涵芳,徐爱卿。MCS-51/96系列单片机原理及引用。北京航空航天大学出版社。1996。【4】李光弟。单片机基础。北京航空航天大学出版社。1992。【5】孙育才,苏学成。单片微型计算机应用系统设计与实现。东南大学出版社。1990。【6】林毓梁。单片机原理及应用。机械工业出版社。2009。【7】杨宏丽,王静霞。单片机基础教程。人民邮电出版社。2009。【8】唐继贤。51单片机工程引用实例。北京航空航天大学出版社。2009。【9】赵星寒,刘小波,王庚兰。从0开始教你学单片机。北京航空航天大学出版社。2008。 附录附录1原理电路图 附录2元件清单编号名称型号数量单位1晶振12MHZ1个2晶振32.768K1个3蜂鸣器1个4电容10uF1个5瓷片电容20pF2个6数码管SMG042块7三极管90129个8独立按键5个9电源开关1个10芯片DS13021个11芯片STC89C521个12芯片脚8脚1个13芯片脚40脚1个14纽扣电池3V1个15万能电板1块附录3实物图 '