学位论文-—基于单片机数字式时钟设计.doc
学 号: 201430110134单片机原理及接口技术课 程 设 计题 目基于单片机数字式时钟设计教 学 院专 业班 级姓 名指导教师 2016 年03月11日20152016学年第2学期课程设计任务书设计名称:单片机原理及接口技术班级:机械制造与自动化(专)2014(1)班地点: K1-312一、课程设计目的单片机原理及接口技术课程设计是机械设计制造及其自动化专业的一门重要的专业实践课程。本课程设计是学生在电子技术基础、算法语言、单片机应用系统设计与制作等专业理论课程之后,所进行的一个重要的实践性教学环节。它要求学生综合运用上述各专业理论课程、先修的有关专业基础理论课程和实践知识,进行单片机系统的设计工作,使学生掌握单片机接口的方法和原理,具备一定的单片机应用开发的实践能力。通过设计训练达到下述目的: 巩固和深化有关电子技术基础、算法语言、单片机应用系统设计与制作等专业理论课程的理论知识。 运用所学知识,进一步提高对单片机系统分析、设计及使用技术资料的能力。 培养学生运用所学知识和技能,独立分析和解决生产中的实际控制对象的能力。 培养学生运用计算机软件进行开发、设计能力。二、课程设计内容本课程设计课题可根据单片机原理及接口技术教学大纲具体实施情况,选定与生产控制相关的设计课题,以充分锻炼学生理论联系实际的能力,亦可从下设计课题中选取。1. 基于单片机设计数字式时钟。2. 基于单片机的直流电机调速设计3. 基于8051单片机实现步进电机控制。4. 基于单片机的DS18B20数字温度计的设计5. 基于单片机的LCD电子万年历6. 基于单片机的交通灯控制系统设计7. 基于单片机的变频器控制在课程设计过程开始,讲授文献资料检索方法,并初步介绍总体设计思路,引导学生掌握设计中用到的硬件(主要芯片)、软件设计的方法、软硬件调试的技巧,采用集中引导与个别辅导完成课程设计,达到课程设计的目的。三、进度安排设计内容及学时分配如下:布置任务、准备参考资料 (0.5工作日)原理图设计及绘制 (2工作日)程序设计 (3工作日)软硬件调试 (2.5工作日)撰写设计说明书 (1.5工作日)答辩 (0.5工作日)四、基本要求学生在教师指导下,完成一个单片机应用系统。基本要求如下:1. 给出你设计的系统的目的、用途、功能。2. 给出硬件设计思想和电原理图(PROTEL 99 SE 格式)。3. 详细说明如何使用硬件单元。4. 给出软件设计思想及软件流程。5. 详细说明软件功能。6. 系统测试过程及测试数据。7. 分析相应的指标参数。8. 设计所需的全部资源。9. 成员分工和工作情况。10. 总结在整个过程中出现的问题及解决的方案。11. 总结团队合作的心得体会。12. 总结课程设计的心得体会。13. 对该课程改革的建议。14. 撰写设计说明书。2016-2-25目 录目录1第1章 课程设计要求及来源21.1课程设计要求21.2 课题来源2第2章 MCS-51单片机的知识介绍32.1 单片机介绍32.2 单片机的中断与定时系统32.2.1 MCS-51单片机中断系统32.2.2 MCS-51单片机的定时器/计数器52.2.3控制引脚5第3章 数字钟原理图元件清单及设计方案73.1 时钟电路原理图73.2 单片机最小系统73.3 显示器工作原理83.4 元器件83.5设计方案与实现9第4章 电路的硬件设计104.1 数字钟硬件框图104.2 程序整体设计114.3数字钟的操作11第5章 数字钟的工作原理介绍125.1 实现时钟计时的基本方法125.2 数字钟的时间显示125.3 键盘/显示125.4仿真结果13第6章软件设计与源程序代码146.1软件选择与介绍146.1.1 软件介绍146.1.2 该软件的特点:146.2源程序代码15第7张 结论与总结27参考文献28第1章 课程设计要求及来源1.1课程设计要求设计一数字钟实现以下功能:1 具有时、分、秒计数显示功能,以24小时循环计时。2 具有校时功能可以分别对时及分进行单独校时使其校正到标准时间并能对计时清零。1.2 课题来源在日常生活和工作中,我们常常用到定时控制,如扩印过程中的曝光定时等。早期常用的一些时间控制单元都使用模拟电路设计制作的,其定时准确性和重复精度都不是很理想,现在基本上都是基于数字技术的新一代产品,随着单片机性能价格比的不断提高,新一代产品的应用也越来越广泛,它功能强大,体积小,质量轻,灵活好用,配以适当的接口芯片,可以构造各种各样、功能各异的微电子产品。 随着电子技术的飞速发展,家用电器和办公电子设备逐渐增多,不同的设备都有自己的控制器,使用起来很不方便。根据这种实际情况,设计了一个单片机多功能时间系统,它可以避免多种控制器的混淆,利用一个控制器对多路电器进行控制,同时又可以进行时钟校准,可以任意设置时间。第2章 MCS-51单片机的知识介绍2.1 单片机介绍51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。图2.1 8051内部结构2.2 单片机的中断与定时系统2.2.1 MCS-51单片机中断系统中断是一项重要的计算机技术,采用中断技术可以使多项任务共享一个资源,所以中断技术实质上就是一种资源共享技术。MCS-51是一个多中断源的单片机,以80C51为例,有三类共五个中断源,分别是外部中断两个,定时中断两个和串行中断一个。1. 外中断:外中断是由外部原因引起的,共有两个中断源,即外部中断0和外部中断1。它们的中断请求信号分别由引脚INT0(P3.2)和INT1(P3.3)引入。2. 定时中断:定时中断是为满足定时或计数的需要而设置的。3. 串行中断:串行中断是为串行数据传送的需要而设置的。中断控制:这里所说的中断控制是指提供给用户使用的中断控制手段,实际上就是一些专用寄存器。在MCS-51单片机中,用于此目的的控制寄存器共有四个,即定时器控制寄存器、中断允许控制寄存器、中断优先控制寄存器以及串行口控制寄存器。1. 定时器控制寄存器(TCON)该寄存器用于保存外部中断请求和以及定时器的计数溢出。寄存器地址88H,位地址8FH88H。这个寄存器既有定时器/计数器的控制功能又有中断控制功能,其中与中断有关的控制位共六位:IE0和IE1 、IT0和IT1 以及TF0和TF1 。表2.2.1位地址8F8E8D8C8B8A8988位符号TF1TR1TF0TR0IE1IT1IE0IT02. 中断允许控制寄存器(IE) 寄存器地址A8H,位地址AFHA8H。其中与中断有关的控制位共六位:EA、EX0和EX1 、ET0和ET1 、ES。表2.2.2位地址AFAEADACABAAA9A8位符号EAESET1EX1ET0EX03. 中断优先级控制寄存器(IP)MCS-51的中断优先级控制只定义了高、低两个优先级。IP寄存器地址B8H,位地址为BFHB8H。寄存器的内容及位地址表示如下:表2.2.3位地址BFBEBDBCBBBAB9B8位符号PSPT1PX1PT0PX0PX0 外部中断0优先级设定位PT0 定时中断0优先级设定位PX1 外部中断1优先级设定位PT1 定时中断1优先级设定位中断响应:中断响应就是对中断源提出的中断请求的接受,是在中断查询之后进行的,当查询到有效的中断请求时,紧接着就进行中断响应。中断返回:中断响应后就转去执行中断服务程序,完成所需要的操作。中断服务程序的最后一条指令必须是中断返回指令RETI,CPU执行这条指令时,把响应中断时置位的优先级触发器复位,再从堆栈中弹出断点地址送入程序计数器PC,以便从断点处重新执行被中断的主程序。2.2.2 MCS-51单片机的定时器/计数器MCS-51单片机共有两个可编程的定时器/计数器,分别称定时器/计数器0和定时器/计数器1。它们都是十六位加法计数结构,分别由TH0和TL0及TH1和TL1两个8位计数器组成。1. 计数功能:所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。2. 定时功能:定时功能也是通过计数器的计数来实现的。不过此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲。也就是每个机器周期计数器加1。2.2.3控制引脚(1) RST/VPD(9脚):复位与备用电源。(2) ALE/PROG*(30脚):第一功能ALE为地址锁存允许,可驱动8个LS型TTL负载。PROG*为本引脚的第二功能。(3) PSEN* (29脚):读外部程序存储器的选通信号。可以驱动8个LS型TTL负载。(4) EA*/VPP (Enable Address/Voltage Pulse of Programing,31脚) EA*为内外程序存储器选择控制端。 EA*=1,访问片内程序存储器,但在PC(程序计数器)值超过0FFFH(对于8051、8751)时,即超出片内程序存储器的4K字节地址范围时,将自动转向执行外部程序存储器内的程序。对89C51,加在VPP脚的编程电压为+12V或+5V。2.2.3 I/O口引脚(1) P0口:双向8位三态I/O口,此口为地址总线及数据总线分时复用口,可驱动8个LS型TTL负载。(2) P1口:8位准双向I/O口,可驱动4个LS型TTL负载。(3) P2口:8位准双向I/O口,与地址总线复用,可驱动4个LS型TTL负载。(4) P3口:8位准双向I/O口,双功能复用口,可驱动4个LS型TTL负载。要特别注意准双向口与双向三态口的差别。当3个准双向I/O口作输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻的“浮空”状态。图2.2 AT89C51引脚图第3章 数字钟原理图元件清单及设计方案3.1 时钟电路原理图图3-1 时钟电路原理图3.2 单片机最小系统单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。下面给出一个51单片机的最小系统电路图。图3-2 最小系统电路图复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。晶振电路:典型的晶振取11.0592MHz/12MHz特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。3.3 显示器工作原理系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线。动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。3.4 元器件单片机,晶振,电容,按键,排阻,数码管,蜂鸣器,三极管。如表3.4元件名称规格型号数量(个)单片机AT89C511晶振11.0592MHz1电容30pF2电容22F1按键BUTTON4排阻RESPACK-8/10K1数码管7SEG-MPX6-CC1蜂鸣器BUZZER1三极管PNP1表3.4 电子钟元器件清单3.5设计方案与实现本课题采用软件程序设计的方案,利用MCS51内部的定时/计数器进行中断定时,LED数码显示器和按键,配合软件延时实现时、分、秒的计时。a、软件流程及储器地址分配: 主程序:初始化与按键监控。 计时子程序:为定时器1中断服务子程序,完成刷新计时缓冲区的功能。 时间设置:由按键输入设置当前时间。 显示:完成6位动态显示。 按键扫描: 判断是否有键按下,并取键号。(6)其它辅助子程序,如按键设置、显示、延时等。b、完成功能: 时间显示: 上电后系统自动进入时钟显示从00:00:00开始计时,此时可以设定当前时间。 时间调整:按下k1键,系统停止计时,进入设定状态,系统保持原有显示,等待键入当前时间,按下k2,k3键可以顺序设置时、分,并在相应数码管上显示设置值,直至6位设置完毕,放开k4开始计时显示。第4章 电路的硬件设计4.1 数字钟硬件框图1、数字钟的构成:振荡器、分频器、计数器、译码器、显示器等几部分。2、数字钟的时、分、秒实际上就是由一个24进制计数器(00-23),两个60进制计数器(00-59)级联构成。3、60进制计数器的设计;4、24进制计数器的设计;5、计数器的级联设计。 图4.1 数字钟硬件框图6.数字钟设计要点:EWB软件本身提供任意频率的时钟,因此振荡器、分频器不需设计;另外EWB软件也带有内置译码驱动的数码管,故此译码器和显示器也不需设计。 图4.2 数字钟设计4.2 程序整体设计定时模块,显示模块,数据调整模块,状态调整模块。 (1)总体介绍:此部分主要介绍定时模块,和显示模块。定时部分采用经典的定时器定时。它实现了数字钟的主要部分,和秒表的主要部分,以及产生报时信号,定时设置。显示模块是实现数字钟的又一重要部分,其模块的的独立程度直接影响到数字钟的可视化程度。(2)数据调整:数据调整有多种方式。方式一,比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度。如果采用二的方式,就不会出现这种情况。(4)定时准确性的讨论:程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔0.1秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时间就造成了定时器定时的误差。(5)软件消抖:消抖可以采用硬件的方式,也可以采用软件的方式。软件消抖有定时器定时,和利用延时子程序两种方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。4.3数字钟的操作按键KEY0状态1: KEY0=k-0,调整数字钟的秒数据,每按一次加1秒。状态2: KEY0=k-1, 调整数字钟的分数据,每按一次加1分。状态3: KEY0=k-2,调整数字钟的时数据,每按一次加1时。状态4: KEY0=k-3,设置按键,按一次时间为停止状态,时间设好后再按一次时间即按设好的时间开始。第5章 数字钟的工作原理介绍5.1 实现时钟计时的基本方法利用MCS-51系列单片机的可编程定时/计数器、中断系统来实现时钟计数。(1) 计数初值计算:把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。(2) 采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);(3) 从秒到分和从分到时的计时是通过累加和数值比较实现。5.2 数字钟的时间显示电子钟的时钟时间在六位数码管上进行显示,因此,在内部RAM中设置显示缓冲区共8个单元。LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED137H 36H 35H 34H 33H 32H 31H 30H时十位 时个位 分隔 分十位 分个位 分隔 秒十位 秒个位5.3 键盘/显示AT89C51的P0口和P2口外接由八个LED数码管(LED8LED1)构成的显示器,用P0口作LED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接四个按键A、B构成键盘电路。 图5.1按键电路图5.4仿真结果图5.2数字钟的时间显示第6章软件设计与源程序代码6.1软件选择与介绍6.1.1 软件介绍Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,您不需要别的,Proteus为您建立了完备的电子设计开发环境!Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。Proteus 产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。6.1.2 该软件的特点: 全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。 具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。 支持大量的存储器和外围芯片。总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。 (1)proteus的工作过程 运行 proteus的ISIS程序后,进入该仿真软件的主界面。在工作前,要设置view菜单下的捕捉对齐和system下的颜色、图形界面大小等项目。通过工具栏中的p(从库中选择元件命令)命令,在pick devices窗口中选择电路所需的元件,放置元件并调整其相对位置,元件参数设置,元器件间连线,编写程序;在source菜单的Define code generation tools菜单命令下,选择程序编译的工具、路径、扩展名等项目;在source菜单的Add/remove source files命令下,加入单片机硬件电路的对应程序;通过debug菜单的相应命令仿真程序和电路的运行情况。 (2)Proteus软件所提供的元件资源 Proteus 软件所提供了30多个元件库,数千种元件。6.2源程序代码#include<reg51.h> /头文件 定义单片机内部寄存器#define uchar unsigned char/宏定义 缩写成uchar#define uint unsigned int/宏定义 缩写成uint/数码管位端口定义sbit w1=P22;sbit w2=P23;sbit w3=P24;sbit w4=P25;sbit w5=P26;sbit w6=P27;/按键/sbit key1=P34;/设置时间sbit key2=P35;/加sbit key3=P36;/减sbit key4=P37;/闹钟sbit beep=P10;/蜂鸣器/共阴数码管段信号编码/uchar code table10=/0-90xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6;/uchar num,miao,fen,shi;/计时 时分秒变量uchar fen1,shi1;/闹钟变量uchar d1,d2,d3,d4,d5,d6;/显示拆分数据void delay(uint ms)/1ms 延时函数 数据保持用的括号里面是几大概就延时多少msuchar x;for(ms;ms>0;ms-)for(x=110;x>0;x-);void display()/显示函数d1=shi/10;/小时d2=shi%10;/d3=fen/10;/d4=fen%10;/分钟d5=miao/10;/d6=miao%10;/秒w1=0;P0=tabled1;delay(10);/第1位显示数据P0=0x00;w1=1;/关闭显示消除动态扫描阴影w2=0;P0=tabled2|0x01;delay(10);/第2位显示数据P0=0x00;w2=1;/关闭显示消除动态扫描阴影w3=0;P0=tabled3;delay(10);/第3位显示数据P0=0x00;w3=1;/关闭显示消除动态扫描阴影w4=0;P0=tabled4|0x01;delay(10);/第4位显示数据P0=0x00;w4=1;/关闭显示消除动态扫描阴影w5=0;P0=tabled5;delay(10);/第5位显示数据P0=0x00;w5=1;/关闭显示消除动态扫描阴影w6=0;P0=tabled6;delay(10);/第6位显示数据P0=0x00;w6=1;/关闭显示消除动态扫描阴影void disp_set()/显示函数d1=shi1/10;/小时d2=shi1%10;/d3=fen1/10;/d4=fen1%10;/分钟w1=0;P0=tabled1;delay(10);/第1位显示数据P0=0x00;w1=1;/关闭显示消除动态扫描阴影w2=0;P0=tabled2|0x01;delay(10);/第2位显示数据P0=0x00;w2=1;/关闭显示消除动态扫描阴影w3=0;P0=tabled3;delay(10);/第3位显示数据P0=0x00;w3=1;/关闭显示消除动态扫描阴影w4=0;P0=tabled4|0x01;delay(10);/第4位显示数据P0=0x00;w4=1;/关闭显示消除动态扫描阴影w5=0;P0=table0;delay(10);/第5位显示数据P0=0x00;w5=1;/关闭显示消除动态扫描阴影w6=0;P0=table0;delay(10);/第6位显示数据P0=0x00;w6=1;/关闭显示消除动态扫描阴影void didi()/滴滴声 设置时间时调用uchar i;beep=0;for(i=0;i<5;i+)display(); /开启蜂鸣器 保持响声beep=1;for(i=0;i<5;i+)display(); /关闭蜂鸣器 保持关闭void didi1()/滴滴声 设置闹钟时调用uchar i;/在括号里调用显示函数也是起到延时作用 为了防止下响声音的时候数码管抖动beep=0;for(i=0;i<5;i+)disp_set();/开启蜂鸣器 保持响声beep=1;for(i=0;i<5;i+)disp_set();/关闭蜂鸣器 保持关闭void keyscan()/调时按键扫描函数uchar k_flag,set_flag;if(key1=0)/按键按下 一下所有按键执行的模式都是一样的delay(10);/延时消除按键抖动if(key1=0)/确定按键按下k_flag=1;didi();/滴滴声while(key1=0)display();/等待按键松手while(k_flag=1)/开始调整小时数据display();if(key1=0)delay(10);/延时消抖if(key1=0)k_flag=2;didi();/滴滴声while(key1=0)display();if(key2=0)delay(10);if(key2=0)shi+;didi();/滴滴声if(shi=24)shi=0;while(key2=0)display();if(key3=0)delay(10);if(key3=0)if(shi=0)shi=24; shi-;didi();/滴滴声while(key3=0)display();while(k_flag=2)/开始调整分钟数据display();if(key1=0)delay(10);/延时消抖if(key1=0)k_flag=3;didi();/滴滴声while(key1=0)display();if(key2=0)delay(10);if(key2=0)fen+;didi();/滴滴声if(fen=60)fen=0;while(key2=0)display();if(key3=0)delay(10);if(key3=0)if(fen=0)fen=60; fen-;didi();/滴滴声while(key3=0)display();while(k_flag=3)/开始调整秒数据display();if(key1=0)delay(10);/延时消抖if(key1=0)didi();/滴滴声didi();/滴滴声k_flag=0;while(key1=0)display();if(key2=0)delay(10);if(key2=0)didi();/滴滴声miao+;if(miao=60)miao=0;while(key2=0)display();if(key3=0)delay(10);if(key3=0)didi();/滴滴声if(miao=0)miao=60; miao-;while(key3=0)display();/设置定时时间/if(key4=0)delay(10);if(key4=0)didi1();/滴滴声set_flag=1;while(key4=0)disp_set();while(set_flag=1)disp_set();if(key2=0)delay(10);if(key2=0)didi1();/滴滴声shi1+;if(shi1=24)shi1=0;while(key2=0)disp_set();if(key3=0)delay(10);if(key3=0)didi1();/滴滴声if(shi1=0)shi1=24;shi1-;while(key3=0)disp_set();if(key4=0)delay(10);if(key4=0)didi1();/滴滴声set_flag=2;while(key4=0)disp_set();while(set_flag=2)disp_set();if(key2=0)delay(10);if(key2=0)didi1();/滴滴声fen1+;if(fen1=60)fen1=0;while(key2=0)disp_set();if(key3=0)delay(10);if(key3=0)didi1();/滴滴声if(fen1=0)fen1=60;fen1-;while(key3=0)disp_set();if(key4=0)delay(10);if(key4=0) didi1();didi1();/滴滴声set_flag=0;while(key4=0)disp_set();void b_s()/报时uchar i;if(shi>=7)&&(shi<=20) /七点到晚上八点/整点报时,蜂鸣器提示音if(fen=0)&&(miao<=15) /整点报时15S 需要更改 可以自己下载程序改动beep=0;for(i=0;i<5;i+)display();/开启蜂鸣器 保持响声beep=1;for(i=0;i<5;i+)display();if(shi1!=0)|(fen1!=0)/都等于0的时候不是闹钟时间if(shi1=shi)&&(fen1=fen)&&(miao<=15)/闹钟报时15S 需要更改 可以自己下载程序改动beep=0;for(i=0;i<5;i+)display();/开启蜂鸣器 保持响声beep=1;for(i=0;i<5;i+)display();/关闭蜂鸣器保持关闭void main()TMOD=0x01;/定时器0 16位计时模式TH0=(65536-50000)/256; /50ms定时TL0=(65536-50000)%256; /50ms定时EA=1;/开启总中断ET0=1;/开启定时器中断TR0=1;/开启定时器while(1)display();/显示函数keyscan();/按键扫描函数b_s();/报时void T0_time() interrupt 1TH0=(65536-50000)/256; /50ms定时TL0=(65536-50000)%256; /50ms定时num+;/加一次50ms定时if(num=20)/1Snum=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;