目 录
1 引 言 ......................................................................................................................... 1
2 概 述 ......................................................................................................................... 2
2.1 定时开关电源插座系统概述 ............................................................................ 2
2.2 本设计方案思路 ................................................................................................ 2
2.3 研发方向和技术关键 ........................................................................................ 3
2.4 主要技术指标 .................................................................................................... 3
3 总体设计 ..................................................................................................................... 4
3.1 可控开关设计的选择 ........................................................................................ 4
3.2 时钟信号的实现 ................................................................................................ 6
3.3 译码方案的选取 ................................................................................................ 6
4 硬件设计 ................................................................................................................... 10
4.1 可控开关电路 .................................................................................................. 12
4.2 电平转换电路 .................................................................................................. 12
4.3 单片机系统电路 .............................................................................................. 14
4.4 显示电路 .......................................................................................................... 16
5 软件设计 ................................................................................................................... 17
5.1 总体方案 .......................................................................................................... 17
5.2 主程序流图 ...................................................................................................... 17
5.3 中断模块说明 .................................................................................................. 18
6 制作与调试 ............................................................................................................... 19
6.1 硬件电路的布线与焊接 .................................................................................. 19
6.2 调试 .................................................................................................................. 20
6.3 改进与扩展 ...................................................................................................... 20
7 结 论 ....................................................................................................................... 21
致 谢 ............................................................................................................................. 23
参考文献 ......................................................................................................................... 23
附 录 ............................................................................................................................. 24
1.引言
随着电子技术和电源技术的发展,开关电源以体积小、重量轻、功率密度大、集成度高、输出组合便利等优点而成为电子电路电源的首选。定时开关电源插座,即可以定时打开或关掉电源的插座,这样既能省电又方便用户的个性化使用。
1
2 概 述
2.1定时开关电源插座系统概述
本文设计的定时开关电源插座电路系统[1]主要是利用单片机P89V51RD2FN作为主控制元件,通过外围电路控制可控开关的通断以达到定时开、关的目的。P89V51具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。通过键盘键入程序控制可控开关和译码器来实现数码管的显示。主板电路包括MCU P89V51 、键盘与显示、输入与输出口、可控开关和稳压等电路组成。
2.2本设计方案思路
本设计实现通过定时电路来控制电源插座开关的通断,和时钟电路的显示为主要目的;以时钟信号的检测,信号控制,信号译码和数据显示为主要设计内容。
定时器是本设计系统中的重点,时间控制器(即定时器)既可以通过纯硬件实现,也可以通过软硬件结合实现,根据时间控制器的核心部件—秒信号的产生原理,通常有四种形式,如下所述。
(1)采用石英钟专用芯片的实现形式
采用石英钟专用芯片的实现的时间控制器,具有实现简单、计时精度高的特点。石英计时芯片比较多,常用的型号有STP5512F、SM5546A和D60400等。如结合利用5512F的2秒输出信号作为秒信号电路的计数脉冲,可实现电子时钟。
(2)采用NE555时基电路的实现形式
采用NE555时基电路或其他振荡电路产生秒脉冲信号,作为秒加法电路的时钟信号或微处理器的外部中断输入信号,可构成时间控制器。由555构成的秒脉冲发生器电路如图1-1所示。输出的脉冲信号Vo的频率f=1.443/(Ra+2Rb)*C,可以通过调节这3个参数,使输出Vo的频率为精确的1HZ。但这类定时器精度低,脉冲周期由外接的电阻和电容决定,常用于旋转灯光控制等。
(3)采用单片机常用的时钟芯片
以前,通常采用并行的实时时钟芯片计时、EEPROM作为存储器,但对一些微小型智能控制设备而言,并行实时时钟芯片封装形式大,再加上EEPROM,占用扩展线多,使电路结构很难进一步简化。Dallas公司生产的串行实时时钟芯片DS1302具有实时时钟和静态RAM,采用串行通信,可方便地与单片机接口。除了在工业控制中使用外,还可以应用到一般的时钟计数上。
2 [3][2]
(4)用软件来实现定时
通常利用单片机或多媒体或PLC内部的定时器,编写大量的源程序来设计,常称为软件定时器。
电子定时器可用一般数字电路搭建而成,一台四位数的定时器要用十多片数字电路组成,电路结构复杂、体积庞大,而且功能有一定的局限性。在进行定时电路设计时,如果需要定时的时间不是很精确且时间较短的话,往往采用555定时集成电路来实现。然而,若需要定时的时间较长(如1小时以上)则采用专用的集成电路定时器比较方便,而且使用定时器专用集成电路所设计的应用电路比较简单,同时调试也比较容易。本设计采用单片机作为主硬件电路,外围电路简单,配合软件设计,使用其灵活的编程实现定时,译码和时间显示等,使定时器插座可有更多的扩展功能选择。 [5][4]
2.3 研发方向和技术关键
(1)合理选取定时器方案,提高系统的精度;
(2)交直流电压转换;
(3)多路优先译码器的选取及扩展;
(4)与微机连接进行程序的汇编输入,实现对定时功能的调试;
(5)显示部分中数码管的四位一体共阴接法。
2.4 主要技术指标
(1)具有电子钟功能,显示为四位数
(2) 可设定定时起动(开始)时间与定时结束(关断)时间
(3)定时开始,指示灯亮;定时结束,指示灯灭
(4)定时范围可以选择
(5) 开关次数:≥2次/天
(6) 时钟日差:≤±2秒/天
(7)工作温度范围:-10o~50o
(8)工作条件:AC220V,10A,50Hz
(9)使用范围:办公室电源开关、实验室电源开关等
(10)插头插座孔型:插头国标三扁型
3
导读:3总体设计,单片机虽然种类繁多,但每片单片机内部结构都大同小异,各个厂商制成了多种型号的单片机,任何一种单片机不论功能如何强大,用户可根据所需来选择单片机的型号,本设计用单片机设计的体积小巧的定时器来控制电源开关插座的通电和断电,根据需要选用了一片40条引脚的P89V512FN单片机,属于飞利浦80C51系列单片机,系列单片机内部包含64位FLASH的ISP(在线可编程系统)和IAP(在应用编3 总体设计
单片机虽然种类繁多,但每片单片机内部结构都大同小异,均由控制器、运算器、存储器、输入端口、输出端口等组成。各个厂商制成了多种型号的单片机。任何一种单片机不论功能如何强大,都是通过其I/O口来发辉作用的,用户可根据所需来选择单片机的型号,引脚最少从8脚到近百脚的都有。本设计用单片机设计的体积小巧的定时器来控制电源开关插座的通电和断电,并还能作为一台数字钟使用实现时间显示。根据需要选用了一片40条引脚的P89V512FN单片机
[6],属于飞利浦80C51系列单片机,带64KB闪存和1024字节RAM。并且P89V51
系列单片机内部包含64位FLASH的ISP(在线可编程系统)和IAP(在应用编程)。其设计的几个基本模块如下图3-1,包括:插头插座(孔型),控制开关,电平转换器,单片机系统,显示电路部分。
图3-1 定时开关电源插座的设计原理框图
3.1可控开关设计的选择
本设计中的定时操作是通过可控开关收到外部电路的控制信号后延时通断的。其中延时实现方式分类一般按常规可分为以下几种:a、通电延时;b、接通延时;c、断电延时;d、断开延时;e、(间隔)定时;f、往复延时;g、星三角启动延时;h、程序式延时。
3.1.1方案一
选用普通晶闸管又叫可控硅,一种以硅单晶为基本材料P1N1P2N2四层三端器件,由于它特性类似于真空闸流管,所以国际上通称为硅晶体闸流管,简称可控硅T。又由于可控硅最初应用于可控整流方面所以又称为硅可控整流元件,简称为可控硅SCR。
在性能上,可控硅不仅具有单向导电性,而且还具有比硅整流元件(俗称“死硅”)更为可贵的可控性。它只有导通和关断两种状态普通可控硅在电路中最基本的用途就是可控整流。大家熟悉的二极管整流电路属于不可控整流电路。如果把二极管换成可控硅,就可以构成可控整流电路。
3.1.2方案二
继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。它是一种当输入量(电、磁、声、光、热)达到一定值时,输出量将发生跳跃式变化的自动控制器件。
其中电磁继电器是在输入电路内电流的作用下,由机械部件的相对运动产生预定响应的一种继电器。电磁继电器的工作原理和特性如下:电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
还可选用时间继电器,时间继电器是一种利用电磁原理和机械原理实现延时控制的控制电器,一般可分为通电延时型和断电延时型两种类型。断电延时时间继电器里有延时常开接点、延时常闭接点、瞬时常开接点和瞬时常闭接点。 其原理如下: 当断电延时时间继电器的“线圈”断电开接点—时, 延时常开接点——经过设定时间后断开 ;延时常闭接点——经过设定时间后接通;瞬时常开接点——立刻断开; 瞬时常闭接点——立刻接通。
3.1.3方案选取
可控硅优点如下:无触点,开断无涌流,开端速度快,可以控制过零开断。缺点:成本高,控制相对复杂,容量小,功耗大,发热严重;继电器优点:技术
成熟可靠,触点容量相对较大,成本低,几乎零功耗,发热量小。缺点:开断时会产生涌流,由于反应稍慢,无法用于很精细开断控制电路中,如移向调压等。
综合考虑两种可控开关各自的优缺点,在本设计中最终是采用电磁继电器通断主电路,主要是考虑到继电器结构简单,消耗电能少体积小,成本低,且控制时动作快、可靠性好。这类继电器在制成电灯定时节电开关或电风扇的定时并调速开关或电热器的定时并调温开关,或电灯的定时并调光开关或通用的定时并调压插座都有广泛的应用。
3.2时钟信号的实现
在单片机的内部RAM中,需要设置显示缓冲区,显示的时分秒值是从显示缓冲区中取出的,在RAM中设置四个单元作为显示缓冲区,分别是7AH、7BH、7CH。为使电路和原理叙述方便,我们这里不显示秒值,秒的进位我们通过闪烁分值实现。这样我们一共有四位LED分别显示时和分值,同时时钟都需要校准的。在程序中还需设置显示码表,要显示的数值通过查表指令将显示用的真正码值送到LED上。我们用单片机P89V51RD2FN的P1.5,P3.6和P3.7这三个I/O口外接微动开关来实现时和分的校正,其中P1.5实现每按一次小时或分值加1,连续按下数值累计下去,实现时钟的校准。
时钟的最小计时单位是秒,但使用单片机定时器来进行计时,若使用6.0MHz的晶振,即使按工作方式1工作,最大的计时时间也只能到131ms,所以我们可把每个定时时间取125ms,这样定时器溢出8次(125ms×8=1000ms)就得到最小的计时单位秒。而要实现8次计数用软件方法实现是轻而易举的。我们使用定时器1,以工作方式1工作,定时器进行125ms定时。采用中断方法进行溢出次数的累计,当计满8次即得到1秒的计时。
一个时钟的计时累加,要实现分、时的进位,要用到多种进制,秒、分、时中的进位是十进制,秒向分进位和分向时进位却是六十进制,而每天又有十二小时制或二十四小时制,它们分别又是十二进制和二十四进制。从秒到分和从分到小时可以通过软件累加和数值比较方法实现。 [7]
3.3译码方案的选取
本设计显示电路可分为三大块:键盘电路,输入端译码电路和输出控制端数码显示电路。显示电路端译码通过硬件译码或软件译码都可以实现。
3.3.1方案一
硬件译码,即上面的三大显示模块和显示段码完全由硬件电路设计实现,具体的硬件电路如下图3-2。对于相应的本系统中单片机,我们可选用简化的51系列单片机AT89C2051(20管脚),显示电路主要由七段共阳显示译码器74LS47、3线-8线译码器74LS138、4个PNP型三极管和四个数码管组成。通过AT89C2051的P1.4~P1.7口将要显示字符的BCD码输出到74LS47的四个输人端,然后译[7]
码并输出相应的笔段来驱动LED数码管(共阳)。
图3-2 硬件译码的电路实现
图3-2电路图中数码管的低电平段选信号由P1口的P1.0~P1.6输出,其真值表见下表3.1。P1.7输出秒闪烁信号,P3口的P3.0、P3.1输出位选信号给74LS138。74LS138被选中的端口输出低电平,PNP三极管导通,对应的数码管点亮。P3.2、P3.3、P3.4、P3.5分别作“调时”、“调分”、“定时开”、“定时减”的功能按钮开关,P3.7输出控制信号,使双向可控开关通电或断电,控制“输出插座”接通或断开220V交流电,从而控制外接电器的工作状态。其中A/D转换器采用宽工作电压,单输入通道,串行I/O接口8位A/D转换器TLC548CP。
表3.1 0-9显示真值表
其中P3.2、P3.3、P3.4、P3.5分别作“调时”、“调分”、“定时开”、“定时
导读:减”的功能按钮开关,本设计译码电路选取74LS138译码集成芯片,从功能表上可以看出它的输出只有一个低电平,从总的设计可以看出,单片机的控制输出是通过P3.0~P3.2口完成的,即上面的三大显示模块和显示段码完全由软件设计实现,由于单片机本身具有较强的逻辑控制能力,在单片机应用系统中使用非常广泛,本设计LED译码和显示模块就是采用软件译码实现,作为一种结构化的程序设计语言,具有很强的功能性、结减”的功能按钮开关;P3.7输出控制信号,使继电器线圈通电或断电,控制“输出插座”接通或断开220V交流电,从而控制外接电器的工作状态。数码管选用四位一体共阳接法,每个数码管由7段笔划组成,每段笔划由一只数码管点亮,其管压降为1.7-2.2V、电流5-20毫安。
LED数码管显示采用动态扫描方式,见下图3-3。即在某一时刻,只有一个数码管被点亮。数码管的位选信号由AT89C2051的P3.3~P3.5输出,并经74LSl38译码后通过三极管放大,以驱动相应的数码管。本设计译码电路选取74LS138译码集成芯片,其管脚分布如下图3-4,用来驱动4个LED,从功能表上可以看出它的输出只有一个低电平,也就是可以用来用灌电流的方式进行驱动LED,工作电压Vcc=5V,输出可以直接连接LED,没有带来不稳定因素,当然实际中应该串接保护电阻,估计常用的200-300欧姆都可以。
图3-3 LED动态扫描电路
图3-4 74LS138的管脚分布图
从总的设计可以看出,单片机的控制输出是通过P3.0~P3.2口完成的。当程序开始时,这三个口的输出状态都是低电平,AT89C2051通过程序查询三路输出的ON或OFF状态预置时间是否已到,若时间到,则改变相应的输出状态,以完成对外部电路的控制。
3.3.2方案二
软件译码,即上面的三大显示模块和显示段码完全由软件设计实现。
对于硬件译码来说,扩展多片的外部程序存储器采用多片的ROM扩展时,其片选信号CS的处理方法若采用全硬件实现,优点是扩展的各个EPROM的地址空间可以是连续的,能得到64K的完整空间;缺点是电路结构复杂,需附加译码器电路,常用的如上面提到的74138。
由于单片机本身具有较强的逻辑控制能力,采用软件译码并不复杂。其译码逻辑可以随意编程设定,不受硬件逻辑限制,同时还能简化硬件电路结构。因此,在单片机应用系统中使用非常广泛。
综上,本设计LED译码和显示模块就是采用软件译码实现,程序编写用C语言。作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能,这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。
4 硬件设计
本设计的硬件电路包括单片机P89V512FN电路、键盘输入与数码显示输出、信号输入与输出口、三孔扁平插座,可控开关和稳压器等电路组成。具体主要有三个模块:单片机控制数码显示模块;插座串接继电器模块;AC/DC5V输出稳压模块(如下图4-1)。随着外加220V/50HZ的交流电加到插座的同时,AC/DC实现电压交直流的转换,把220V的交流电变为5V的直流电用于SRD电磁继电器的工作电压。可控开关装置中的电磁继电器[8]收到单片机高低脉冲电平的变化相应做出吸合或断开的指令控制,从而控制插座电源的通断。而单片机软件编程通过串口输入和USB接口主要实现键盘、LED显示等各模块的功能,采用C语言编程,来控制译码器译码以及数码管显示。本设计硬件部分电路图见下图4-2,最终完成的硬件实物图见附录2。
其中本系统的核心单片机MCU P89V512FN为40脚600MIL封装,是CMOS型飞利浦80C51系列单片机,带有2KB 闪存E2PROM型。该单片机除了少了两个并口外,能兼容MCS-51系列单片机的所有功能,且具备体积小、功能强、运行速度快等特点。该电路可通过单片机的P3.7口连接一个键盘电路来实现对参数的人工自由设定,同时可通过串口连接4位LED数码管,以分别显示小时、分钟和秒。系统定时启动是通过P3.0口完成的。程序开始时这三个口的输出状态都是低电平,P89V512FN通过程序查询P3.0口输出ON或OFF的状态预置时间是否已到,如果已到时间,则改变相应的输出状态,从而完成对外部电路的控制。
图4-1本设计的三大模块
图4-2 定时部分硬件电路图
如上图4-2,上半部分是数码管显示电路;下半部分是由桥式整流二极管和LM7805组成的AC/DC稳压电路,将220V的交流电压整流,滤波后输出直流5V电压用于单片机的工作电压;中间部分是由四个按扭开关和单片机相应管脚(P1.4,P1.5,P3.6,P3.7)连接,分别对应LED时间显示模式控制(开关SW1)、操作控制(SW5)、执行加键(开关SW2),执行减键(开关SW3)。此外还有单片机外接热敏电阻,复位键(开关SW4)以及蜂鸣器可以用来实现温度测量和自动温度报警。
导读:本设计中选用继电器型号为SRD-05VDC-SL-C,本设计中选用的继电器的额定工作电压为5V直流电压,在本次设计过程中,另外两接脚中接脚3接单片机的控制信号引出脚,从插座正常工作到不工作的这段时间即为定时操作,可通过软件编程设置定时(闹铃)程序实现,本稳压电源可作为TTL电路或单片机电路的电源,成为目前稳压电源中应用最为广泛的一种单片式集成稳压器件,-5V输出电压上电容的方向(不过本设计只取4.1可控开关电路
图4-3 继电器结构图
继电器(relay)也是一种电门,但与一般开关不同,继电器并非以机械方式控制,而是一种以电磁力来控制切换方向的电门。当线圈通电后,会使中心的软铁核心产生磁性,将横向的摆臂吸下,而臂的右侧则迫使电门接点相接,使两接点形成通路。本设计中选用继电器型号为SRD-05VDC-SL-C,5接脚,如上图4-3。其中一边的两脚工作状态分别为衔铁动静触点闭合或断开(低压控制电路时);额定工作电压,即继电器正常工作时线圈所需要的电压,本设计中选用的继电器的额定工作电压为5V直流电压。利用直流电流触发并控制延时,在延时过程中可不影响主电路而延时递增。
在本次设计过程中,将继电器与普通电源插座串接起来,三接点中间的那个脚脚4接电源插座的火线,另外两接脚中接脚3接单片机的控制信号引出脚,另一接脚5和控制信号引出脚连共地端。特别需要注意的是,在焊接继电器前要用万用电表测试其五个管脚以确保正确连接。当接脚3和接脚5之间加5V电压时,接脚4和接脚2导通,电源插座开关可正常工作;当接脚3和接脚5之间电压为0时,接脚4和接脚1导通,电源插座开关不工作,从插座正常工作到不工作的这段时间即为定时操作,可通过软件编程设置定时(闹铃)程序实现。
4.2电平转换电路
4.2.1 LM7805稳压电路
在不同的数字系统中,其电平标准是不同的。该系统中就包括了220V交流输入和5V的TTL电平标准,要实现两个标准的正常通信,必须进行电平转换。该系统采用使用简单的LM7805芯片。
12
如图4-4所示电路为输出电压+5V、输出电流1.5A的稳压电源。它由电源变压器B,桥式整流电路D1~D4,滤波电容C1、C3,防止自激电容C2、C3和一只固定式三端稳压器7805极为简捷方便地搭成的。
图4-4 LM7805稳压电路
220V交流市电通过电源变压器变换成交流低压,再经过桥式整流电路D1~D4和滤波电容C1的整流和滤波,在固定式三端稳压器LM7805的Vin和GND两端形成一个并不十分稳定的直流电压(该电压常常会因为市电电压的波动或负载的变化等原因而发生变化)。此直流电压经过LM7805的稳压和C3的滤波便在稳压电源的输出端产生了精度高、稳定度好的直流输出电压。本稳压电源可作为TTL电路或单片机电路的电源。三端稳压器是一种标准化、系列化的通用线性稳压电源集成电路,以其体积小、成本低、性能好、工作可靠性高、使用简捷方便等特点,成为目前稳压电源中应用最为广泛的一种单片式集成稳压器件。注意问题:
1.7905的引脚定义,-5V输出电压上电容的方向(不过本设计只取+5V即可);
2.7905空载时测量输出在6V左右。加上负载,输出正常;
3.7805驱动电流可达1A。实际测量时运行时电流200~300mA,7805会发热,温度有50度左右,布线时该器件的摆放应考虑散热。
4.2.2RS232电平转换电路
由于本设计中的单片机电路要用到串口输入,而电脑串口RS232电平是-10V,+10V,P89V51单片机应用系统的信号电压是TTL电平0,+5 V,故需进行电平转换。
本设计采用MAX232EPE进行电平转换,该产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-V TTL/CMOS电平;每一个发送器将TTL/CMOS电平转 13 [9]
换成TIA/EIA-232-F电平。该芯片单5V电源工作,特点是低电源电流,典型值是8mA。如下图4-4,为MAX232双串口的连接图,可以分别接单片机的串行通信口或者实验板的其它串行通信接口。
图4-5 RS232双串口连接图
4.3单片机系统电路
4.3.1单片机P89V51简介
单片微型计算机作为微型计算机的一个分支,于今它已成为今天工业控制领域、通讯设备、信息处理以及日常生活中最广泛使用的计算机。应用方面,本设计中涉及的电子定时器也可用一般数字电路搭建而成,一台四位数的定时器要用十多片数字电路组成,电路结构复杂、体积庞大,而且功能有一定的局限性。但如用单片机制作定时器
功能选择。
本设计中的单片机芯片P89V51RD2FN是由飞利浦公司生产的,属于80C51系列单片机的一类。它为40管脚,工作电压为5V,片内有振荡器和时钟电路,时钟电路的频率范围从0兆赫至40兆赫,4 个8位并行I / O口,3个16位定时器/计数器,8个中断源与四个优先级,1个全双工串行口(SIO/UART),内置1个布尔处理器和1个布尔累加器(Cy),内含64KB的单晶片Flash的ISP(在线可编程系统)和IAP(在应用编程),可应用于设计可编程看门狗定时器。芯片管脚图见下图4-6,具体的各管脚功能介绍见附录1。 [10],外围电路简单,用其灵活的编程,使定时器可有更多的
14
图4-6 P89V51RD2FN信号引脚图
4.3.2 P89V51RD2的时钟电路
时钟电路是用于产生供单片机各部分同步工作的时钟信号。具体的产生有两种方法,如下图4-7,一是用单片机内部的石英晶体振荡器外接电容构成振荡电路;二是从外部输入时钟信号。本设计时钟电路采用的是第一种方法。
P89V51RD2的一个显著的特点是它有两种时钟模式(X1模式和X2模式)。X1模式下一个机器周期时间为12个时钟周期(即晶振频率fosc的倒数),而在X2模式下一个机器周期时间为6个时钟周期,从而可以加速器件的运行速度。时钟加倍模式只可用于加倍内部系统时钟和内部Flash存储器(即EA=1)。在访问外部存储器和外围器件时要特别小心,还要注意晶振的输出(XTAL2)是不能加倍的。且时钟加倍模式可通过外部编程器或IAP来实现。当该模式被选择时,FST寄存器的EDC位用来指示6时钟模式。此时FST-Flash状态寄存器的位分配(地址:B6H),不可位寻址;复位值:xxxxx0xxB。如下图4-8。
15
导读:temp=j/3380+1/298.15;temp=1/temp-273.15;tmp=(unsignedchar)temp;/*******************温度超过上限报警********************************/if(tmp>temph)elsebell=0;bell=1;keys=gotkey();/*******
temp=j/3380+1/298.15; temp=1/temp-273.15; tmp=(unsigned char)temp; /*******************温度超过上限报警********************************/ if(tmp>temph) else bell=0;
bell=1;
keys=gotkey();
/******************按键值*******************************************/ switch(keys)
{
case 1:
mode++;
if(mode==5)
mode=0;
break;
case 2:
operation++;
if(operation==2) operation=0; default :break; break;
}
/*******************模式控制****************************************/ switch(mode)
{
case 0://显示时间
display_time();
break;
case 1: //时间校准
if(operation==0)//时校准
{display1(0,now.hour);
if (keys==3)
{delay100ms();
if(keys==3) {if(++now.hour>=24) now.hour=0;} } if (keys==4) } if(keys==4) now.hour=23; {delay100ms(); { if(--now.hour<0) } } else //分校准 { display1(now.second,now.minute);
if (keys==3)
{delay100ms();
if (keys==3) {if(++now.minute>=60) now.minute=0; } }
if (keys==4)
{delay100ms();
if (keys==4) {if(--now.minute<0) now.minute=59; } } }
break;
case 2: //跑表显示
displaytimer(); if(operation_button==0) {delay100ms(); if(operation_button==0)
{ s++;if(s==2){ s=0;} } } if(inc_button==0) {flag=0;timer=0,timer_second=0;} break; case 3: //闹铃设定 display_ring(); { if (keys==3) if(operation==0) {delay100ms(); if (keys==3) } if (keys==4) ring_hour=0; } {if(++ring_hour>23) {delay100ms(); if (keys==4) {if(--ring_hour<0) } ring_hour=23; } }
else
{ if (keys==3)
{delay100ms();
if (keys==3) } if (keys==4) ring_minute=0; } {if(++ring_minute>59) {delay100ms(); if (keys==4)
{if(--ring_minute<0) ring_minute=59; } } } break; case 4 : //显示温度 display_temp(); if(operation==0)
else //设定上限温度
{display1(0,temph);
if (keys==3)
{delay100ms();
if (keys==3) temph=0; } {if(++temph>99) } if (keys==4) {delay100ms(); if (keys==4) {if(--temph<0) temph=99; } } } break; default: break;
}
} while(1);
}
/*******************************************************************/
导读:用单片机驱动LED数码管[11]有很多方法,静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后就不再管,软件译码是用软件来完成硬件的功能,本设计就采用软件译码来实现,且单片机驱动数码管的显示采用动态扫描显示的方式,5软件设计,并且决定它所应达到的功能,本设计用了4位数码管及4个按键,根据既定的目标具有定时及时钟的功能,程序应在定时器工作的同时也要启动时钟的时钟工作,涉及的软
图4-7 时钟电路的两种实现
(时钟电路的参数:频率范围0-40MHZ;C1,C2 20-
30pF)
图4-8 X2模式下的位分配
4.4显示电路
用单片机驱动LED数码管[11]有很多方法,按显示方式分,有静态显示和 动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后就不再管,直到下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用很少的CPU时间;动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。这两种显示方式各有利弊:静态显示虽然数据稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多;动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。硬件译码就是显示的段码完全由硬件完成,CPU只要送出标准的BCD码即可,硬件接线有一定标准;软件译码是用软件来完成硬件的功能,硬件简单,接线灵活,显示段码完全由软件来处理,是目前常用的显示驱动方式。本设计就采用软件译码来实现,且单片机驱动数码管的显示采用动态扫描显示的方式。
16
5 软件设计
5.1总体方案
硬件电路一旦决定,可根据电路的结构编制软件,并且决定它所应达到的功能。本设计用了4位数码管及4个按键,根据既定的目标具有定时及时钟的功能。程序应在定时器工作的同时也要启动时钟的时钟工作。
该系统显示电路部分的控制信号检测与数据传送部分,涉及的软件部分较多,主要是P89V51RD2FN单片机[12]数据串接口通信及通信协议的程序设计。本设计中用定时芯片制作定时器的关键是从P89V51芯片P1.7端口引出控制信号,随着P1.7高低电平的变化,通过键盘键入程序控制实现继电器的吸合和上扬,来控制电源插座通断以实现定时控制目的。即当继电器接脚3和接脚5之间加来自P1.7端口的5V电平信号时,接脚4和接脚2导通,电源插座开关可正常工作;当键入定时程序控制定时后,接脚3和接脚5之间电平信号为0时,接脚4和接脚1导通,电源插座开关关闭。此外如要扩展功能,采用单片机C语言编程可实现时间显示、时间校准、温度显示和温度上限报警、定时(闹钟)功能、跑表等各模块。
对于P89V51的程序设计,由于所需实现的功能较简单,采用C语言编译形式。编译器采用Keil uVision2 [13]。Keil uVision2标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。Keil 编译器可为人们提供单一而灵活的开发环境,C51已被完全集成到Keil的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器,Keil uVision2 可为它们提供单一而灵活的开发环境。
5.2 主程序流图
本系统的主程序工作过程是首先循环进行四个数码管的扫描显示[14] (DISPLY段),然后比较所有预置时间(COMP段)是否与当前时间相等,如相等则转向相应处理程序。比较完成(或处理完成)后,再判断有无按键(PP2段)按下,没有则返回继续显示、比较、判断;有按键按下则转向相应的处理程序。按键转移采用偏移量加表格跳转转移法(KEY段)。预置时间比较则采用逐一比较法,即对每一个预设的值都进行比较,如果相等,则进行相应的处理。在具体比较时(COMP1段),首先比较TH值,如不相等,则直接转出并置“时间到”标志CCB为0,而如果TH、TM、TS全部对应相等,则置该标志为1,其软件流程见下图5-1所示。 17
图5-1主程序流程图 图5-2 中断子程序流程图
程序用C语言编写,定时和时钟计时信号由单片机内部定时器T1产生的毫秒级信号,中断溢出后在RAM的40H单元中经多次累加输出1秒信号,作为计时的基本计数单元。待显示的数据放在以下RAM单元中,(1)时钟部分:46H→小时十位数,45H→小时个位数,44H→分钟十位数,43H→分钟个位数;(2)定时部分:4AH→分钟十位数,49H→分钟个位数,48H→秒十位数, 47H→秒个位数。通电后,程序初始化使4BH单元被置1,进入了同时打开定时器,时钟开始走时,显示→12: 00,秒信号在41H中累加60次,向48H单元作加1运算,这时数码管将显示→12:01,满60分将向小时进位而显示→1:00。如果按动“调时”、“调分”键即可调整时间。具体的主程序见附录3。
5.3中断模块说明
程序初始化后就进入了“定时中断”子程序,其程序流程图见上图5-2。一系列的运算是在中断产生后进行的[15],具体的中断服务程序见附录3。
在程序计数运算中,小时应作12进制或24进制运算、分钟要作60进制运算;而定时工作时应作99分钟倒计时及的60进制倒计时减运算。
18
6 制作与调试
6.1硬件电路的布线与焊接
6.1.1总体特点
该系统所涉及的各部分硬件电路,总体的特点是:
(1)电路原理简单,所用的器件均为常用器件;
(2)由于路数较多,电路的规模较大,因此在制作中只做了8路。
因此,应合理布线,以降低焊接难度,降低出错率,同时防止干扰。
6.1.2 电路划分与PCB的制作
主板的制作与调试主板的制作稍微复杂一点。首先是制作印刷板,利用Protel99按照本文所示器件位置图放置好元器件,然后手动布线(双面),线宽为0.8mm左右,太宽做出的板子太大,太窄无法进行自制。绘好印制板图后转成BMP格式利用电脑刻字机镂空(要用进口的即时贴纸,不然容易断开),贴在双面敷铜板上,就可以用FeCl3腐蚀了。具体的制作方法这里不再赘述,但最好在印制板布线时做个阻焊层,同时在即时贴上刻出来,当板子制好清洗干净后敷在上面,用浅绿色油漆或清漆喷上薄薄的一层,好看又防腐蚀。
PCB的制作关键是布局和布线的问题,而布局和布线不是截然分开的,布局是为布线服务,布线为的实现布局的目标。
显然,完成布局不是就不一定能布好线,布局只是布好线的第一步和最基础的一步。接下来的问题是跳线。跳线就要打乱原先画好的原理图。一个元件转个方向就可能导致布线发生的改变,两个或多个改变,就更麻烦了。布局过程中的应在每一次改变方案之前就有了种种考虑,不但包括改变面谈布局后的跳线问题,甚至还包括不行之后的其它考虑都会在其中。反复的尝试,得出一个合理的布局,尽量做到电路的走线最优先、最简捷、最有效。制板中注意事项如下:
1. 模拟与数字电路合理分开, 普通信号线容易能以很简练的方式完成走线。
2. 高速信号线、主信号线可以得到最优先、最简捷、最有效的走线。
3. 电源线在走向上容易形成合理的回路和分支。
4 . 热设计合理,有利于系统日后工作中散热纳凉,发热元件较合理地远离模拟电路且工作时不熏烤这些电路。
5. 印刷板的制作特别要注意的是在布线时对220V市电进入和输出(包括中线)的线宽设计要宽一点(根据工作电流大小来定为好),还要注意市电与直流电源的隔离,以免在使用中造成触电事故。
19
导读:本设计调试通过硬件中的串口接口通信和USB接口连接微机,本设计成品中的四个按钮开关控制使用了单片机P89V51RD2FN的P1.4(模式,这四个按钮开关通过软件设计模式控制端可控制时钟显示(case0),定时(闹钟)设定(case3),其中定时(闹钟)操作,本设计方案达到了任务书的要求,实现了定时开关电源插座的定时,时间显示的电子钟功能,但设计中有下面几个问题需要注意:,(3)设计中选用的单片6.1.3 焊接
元器件购回后应先进行预处理(引脚打磨、上焊锡),然后逐一焊接。在焊接MCU和其它集成电路时应使用有良好接地的烙铁(断电焊接也可),以免被击穿。由于双面印刷板存在一个穿孔问题,器件引脚穿过后,两面都要点上焊锡;如只是过孔,可用细铜线穿过并在两面焊接后剪掉即可。
在印刷板制作良好,连线没有不应有的开路或短路,且焊接没有虚焊的情况下,不用调试即可正常工作。焊接前应熟悉各芯片的引脚,焊接时参照电路图,仔细地连接引脚。按照以下原则进行焊接:
(1)先焊接各芯片的电源线和地线,这样确保各芯片有正确的工作电压;
(2)同类的芯片应顺序焊接,在一片焊接并检查好之后,其他的同类芯片便可以参照第一片进行焊接。这样便可大大节省时间,也可降低出错率。 6.2调试
本设计调试通过硬件中的串口接口通信和USB接口连接微机,采用Keil uVision2调试。uVision2包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定微控制器的要求。uVision2编辑器它包含了所有用户熟悉的特性,彩色语法显像和文件辩识都对C源代码进行和优化。它可以在编辑器内调试程序,能提供一种自然的调试环境,使你更快速地检查和修改程序。
6.3改进与扩展
本设计成品中的四个按钮开关控制使用了单片机P89V51RD2FN的P1.4 (模式控制开关),P1.5(操作控制开关),P3.6(执行加键),P3.7(执行减键)。这四个按钮开关通过软件设计模式控制端可控制时钟显示(case 0),时钟校准(case 1),跑表显示(case 2),定时(闹钟)设定(case 3),显示温度(case 4)。其中定时(闹钟)操作,显示温度,跑表显示能,只需在软件编程时相应加入相应的程序,并在硬件电路中相应接入热敏电阻和蜂鸣器即可。当然譬如年月日、农历、星期的计算(如大月小月、闰年、闰月等)分别汇编相应的子程序插入也可实现。

7 结 论
本设计方案达到了任务书的要求,实现了定时开关电源插座的定时,时间显示的电子钟功能,实现了于今一种较为先进且简单实用的节约能源模式的展望。但设计中有下面几个问题需要注意:
(1)由于220V强电输入,在焊接及调试电路时要非常小心;
(2)前端220V交流输入后经LM7805稳压后输出5V,误差较大;
(3)设计中选用的单片机P89V51所用的工作电源是连接计算机USB接口的5V电源,如需做成市场上的成品,这一点还需要改进;
(4)由MCU 控制的译码采集和串行传送也调试实现(通过与计算机的串口相连,用“串口调试程序”调试),信号处理电路通过串口连接到计算机,应用参考书上设计的“定时汇编程序”软件进行总体调试,实现对时钟的显示和定时。
由于时间、水平和经验有限,在硬件的调试、软件编码及抗干扰等方面仍有不足之处,有改进的余地,比如电路规模的精简,其他的保护电路,抗干扰处理。
这次毕业设计对于我来说,既是一次机遇,又是一次挑战。通过这次的毕业设计,我学到了很多东西,通过自己的实践,增强了动手能力。通过实际工程的设计也使我了解到书本知识和实际应用的差别。在实际应用中遇到很多的问题,这都需要我对问题进行具体的分析,并一步一步地去解决它。
致谢
在这几个月的时间里,从对课题的理解,方案的设计,到电路的制作,再到论文的写作,中间有着自己的努力,更有着老师和同学的关心和巨大的帮助。
感谢胡体玲老师在很忙的情况下,为我讲解课题的要点,引领设计的思路。她对学生认真负责的态度让我由衷地敬佩。
感谢冯世柱和孙海连同学给予我无私的帮助,他们对我所遇到的难题的解答让我受益匪浅。
感谢杨老师对我们的关心照顾。
感谢母校和老师们在大学四年中对我的培养。
参考文献
[1] 魏军丞. 用单片机制作的定时开关控制器. 电子世界,2005(10):25-27
[2] 曾若渊. MCS-51定时器/计数器在出租车计价器中的应用. 现代测量与实
验室管理,2005,19(01):24-25
[3] 崔惠柳. 单片机应用技术选编:串行时钟芯片DS1302在汽车智能记录仪中
的应用.北京:北京航空航天大学出版社,1999
[4] 张晓军,罗翔,史金飞. 基于时间芯片的定时控制装置. 现代电子技术,
2006,16(01):8-10
[5] 李响初. 基于MCS-51单片机的智能时钟控制系统设计. 世界电子元器件,
2007(4):50-52
[6] 张俊谟编著. SoC单片机原理与应用. 北京:北京航空航天大学出版社,
2007
[7] 吴汉清. 基于AT89C2051 单片机的倒计数定时器.单片机与可编程器件,
2005,8(11): 28-30
[8] 田希晖, 薛亮儒编著. C51单片机技术教程. 北京:人民邮电出版社,2007
[9] 王为青,邱文勋编著. 51单片机应用开发案例精选. 北京:人民邮电出版社,
2007
[10] 徐金增; 史斐翡. MCS-51软件消除定时中断误差. 电子制作,2007(10):
52-53
[11] 朱蓉,郑建华. 基于MCS-51单片机定时精确控制的研究. 现代电子技术,
2005,28(17):32-34
[12] 王振宇. 基于单片机设计的多功能定时器. 贵州教育学院学报(自然科
学),2005.8,16(4):79-81
[13] Fast Memory Transfers with the Ultra High-Speed Flash Microcontroller.
http://www. maxim-ic.com/appnotes.cfm/appnote_number/604
[14] Paul C. de Jong and Ferry N. Toth .Measuring Duty Cycles with an Intel
MCS-51 Microcontroller. http://www.smartec.nl/pdf/appsmt01.pdf
[15] 80C51 8bit ;http://cn.ic-on-line.cn/IOL_m80c51fb/PdfView/ 4628.htm
导读:附录1单片机内部结构和引脚功能,附录1.1单片机内部结构如下图,附录1.2引脚功能介绍,对于HMOS单片机,对于CHMOS单片机,①ALE功能:用来锁存P0口送出的低8位地址,②PROG功能:片内有EPROM的芯片,①RST(Reset)功能:复位信号输入端,②VPD功能:在Vcc掉电情况下,①EA功能:内外ROM选择端,80C51单片机ROM寻址范围为64KB,②Vpp功能:片内有EPROM
附 录
附录1 单片机内部结构和引脚功能
附录1.1 单片机内部结构如下图
附录图1 80C51内部结构框图
附录1.2 引脚功能介绍
1.电源:Vss(20脚):接地;VCC(40脚): 主电源+5V。
2. 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 XTAL1(19脚):接外部晶体的一端。在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,此引脚作为驱动端。XTAL2(18脚): 接外部晶体的另一端。在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。
3. 控制线:控制线共有4根。
(1)ALE/PROG(30脚):地址锁存允许/片内EPROM编程脉冲;
① ALE功能:用来锁存P0口送出的低8位地址;
② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
(2)PSEN(29脚):外ROM读选通信号。在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在
12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。
(3)RST/VPD(9脚):复位/备用电源。
① RST(Reset)功能:复位信号输入端;
② VPD功能:在Vcc掉电情况下,接备用电源。
(4)EA/Vpp(31脚):内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
80C51单片机ROM寻址范围为64KB,其中4KB在片内,60KB在片外(80C31芯片无内ROM,全部在片外)。当EA保持高电平时,先访问内ROM,但当PC(程序计数器)值超过4KB(0FFFH)时,将自动转向执行外ROM中的程序。当EA保持低电平时,则只访问外ROM,不管芯片内有否内ROM。对80C31芯片,片内无ROM,因此EA必须接地。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
4.I/O线:80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
其中P3口的功能如下:
P3.0 (10脚)—— RXD:串行口输入端;
P3.1 (11脚)—— TXD:串行口输出端;
P3.2 (12脚)—— INT0:外部中断0请求输入端;
P3.3 (13脚)—— INT1:外部中断1请求输入端;
P3.4 (14脚)—— T0:定时/计数器0外部信号输入端;
P3.5 (15脚)—— T1:定时/计数器1外部信号输入端;
P3.6 (16脚)—— WR:外RAM写选通信号输出端;
P3.7 (17脚)—— RD:外RAM读选通信号输出端。
5. 4个8位的I/0口
① P0.0—P0.7(39脚—32脚),双向I/O(内置场效应管上拉)。寻址外部程序存储器时分时作为双向8位数据口和输出低8位地址复用口;不接外部程序存储器时可作为8位准双向I/O口使用;
② P1口:P1.0—P1.7(1脚—8脚),通用I/O口(准双向口);
③ P2.0—P2.7(26脚—21脚):输出高8位地址(用于寻址时是输出口;不寻址时是准双向口);
④ P3.0—P3.7(10脚—17脚):具有特定的第二功能(准双向口)。
附录2 硬件电路实物图
附录3 时间显示及定时主程序
#include <regx52.h>
#include <intrins.h>
#include <math.h>
/*****************端口定义**************************/
sbit mode_button=P1^4; //模式控制
sbit operation_button=P1^5;//操作控制
sbit inc_button=P3^6;//执行加键
sbit dec_button=P3^7;//执行减键
sbit s3 = P1^3;
sbit s2 = P1^1;
sbit s1 = P1^2;
sbit s0 = P1^0;
sbit bell= P2^7; //蜂鸣器控制
sbit power_ctrl = P1^7;//继电器控制
sbit Clock = P2^2; //时钟口线
sbit DataOut = P2^1; //数据输出口线
sbit ChipSelect = P2^0; //片选口线
/******************************************************/ /******************延时定义****************************/ #define Wait1us {_nop_();}
#define Wait2us {Wait1us;Wait1us;}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait30us {Wait8us;Wait8us;Wait8us;Wait4us;Wait2us;} /*********************************************************/ /******************共阳数码管代码**********************/ code unsigned char table[10]
={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char led[4];
unsigned char timer2_tick,mode,operation;
unsigned char flag=0,timer=0,timer_second=0,timer_minute;s=0;//跑表时间 int ring_hour=0,ring_minute=0;//闹铃时间
unsigned char keys;
导读:/***************************************,s2=0;led[1]=now.hour%10;if(now.second%2)P0_7=0;elseP0_7=1;P0=table[led[1]];delay_ms1();P1|=0x0f;//litoffallledP0=0xff;s3=0;led[0]=now.hour/10;P0=table[led[0]s2=0;
led[1]=now.hour%10; if(now.second%2) P0_7=0; else P0_7=1; P0=table[led[1]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s3=0;
led[0]=now.hour/10;
P0=table[led[0]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
}
/*********************************************************************/ /*****************秒表显示函数***************************************/ void displaytimer(void)
{
P1|=0x0f; //lit off all led
P0=0xff;
s0=0;
led[3]=flag;
P0=table[led[3]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s1=0;
led[2]=timer_second%10;
P0=table[led[2]];
P0_7=0;
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s2=0;
32
led[1]=timer_second/10;
P0=table[led[1]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s3=0;
led[0]=timer_minute%10;
P0=table[led[0]];
P0_7=0;
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
}
/*********************************************************************/ /***************闹铃显示函数******************************************/ void display_ring(void)
{display1(ring_minute,ring_hour);
if(now.hour==ring_hour)
{if(now.minute==ring_minute)
bell=0;
power_ctrl = 0;
}
else bell=1;
power_ctrl = 1;//p1^7高电平时,继电器通;低电平时,继电器断
}
/*********************************************************************/ /************************温度显示函数******************************/ void display_temp(void)
{
float temp,k,value;
unsigned char tmp;
delay_ms1();
value=adc_conv(); tmp=value; temp=(float)tmp; 33
} k=log(temp/(255-temp)); temp=k/3380+1/298.15; temp=1/temp-273.15; tmp=(unsigned char)temp; led[0]=tmp%10; led[1]=(tmp%100)/10; led[2]=0; led[3]=0; display();
/*********************************************************************/ /*******************T2定时器初始化***********************************/ static void timer2_initialize (void)
{
T2CON=0x00;
timer2_tick=0;
TH2 = 0x4C;
}
/*********************************************************************/ /********************按键记值程序************************************/ char gotkey()
{ keys=0;
if (mode_button==0)
{
delay100ms(); if (mode_button==0) keys=1; } TL2 = 0x00; RCAP2H = 0x4C; RCAP2L = 0x00; ET2 = 1; EA = 1; TR2 = 1;
if (operation_button==0)
34
{
delay100ms(); if (operation_button==0) keys=2; }
if (inc_button==0)
{delay100ms();
if (inc_button==0) keys=3; }
if (dec_button==0)
{
}
/*********************************************************************/ /*********************主函数*****************************************/ void main(void)
{
float temp,j,value;
unsigned char tmp;
unsigned char temph;
mode=0;
operation=0;
timer2_initialize();
temph=35;
do{
Wait30us;
value=adc_conv();
delay100ms(); if (dec_button==0) keys=4; } return (keys); tmp=value; temp=(float)tmp; j=log(temp/(255-temp)); 35
导读:unsignedchartemp;/*****************当前时间************************************/typedefstruct{charhour;charminute;charsecond;}time;timenow={10,30,30};/*********************************unsigned char temp;
/*****************当前时间************************************/ typedef struct {
char hour;
char minute; char second;
} time;
time now={10,30,30};
/****************************************************************/ /*******************100MS延时**********************************/ void delay100ms(void)
{
}
/*******************************************************************/ /*****************延时程序******************************************/ void delay_ms1() //延时程序1
{
unsigned int i;
for(i=0;i<100;i++);
}
void delay_ms2() //延时程序2
{
unsigned int i,j;
for(i=0;i<100;i++)
for(j=0;j<50;j++) ;
}
/*****************************************************************/ /*******************AD转换程序*********************************/ unsigned char adc_conv(void)
{
unsigned int i = 1 , j ; while(i--) { }; j=9086; while(j--);
unsigned char i;
unsigned char value;
Clock=0;
ChipSelect=1;
Wait30us;
ChipSelect=0;
for(i=0;i<8;i++)
{
value<<=1;
Clock=1;
if(DataOut==1)
value|=0x01;//value+=1;
Clock=0;
}
ChipSelect=1;
return(value);
}
/***************************************************************/ /*****************LED动态扫描程序********************************/ void display(void)
{
P1|=0x0f; //lit off all led
P0=0xff;
s0=0;
P0=table[led[0]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s1=0;
P0=table[led[1]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s2=0;
P0=table[led[2]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s3=0;
P0=table[led[3]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
}
/*********************************************************************/ /*********************显示两位函数************************************/ void display1(unsigned char a,b) //显示两位
{
led[0]=a%10;
led[1]=a/10;
led[2]=b%10;
led[3]=b/10;
display();
}
/*****************************************************************/ /*******************中断服务函数*********************************/ void timer2(void) interrupt 5 using 1
{
if(s==1)
{timer++;
if(timer==2)
{timer=0;flag++;
if(flag==10)
{flag=0;timer_second++;
if(timer_second==60)
{timer_second=0;
timer_minute++;}
}
}
}
timer2_tick++;
if(timer2_tick==20)
{ timer2_tick=0;
}
/********************************************************************/ /******************当前时间程序*************************************/ void display_time(void)
{
P1|=0x0f; //lit off all led
P0=0xff;
s0=0;
led[3]=now.minute%10;
P0=table[led[3]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
s1=0;
led[2]=now.minute/10;
P0=table[led[2]];
delay_ms1();
P1|=0x0f; //lit off all led
P0=0xff;
now.second++; if(now.second==60) { now.minute++; now.second=0; } if(now.minute==60) { now.hour++; now.minute=0; if(now.hour==24) now.hour=0; } } TF2=0;
爱华网



