返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

学林杯第二届单片机征文大赛公开评奖稿件 深圳学林电子www.51c51.com 版权所有 转载注明出处   请不要忘了:现在为你喜欢的稿件投票!
作品1:征文-我是怎样开始学习电子的  山西省大同市作品6:多功能自行车测速仪  北京大学      崔健
作品2:数字温度计的设计  杭州电子科技大学     陈智杰作品7:带闹钟智能电子钟 深圳市天安数码城      谢玉平 
作品3:如何使自制的单片机电子钟走时精准      舒新生作品8:电话回拨服务告知装置 武汉市桥口区      詹显德
作品4:宽带数控放大器 陕西省西安通信学院    韩宏伟作品9:单片机应用之摩斯密码电子锁广东省顺德      吴志光
作品5:一些事,一些情  韶关市      冯敬锋作品10:基于aduc842瞬态波形存储器 华中师范大学物理学院     杨程泽
作品11:基于AT89S52单片机的毫欧表电路设计中南林业科技大学涉外学院     郭海

作品1:字符型液晶显示模块       邓杰   作品6:基于89C51的智能转速计  淮安信息学院     宋炎
作品2:8X8LED点阵屏循环显示作品7:用虚拟IIC总线实现24C02 的应用  南阳理工学院     张全领
作品3:虚拟仿真仪器UMPS的应用     牛余朋作品8:语音编程、远程控制试验板      社区乞丐
作品4:万年历数字钟及可调时钟系统作品9:定时开关控制器的制作     魏军丞
作品5:点矩阵显示器的应用  会员lfgbody    林发根作品10:AD080951单片机中的应用     文/黄海

定时开关控制器的制作

魏军丞

定时开关控制器在各种场合都有着极为广泛的用途,例如可用于工业方面的自动控制,办公场所的电器控制,广告公司的霓虹灯控制,军事装备的武器控制等等,有比较高的应用价值。本文利用2051单片机设计的定时开关控制器具有简单易制、价格低廉、控制点数多、控制时间可精确到秒等特点,供有兴趣的朋友参考。

1、主板电路部分


本电路主要是利用单片机AT89C2051(-24PI)作为主控制元件,通过外围电路控制用电设备的电源,以达到定时开关机的目的。AT89C2051具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。按图1制作的主板(双面)大小只有95*70mm2,器件位置图见图2。主板电路包括MCU AT89C2051、键盘与显示、输入与输出口、复位和电源滤波等电路组成。

1.1 键盘与显示

显示电路由U2、U3、Q1~Q7和L1A、L2A组成。U2为BCD-7段译码器(74LS47),通过单片机U1的P1.4~P1.7口将要显示字符的BCD码输出到U2的四个输入端,经U2译码后输出相应的笔段驱动LED数码管(共阳)。LED数码管显示采用动态扫描方式,即在某一时刻,只有一个数码管被点亮。数码管的位选信号由单片机U1的P3.3~P3.5输出,经U3(74HC138)译码后通过Q1~Q6放大,驱动相应的数码管。R17~R24为限流电阻。

由于U2只能输出7段笔段码,而数码管除了七段笔段外,还要控制点亮小数点,因此,小数点必须有另外的驱动电路来完成,在这里,通过Q7来驱动小数点。当需要点亮小数点时,在U1的P1.3输出高电平即可。

键盘电路跟显示电路一样,采用扫描方式,利用动态显示时的数码管驱动位置信号来判断相应按键的状态。U1的P3.3~P3.5口输出的BCD码经U3译码后,相应Y口呈低电平,而U1的P3.7口平时为高电平(由于R8上拉),当某一键按下时, P3.7被下拉为低电平,这时MCU利用程序查询P3.7是否为低电平,如果P3.7为低电平,就读回U1 P3.3~P3.5口的值(从缓冲区读取),就可判断是那个按键按下,然后调用相应的处理程序进行处理。

1.2 控制输出、复位与电源滤波电路

MCU对控制的输出是通过P3.0~P3.2口完成的。程序开始时这三个口的输出状态是低电平,MCU通过程序查询三路输出的ON或OFF状态预置时间是否已到,如果已到时间,则改变相应的输出状态,就完成了对外部电路的控制。复位电路如图1左上角所示,C3和R25完成上电复位,S6为手动复位,按键输入干扰和抖动的预防是由软件完成的。+5V电源由JP2输入,经C4~C9滤波后给U1和其它器件供电。

2、电源与控制电路

