创设报告-多功能电子时钟

更新时间:2024-07-07 13:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

浦江学院

创新课程设计报告

( 2013 — 2014 学年 第 一 学期)

课程名称: 创新课程设计____ 班 级: 浦电子1004 学 号: P1402080416 姓 名:黄亦青 指导教师:武晓光

2013 年 12 月

I

摘 要

近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强、体积小、功耗低、价格便宜、工作可靠、使用方便等特点,因此特别适合与控制有关的系统,越来越广泛地自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电气等各个领域。单片机往往是作为一个核心部件来使用,再根据具体硬件结构以及针对具体应用对象特点的软件结合,以作完善。本设计是一个基于AT89C52系列单片机为核心的数码时钟,结合相关的元器件(共阴极数码管显示器,NPN三极管驱动,蜂鸣器等)在配以相应的软件,它具有时、分、秒显示功能,而且时、分、秒可调;另外,还有定时及定点报时的功能。本设计利用KEIL编程软件对数字钟程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。此次设计电子数字时钟是为了了解电子数字钟的原理,从而学会了制作数字电子钟。而且通过电子数字钟的设计进一步了解了C51单片机的原理及使用方法

【关键字】数字钟;AT89S52单片机; KEIL;

II

目录

摘 要 ...................................................................... II 目录 ..................................................................... IIII 1、绪论 ..................................................................... 1

1.1设计目的 ............................................................. 1 1.2内容和要求 ........................................................... 1 2、系统总方案设计 ........................................................... 2

2.1 硬件设计要求 ........................................................ 2 2.2单片机最小系统 ....................................................... 2 2.3温湿度采集模块 ....................................................... 5 2.4红外遥控模块 ......................................................... 8 2.5语音模块 ............................................................. 9 2.6时钟模块 ............................................................. 9 2.7液晶显示模块 ........................................................ 11 3、软件设计 ................................................................ 13 4、心得体会 ............................................................... 134 参考文献 ................................................................... 14 附录: ..................................................................... 16

III

单片机课程设计

1、绪论

1.1设计目的

(1) (2) (3)

掌握一门设计语言——keil语言,并会灵活运用相关软件。 了解AT89S52单片机芯片的功能。

学会电路板软硬件的调试以及仿真软件的运用。

1.2、内容和要求

本设计是基于单片机上的多功能电子时钟,系统由51单片机最小系统、显示模块、按键模块、电源指示模块、蜂鸣器电路等组成。在Keil uvision4基础上完成系统软件设计的程序的编写,并进行编译调试。在proteus环境下对系统设计进行仿真。在单片机的开发板上实现上述功能。

数字时钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力.

1

单片机课程设计

2、系统总方案设计

本系统主要由电源模块、AT89S52单片机、时钟模块、液晶显示模块、语音模块、温湿度采集模块、红外遥控模块组成。上电之后,通过时钟模块,在液晶显示屏上显示年、月、日、时、分、秒、温度、湿度,用红外遥控通过语音模块播报时间和温湿度。

2.1 硬件设计要求

根据以上的要求可以分为以下几个电路 温湿度采集模块 单 语音模块 片 机

红外遥控模块 时钟模块

液晶显示模块 2.1.1单片机最小系统

本次设计中单片机最小系统中所用到的芯片是AT89S52,最小系统中有时钟电

路、复位电路。

2

单片机课程设计

图1 单片机最小系统

图2单片机引脚图

VCC:供电电压。GND/VSS:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低

3

单片机课程设计

电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:

P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输

4

单片机课程设计

出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

2.1.2温湿度采集模块

用新型的集成温湿度传感器检测温度、湿度,将温度、湿度信号通过传感器进行信号的采集并穿换成数字信号,再通过单片机进行数据的分析处理,并在液晶屏上显示当前的温湿度。

图3温湿度采集模块

根据设计需求,本设计采用的传感器是DH11温湿度传感器。

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期

5

单片机课程设计

稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

单片机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待开始信号结束后,DHT11发送响应信号,送出数据,并触发一次信号采集,可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低俗模式。

数据格式:

8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和

数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”所得结果的末8位。

图4通讯过程

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

6

单片机课程设计

图5 通讯过程

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

图6数字0信号表示方法

图7字1信号表示方法

7

单片机课程设计

图8DHT11引脚说明

2.1.3红外遥控模块

红外遥控模块由发射和接受两大部分组成。

