智能电子闹钟设计_第1页
智能电子闹钟设计_第2页
智能电子闹钟设计_第3页
智能电子闹钟设计_第4页
智能电子闹钟设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

辽东学院毕业论文智能电子闹钟设计学生姓名:XXXX学号:XXXX班级:XXXX专业:计算机应用技术指导教师:XXXX2012年12月摘要本系统设计是基于STC89C51RC的一种带8K闪烁可编程可擦除只读存储器〔FPETOM-FlashProgrammabalandErasableReadOnlyMemory〕的低电压、高性能CMOS8位微型处理器,即单片机芯片。单片机的可擦除只读存储器可以反复擦除1000次,内部FLASH擦写次数为100000次以上。该芯片使用高密度非易失存储制造技术,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器集成在单个芯片中,使得STC89C51RC成为了一种性价比极高的微型处理器芯片,在许多电路设计中都得到了应用。由单片机控制数码管的显示,,修改设置时间采用操作方便的键盘,整点报时系统使用无源蜂鸣器,通过调节输入方波的占功比,到达美妙旋律的声音实现报时的功能,整个系统设计比拟完善,有显示时间日期、整点报时、时间日期调节设置的功能,除些之外还介绍了单片机和汇编程序一些经验和方法,以便将单片机的汇编程序经过局部的修改就可以移植到单片机上,实现不同的功能,节约重新开发的时间。最后总结了一些关于在做基于单片机的智能闹钟所遇到的问题和困难,其最大的特点是只读存储器可以反复擦除,精简版本高效微控制器STC89C51RC单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,也是它应用较为广泛的原因。关键词:STC89C51RC单片机;数码管;蜂鸣器AbstractThesystemdesignisbasedonaSTC89C51RCwith8kscintillationprogrammablecanerasereadonlymemory(FPETOM-FlashProgrammabalandErasableReadOnlyMemory)lowvoltage,highperformanceCMOS8amicroprocessor,namelymicrocontrollerchip.SCMcaneraseread-onlymemorycanberepeatederase1000times,internalFLASHintegration.itnumberfor100000timesormore.Thechipusinghighdensitynonvolatilestoragemanufacturingtechnology,andindustrystandardMCS-51instructionsetandoutputpipeJiaoXiangcompatible.Becauseofthemulti-functioneightCPUandscintillationmemoryintegratedonasinglechip,maketheSTC89C51RCbecomeakindofhighperformancemicroprocessorchip,inmanycircuitdesignhavebeenapplied.Thesingle-chipmicrocomputercontrol,digitaltubedisplay,,modifythesetuptimeuseconvenientoperationkeyboard,integralpointtimesystemsusepassivebuzzer,throughthecontrolinputsquare-waveoccupyworkthantothevoiceofmelodytorealizethefunctionofthetime,thewholesystemdesignisperfect,haveshowtimedate,onthehourtime,timedateregulationsettingfunction,inadditiontosomeoutsidestillintroducestheSCMandassemblersomeexperienceandmethodstoMCUassemblyprogramthroughlocalmodificationcanbetransplantedintosinglechipmicrocomputer,therealizationofdifferentfunction,savetodevelopmenttime.Finally,summarizedtheaboutdoingbasedonsinglechipmicrocomputerintelligentalarmclockmeetproblemsanddifficulties,itsbiggestcharacteristicistoreadonlymemorycanberepeatederase,streamlinedversionefficientmicrocontrollerSTC89C51RCmicrocontrollerasmanyembeddedcontrolsystemprovidesahighflexibilityandcheapscheme,itismorewidelyapplicationofreason.Keywords:STC89C51RCmicrocontroller;Digitaltube;buzzer目录前言…….………………………….51.电子时钟的设计原理和方法6设计原理62.硬件电路的设计72.1STC89C51RC简介72.2键盘电路的设计8蜂鸣器驱动电路92.4数码管驱动电路102.5晶振电路113软件局部的设计12主程序局部的设计12中断计时器及时间进位133.3闹钟子函数143.4按键扫描153.5时钟闹钟设置163.6显示数字函数173.7显示界面函数173.8闹钟记录及读取184总结225参考文献……………….……..236致谢………………………..…….24附录A:电路原理图.25附录B:源程序..26前言随着科学技术的开展和电子技术产业结构调整,单片机开始迅速开展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。但是却很少知道它的内部结构以及工作原理。由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行定时、校时功能。输出设备显示器可以用液晶显示技术和数码管显示技术。单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件设计和软件编程设计两个方面,其调试过程一般分为软件调试、硬件测试、系统调试,通常不用制作具体的电路板用单片机系统的虚拟仿真软件Proteus 实现仿真功能。本文所述智能时钟设计主要指时钟显示、时间设置、整点报时等控制系统。本文采用STC89C51RC型单片机为核心实现智能闹钟控制,至所以选择STC89C51RC型单片机而没有选择其他单片机主要原因在于STC89C51RC型单片机进入市场时间早、总线开放、仿真开发设备多、芯片及其开发设备价格低廉、速度较快、电磁兼容性较好的。STC89C51RC单片机与工业标准的MCS-51的各方面性能比拟,其最大的特点是只读存储器可以反复擦除,是一种精简版本高效微控制器,STC89C51RC单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。1.电子时钟的设计原理和方法设计原理原理为:该电子时钟由STC89C51RC、晶振、按键、六段数码管、蜂鸣器等构成,采用外部晶振电路作为单片机的振荡电路,由延时程序和循环程序产生的一秒定时,到达时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路通过控制键实现时间调节、闹钟设置等功能。按下时间调节按键之后再按加减功能键实现时间的加减,每按一次数值加一,移动按键可以选择要调节的选项。按下闹钟功能键可以实现闹钟时间的调节。那么可实现小时的调节,同样每按一次小时加一。使用单片机内部计数器的定时器功能,编程设置主要针对定时器/计数器工作方式存放器TMOD。具体为:工作方式选择位,设置为方式2;计数/定时方式选择位,设置为定时器工作方式。电子时钟每一秒钟更新一次,因此MCU须产生一秒钟定时,工程上常采用如下方法:定时器使用方式一,设系统使用12MHz晶振,可使T0或T1产生50毫秒钟定时中断,再在中断效劳程序中,对中断次数进行计数,计数到20次即可产生一秒钟定时。STC89C51RC六位数码STC89C51RC六位数码管蜂鸣器按键晶振计2.1STC89C51RC简介STC89C51RC是一种带8K闪烁可编程可擦除只读存储器〔FPETOM-FlashProgrammabalandErasableReadOnlyMemory〕的低电压、高性能CMOS8位微型处理器,即单片机芯片。单片机的可擦除只读存储器可以反复擦除1000次,内部FLASH擦写次数为100000次以上。该芯片使用高密度非易失存储制造技术,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器集成在单个芯片中,使得STC89C51RC成为了一种性价比极高的微型处理器芯片,在许多电路设计中都得到了应用。STC89C51RC单片机特点:工作电压:工作频率:0-40MHz用户应用程序空间:8K片上集成128*8RAMISP〔在系统可编程〕/IAP〔在应用可编程〕,无需专用编程器/仿真器可通过串口〔〕直接下载用户程序EEPROM功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使用外部中断4路通用异步串行口〔UART〕,还可用定时器软件实现多个UART工作温度范围:0-75℃引脚说明:VCC:供电电压GND:接地P0:P0是一个8位漏级开路双向I/O口,低8位地址复用总线端口。P1:P1是一个内部提供上拉电阻的8位双向I/O口,静态通用端口。P2:P2是一个内部提供上拉电阻的8位双向I/O口,高8位地址总线动态端口。P3:P3是一个内部提供上拉电阻的8位双向I/O口,双功能静态端口。P3口也可作为一些特殊功能口。P3.0RXD(串行输入口)P3.1TXD(串行输出口)。RST:复位自输入。XTAL1/XTAL2:反向振荡器的输入与输出。STC89C51RC芯片外形结构和引脚分布图2.2键盘电路的设计采取独立式键盘接口的编程模式,此键盘接口程序的功能实际上就是驱动键盘工作,完成键盘的识别,根据所识别按键的键值,完成子程序的正确散转,从而完成单片机应用系统对用户按键动作的预定义的响完成单片机应用系统对用户按键动作的预定义的响应。采取独立式键盘的原因是每一个按键只占用一个应。采取独立式键盘的原因是每一个按键只占用一个I/O口,同时每个按键的工作不影响其他按键,可直接依据每个I/O口线的状态进行子程序的散转,因此编制的程序较简练。本程序中利用查询方式对按键进行判断,假设有键按下,那么进行软件延时消抖,防止了抖动引起的干扰,同时只有当按键松开后,才判断其有效并进行识别,最后根据识别的按键转子程序处理(主要是对具体按键的系统功能的执行)。通过按键来调整内部的存储单元。89C51的P0口和P2口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作LED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接按键构成键盘电路。键盘采用四个个独立按键配以实现对时钟和闹钟的设定及修改。按键未按下时,IO口为高电平,按键按下后IO口被拉低。蜂鸣器驱动电路发音局部是通过三极管放大驱动蜂鸣器工作,当IO口输出低电平时,三极管导通,蜂鸣器响。2.4数码管驱动电路动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制翻开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。动态显示:所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。动态显示,也称扫描显示。显示器由6个共阴极LED数码管构成。单片机的P1口输出显示段码,经由一片74LS245驱动输出给LED管,由P0口输出位码,经由74LS06输出给LED管。电路由于点亮数码管所需电流较大,对单片机IO口连接上拉电阻,提高IO口的电流输出能力。图3.软件局部的设计主程序局部的设计利用单片机制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。本程序设计中,在主程序之外,可以设置时间值处理子程序,时间值显示前的处理子程序,按键情况扫描子程序,1S定时中断子程序以及50ms延时消除按键抖动子程序等多个小型的子程序。另外,可以设置一些数据单元作为数据存放器。用30H,31H,40H和41H地址单元分别作为显示位数的扫描指针值存放器,时存放器,分存放器和秒存放器。flag=0flag=0flag!=0开始初始化定时器读取闹钟时间进位函数闹钟函数显示切换界面按键扫描设置按键扫描切换界面按键扫描设置标志位当程序开始时,先读取闹钟所示时间,用定时器进行初始化定时,先调用时间进位函数,再调用闹钟函数,显示切换界面按键扫描,设置按键扫描,切换界面按键扫描,到达指定的标志位,函数通过判断标志位flag_sw判断需要显示的界面。程序局部主要采用了程序结构的模块化设计,防止了一些函数的不必要的重复书写,使程序变得单间易懂。程序在执行时,主程序要须通过调用子函数就可完成相应的功能。中断计时器及时间进位数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。STC89C51RC有两个通用定时/计数器。两者均可配置为定时器或事件计数器。另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。用作“定时器”功能时,每经过一个机器周期,存放器值加1。用作“计数器”功能时,存放器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。使用该功能时,外部输入每个机器周期被采样一次。设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到。3.3闹钟子函数YYYNN开始时间到且开关开闹铃一分钟或按键按下结束闹钟流程图闹钟时间的判别主要是通过设定时间与实时时间对逐位比照确定是否进行闹铃。当程序开始执行时,首先要判断设置的时间是否到达设定时间,假设到达那么闹钟开始发出响声,否那么此程序结束。当闹铃响时,判断是否响一分钟,或将闹铃关闭,假设超过一分钟火箭闹铃关闭那么程序结束;否那么将返回循环程序。3.4按键扫描<b<b(<=a)(>a)>=b按下未按下开始变量++(--)Key变量结束变量=a(=b)按键扫描流程这些函数主要是判断是否有按键按下,当按键按下时,执行变量++,判断变量>b(<=a),那么变量=a〔=b〕,程序结束;假设变量<b〔<a〕,那么结束;假设未按下,那么结束程序。3.5时钟闹钟设置图图=3=2=1=3=2=1=3=2=1=3=2=1开始flag_swflag_set设置时钟月结束设置时钟日设置时钟年flag_set设置闹钟分钟设置闹钟开关设置闹钟小时flag_set设置时钟分钟设置时钟秒设置时钟小时由时钟闹钟程序开始时,当flag_sw=1时,执行flag_set,假设flag_set=1时,设置时钟小时,假设flag_set=2时,设置时钟分钟,假设flag_set=3时,设置时钟秒;当flag_sw=2时,继续执行flag_set,假设flag_set=1时,设置时钟年,假设flag_set=2时,设置时钟月,假设flag_set=3时,设置时钟日;当flag_sw=3时,再执行flag_set,假设flag_set=1时,设置闹钟小时,假设flag_set=2时,设置闹钟分钟,假设flag_set=3时,设置闹钟开关;结束设置。3.6显示数字函数开始开始数及显示位置判断显示位置在相应位置显示结束函数由开始,输入显示的数字及显示的位置,判断需要显示的数字及显示的位置并在相应位置进行显示,并结束。3.7显示界面函数=3=3=2=1开始结束标志位显示时间显示日期显示闹钟界面显示图由开始,函数通过判断标志位flag_sw判断需要显示的界面。当flag_sw=1时,显示时间;当flag_sw=2时,显示日期;当flag_sw=3时,显示闹钟。3.8闹钟记录及读取STC89C51RC单片机内部集成了的EEPROM是与程序空间是分开的,利用ISP/IAP技术可将内部DataFlash当EEPROM,擦写次数在10万次以上。EEPROM可分为假设干个扇区,每个扇区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。EEPROM可用于保存一些需要在应用过程中修改并且掉电不丧失的参数数据。在用户程序中,可以对EEPROM进行字节读/字节编程/扇区擦除操作。IAP及EEPROM新增特殊功能存放器介绍符号描述地址位地址及符号MSBLSB复位值ISP_DATAISP/IAPFlashDataRegisterE2H11111111BISP_ADDRHISP/IAPFlashAddressHighE3H00000000BISP_ADDRLISP/IAPFlashAddressLowE4H00000000BISP_CMDISP/IAPFlashCommandRegisterE5H------MS1MS0xxxxxx00BISP_TRIGISP/IAPFlashCommandTriggerE6HxxxxxxxxBISP_CONTRISP/IAPControlRegisterE7HISPENSWBSSWRST--WT2WT1WT0000xx000B1.ISP/IAP数据存放器ISP_DATAISP_DATA:ISP/IAP操作时的数据存放器。ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也需放在此处2.ISP/IAP地址存放器ISP_ADDRH和ISP_ADDRLISP_ADDRH:ISP/IAP操作时的地址存放器高八位。该存放器地址为E3H,复位后值为00H.ISP_ADDRL:ISP/IAP操作时的地址存放器低八位。该存放器地址为E4H,复位后值为00H.3.ISP/IAP命令存放器ISP_CMDISP/IAP命令存放器IAP_CMD格式如下:SFRnameAddressbitB7B6B5B4B3B2B1B0ISP_CMDE5Hname------MS1MS0MS2MS1MS0命令/操作模式选择000Standby待机模式,无ISP操作001从用户的应用程序区对"DataFlash/EEPROM区"进行字节读010从用户的应用程序区对"DataFlash/EEPROM区"进行字节编程011从用户的应用程序区对"DataFlash/EEPROM区"进行扇区擦除程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。已经固化有ISP引导码,并设置为上电复位进入ISP4.ISP/IA命令触发存放器ISP_TRIGISP_TRIG:ISP/IAP操作时的命令触发存放器。在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP命令才会生效。ISP/IAP操作完成后,ISP地址高八位存放器ISP_ADDRH、ISP地址低八位存放器ISP_ADDRL和ISP命令存放器ISP_CMD的内容不变。如果接下来要对下一个地址的数据进行ISP/IAP操作,需手动将该地址的高8位和低8位分别写入ISP_ADDRH和ISP_ADDRL存放器。每次ISP操作时,都要对ISP_TRIG先写入46H,再写入B9H,ISP/IAP命令才会生效。5.ISP/IAP命令存放器ISP_CONTRISP/IAP控制存放器IAP_CONTR格式如下:SFRnameAddressbitB7B6B5B4B3B2B1B0IAP_CONTRE7HnameISPENSWBSSWRST--WT2WT2WT0ISPEN:ISP/IAP功能允许位。0:禁止IAP/ISP读/写/擦除DataFlash/EEPROM1:允许IAP/ISP读/写/擦除DataFlash/EEPROMSWBS:软件选择从用户应用程序区启动(送0),还是从系统ISP监控程序区启动(送1)。要与SWRST直接配合才可以实现SWRST:0:不操作;1:产生软件系统复位,硬件自动复位。设置等待时间CPU等待时间(机器周期),(1个机器周期=12个CPU工作时钟)WT2WT1WT0Read/读Program/编程(=72uS)SectorErase扇区擦除(=13.1304ms)RecommendedSystemClock跟等待参数对应的推荐系统时钟0116个机器周期30个机器周期5471个机器周期5MHz01011个机器周期60个机器周期10942个机器周期10MHz00122个机器周期120个机器周期21885个机器周期20MHz00043个机器周期240个机器周期43769个机器周期40MHzSTC89C51RC/RD+系列单片机EEPROM空间大小及地址STC89C51RC/RD+系列单片机内部可用EEPROM的地址与程序空间是分开的:程序在用户应用程序区时,可以对EEPROM行IAP/ISP操作。具体某个型号单片机内部EEPROM大小及详细地址请参阅:1.STC89C51RC/RD+系列单片机内部EEPROM详细地址表2.STC89C51RC/RD+系列单片机内部EEPROM空间大小选型一览表STC89C51RC系列单片机内部EEPROM详细地址表具体某型号有多少扇区的EEPROM,参照前面的EEPROM空间大小选型一览表,每个扇区0.5K字节第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000h21FFh2200h23FFh2400h25FFh2600h27FFh第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800h29FFh2A00h2BFFh2C00h2DFFh2E00h2FFFh每个扇区512字节,建议同一次修改的数据放在同一扇区,不是同一次修改的数据放在不同的扇区,不必用满,当然可全用。4.总结在这次毕业设计调试过程中,我碰到很多困难,如时间设置时按键的判断,由于之初程序的问题时间显示不能根据按键的变化而变化,还有跳转指令的使用,导致程序运行时时常进入死循环,修改程序时思考不周全,如整点报时的问题,由于报时时间,导致时间显示时延迟,时钟不够精确。通过本次毕业设计,让我对单片机整体有了一次全面的了解,原来单片机的功能是如此强大,其实学习单片机没有我们想象的那么困难,做完这次毕业设计我直接体会要学会单片机只要我们熟练控制单片机32个I/O输入输出,会对所有功能块的模式存放器和控制存放器进行设置,掌握程序的编写,我们学习的目的就到达了。这次设计使我深刻认识到学习的理论必须用到实际中才能表达它的价值,才能学有所用,也就是所谓理论必须联系实际,这次设计对我查阅资料、程序编写、动手设计、对一些陌生软件的自主学习能力等都有很大的提高。本文采用STC89C51RC单片机用汇编语言进行编程,根本到达了设计的要求,由于设计者学识有限,设计还可以进一步优化和完善,真正实现“智能”时钟。5.参考文献[1]郭天祥新概念51单片机C语言教程——入门、提高、开发、拓展电子工业出版社2009年[2]梅丽凤、王艳秋、汪毓铎、张军单片机原理及接口技术清华大学出版社2006-8[3]李朝青单片机原理及接口技术北京航空航天大学出版社2005-5[4]阎石数字电路技术根底北京高等教育出版社1998[5]童诗白、华成英模拟电子技术根底北京高等教育出版社2001[6]夏路易石宗义电路原理图与电路设计教程Protel99SE[M]北京希望电子出版社2002[7]丁明亮唐前辉单片机原理及应用——基于Keilc与Proteus北京航空航天大学出版社2009-2[8]龚运新单片机C语言开发技术清华大学出版社2006年。[9]孙涵芳MCS-51系列单片机原理及应用[M]北京航空航天大学出版社1996-4[10]陈明荧8051单片机课程设计实训教材清华大学出版社2004年[11]贾好来MCS—51单片机原理及应用机械工业出版社2007年[12]徐江海单片机实用教程机械工业出版社2007年[13]陈海宴51单片机原理及应用——基于Keilc与Proteus北京航空航天大学出版社2010-7[14]刘秀英单片机应用设计200例北京航空航天大学出版社2006年[15]林立张俊亮曹旭东单片机原理及应用:基于Proteus和KeilC电子工业出版社2009-76.致谢经历了近2个月的时间,毕业论文暂告收尾,这也意味着我在北京城市学院的四年的学习生活既将结束。回首既往,自己一生最珍贵的时光能于这样的校园之中,能在众多学富五车、才华横溢的老师们的熏陶下度过,实是荣幸之极。在这几年的时间里,我在学习上和思想上都受益非浅。这除了自身努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的论文的写作是枯燥艰辛而又富有挑战的。在指导老师的谆谆诱导、同学的出谋划策及家长的支持鼓励,是我坚持完成论文的动力源泉。在此,我要感谢我的指导老师,从论文的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从内容到格式,从标题到标点,他都费尽心血。没有老师的辛勤栽培、孜孜教诲,就没有我论文的顺利完成。感谢各位同学,与他们的交流使我受益颇多。最后要感谢我的家人以及我的朋友们对我的理解、支持、鼓励和帮助,正是因为有了他们,我所做的一切才更有意义;也正是因为有了他们,我才有了追求进步的勇气和信心。时间的仓促及自身专业水平的缺乏,整篇论文肯定存在尚未发现的缺点和错误。恳请阅读此篇论文的老师、同学,多予指正,不胜感谢!随着毕业设计的结束,大学生活也即将结束,我也要马上就步入工作岗位,走进社会,在整个毕业设计的过程中所学到的独立阅读,查阅资料,遇到问题通过理论结合实践解决问题,与人沟通研讨的能力是我受益匪浅,会为我以后的踏入社会,参加工作打下坚实的根底,我也会在日后学习和工作中不断的充实和完善自己,以优秀的业绩向母校汇报!附录A:电路原理图附录B:源程序#include<reg51.h>#include<intrins.h>#definedp10charsec,min,h,date=1,mon=1,year=12;charh_ala=0,min_ala=1,sw_ala=1;charflag_set,flag_sw;charcount;sbitnum1=P0^0;sbitnum2=P0^4;sbitnum3=P2^7;sbitnum4=P2^3;sbitnum5=P2^0;sbitnum6=P2^1;sbitbell=P2^2;sbitkey_set=P3^0;sbitkey_sw=P3^1;sbitkey_l=P3^2;sbitkey_down=P3^3;sbitkey_ok=P3^4;sbitkey_up=P3^5;sbitkey_r=P3^6;voidDelay(unsignedintz); voiddisplay_num(charnum,charpo);voiddisplay_sec(void);voiddisplay_min(void);voiddisplay_h(void);voiddisplay_year(void);voiddisplay_mon(void);voiddisplay_date(void);voiddisplay_time(void);voiddisplay_dates(void);voiddisplay_h_ala(void);voiddisplay_min_ala(void);voiddisplay_sw_ala(void);voiddisplay_alarm(void);voiddisplay(void);voidcarry(void);voidkey_swscan(void);voidkey_setscan(void);voidset(void);voidalarm(void);voidInitTimer0(void);#defineRdCommand0x01 //定义ISP的操作命令#definePrgCommand0x02#defineEraseCommand0x03#defineError1#defineOk0#defineWaitTime0x01 //定义CPU等待时间sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;voidISP_IAP_enable(void);voidISP_IAP_disable(void);voidISPgoon(void);unsignedcharbyte_read(unsignedintbyte_addr);voidSectorErase(unsignedintsector_addr);voidbyte_write(unsignedintbyte_addr,unsignedcharoriginal_data);voidread_ala(void);voidrecord_ala(void);voidmain(void){ read_ala(); //读取闹铃 InitTimer0(); //定时器0初始化 while(1) { carry(); //进位 display(); //显示 alarm(); //闹钟 key_swscan(); //切换界面按键扫描 key_setscan(); //设置按键〔改变设置标志位〕扫描 if(flag_set!=0) //设置标志位不为'0',开始设置 { set(); } }}//================延时函数================voidDelay(unsignedintz) { unsignedintx,y; for(x=z;x>0;x--) for(y=120;y>0;y--);}//================显示数字================voiddisplay_num(charnum,charpo){ unsignedcharcodeTab[]={0x77,0x14,0xB3,0xB6,0xD4,0xE6,0xE7,0x34,0xF7,0xF6,0x08}; if(!(num==0&&(po==1||po==3||po==5))||(flag_sw==1&&po==1)) { switch(po) { case1: P1=Tab[num]; num1=0; Delay(1); num1=1; break; case2: P1=Tab[num]; num2=0; Delay(1); num2=1; break; case3: P1=Tab[num]; num3=0; Delay(1); num3=1; break; case4: P1=Tab[num]; num4=0; Delay(1); num4=1; break; case5: P1=Tab[num]; num5=0; Delay(1); num5=1; break; default: P1=Tab[num]; num6=0; Delay(1); num6=1; } }}//================显示秒================voiddisplay_sec(void){ if(flag_set==3&&count>10||flag_set!=3) { display_num(sec/10,5); display_num(sec%10,6); }}//================显示分================voiddisplay_min(void){ if(flag_set==2&&count>10||flag_set!=2) { display_num(min/10,3); display_num(min%10,4); } display_num(dp,4);}//================显示时================voiddisplay_h(void){ if(flag_set==1&&count>10||flag_set!=1) { display_num(h/10,1); display_num(h%10,2); } display_num(dp,2);}//================显示日================voiddisplay_date(void){ if(flag_set==3&&count>10||flag_set!=3) { display_num(date/10,5); display_num(date%10,6); }}//================显示月================voiddisplay_mon(void){ if(flag_set==2&&count>10||flag_set!=2) { display_num(mon/10,3); display_num(mon%10,4); } display_num(dp,4);}//================显示年================voiddisplay_year(void){ if(flag_set==1&&count>10||flag_set!=1) { display_num(year/10,1); display_num(year%10,2); } display_num(dp,2);}//================显示时间================voiddisplay_time(void){ display_sec(); display_min(); display_h();}//================显示日期================voiddisplay_dates(void){ display_date(); display_mon(); display_year();}//================显示闹钟时================voiddisplay_h_ala(void){ if(flag_set==1&&count>10||flag_set!=1) { display_num(h_ala/10,1); display_num(h_ala%10,2); } display_num(dp,2);}//================显示闹钟分================voiddisplay_min_ala(void){ if(flag_set==2&&count>10||flag_set!=2) { display_num(min_ala/10,3); display_num(min_ala%10,4); }}//================显示闹钟开关================voiddisplay_sw_ala(void){ if(flag_set==3&&count>10||flag_set!=3) { display_num(sw_ala,6); }}//================显示闹钟================voiddisplay_alarm(void){ display_h_ala(); display_min_ala(); display_sw_ala();}//================显示各界面================voiddisplay(void){ switch(flag_sw) //判断要显示的界面 { case0: display_time(); break; case1: display_dates(); break; default: display_alarm(); }}//================时间进位================voidcarry(void){ if(count>=20) { count=0; sec++; } if(sec>=60) { sec=0; min++; } if(min>=60) { min=0; h++; } if(h>=24) { h=0; date++; } if(date>=29&&mon==2&&(year%4!=0)) { date=1; mon++; } if(date>=30&&mon==2&&(year%4==0)) { date=1; mon++; } if(date>=31&&(mon==4||mon==6||mon==9||mon==11)) { date=1; mon++; } if(date>=32&&(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)) { date=1; mon++; } if(mon>=13) { mon=0; year++; } if(year>=100) { year=0; }}//================初始化定时器================voidInitTimer0(void){TMOD=0x01;TH0=0x3C; //设置定时器初值,定时时间50msTL0=0x0B0;EA=1;ET0=1;TR0=1;}//================切换界面按键扫描================voidkey_swscan(void){ if(key_sw==0) { Delay(10); if(key_sw==0) { flag_sw++; if(flag_sw>=3) { record_ala(); flag_sw=0; } while(!key_sw); } }}//================设置按键扫描================voidkey_setscan(void){ if(key_set==0) { Delay(10); if(key_set==0) { flag_set++; if(flag_set>=4) { flag_set=0; } while(!key_set); } } if(flag_set!=0) //左右键功能 { if(key_l==0) { Delay(10); if(key_l==0) { flag_set--; if(flag_set<=0) { flag_set=3; } while(!key_l); } } if(key_r==0) { Delay(10); if(key_r==0) { flag_set++; if(flag_set>=4) { flag_set=1; } while(!key_r); } } if(key_ok==0) { flag_set=0; record_ala(); } }}//================时间、闹钟设置================voidset(void){ switch(flag_sw) { case0: //时间界面下 switch(flag_set) { case1: if(key_up==0) //设置时 { Delay(10); if(key_up==0) { h++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { h--; while(!key_down); } } break; case2: //设置分 if(key_up==0) { Delay(10); if(key_up==0) { min++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { min--; while(!key_down); } } break; default: //设置秒 if(key_up==0) { Delay(10); if(key_up==0) { sec++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { sec--; while(!key_down); } } } break; case1: //日期界面下 switch(flag_set) { //设置年 case1: if(key_up==0) { Delay(10); if(key_up==0) { year++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { year--; while(!key_down); } } break; case2: //设置月 if(key_up==0) { Delay(10); if(key_up==0) { mon++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { mon--; while(!key_down); } } break; default: //设置日 if(key_up==0) { Delay(10); if(key_up==0) { date++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { date--; while(!key_down); } } } break; default: //闹钟界面下 switch(flag_set) { case1: //设置闹钟时 if(key_up==0) { Delay(10); if(key_up==0) { h_ala++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { h_ala--; while(!key_down); } } break; case2: //设置闹钟分 if(key_up==0) { Delay(10); if(key_up==0) { min_ala++; while(!key_up); } } if(key_down==0) { Delay(10); if(key_down==0) { min_ala--; while(!key_down); } } break; default: //设置闹开关 if(key_up==0||key_down==0) { Delay(10); if(key_up==0||key_down==0) { sw_ala=!sw_ala; while(!key_up||!key_down); } } } } if(sec<0) { sec=59; } if(sec>=60) { sec=0; } if(min<0) { min=59; } if(min>=60) { min=0; } if(h<0) { h=23; } if(h>=24) { h=0; } if(date<=0&&mon==2&&(year%4!=0)) { date=28; } if(date<=0&&mon==2&&(year%4==0)) { date=29; } if(date<=0&&(mon==4||mon==6||mon==9||mon==11)) { date=30; } if(date<=0&&(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)) { date=31; } if(date>=29&&mon==2&&(year%4!=0)) { date=1; } if(date>=30&&mon==2&&(year%4==0)) { date=1; } if(date>=31&&(mon==4||mon==6||mon==9||mon==11)) { date=1; } if(date>=32&&(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)) { date=1; } if(mon<1) { mon=12; } if(mon>12) { mon=1; } if(year<0) { year=99; } if(year>=100) { year=0; } if(h_ala<0) { h_ala=23; } if(h_ala>=24) { h_ala=0; } if(min_ala<0) { min_ala=59; } if(min_ala>=60) { min_ala=0; } }//================

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论