单片机温度检测课程设计和单片机原理及系统课程设计-基于单片机的电子闹钟设计_第1页
单片机温度检测课程设计和单片机原理及系统课程设计-基于单片机的电子闹钟设计_第2页
单片机温度检测课程设计和单片机原理及系统课程设计-基于单片机的电子闹钟设计_第3页
单片机温度检测课程设计和单片机原理及系统课程设计-基于单片机的电子闹钟设计_第4页
单片机温度检测课程设计和单片机原理及系统课程设计-基于单片机的电子闹钟设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

湖南工程学院课程设计课程名称单片机原理与应用课题名称温度检测设计专业电气工程及其自动化班级电气学号姓名周敏指导教师_______李世军_________20XX年6月25日湖南工程学院课程设计任务书课程名称单片机原理与应用课题温度检测设计专业班级电气学生姓名学号指导老师审批任务书下达日期20**年6月7日任务书完成日期20**年6月25日设计内容与设计要求设计内容:本课题以单片机为核心,实现设计温度的检测。用可调电阻调节电压值(0-5V)作为模拟温度的输入量,当温度低于30度时,发出长嘀声报警和光报警,当温度高于60度时,启动直流电机散热。测量温度范围在0-99度。1、 1路模拟电压输入,电压范围0-5V;2、通过两位LED数码管显示其转换的数字量(00—FFH)3、当其转换的数字量为(00-4DH),则通过发光二极管闪烁报警,当其转换数字量为(9A-FFH)时,启动直流电机散热。设计要求:1)确定系统设计方案; 2)进行系统的硬件设计;3)完成必要的参数计算与元器件选择;4)完成应用程序设计;5)进行单元电路及应用程序的调试;6)写出使用说明书。主要设计条件1、 MCS-51单片机实验操作台1台;2、 PC机及单片机调试软件;3、 单片机应用系统板1套;4、 制作工具1套;5、 系统设计所需的元器件。说明书格式课程设计任务书目录说明书内容1)课题的设计要求、目的、意义2)系统总体方案选择与说明3)系统结构框图与工作原理4)各单元硬件设计说明及计算方法5)软件设计与说明(包括流程图)6)调试结果与必要的调试说明7)使用说明8)程序清单9)总结10)参考文献附录附录A系统原理图附录B程序清单评分表单片机原理及系统课程设计报告PAGE -PAGE26-温度检测设计【摘要】随着科技的不断进步,在工业生产中温度是常用的被控参数,而采用单片机来对这些被控参数进行控制已成为当今的主流。本文介绍了数字温度测量及自动控制系统的设计。本文采用单片机来实现对温度的控制。它的主要组成部分有:AT89C51单片机、温度传感器、显示电路、温度控制电路。它可以实时的显示和设定温度,实现对温度的自动控制。通过测试表明,本设计对温度的控制有方便、简单的特点,从而大幅提高了被控温度的技术指标。目录摘要……………………1第1章、设计目的……………………3第2章、设计思路……………………42.1系统框架图……………………42.2工作原理………4第3章、主元件介绍…………………63.1AT89C51………63.2ADC0808………83.3LED显示器…………………9第4章、系统的主程序设计………114.1系统总流程图.………………114.2系统仿真………12总结…………………13附录…………………14参考文献……………19第1章设计目的温度控制广泛应用于人们的生产和生活中,人们使用温度计来采集温度,通过人工操作加热、通风和降温设备来控制温度,这样不但控制精度低、实时性差,而且操作人员的劳动强度大。即使有些用户采用半导体二极管作温度传感器,但由于其互换性差,效果也不理想。在某些行业中对温度的要求较高,由于工作环境温度不合理而引发的事故时有发生。对工业生产可靠进行造成影响,甚至操作人员的安全。为了避免这些缺点,需要在某些特定的环境里安装数字温度测量及控制设备。本设计由于采用了新型单片机对温度进行控制,以其测量精度高,操作简单。可运行性强,价格低廉等优点,特别适用于生活,医疗,工业生产等方面的温度测量及控制。本设计是一个数字温度测量及控制系统,能测柜内的温度,并能在超限的情况下进行控制、调整,并报警。保证环境保持在限定的温度中第2章设计思路2.1系统框架图利用可调电阻调节电压值(0-5V)作为模拟温度的输入量,当温度低于30度时,发出长嘀声报警和光报警,当温度高于60度时,启动直流电机散热。测量温度范围在0-99度。通过两位LED数码管显示其转换的数字量,同时启动报警系统,如图2-1所示:AT89C51LEDAT89C51LED显示A/D复位电路晶振电路等温度检测电压输入报警系统2.2工作原理(1)、 1路模拟电压输入,电压范围0-5V;(2)、通过两位LED数码管显示其转换的数字量(00—FFH)(3)、当其转换的数字量为(00-4DH),则通过发光二极管闪烁报警,当其转换数字量为(9A-FFH)时,启动直流电机散热。工作原理图如下图所示:LED显示器LED显示器7SEG-MPX4-CAAT89C51ADC0808电位计模拟信号电压输入图2-2工作原理图第3章主要元器件介绍3.1AT89C51AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51?指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器2个全双工串行通信口,片上Flash允许程序存储器在系统可编程,亦适于常规编程器。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。其芯片引脚图如下:图3-1AT89C51引脚图单片机管脚说明(1)VCC:供电电压。(2)GND:接地。(3)P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。(4)P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。(5)P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。(6)P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。(7)P3口也可作为AT89S51的一些特殊功能口,如下表3-1所示:表1-1P3口第二功能P3口引脚第二功能P3.0RXD(串行口输入)P3.1TXD(串行口输出)P3.2INT0(外部中断0输入)P3.3INT1(外部中断1输入)P3.4T0(定时器0外部脉冲输入)P3.5T1(定时器1外部脉冲输入)P3.6WR(外部数据存储器写脉冲输出)P3.7RD(外部数据存储器读脉冲输出)P3口同时为闪烁编程和编程校验接收一些控制信号。(8)XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。XTAL1XTAL2一般是用外接晶振。3.2ADC0808ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。内部结构:ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。引脚功能(外部特性)ADC0808芯片有28条引脚,采用双列直插式封装,如下图所示。图3-2ADC0808引脚图各引脚功能如下:1~5和26~28(IN0~IN7):8路模拟量输入端。8、14、15和17~21:8位数字量输出端。22(ALE):地址锁存允许信号,输入,高电平有效。6(START):A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。7(EOC):A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。12(VREF())和16(VREF(-)):参考电压输入端11(Vcc):主电源输入端。13(GND):地。23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路3.3.LED显示器采用传统的七段数码LED显示器。LED虽然价格便宜,但在现代的许多仪表、各种电子产品中逐渐被LCD所取代。采用LCD液晶屏进行显示。LCD液晶显示器是一种低压、微功耗的显示器件,只要2~3伏就可以工作,工作电流仅为几微安,是任何显示器无法比拟的,同时可以显示大量信息,除数字外,还可以显示文字、曲线,比传统的数码LED显示器显示的界面有了质的提高。在仪表和低功耗应用系统中得到了广泛的应用。优点为:1显示质量高,由于液晶显示器的每一个点收到信号后就一直保持那种色彩和亮度恒定发光,因此液晶显示器的画质高而且不会闪烁。2数字式接口,液晶显示器都是数字式的,和单片机的接口简单操作也很方便。3功率消耗小,相比而言液晶显示器的主要功耗在内部电极和驱动IC上,因而耗电量比其他器件要小很多。虽然LCD显示器的价格比数码管要贵,但它的显示效果好,是当今显示器的主流,所以采用LCD作为显示器第4章系统的主程序设计4.1系统总流程图主程序是系统的监控程序,在程序运行的过程中必须先经过初始化,流程图如图4-1所示。系统在初始化完成后就进入温度测量程序,时实的测量温度并通过显示电路在LCD上显示。程序中以中断的方式来重新设定温度的上下限。根据硬件设定完成对温度的控制。系统软件设计的总流程图如图4-1所示。开始开始系统初始化Int=0?温度上下设定温度测量显示系统温度测量YN4-1系统总体设计流程图4.2系统仿真本设计在Proteus的ISIS7.5sp2或者更高版本的软件环境下打开电路仿真图,如下面图6.1。接下来将设计好的程序在keilC51μVision3开发集成环境上编译成机器语言,生成.hex文件,进入Proteus的ISIS,将keilc下编程生成的.hex文件导入到AT89C51中可在Proteus中单击全速仿真运行按钮,LED显示屏上显示出当前温度传感器的温度值。4-2系统仿真图设计总结经过两个星期的学习,我们从图书馆和网络上查找资料,熟悉题目,设计几套方案并进行比较分析,编程整理设计。虽然时间紧迫,但是我们仍然按时的完成了这次的课程设计,因此对我来说学到的不仅是那些知识,更多的是团队的合作。现在想来,学校安排的课程设计有着他更深层的意义,他不仅仅让我们综合那些理论知识来运用到设计和创新,还让我们知道啦一个团队凝聚在一起时所发挥出的巨大潜能。在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。在此感谢我们的李老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次温度检测设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。附录.源程设计LED_0 EQU 30HLED_1 EQU 31HLED_2 EQU 32HADC EQU 35HTCNTA EQU 36HTCNTB EQU 37HH_TEMP EQU 38H ;温度上限L_TEMP EQU 39H ;温度下限FLAG BIT 00HH_ALM BIT P3.0L_ALM BIT P3.1SOUND BIT P3.7CLOCK BIT P2.4ST BIT P2.5EOC BIT P2.6OE BIT P2.7 ORG 00H SJMP START ORG 0BH LJMP INT_T0 ORG 1BH LJMP INT_T1 START: MOV LED_0,#00H MOV LED_1,#00H MOV LED_2,#00H MOV DPTR,#TABLE MOV H_TEMP,#153 MOV L_TEMP,#77 MOV TMOD,#12H MOV TH0,#245 MOV TL0,#0 MOV TH1,#(65536-1000)/256 MOV TL1,#(65536-1000)MOD256 MOV IE,#8aH CLR C SETB TR0 ;为ADC0808提供时钟WAIT: SETB H_ALM SETB L_ALM CLR ST SETB ST CLR ST ;启动转换 JNB EOC,$ SETB OE MOV ADC,P1 ;读取AD转换结果 CLR OE MOV A,ADC SUBB A,#77 ;判断是否低于下限 JC LALM MOV A,H_TEMP MOV R0,ADC SUBB A,R0 ;判断是否高于上限 JC HALM CLR TR1 LJMP PROCLALM: ;低温报警 CLR L_ALM SETB TR1 CLR FLAG LJMP PROCHALM: ;高温报警 CLR H_ALM SETB TR1 SETB FLAG LJMP PROCPROC: MOV A,ADC ;数值转换 MOV B,#100 DIV AB MOV LED_2,A MOV A,B MOV B,#10 DIV AB MOV LED_1,A MOV LED_0,B LCALL DISP SJMP WAITINT_T0: CPL CLOCK ;提供ADC0808时钟 RETIINT_T1: MOV TH1,#(65536-1000)/256 MOV TL1,#(65536-1000)MOD256 CPL SOUND INC TCNTA MOV A,TCNTA JB FLAG,I1 ;判断是高温警报还是低温警报 CJNE A,#30,RETUNE ;低温警报声 SJMP I2 I1: CJNE A,#20,RETUNE ;高温警报声 I2: MOV TCNTA,#0 INC TCNTB MOV A,TCNTB CJNE A,#25,RETUNE MOV TCNTA,#0 MOV TCNTB,#0 LCALL DELAY2RETUNE: RETI DISP: MOV A,LED_0 ;数码显示子程序 MOVC A,@A+DPTR CLR P2.3 MOV P0,A LCALL DELAY SETB P2.3 MOV A,LED_1 MOVC A,@A+DPTR CLR P2.2 MOV P0,A LCALL DELAY SETB P2.2 MOV A,LED_2 MOVC A,@A+DPTR CLR P2.1 MOV P0,A LCALL DELAY SETB P2.1 RETDELAY: MOV R6,#10D1: MOV R7,#250 DJNZ R7,$ DJNZ R6,D1 RETDELAY2: MOV R5,#20D2: MOV R6,#20D3: MOV R7,#250 DJNZ R7,$ DJNZ R6,D3 DJNZ R5,D2 RETTABLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH END参考文献:[1]张迎新.《单片微型计算机原理、应用及接口技术》[M].国防工业出版社[2]房小翠.《单片机实用系统设计技术》[M].国防工业出版社.1987[3]何立民.《单片机应用系统设计》[M].北航出版社.1997年5月[4]王迎旭.《单片机原理及及应用》[M].机械工业出版社.2004年7月[5]邓重一.《智能数字式温度测量报警系统》[J].电子技术.2004