遥控用的红外发射传感器为了在无线传输过程中免收其他红外信号的干扰,通常将红外遥控信号调制在特定的载波频率上,再由红外发光二极管发射出去,红外接收装置则会滤除其他杂波只接收该特定频率的信号并将其还原成二进制脉冲码。

通常,红外遥控中所采用的编码方式有三种: 1)FSK(移频键控)方式

移频键控方式有两种不同的脉冲频率分别表示二进制数的“0”和“1”,下图是用移频键控方式对“0”和“1”进行编码的示意图。

图9移频键控方式

2)PPM(脉冲位置编码)方式

在脉冲位置编码方式下,每一位二进制数所张勇的时间是一样的,只是传号脉冲的位置有所不同。空号在前、传号在后的表示“1”,传号在前,空号在后的表示“0”。下图是采用脉冲位置编码方式对“0”和“1”进行编码的示意图。

图10冲位置编码方式

8

单片机课程设计

3)PWM(脉冲宽度编码)方式

脉冲宽度编码方式是根据传号脉冲的宽度来区别二进制数的“0”和“1”。 传号脉冲宽的是“1”,传号脉冲窄的是“0”,而每位二进制数之间则用等宽的空号来进行分隔。下图是用脉冲宽度编码方式对“0”和“1”进行编码的示意图。

图11脉冲宽度编码方式

三个引脚的接收头一般是集接收、放大、解调的一体头,一般红外信号经接收头解调后,数据“0”和“1”的区别通常体现在高低电平的时间长短或信号周期上,单片机解码时,通常将接收头输出脚接到单片机的外部中断,结合定时器判断外部中断间隔的时间从而获取数据。

当遥控器某个操作按键按下,单片机先读出键值,然后根据键值设定遥控码的脉冲个数。再调制成特定方波由红外发射管发射出去。在红外线接收器输出脉冲帧数据时,第1位码的低电平将启动中断程序,实时接收数据帧。在数据帧接收时,将对第1位码的码宽进行验证:若第1位低电平码的脉宽过小,将作为错误处理:当间隔位的高电平脉宽正常时,结束接收,然后根据脉冲个数,得出相应的键值。

2.1.4语音模块

本模块采用集成语音芯片,所以操作有单片机控制,操作命令通过串行通信接口送入。片内信息储存于闪烁存储器中。

单片机的P2.5引脚连接芯片片选引脚,控制语音芯片的选通情况;P2.4、P2.3连接MOSI、MISO,分别控制输入输出数据,对于MOSI来说,先发送地址信息,然后发送控制位;P2.2引脚连接串行时钟输入端SCLK,为语音芯片提供时钟输入;P2.1引脚连接中断引脚INT,以便及时捕获语音芯片发出的中断信号;P2.0引脚连接RAC端,为行地址时钟端。

录音操作主要是将外部输入的语音储存到芯片里,留有录音接口是为了通过专业音频电缆与数字录音设备相连,向录音设备提供音频信号;放音操作主要将存储到内部的语音数据回放出来。

9

单片机课程设计

2.1.5时钟模块

本模块采用DS1302时钟芯片,可对秒、分、时、日、月以及带闰年补偿的年进行计数。DS1302时钟芯片报考实时时钟/日历和31字节的静态RAM。它经过一个简单的串行接口与微处理器通信。四十时钟/日历提供秒、分、时、日、月和年等信息。对于小于31天的月和月末的日期自动跳帧,还包括闰年校正的功能。时钟的运行可以采用24h或12h的格式。采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

下图是DS1302时钟电路:

图12 时钟模块

DS1302在任何数据传送时必须先初始化,把RST脚设置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8为指定40个寄存器中哪个将被访问到。在开始8个时钟周期,吧命令字节装入移位寄存器之后,另外的时钟周期在读操作时输入数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。

如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc大于等于2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的控制字如图4.2所示。控制字节的最高位(位7)必须是逻辑1;如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1

10

单片机课程设计

表示存取RAM数据。位5~1(A4~A0)指示操作单元的地址。最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。

为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能寄存数据。在多字节方式中,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节。不管是否写了全部31字节,所写的每一字节都将传送至RAM。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见图12,其中奇数为读操作,偶数为写操作。

时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止震荡,进入低功耗的备份方式。通常在对DS1302进行写操作时(如进入时钟调整程序),停止震荡。当它为0时,时钟将开始启动。