电源电路如图3,市电经总开关K后由B降压、V1整流、C11~C14滤波、U4、U5稳压后给主板和控制电路板提供稳定的工作电源。控制电路原理如图3,主板送过来的三路控制信号通过Q12~Q14分别控制继电器J1、J2、J3,对外部电路实施直接控制。继电器这里没有给出具体型号,您可根据耐压及通流大小选用相应的继电器,如在大电流和强电磁场干扰的环境里工作,最好利用中间继电器来间接控制。

3、程序软件工作过程

3.1 秒脉冲发生器


秒脉冲发生器是由定时器T0和内存空间TT0配合完成的。T0工作于16位计数器模式,当T0向上计数由全1变为全0时产生中断,本程序中T0的初值为0DC00H,大约0.01秒中断一次。这里使用的晶振频率为11.0592MHz,由此可计算出日误差约为0.78S。

工作过程:如图4流程图所示,产生中断后,首先保存ACC和PSW的值,然后为T0重装初值,判断中断次数是否小于100,是则转出中断服务,反之则为秒计数器加1,秒计数器如果大于59,则为分计数器加1,同时秒计数器清0。同样分计数器如大于59则为时计数器加1,同时分计数器清0,时计数器如大于23则清0并转出中断服务。T0中断100次的时间刚好为1秒钟。

3.2 主程序

上电复位过程:首先P0~P2口全部置1,P3口高5位置1,低3位置0。设置定时器T0工作于16位计数器模式,并赋初值TH0=0DCH,TL0=00H,关闭外部中断和串行口中断,时间计数器TS、TM、TH清0,所有预置时间存储区全部赋值FFH,至此所有初始化工作完成。

主程序工作过程:首先循环进行六个数码管扫描显示(DISPLY段),然后比较所有预置时间(COMP段)是否与当前时间相等,如相等则转向相应处理程序。在比较完成(或处理完成)后判断有无按键(PP2段),没有则返回继续显示、比较、判断;有按键则转向相应处理程序。按键转移采用偏移量加表格跳转转移法(KEY段),简单、明了。预置时间比较则采用逐一比较法,即对每一个预置值进行比较,如相等则做相应处理。具体比较时(COMP1段)先比较TH值,如不相等则直接转出并置“时间到”标志CCB为0,如TH、TM、TS全部对应相等,则置该标志为1。


本程序在显示及按键处理(设置过程)中巧妙使用R1寄存器作为公用地址寄存工具,对实时时间和预置时间的显示和修改调用同一程序完成,使源代码长度大大缩短,提高了程序的可读性和运行效率。

4、制作与调试

4.1主板的制作与调试

主板的制作稍微复杂一点。首先是制作印刷板,利用Protel99按照本文所示器件位置图放置好元器件,然后手动布线(双面),线宽为0.8mm左右,太宽做出的板子太大,太窄无法进行自制。绘好印制板图后转成BMP格式利用电脑刻字机镂空(要用进口的即时贴纸,不然容易断开),贴在双面敷铜板上,就可以用FeCl3腐蚀了。具体的制作方法这里不再赘述,但最好在印制板布线时做个阻焊层,同时在即时贴上刻出来,当板子制好清洗干净后敷在上面,用浅绿色油漆或清漆喷上薄薄的一层,好看又防腐蚀。

S5

数码管显示

   

S1

S2

S3

S4

没有按S5

00.00.00

设 置 时 间

时计数器加1

分计数器加1

秒计数器加1

退 出

按第1次S5

95.95.95

1路ON设置

时加1

分加1

秒加1

退 出

按第2次S5

95.95.95

1路OFF设置

时加1

分加1

秒加1

退 出

按第3次S5

95.95.95

2路ON设置

时加1

分加1

秒加1

退 出

按第4次S5

95.95.95

2路OFF设置

时加1

分加1

秒加1

退 出

按第5次S5

95.95.95

3路ON设置

时加1

分加1

秒加1

退 出

按第6次S5

95.95.95

3路OFF设置

时加1

分加1

秒加1

退 出

按第7次S5

当前时间

退                 

其次是元器件的选择。如果按照本文所附器件位置图布线的话,数码管需选用图示型号才能安装(5361BH,一拖三数码管),选用不同型号数码管时可能需修改器件位置参数,然后再布线即可。晶振为11.0592MHz。S1~S5选用黑色小型轻触开关,S6则用红色同类型开关。变压器B选用15V、10W左右即可,V1硅堆应与B配合选用。控制继电器根据需要选用适合的型号,如5V、12V、24V等,如果选用5V的,相应的B、V1可选小一点的,7812则不要。如选用24V的,那么B、V1、7812、7805都需同时根据实际情况来选用了。~220V输出插座没有特殊要求,其耐压和通流符合受控器件要求即可。其它元器件选用通用的就行。