电气信息学院课程设计评分表项目评价优良中及格差设计方案合理性与创造性(10%)开发板焊接及其调试完成情况*(10%)硬件设计或软件编程完成情况(20%)硬件测试或软件调试结果*(10%)设计说明书质量(20%)答辩情况(10%)完成任务情况(10%)独立工作能力(10%)出勤情况(10%)综合评分指导教师签名:________________日期:________________注:=1\*GB3①表中标*号项目是硬件制作或软件编程类课题必填内容;=2\*GB3②此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。电气信息学院课程设计评分表项目评价优良中及格差设计方案合理性与创造性(10%)开发板焊接及其调试完成情况*(10%)硬件设计或软件编程完成情况(20%)硬件测试或软件调试结果*(10%)设计说明书质量(20%)答辩情况(10%)完成任务情况(10%)独立工作能力(10%)出勤情况(10%)综合评分指导教师签名:________________日期:________________注:=1\*GB3①表中标*号项目是硬件制作或软件编程类课题必填内容;=2\*GB3②此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。单片机原理及系统课程设计评语:考勤(10)守纪(10)过程(40)设计报告(30)答辩(10)总成绩(100)专业:电气工程及其自动化班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院20年3月7日基于单片机的电子闹钟设计摘要本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。关键词:单片机;led;闹钟;定时器AbstractThisdesign,adoptingAT89C51chipasthecorepartwithsomenecessaryperipheralcircuits,isasimpleelectronicclockwhichuses5VDCasthepowersupply.Keywords:singlechipmachine,infixedtimemachine,alarmclock,LED1引言1.1设计目的此次课程设计是在学习先修课程《单片机原理与系统设计》之后,为加强对学生系统设计和应用能力的培养而开设的综合设计训练环节。本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。1.2设计要求结合单片机知识,以AT89C51单片机为核心,利用七段LED数码管实现计时、校时及闹钟功能。1.3设计方法以AT89C51单片机为核心,外加晶振电路,使用8个七段数码管显示,LED采用动态扫描,用74ls245芯片作为驱动电路。通过四个独立按键对时间进行定时、校时,从而实现闹钟提醒功能。2设计方案及原理2.1设计方案选AT89C51单片机作为系统核心,辅助外部产生时钟信号的晶振电路,再加上四个独立按键作为输入信号,使用8个七段数码管显示时间,芯片74ls245为数码管段选线的驱动,最后用蜂鸣器实现闹铃功能。使用单片机的定时器T0计时时间为50ms,计时20次作为1s的时间基准。第一部分,12MHz的晶振连接至单片机的时钟信号输入端;第二部分,四个独立按键加上四个上拉电阻连接至单片机的P1口的低四位;第三部分,单片机的P0口通过由芯片74ls245构成的驱动电路连接至数码管的段选线,单片机的P3口连接至数码管的位选线;第四部分,单片机的P2.1通过一个NPN型三极管连接至蜂鸣器。8个七段数码管使用动态扫描显示时间,独立按键用软件编程实现对时间和闹钟时、分、秒的设置,再通过比较所设置的闹钟与时间是否相等,达到闹铃发出声响的效果。2.2设计原理系统原理图如图2.1所示。ATAT89C51晶振按键段码驱动位码驱动蜂鸣器8位数码管图2.1系统原理图3硬件设计硬件电路分四个模块:晶振电路、键盘电路、数码管显示电路、蜂鸣器驱动电路。晶振电路使用12MHz晶体振荡器,经分频后供单片机工作。键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74ls245来驱动段码,用P3口作位码驱动。发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。系统硬件电路图如图3.1所示。图3.1系统硬件图4软件设计源程序清单见附录。主程序流程图如图4.1所示。图4.1主程序流程图5系统仿真及调试硬件部分设置了的三个按键K1、K2、K3、K4。当按键K1第一次按下时,停止计时进入闹钟1的秒设置,当按键K1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按K1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按K1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按K1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在K1按下的各阶段,可用按键K2、K3进行时间和闹铃时间的时、分、秒进行加减设置;当按键K1第十三次按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。在各个闹钟设置阶段,如果有K4按下,则相应闹钟功能关闭或开启;如在闹铃时有K4按下则提前停止闹铃。系统仿真图如图5.1所示。图5.1系统仿真图6总结通过两周的努力,完成了电子闹钟的设计目的,实现了时间的显示、校时、设置闹钟、闹铃等功能。这期间,我复习了单片机的相关知识,并结合查阅相关资料,设计了整体电路以及各模块的电路,对照硬件电路编写对应模块的子程序,最后将各个子程序整合到一个主程序中,完成了设计所需功能。在设计中,我发现选择合适的元器件很重要,比如数码管有共阳极和共阴极两种,不同的选择会导致程序的不同,经过多次调试最终选择了共阳极数码管。另外,我觉得软件的设计比硬件设计更重要,而且难度更大。比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。我在这次设计中收获颇多。我对所学的理论知识在实践中加深了认识,同时更加熟练掌握了Proteus、Keil等软件的使用。做任何事都需要耐心和细心,一点小的疏忽和懈怠可能导致整个设计失败。还有一点,自己的设计思路不可能凭空产生,只有借鉴别人已有的设计并充分消化吸收成为自己的东西,才能做出更好的设计作品。参考文献[1]王思明.单片机原理及应用系统设计[M].北京:科学出版社,2012.[2]陈明荧.89C51单片机课程设计实训教材[M].北京:清华大学出版社[3]刘瑞新.单片机原理及应用教程[M].北京:机械工业出版社,2005.[4]杨文龙.单片机原理及应用[M].西安:西安电子科技大学出版社,2002.附录源程序清单://****************************头文件********************************#include<reg51.h>#include<intrins.h>//****************************宏定义********************************#defineucharunsignedchar#defineuintunsignedint//****************************位声明********************************sbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitfmq=P2^1; //************************数码管显示的数值**************************ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0 1234 50x82,0xf8,0x80,0x90,0xbf,0x0ff};// 67 89-灭 voidjia();//定义时间加函数voidjian();//定义时间减函数//********************数组定义,数组内含有8个数值******************uchartable1[8],table2[8],table3[8],table4[8];//**************************时间显示初始值**************************ucharshi=12,fen=0,miao=0;//**************************定义全局变量****************************ucharshi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;ucharshi4,fen4,miao4;ucharflag,flag1,wss,cnt,cnt1,alm1,alm2,alm3;//1秒等时位闪次数校时闹1闹2闹3uintflag2;//蜂鸣//*********************延时函数,用于动态扫描数码管*****************voiddelay(uchari){ucharx,y;for(x=i;x>0;x--)for(y=120;y>0;y--);}//*******************************初始化函数*************************voidinit(){TMOD=0x01;//工作方式1 TH0=0x3c;//定时时间为:50ms (65536-50000)/256TL0=0x0b0;//(65536-50000)%256ET0=1;//打开定时器EA=1;//开总中断TR0=1;//启动定时器}//********************显示子函数,用于显示时间数值*****************voiddisplay(){uchari,j;if(cnt!=10||wss==0){table1[0]=miao%10;//分离秒的个位与十位table1[1]=miao/10; } else {table1[0]=table1[1]=11;} if(cnt!=11||wss==0) {table1[3]=fen%10;//分离分的个位与十位table1[4]=fen/10; } else {table1[3]=table1[4]=11;} if(cnt!=12||wss==0) {table1[6]=shi%10;//分离时的个位与十位table1[7]=shi/10; } else {table1[6]=table1[7]=11;}table1[2]=table1[5]=10;j=0x7f;for(i=0;i<=7;i++)//从秒到时的扫描{P3=j; //选通点亮八个数码管P0=table[table1[i]];//显示数值delay(10); //调用延时程序j=_cror_(j,1);//循环右移}}//*******************显示子函数,用于显示定时1时间*****************voiddisplay1(){uchari,j;if(alm1==0){if(cnt!=1||wss==0) {table2[0]=miao1%10;//分离秒的个位与十位table2[1]=miao1/10; } else {table2[0]=table2[1]=11;} if(cnt!=2||wss==0) {table2[3]=fen1%10; //分离分的个位与十位table2[4]=fen1/10; } else {table2[3]=table2[4]=11;} if(cnt!=3||wss==0) {table2[6]=shi1%10; //分离时的个位与十位table2[7]=shi1/10; } else {table2[6]=table2[7]=11;} } else table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;table2[2]=table2[5]=10;j=0x7f;for(i=0;i<=7;i++) //从秒到时的扫描{P3=j; //选通点亮八个数码管P0=table[table2[i]]; //显示数值 delay(10); //调用延时程序j=_cror_(j,1); //循环右移}}//********************显示子函数,用于显示定时2时间******************voiddisplay2(){uchari,j;if(alm2==0){if(cnt!=4||wss==0) {table3[0]=miao2%10;//分离秒的个位与十位table3[1]=miao2/10; } else {table3[0]=table3[1]=11;} if(cnt!=5||wss==0) {table3[3]=fen2%10;//分离分的个位与十位table3[4]=fen2/10; } else {table3[3]=table3[4]=11;} if(cnt!=6||wss==0) {table3[6]=shi2%10;//分离时的个位与十位table3[7]=shi2/10; } else {table3[6]=table3[7]=11;} } else table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;table3[2]=table3[5]=10;j=0x7f;for(i=0;i<=7;i++)//从秒到时的扫描{P3=j;//选通点亮八个数码管P0=table[table3[i]];/显示数值 delay(10);//调用延时程序j=_cror_(j,1);//循环右移}}//***************显示子函数,用于显示定时3时间数值****************//voiddisplay3(){uchari,j;if(alm3==0){if(cnt!=7||wss==0) {table4[0]=miao3%10;//分离秒的个位与十位table4[1]=miao3/10;} else {table4[0]=table4[1]=11;} if(cnt!=8||wss==0) {table4[3]=fen3%10;//分离分的个位与十位table4[4]=fen3/10; } else { table4[3]=table4[4]=11;} if(cnt!=9||wss==0) {table4[6]=shi3%10;//分离时的个位与十位table4[7]=shi3/10; } else { table4[6]=table4[7]=11;}}else table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;table4[2]=table4[5]=10;j=0x7f;for(i=0;i<=7;i++)//从秒到时的扫描{P3=j;//选通点亮八个数码管P0=table[table4[i]];//显示数值 delay(10);//调用延时程序j=_cror_(j,1);//循环右移}}//***********************时间子函数*****************************//voidshijian(){if(flag>=20)//判断是否到一秒{wss=~wss; flag=0; //到了,则标志位清零 if(cnt1!=0) {miao4++;//秒加1if(miao4>59)//判断秒是否到60s{miao4=0;//到了,则清零fen4++;//分加1if(fen4>59)//判断分是否到1min{fen4=0;//到了,则清零shi4++;//时加1if(shi4>23)//判断时是否到24hshi4=0; //到了,则清零 } }} else{miao++;//秒加1if(miao>59)//判断秒是否到60s{miao=0;//到了,则清零fen++;//分加1if(fen>59)//判断分是否到1min{fen=0;//到了,则清零shi++;//时加1if(shi>23)//判断时是否到24hshi=0; //到了,则清零 } }}}}//**************************键盘扫描子函数************************//voidkey_scan(){if(key1==0){while(!key1)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();}//key1按了1、2、3次,调用闹钟1子程序 if(cnt==4||cnt==5||cnt==6){display2();}//key1按了4、5、6次,调用闹钟2子程序 if(cnt==7||cnt==8||cnt==9){display3();}//key1按了7、8、9次,调用闹钟3子程序 if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}//key1按了10、11、12、13次,调用计时子程序}cnt++;//记下按键key1按下的次数 if(cnt==10&&cnt1==0) {miao4=miao; fen4=fen; shi4=shi; cnt1++; } if(cnt==13) {cnt=0; if(cnt1==1) {miao=miao4; fen=fen4; shi=shi4; } cnt1=0; }}if(key2==0)//判断key2是否按下{while(!key2)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}}jia();//调用加1子函数}if(key3==0)//判断key3是否按下{while(!key3)//防止掉显{if(cnt==1||cnt==2||cnt==3){display1();} if(cnt==4||cnt==5||cnt==6){display2();} if(cnt==7||cnt==8||cnt==9){display3();} if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13){display();}}jian(); //调用减1子函数} if(key4==0) //判断key4是否按下 {while(!key4) //防止掉显 {if(cnt==1||cnt==2||cnt==3) {alm1=~alm1; display1(); } if(cnt==4||cnt==5||cnt==6) {alm2=~alm2; display2(); } if(cnt==7||cnt==8||cnt==9) {alm3=~alm3; display3(); } if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13) display(); } }}//****************************加1子函数***************************voidjia(){if(cnt==1) //判断key1按下的次数是否为1{miao1++; //是,则秒加1if(miao1>59) //判断秒是否大于60,是,则秒清零miao1=0;}if(cnt==2) //判断key1按下的次数是否为2{fen1++; //是,则分加1if(fen1>59)//判断分是否大于60fen1=0;//是,则分清零}if(cnt==3)//判断key1按下的次数是否为3{shi1++;//是,则时加1if(shi1>23)//判断时是否大于23shi1=0;//是,则时清零}if(cnt==4)//判断key1按下的次数是否为4{miao2++;//是,则秒加1if(miao2>59)//判断秒是否大于60,是,则秒清零miao2=0;}if(cnt==5)//判断key1按下的次数是否为5{fen2++;//是,则分加1if(fen2>59)//判断分是否大于60fen2=0;//是,则分清零}if(cnt==6)//判断key1按下的次数是否为6{shi2++;//是,则时加1if(shi2>23)//判断时是否大于23shi2=0;//是,则时清零}if(cnt==7)//判断key1按下的次数是否为7{miao3++;//是,则秒加1if(miao3>59)//判断秒是否大于60,是,则秒清零miao3=0;}if(cnt==8)//判断key1按下的次数是否为8{fen3++;//是,则分加1if(fen3>59)//判断分是否大于60fen3=0;//是,则分清零}if(cnt==9)//判断key1按下的次数是否为9{shi3++;//是,则时加1if(shi3>23)//判断时是否大于23shi3=0;//是,则时清零}if(cnt==10)//判断key1按下的次数是否为10{miao++;//是,则秒加1if(miao>59)//判断秒是否大于60,是,则秒清零miao=0; cnt1++;}if(cnt==11)//判断key1按下的次数是否为11{fen++;//是,则分加1if(fen>59)//判断分是否大于60fen=0;//是,则分清零 cnt1++;}if(cnt==12)//判断key1按下的次数是否为12{shi++;//是,则时加1if(shi>23)//判断时是否大于23shi=0;//是,则时清零 cnt1++;}}//***************************减1子函数**************************//voidjian(){if(cnt==1) //判断key1按下的次数是否为1,是则秒减1{miao1--;if(miao1==255) //判断秒是否减到255,是,则秒置59miao1=59;}if(cnt==2) //判断key1按下的次数是否为2,是则分减1{fen1--;if(fen1==255)//判断分是否减到255,是,则分置59fen1=59;}if(cnt==3)//判断key1按下的次数是否为3,是则时减1{shi1--;if(shi1==255)//判断时是否减到255,是,则时置23shi1=23;}if(cnt==4)//判断key1按下的次数是否为4,是则秒减1{miao2--;if(miao2==255)//判断秒是否减到255,是,则秒置59miao2=59;}if(cnt==5)//判断key1按下的次数是否为5,是则分减1{fen2--;if(fen2==255)//判断分是否减到255,是,则分置59fen2=59;}if(cnt==6)//判断key1按下的次数是否为6,是则时减1{shi2--;if(shi2

温馨提示

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

最新文档

评论

0/150

提交评论