AM-PM/12-24[小]时方式:[小]时寄存器的位7定义为12或24[小]时方式选择位。它为高电平时,选择12[小]时方式。在此方式下,位5是AM/PM位,此位是高电平时表示PM低电平表示AM。在24[小]时方式下,位5为第二个10[小]时位(20~23h)。

图13内部寄存器地址和内容

2.1.6液晶显示模块

液晶显示模块是由1602液晶显示器构成。

11

单片机课程设计

第一引脚为地电源;第二引脚接5V正电;第三引脚V0为对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”;第四引脚RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器;第六引脚E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行指令;第七到第十四引脚为8位双向数据线;第十五引脚为背光电源正极;第十六引脚为背光电源负极。

字符型液晶显示器模块内部主要有LCD显示屏、控制器、驱动器和偏压产生电路。控制器主要由指令寄存器IR、数据寄存器DR、忙识别位BF、地址计数器AC、DDRAM、CGROM、CGRAM及时序发生电路组成。

图14液晶显示模块

1602液晶模块背部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图14所示,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

12

单片机课程设计

图15GROM和CGRAM中字符代码与字符图形对应关系

3、软件设计

软件部分设计主要由主程序、时间、温湿度采集和语音播报构成。

开始 开始 初始化 读写日期、时间和温湿度 分离日期、时间和温湿度的显示值 显示子程序 图17 时间模块流程图

初始化 读写日期和时间 数据发送 返回 返回

13

单片机课程设计

图16 主程序流程图

无 开始 开始 无 检测是否有采集信号 检查是否有报音信号 有 有 报音 返回数据 返回 返回 图19语音播报流程图 图20 温湿度采集流程图

4、心得体会

随着集成电路和计算机技术的迅速发展,使电子仪器的整体水平发生巨大变化,传统的仪器逐步的被智能仪器所取代。智能仪器的核心部件是单片机,因其极高的性价比得到广泛的应用与发展,而加快了智能仪器的发展。而传感器作为测控系统中对象信息的入口,越来越受到人们的关注。传感器好比人体“五官”的工程模拟物,它是一种能将特定的被测量信息(物理量、化学量、生物量等)按一定规律转换成某种可用信号输出的器件或装置本次课设中的半桥电子秤就是在以上仪器的基础上设计而成的。因此,只有充分了解有关智能仪器、单片机、传感器以及各部分之间的关系才能达到要求。

通过本次设计,我们系统的了解了实时时钟的设计流程,尤其是硬件的设计方法,开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力。

此次单片机设计,从选题到定稿,从理论到实践,学到了很多的东西。不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。通过这次课程设计使

14

单片机课程设计

我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,不轻言放弃。

设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富。

参考文献

【1】 江思敏,陈明.Protel电路设计教程(第二版).清华大学出版社,2008 【2】 黄正瑾主编,田亮主审.电子设计竞赛.东南大学出版社,2003. 【3】 余发山,王福忠.单片机原理及应用技术.中国矿业大学出版社,2008. 【4】 张洪润,马平安,张亚凡.单片机原理及应用.科学出版社,2004

【5】 李群芳,张士军.单片机微型计算机与接口技术[M].北京,电子工业出版社 【6】 咸俊伟,陈波,梁书旺等.基于AT89C51红外遥控电子密码锁的设计[J].科技信息,

2008(11):567-569

【7】 杨海东,陈高平.ISD4004-16M语音芯片的循环录放电路设计[J].单片机与嵌入式系

统应用,2004(12):56-57

【8】 蒋敏,单片微机万年历设计,职大学报2002年第2期 【9】 谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2007. 【10】李学军.如何用MCS-51单片机扩展串口进行通讯[J]. 宁夏机械,2003,(2). 【11】潘新民,王燕芳.微型计算机控制技术.[M] 北京: 电子工业出版社,2007.

15

单片机课程设计

附主要程序

#include \#include \#include #include \#include \#include \

#define uchar unsigned char #define uint unsigned int

#define HIGH 1 #define LOW 0

#define KEY_NO_NUM 0 #define KEY_TIM_SET_NUM 1 #define KEY_ADD_NUM 2 #define KEY_MIN_NUM 3 #define KEY_TIMING_SET_NUM 4

uchar Tim_red_tab[7]={0}; uchar Timing_hour=0; uchar Timing_min=0;

uchar Timing_on=0;