最后就是焊接元器件。元器件购回后应先进行预处理(引脚打磨、上焊锡),然后逐一焊接。在焊接MCU(当然2051要烧好程序后才能焊接哦J)和其它集成电路时应使用有良好接地的烙铁(断电焊接也可),以免被击穿。由于双面印刷板存在一个穿孔问题,器件引脚穿过后,两面都要点上焊锡;如只是过孔,可用细铜线穿过并在两面焊接后剪掉即可。

在印刷板制作良好,连线没有不应有的开路或短路,且焊接没有虚焊的情况下,不用调试即可正常工作(本程序已制作成品并调试通过,不需再行调试)。如果您觉得自己制作的印刷板不够漂亮或太麻烦可联络凯思迪邮购(焊接好的整板也有)。

4.2 电源与控制板的制作

可以将电源与控制板做在同一个板子上,也可分开制作,视所使用的情况而定,但JP1与JZ1之间的连线不宜太长。印刷板的制作同前所述,要注意的是在布线时对~220V市电进入和输出(包括中线)的线宽设计要宽一点(根据工作电流大小来定为好),还要注意市电与直流电源的隔离,以免在使用中造成触电事故。

5、操作使用

本系统在加电后数码管显示“00.00.00”,输出继电器均不动作,此时可直接按S1、S2、S3键分别对时、分、秒进行调整,使当前时间与北京时间相符,时间设置过程中将停止计时,在设置好后按S4退出,时钟即进入正常计时。如果要设置输出控制的预置时间则先按S5,数码管显示“95.95.95”,此时可再按S1、S2、S3键分别对第一路输出状态ON的时、分、秒进行设置,设好后再按一次S5键,数码管也显示“95.95.95”,然后按S1、S2、S3键则分别对第一路输出状态OFF的时、分、秒进行设置,依此类推,按第七次时退出设定(详见附表)。任一路任一状态被执行后其预置值即被清除,24小时后并不有效,如果需要每天循环执行则对程序进行简单的修改即可(预置值不清除就可)。

6、改进与扩展

本文所述的AT89C2051在控制输出时只使用了P3.0~P3.2三个口,所以只能控制三路六个状态,如果把不用的P1.0~P1.2三个口用起来,则可控制六路十二个状态,外围电路相应增加三路继电器,程序软件只需稍事修改即可。当然如果需要控制更多路输出状态,那么在使用锁存器、译码器、触发器等后最多可以扩展到控制2664路128个状态。在对控制输出的路数要求不多,而显示部分需要比较多的情况下,如还要显示年月日、农历、星期等,只要对其进行扩展就可实现:P1.4~P1.7不动,选通端用两个138,输出口用P3.2~P3.5就有2416个数码显示。这时仍然利用上述方法最多可扩展到控制2532路64个状态。当然年月日、农历、星期的计算(如大月小月、闰年、闰月等)分别汇编相应的子程序插入即可,这方面的资料8951论坛讨论的很多,这里不再赘述。如您对源程序有不明白的地方或有兴趣交流可与我联系E-mail:luckybirds@sina.com。

 

;*****************************************

;*     三路六个状态定时开关控制器        *

;*****************************************

;*    S1----对时按钮;S2--对分按钮     *

;*    S3--对秒按钮;S4--退出对时     *  

;*    S5--设定预设值按钮               *

;*****************************************

TS      EQU    2DH         ;* TS 为秒计数器(二进制,0~24)

TM      EQU    2EH         ;* TM 为分计数器(二进制,0~60)

TH      EQU    2FH         ;* TH 为时计数器(二进制,0~60)

K5      EQU    26H         ;S5状态

KEYCODE EQU    29H         ;*KEYCODE 为键盘值

TT0     EQU    2BH         ;*与T0配合构成为秒脉冲发生器

CCB     EQU    20H         ;预设‘时间到’标志,为01H时表示时间到

OFF     EQU    0FFH        ;预设值复位标志

DPS0    EQU    11000000B      ;秒个位选通

DPS1    EQU    11001000B      ;秒十位选通

DPM0    EQU    11010000B    ;分个位选通

DPM1    EQU    11011000B    ;分十位选通

DPH0    EQU    11100000B     ;时个位选通

DPH1    EQU    11101000B   ;时十位选通

    