uchar SET_TIM_FLAG=0;

bit Again_flag=0;

uchar SET_TIMING_FLAG=0; bit beep_flag=0; bit Timing_flag=0;

sbit KEY_TIM_SET=P3^4; //时间设置按键 sbit KEY_ADD=P3^5; //时间设置加 sbit KEY_MIN=P3^6; //时间设置减 sbit KEY_TIMING_SET=P3^7; //定时设置按键

#define Imax 14000 #define Imin 8000 #define Inum1 1450 #define Inum2 700 #define Inum3 3000

uchar Im[4]={0x00,0x00,0x00,0x00};

16

//记录年月日时分秒和系统状态信息//闹钟开启标志位 //时间设置标志位

单片机课程设计

uchar f;

bit flog_Receive=0; unsigned long m,Tc; uchar IrOK;

uchar Receive_dat;

//sbit BEEP=P2^1;

uint code VoiceAddTab[]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,

190, 210, 230, 260, 280,310,350}; //uchar num1=0;

void Sys_init(void); void Main_display(void); void keycsan(void);

void Timing_display(void); void PlayVoice(void);

//void RecFuntion(void) //{

// if(!KEY_TIM_SET) // {

// delayms(10); // if(!KEY_TIM_SET) // {

// autorecord(VoiceAddTab[num1]); // while(!KEY_TIM_SET); // stoppd(); // } // } //

// if(!KEY_ADD) // {

// delayms(10); // if(!KEY_ADD) // {

// autoplay(VoiceAddTab[num1]); // while(!KEY_ADD); // } // } //

// if(!KEY_MIN) // {

// delayms(10); // if(!KEY_MIN)

17

单片机课程设计

// {

// num1++;

// while(!KEY_MIN); // } // } //

// if(!KEY_TIMING_SET) // {

// delayms(10);

// if(!KEY_TIMING_SET) // {

// if(num1>0) // num1--;

// while(!KEY_TIMING_SET); // } // } //}

void main() { Sys_init(); while(1) {

// RecFuntion();

// WRITE_LCD1602_COM(0x80+0x40+11); //指定显示字符的地址 // WRITE_LCD1602_DAT(0x30+num1/10); // WRITE_LCD1602_DAT(0x30+num1); if(SET_TIMING_FLAG==0) { RH(); Main_display(); } else { Timing_display(); } keycsan(); PlayVoice(); } }

void Sys_init(void) { m=0; f=0; InitISD();

18

单片机课程设计

stoppd(); INIT_DS1302(); //初始化DS1302 init_1602(); //初始化LCD1602 Timing_hour=READ_DS1302(READ_DS1302_Timing_Hour1); if(Timing_hour>23) Timing_hour=0; Timing_min=READ_DS1302(READ_DS1302_Timing_Min1); if(Timing_min>59) Timing_min=0; Timing_on=READ_DS1302(READ_DS1302_Timing_Hour2); if(Timing_on>1) Timing_on=1; TMOD=0x01; TH0=0; TL0=0; TR0=1; IT0=1; EX0=1; EA=1; }

//外部中断解码程序

void intersvrl(void) interrupt 0 { Tc=TH0*256+TL0; TH0=0; TL0=0; if((Tc>Imin)&&(TcInum1&&Tc>1|0x80; m++; } if(Tc>Inum2&&Tc

19

单片机课程设计

{ Im[m/8]=Im[m/8]>>1; m++; } if(m==32) { m=0; f=0; if(Im[2]=~Im[3]) IrOK=1; else IrOK=0; } } }

void PlayVoice(void)

{ if(IrOK==1) //解码成功 { Receive_dat=Im[2]; IrOK=0; } if(!KEY_MIN||Receive_dat==0x1c) { delayms(10); if(!KEY_MIN||Receive_dat==0x1c) { Receive_dat=0; if(SET_TIMING_FLAG==0&&SET_TIM_FLAG==0) { autoplay(VoiceAddTab[2]); while(INT==0); while(INT==1); Main_display(); autoplay(VoiceAddTab[0]); while(INT==0); while(INT==1); Main_display(); autoplay(VoiceAddTab[Tim_red_tab[0]/10]); while(INT==0); while(INT==1); Main_display(); autoplay(VoiceAddTab[Tim_red_tab[0]]); while(INT==0); while(INT==1);

20

单片机课程设计

Main_display();

autoplay(VoiceAddTab[11]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[1]>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[Tim_red_tab[1]]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[Tim_red_tab[1]]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[12]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[2]>19) {

autoplay(VoiceAddTab[Tim_red_tab[2]/10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[2]>0) {

autoplay(VoiceAddTab[Tim_red_tab[2]]); while(INT==0); while(INT==1); Main_display(); }

21

单片机课程设计

}

else if(Tim_red_tab[2]>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[Tim_red_tab[2]]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[Tim_red_tab[2]]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[13]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[17]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[3]==0) {

autoplay(VoiceAddTab[13]); while(INT==0); while(INT==1);

Main_display(); } else {

autoplay(VoiceAddTab[Tim_red_tab[3]]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[18]); while(INT==0);

22

单片机课程设计

while(INT==1); Main_display();

if(Tim_red_tab[4]>19) {

autoplay(VoiceAddTab[Tim_red_tab[4]/10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[4]>0) {

autoplay(VoiceAddTab[Tim_red_tab[4]]); while(INT==0); while(INT==1); Main_display(); } }

else if(Tim_red_tab[4]>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[Tim_red_tab[4]]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[Tim_red_tab[4]]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[14]); while(INT==0); while(INT==1); Main_display(); if(Tim_red_tab[5]>19)

23

单片机课程设计

{

autoplay(VoiceAddTab[Tim_red_tab[5]/10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

if(Tim_red_tab[5]>0) {

autoplay(VoiceAddTab[Tim_red_tab[5]]); while(INT==0); while(INT==1); Main_display(); } }

else if(Tim_red_tab[5]>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[Tim_red_tab[5]]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[Tim_red_tab[5]]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[15]); while(INT==0);

while(INT==1); Main_display();

autoplay(VoiceAddTab[19]); while(INT==0); while(INT==1); Main_display(); if(U8T_data_H>19)

24

单片机课程设计

{

autoplay(VoiceAddTab[U8T_data_H/10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display(); if(U8T_data_H>0) {

autoplay(VoiceAddTab[U8T_data_H]); while(INT==0); while(INT==1); Main_display(); } }

else if(U8T_data_H>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[U8T_data_H]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[U8T_data_H]); while(INT==0); while(INT==1);

Main_display(); }

autoplay(VoiceAddTab[20]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[21]); while(INT==0); while(INT==1);

25

单片机课程设计

Main_display();

autoplay(VoiceAddTab[22]); while(INT==0); while(INT==1); Main_display(); if(U8RH_data_H>19) {

} } }

autoplay(VoiceAddTab[U8RH_data_H/10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

if(U8RH_data_H>0) {

autoplay(VoiceAddTab[U8RH_data_H]); while(INT==0); while(INT==1); Main_display(); } }

else if(U8RH_data_H>10) {

autoplay(VoiceAddTab[10]); while(INT==0); while(INT==1); Main_display();

autoplay(VoiceAddTab[U8RH_data_H]); while(INT==0); while(INT==1); Main_display(); } else {

autoplay(VoiceAddTab[U8RH_data_H]); while(INT==0); while(INT==1);

Main_display(); }

26

单片机课程设计

}

/************************************ 闹钟设置界面

************************************/ void Timing_display(void) { static uchar i; i++; if(i>20) i=0; WRITE_LCD1602_COM(0x80+0x40+4); //指定显示字符的地址 if(SET_TIMING_FLAG==1&&i<10) { WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT(' '); } else { WRITE_LCD1602_DAT(LCD1602_Table[Timing_hour/10]); WRITE_LCD1602_DAT(LCD1602_Table[Timing_hour]); } WRITE_LCD1602_COM(0x80+0x40+7); //指定显示字符的地址 if(SET_TIMING_FLAG==2&&i<10) { WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT(' '); } else { WRITE_LCD1602_DAT(LCD1602_Table[Timing_min/10]); WRITE_LCD1602_DAT(LCD1602_Table[Timing_min]); } WRITE_LCD1602_COM(0x80+0x40+11); //指定显示字符的地址 if(SET_TIMING_FLAG==3&&i<10) { WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT(' '); } else { if(Timing_on==0) {

27

单片机课程设计

WRITE_LCD1602_DAT('o'); WRITE_LCD1602_DAT('f'); WRITE_LCD1602_DAT('f'); } else { WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT('o'); WRITE_LCD1602_DAT('n'); } } }

/************************************ 主界面

************************************/ void Main_display(void) { static uchar Year=80,Month=80,Day=80,Week=80,Hour=80,Min=80,Sec=80; static uchar i; static time_hour1=0; static time_min1=0; i++; if(i>10) i=0; if(beep_flag&&!Timing_flag) { Timing_flag=1; autoplay(VoiceAddTab[23]); } else if(!beep_flag) { Timing_flag=0; } if(Again_flag) { Again_flag=0; Year=80;Month=80;Day=80;Hour=80;Min=80;Sec=80;Week=80; } if(SET_TIM_FLAG==0) { Tim_red_tab[0]=READ_DS1302(READ_DS1302_YEAR); Tim_red_tab[1]=READ_DS1302(READ_DS1302_MONTH);

28

单片机课程设计

Tim_red_tab[2]=READ_DS1302(READ_DS1302_DAY); Tim_red_tab[3]=READ_DS1302(READ_DS1302_WEEK); Tim_red_tab[4]=READ_DS1302(READ_DS1302_HOUR); Tim_red_tab[5]=READ_DS1302(READ_DS1302_MINUTE); Tim_red_tab[6]=READ_DS1302(READ_DS1302_SECOND); if(Timing_min>49) {

if(Timing_hour==23) time_hour1=0; else

time_hour1=Timing_hour+1; time_min1=(Timing_min-50); } else {

time_hour1=Timing_hour;

time_min1=Timing_min+10; }

if(Tim_red_tab[4]==Timing_hour&&Tim_red_tab[5]==Timing_min&&Tim_red_tab[6]<3) beep_flag=1; else

if(Tim_red_tab[4]==Timing_hour&&Tim_red_tab[5]==Timing_min&&Tim_red_tab[6]>45) beep_flag=0;

// if(Tim_red_tab[4]==time_hour1&&Tim_red_tab[5]==time_min1&&Tim_red_tab[6]<3) // beep_flag=1; // else

if(Tim_red_tab[4]==time_hour1&&Tim_red_tab[5]==time_min1&&Tim_red_tab[6]>30) // beep_flag=0; if(Year!=Tim_red_tab[0]) { Year=Tim_red_tab[0]; WRITE_LCD1602_COM(0x80+2); //指定显示字符的地址 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]/10]); //年 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]]); //年 } if(Month!=Tim_red_tab[1]) { Month=Tim_red_tab[1]; WRITE_LCD1602_COM(0x80+5); //指定显示字符的地址 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]/10]); //月 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]]); //月 }

29

单片机课程设计

if(Day!=Tim_red_tab[2]) {

Day=Tim_red_tab[2];

WRITE_LCD1602_COM(0x80+8); //指定显示字符的地址

WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]/10]); //日 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]]); //日 }

if(Week!=Tim_red_tab[3]) {

Week=Tim_red_tab[3];

WRITE_LCD1602_COM(0x80+12); //指定显示字符的地址 switch(Week) {

case 0:

WRITE_LCD1602_DAT('S'); WRITE_LCD1602_DAT('U'); WRITE_LCD1602_DAT('N'); break; case 1:

WRITE_LCD1602_DAT('M'); WRITE_LCD1602_DAT('O'); WRITE_LCD1602_DAT('N'); break; case 2:

WRITE_LCD1602_DAT('T'); WRITE_LCD1602_DAT('U'); WRITE_LCD1602_DAT('E'); break; case 3:

WRITE_LCD1602_DAT('W'); WRITE_LCD1602_DAT('E'); WRITE_LCD1602_DAT('D'); break; case 4:

WRITE_LCD1602_DAT('T'); WRITE_LCD1602_DAT('H'); WRITE_LCD1602_DAT('U'); break; case 5:

WRITE_LCD1602_DAT('F'); WRITE_LCD1602_DAT('I'); WRITE_LCD1602_DAT('R'); break; case 6:

30

单片机课程设计

WRITE_LCD1602_DAT('S'); WRITE_LCD1602_DAT('A'); WRITE_LCD1602_DAT('T'); break; default:

WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护

WRITE_DS1302(WRITE_DS1302_WEEK,0); //星期

WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护

break; } }

if(Hour!=Tim_red_tab[4]) {

Hour=Tim_red_tab[4];

WRITE_LCD1602_COM(0x80+0x40); //指定显示字符的地址

WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]/10]); //时 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]]); //时 }

if(Min!=Tim_red_tab[5]) {

Min=Tim_red_tab[5];

WRITE_LCD1602_COM(0x80+0x40+3); //指定显示字符的地址 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]/10]); //分 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]]); //分 }

//if(Sec!=Tim_red_tab[6]) //{

Sec=Tim_red_tab[6];

WRITE_LCD1602_COM(0x80+0x40+6); //指定显示字符的地址 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]/10]); //秒 WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]]); //秒 // WRITE_LCD1602_DAT(' '); //} } else {

beep_flag=0;

WRITE_LCD1602_COM(0x80+2); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==1){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]/10]);WRITE_LCD1602_DAT(LCD16

31

单片机课程设计

02_Table[Tim_red_tab[0]]);}

WRITE_LCD1602_COM(0x80+5); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==2){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]]);}