K1ON    DATA    30H    ;*第一个开启时间   30H 

K1OFF   DATA    33H    ;*第一个关闭时间   33H  

K2ON    DATA    36H    ;*第二个开启时间   36H      

K2OFF   DATA    39H    ;*第二个关闭时间   39H   

K3ON    DATA    3CH    ;*第三个开启时间   3CH   

K3OFF   DATA    3FH    ;*第三个关闭时间   3FH    

 

                             ORG 0000H             

AJMP     MAIN

 

                             ORG 000BH             ;定时器0(T0)中断入口

SJMP    I_T0

 

                             ORG 001BH             ;定时器1(T1)中断入口

I_T1:           AJMP MAIN1             

                  RETI                   

 

;*********   定时器0中断服务  **************

                             ORG 0060H              ;定时器T0中断服务程序

I_T0:             PUSH   ACC

                  PUSH   PSW

                  MOV    TH0,#0DCH          ;0.01s时间,常数因子DC00H

                  MOV    R3,TT0           

                  DJNZ   R3,I_T01          ;中断次数<100(每次中断0.01S),转出.

                  MOV    R3,#100         ;中断次数=100次,重新下一个计数.

                  MOV    A,TS            ;秒计数器加1

                  ADD    A,#01H

                  MOV    TS,A

                  SUBB   A,#60                  ;秒计数器>59?  Y,秒计数器=00

                  JC     I_T01

                  MOV    TS,#00H

                  MOV    A,TM                  ;分计数器加1

                  ADD    A,#01H

                  MOV    TM,A

                  SUBB   A,#60                  ;分计数器>59? Y,分计数器=00

                  JC     I_T01

                  MOV    TM,#00H

                  MOV    A,TH            ;时计数器加1

                  ADD    A,#01H

                  MOV    TH,A

                  SUBB   A,#24                  ;时计数器>23? Y,时计数器=00

                  JC     I_T01

                  MOV    TH,#00H

I_T01:         MOV    TT0,R3

                  POP    PSW

                  POP    ACC

                  NOP

NOP

RETI

 

;************   主程序   ********************

                  ORG 00F0H

MAIN:        MOV   P0,#0FFH         ;主程序,初始化

                  MOV   P1,#0FFH

                  MOV   P2,#0FFH

                  MOV   P3,#0F8H         ;p3.0~p3.2置低电平,使三个控制口关闭

                  MOV   SP,#50H                ;初始化堆栈指针       

                  MOV   TMOD,#11H           ;T0工作于16位定时器

                  MOV   TT0,#100         ;中断次数,每次0.01s*100=1s

                  MOV   TH0,#0DCH            ;T0初值

                  MOV   TL0,#00H

                  MOV   TS,#00H          ;时间赋初值

                  MOV   TM,#00H

                  MOV   TH,#00H

                  CLR    EX0           ;外部中断0失效

                  CLR    EX1           ;外部中断1失效

                  CLR    ES            ;串行口中断失效

                  SETB   ET0            ;开T0

                  SETB   TR0           ;激活T0

                  SETB   EA            ;开总中断

                  MOV    K5,#00H       ;S5键状态赋0

          mov    r5,#14H       ;预设值全部赋FFH,数码管显示95.95.95

                  mov    r1,#K1ON 

kk:             mov    @r1,#OFF

                  INC    R1

                  DJNZ   r5,kk

MAIN1:      MOV    R6,#50H         ;循环显示80次,消除按键抖动

DISP:         MOV    KEYCODE,#00H

                  MOV    R1,#TS        ;R1保存时间存储区的首地址

        MOV    A,K5         ;K5为S5的状态,在设定预设值时则为增量

        ADD    A,R1

        MOV    R1,A

        NOP

        NOP

        ACALL  DISPLY       ;调用显示子程序

             DJNZ   R6,DISP

        MOV    A,K5          ;S5按下时不进行比较

        JNZ    PP2

        NOP

        NOP

        ACALL  COMP             ;判断预设置是否与当前时间相等,

PP2:           MOV     DPTR,#KEY        ;设置转移表增量

                  MOV     A,KEYCODE            ;读键盘值

                  JMP     @A+DPTR              ;按键值跳到相应处理程序

KEY:           SJMP    MAIN1

                  SJMP    KEY1             ;设置小时值

                  SJMP    KEY2             ;设置分钟值

                  SJMP    KEY3             ;设置秒钟值

                  SJMP    KEY4             ;退出设置

                  SJMP    KEY5             ;设定预设置