WRITE_LCD1602_COM(0x80+8); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==3){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]]);}

WRITE_LCD1602_COM(0x80+12); //指定显示字符的地址 if(i<5&&SET_TIM_FLAG==4){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');} else {

switch(Tim_red_tab[3]) {

case 0:

WRITE_LCD1602_DAT('S'); WRITE_LCD1602_DAT('U'); WRITE_LCD1602_DAT('N'); break; case 1:

WRITE_LCD1602_DAT('M'); WRITE_LCD1602_DAT('O'); WRITE_LCD1602_DAT('N'); break; case 2:

WRITE_LCD1602_DAT('T'); WRITE_LCD1602_DAT('U'); WRITE_LCD1602_DAT('E'); break; case 3:

WRITE_LCD1602_DAT('W'); WRITE_LCD1602_DAT('E'); WRITE_LCD1602_DAT('D'); break; case 4:

WRITE_LCD1602_DAT('T'); WRITE_LCD1602_DAT('H'); WRITE_LCD1602_DAT('U');

32

单片机课程设计

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]]);}

WRITE_LCD1602_COM(0x80+0x40+3); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==6){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]]);}

WRITE_LCD1602_COM(0x80+0x40+6); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==7){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]]);} }

WRITE_LCD1602_COM(0x80+0X40+9);