KEY1:         MOV     A,K5        ;如果S5按下,则TR0不停止计数

        JNZ     KEY12        ;在设定预设置值时时钟不停止

        CLR     TR0   

KEY12:       MOV    A,@R1

                  CLR    C

                  INC    A          ;时计数器加1

                  MOV    @R1,A

                  SUBB   A,#24              ;24D

                  JC    KEY11

                  MOV   @R1,#00H

KEY11:    SJMP   MAIN1

                  NOP

KEY2:         MOV    A,K5         ;如果S5按下,则TR0不停止计数

        JNZ    KEY22

        CLR    TR0     

KEY22:       DEC    R1

        MOV    A,@R1

               CLR    C

               INC    A            ;分计数器加1

               MOV   @R1,A

               SUBB   A,#60                ;60D

               JC     KEY21

               MOV    @R1,#00H

KEY21:    SJMP   MAIN1

                  NOP

KEY3:         MOV   A,K5        ;如果S5按下,则TR0不停止计数

          JNZ   KEY32

          CLR   TR0                     ;秒计数器加1

KEY32:       DEC   R1

          DEC   R1

          MOV   A,@R1

                  CLR   C

                  INC   A

                  MOV   @R1,A

                  SUBB  A,#60            ;60D

                  JC    KEY31

                  MOV   @R1,#00H

KEY31:    SJMP   MAIN1    

                  NOP

KEY4:         MOV    K5,#00H        ;退出时将K5清0

          MOV    TH0,#0DCH        ;退出校时状态

                  MOV    TL0,#00H

                  SETB   TR0

                  SJMP   MAIN1

KEY5:     MOV    A,K5          ;修改预设置

          CLR    C

        SUBB  A,#12H   ;判断S5按钮是否越过设定区,如果越过则将K5清0并退出设定

        JZ  KEY51

        MOV A,K5

        ADD  A,#03H

        MOV  K5,A

        AJMP KEY52

KEY51:     MOV  K5,#00H

KEY52:     LJMP MAIN1         

 

;***********   键盘和显示子程序  *************

                  ORG    0200H                ;显示子程序

DISPLY:   MOV    A,@R1               ;秒计数器调入A

                  MOV    B,#0AH

                  DIV    AB           ;秒计数值÷10(结果十位从A,个位存于B) 

                  SWAP   A

                  ORL    A,#0FH              ;显示秒的十位

                  MOV    P1,A

                  MOV    A,P3         ;输出位选信号,以下相同

                  ANL    A,#0FH

                  ORL    A,#DPS1

                  MOV    P3,A

          NOP

          NOP

                  ACALL  DSPDEL             ;延时

                  MOV    C,P3.7                ;读S4按键状态

                  JC     NP1

                  MOV    KEYCODE,#08H    ;S4按下,键盘值=8  

NP1:          MOV    P1,#0FFH              ;消隐

                  NOP

                  NOP

                  MOV    A,B              ;显示秒的个位

                  SWAP   A

                  ORL    A,#0FH

                  MOV    P1,A

                  MOV    A,P3

                  ANL    A,#07H

                  ORL    A,#DPS0

                  MOV    P3,A

                  ACALL  DSPDEL

                  MOV    C,P3.7

                  JC     SS5

                  MOV    KEYCODE,#0AH        ;S5按下,键值=#0AH

SS5:           MOV    P1,#0FFH                   ;消隐

                  NOP

                  INC    R1

          MOV    A,@R1                     ;调入分值

                  MOV    B,#0AH

                  DIV    AB            

                  SWAP   A                             ;显示分的十位

                  ORL    A,#0FH

                  MOV    P1,A

                  MOV    A,P3

                  ANL    A,#07H

                  ORL    A,#DPM1

                  MOV    P3,A

                  ACALL  DSPDEL

                  MOV    C,P3.7                 ;检测S2是否按下

                  JC     NP2

                  MOV    KEYCODE,#04H    ;S2按下,键盘值=4

                  NOP

NP2:          MOV    P1,#0FFH              ;消隐

                  NOP

                  NOP

                  MOV    A,B

                  SWAP   A                       ;显示分的个位

                  ORL    A,#07H

                  MOV    P1,A

                  MOV    A,P3

                  ANL    A,#07H

                  ORL    A,#DPM0

                  MOV    P3,A

                  ACALL  DSPDEL

                  MOV    C,P3.7                 ;判断S3是否按下

                  JC     NP3

                  MOV    KEYCODE,#06H    ;若S3按下,键盘值=6

                  NOP        