WRITE_LCD1602_DAT(LCD1602_Table[U8T_data_H/10]); WRITE_LCD1602_DAT(LCD1602_Table[U8T_data_H]); WRITE_LCD1602_DAT(0xdf);

WRITE_LCD1602_COM(0x80+0X40+13);

WRITE_LCD1602_DAT(LCD1602_Table[U8RH_data_H/10]); WRITE_LCD1602_DAT(LCD1602_Table[U8RH_data_H]);

break; case 5:

WRITE_LCD1602_DAT('F'); WRITE_LCD1602_DAT('I'); WRITE_LCD1602_DAT('R'); break; case 6:

WRITE_LCD1602_DAT('S'); WRITE_LCD1602_DAT('A'); WRITE_LCD1602_DAT('T'); break; default: break; } }

WRITE_LCD1602_COM(0x80+0x40); //指定显示字符的地址

if(i<5&&SET_TIM_FLAG==5){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}

}

/****************************************** 按键子程序

33

单片机课程设计

******************************************/ void keycsan(void)

{ static uchar KEY_TIM_SETJ,KEY_ADDJ,KEY_MINJ,KEY_TIMING_SETJ; uchar KEY_NUM=KEY_NO_NUM; uchar i; static uchar TIM_DAT; if(IrOK==1) //解码成功 { Receive_dat=Im[2]; switch(Receive_dat) { case 0x0c: KEY_NUM=KEY_TIM_SET_NUM; break; case 0x18: KEY_NUM=KEY_ADD_NUM; break; case 0x5e: KEY_NUM=KEY_MIN_NUM; break; case 0x08: KEY_NUM=KEY_TIMING_SET_NUM; break; default: break; } IrOK=0; } if(~KEY_TIM_SET&KEY_TIM_SETJ) KEY_NUM=KEY_TIM_SET_NUM; KEY_TIM_SETJ=~(~KEY_TIM_SET); if(~KEY_ADD&KEY_ADDJ) KEY_NUM=KEY_ADD_NUM; KEY_ADDJ=~(~KEY_ADD); if(~KEY_MIN&KEY_MINJ) KEY_NUM=KEY_MIN_NUM; KEY_MINJ=~(~KEY_MIN); if(~KEY_TIMING_SET&KEY_TIMING_SETJ) KEY_NUM=KEY_TIMING_SET_NUM; KEY_TIMING_SETJ=~(~KEY_TIMING_SET); switch(KEY_NUM) { case KEY_TIM_SET_NUM: //检测到时间设置按键按下 if(SET_TIMING_FLAG==0) { SET_TIM_FLAG++; if(SET_TIM_FLAG>7) { SET_TIM_FLAG=0; WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); 34

//

单片机课程设计

禁止写保护

WRITE_DS1302(WRITE_DS1302_SECOND,Tim_red_tab[6]); //秒 WRITE_DS1302(WRITE_DS1302_MINUTE,Tim_red_tab[5]); //分 WRITE_DS1302(WRITE_DS1302_HOUR,Tim_red_tab[4]); //小时 WRITE_DS1302(WRITE_DS1302_DAY,Tim_red_tab[2]); //日期 WRITE_DS1302(WRITE_DS1302_MONTH,Tim_red_tab[1]); //月份 WRITE_DS1302(WRITE_DS1302_WEEK,Tim_red_tab[3]); //星期 WRITE_DS1302(WRITE_DS1302_YEAR,Tim_red_tab[0]); //年

WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护

}