NP3:          MOV    P1,#0F7H           ;消隐

                  NOP

                  INC    R1

                  MOV    A,@R1                ;调入时值

                  MOV    B,#0AH  

                  DIV    AB                   

                  SWAP   A                        ;显示时的十位

                  JNZ    DISPLY1

                  MOV    A,#0FFH

DISPLY1:   ORL    A,#0FH

                  MOV     P1,A

                  MOV     A,P3

                  ANL     A,#07H

                  ORL    A,#DPH1

                  MOV    P3,A

                  ACALL  DSPDEL

                  NOP

                  MOV    A,B

                  SWAP  A                   ;显示时的个位

                  ORL   A,#07H

                  MOV   P1,A

                  MOV   A,P3

                  ANL   A,#07H

                  ORL   A,#DPH0

                  MOV   P3,A

                  ACALL DSPDEL

                  MOV   C,P3.7                  ;判断S1是否按下

                  JC    NP4

                  MOV   KEYCODE,#02H      ;S1按下,键盘值=2

                  NOP

NP4:          MOV   P1,#0F7H         ;消隐

                  NOP

                  RET

 

 

DSPDEL:    MOV   R7,#0FFH     ;延时程序0.5ms

                  DJNZ  R7,$

        RET

;************  比较设定值  *****************

 

COMP:      NOP

YY1_1:        CLR   C

                  MOV   R0,#K1ON

                  NOP

        NOP

        ACALL  COMP1

        MOV    A,CCB

        JZ     YY1_2      ;CBB标志为0则转移('时间到'标志)

        MOV    A,P3       ;取P3口原值

        ORL    A,#01H     ;置位P1.0

        MOV    P3,A

YY1_2:        CLR   C

                  MOV   R0,#K1OFF

                  NOP

        NOP

        ACALL  COMP1

        MOV    A,CCB

        JZ     YY2_1       ;CBB标志为0则转移

        MOV    A,P3

        ANL    A,#0FEH     ;P1.0清0

        MOV    P3,A

YY2_1:        CLR C

                  MOV   R0,#K2ON

                  NOP

        NOP

        ACALL  COMP1

        MOV    A,CCB

        JZ     YY2_2      ;CBB标志为0则转移

        MOV    A,P3

        ORL    A,#02H     ;P1.1置位

        MOV    P3,A

YY2_2:        CLR   C

                  MOV   R0,#K2OFF

                  NOP

        NOP

        ACALL  COMP1

        MOV    A,CCB

        JZ     YY3_1      ;CBB标志为0则转移

        MOV    A,P3

        ANL    A,#0FDH    ;P1.1清0

        MOV    P3,A

YY3_1:        CLR    C

                  MOV    R0,#K3ON

                  NOP

        NOP

        ACALL   COMP1

        MOV     A,CCB

        JZ      YY3_2      ;CBB标志为0则转移

        MOV     A,P3

        ORL     A,#04H     ;P1.2置位

        MOV     P3,A

YY3_2:        CLR    C

                  MOV    R0,#K3OFF

                  NOP

        NOP

        ACALL  COMP1

        MOV    A,CCB

        JZ     YY4         ;CBB标志为0则转移

        MOV    A,P3

        ANL    A,#0FBH     ;P1.2置位

        MOV    P3,A

        NOP

        NOP

YY4:     RET

 

COMP1:     CLR   C

                  MOV   A,R0

                  ADD   A,#02H   ;先比较小时值,相等再看分钟,秒钟值是否相等

          MOV   R0,A           ;R0为比较器的入口地址,指向设定值的小时值

          MOV   A,TH

                  SUBB  A,@R0

                  JNZ   COMP2         ;不相等,停止比较

                  CLR   C

                  MOV   A,TM

                  DEC   R0            ;指向分钟值

                  SUBB  A,@R0

                  JNZ   COMP2         ;不相等,停止比较

                  CLR   C

                  MOV   A,TS

                  DEC   R0            ;指向秒钟值

                  SUBB  A,@R0

                  JNZ   COMP2         ;不相等,停止比较

           MOV  CCB,#01H      ;'时间到'标志置位

           MOV  @R0,#OFF      ;如全部相等则将该预设置复位

        INC  R0

        MOV  @R0,#OFF

        INC  R0

        MOV   @R0,#OFF

        SJMP  COMP3

COMP2:     MOV  CCB,#00H      ;'时间到'标志清0

COMP3:     RET

 

 

                  END

                 

Email:luckybirds@sina.com,luckybirds2005@163.com。