switch(SET_TIM_FLAG)

{ case 1:TIM_DAT=READ_DS1302(READ_DS1302_YEAR); break;

case 2:TIM_DAT=READ_DS1302(READ_DS1302_MONTH); break; case 3:TIM_DAT=READ_DS1302(READ_DS1302_DAY); break; case 4:TIM_DAT=READ_DS1302(READ_DS1302_WEEK); break; case 5:TIM_DAT=READ_DS1302(READ_DS1302_HOUR); break; case 6:TIM_DAT=READ_DS1302(READ_DS1302_MINUTE); break; case 7:TIM_DAT=READ_DS1302(READ_DS1302_SECOND); break; default: break; } } break;

case KEY_ADD_NUM:

switch(SET_TIM_FLAG) {case 1:

if(TIM_DAT<99) TIM_DAT++;

Tim_red_tab[0]=TIM_DAT; break;

case 2:

if(TIM_DAT<12) TIM_DAT++;

Tim_red_tab[1]=TIM_DAT; break;

case 3:

if(TIM_DAT<31) TIM_DAT++;

Tim_red_tab[2]=TIM_DAT; break; case 4:

if(TIM_DAT<6) TIM_DAT++;

35

单片机课程设计

Tim_red_tab[3]=TIM_DAT; break;

case 5:

if(TIM_DAT<23) TIM_DAT++;

Tim_red_tab[4]=TIM_DAT; break;

case 6:

if(TIM_DAT<59) TIM_DAT++;

Tim_red_tab[5]=TIM_DAT; break; case 7:

if(TIM_DAT<59) TIM_DAT++;

Tim_red_tab[6]=TIM_DAT; break;

default:

switch(SET_TIMING_FLAG) {

case 1:

if(Timing_hour<23) Timing_hour++; break;

case 2: if(Timing_min<59) Timing_min++; break; case 3:

if(Timing_on>0) Timing_on=0; else

Timing_on=1; break; } break; } break;

case KEY_MIN_NUM:

switch(SET_TIM_FLAG) {

case 1:

if(TIM_DAT>0) TIM_DAT--;

Tim_red_tab[0]=TIM_DAT;

36

单片机课程设计

break;

case 2:

if(TIM_DAT>1) TIM_DAT--;

Tim_red_tab[1]=TIM_DAT; break;

case 3:

if(TIM_DAT>1) TIM_DAT--;

Tim_red_tab[2]=TIM_DAT; break;

case 4:

if(TIM_DAT>0) TIM_DAT--;

Tim_red_tab[3]=TIM_DAT; break; case 5:

if(TIM_DAT>0) TIM_DAT--;

Tim_red_tab[4]=TIM_DAT; break;

case 6:

if(TIM_DAT>0) TIM_DAT--;

Tim_red_tab[5]=TIM_DAT; break; case 7:

if(TIM_DAT>0) TIM_DAT--;

Tim_red_tab[6]=TIM_DAT; break;

default:

switch(SET_TIMING_FLAG) {

case 1:

if(Timing_hour>0) Timing_hour--; break;

case 2: if(Timing_min>0) Timing_min--; break; case 3:

37

本文来源:https://www.bwwdw.com/article/v7j.html

Top