logo资料库

AT89C2051电子定时器.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
电子定时器
电子定时器 单片机 DIY 2008-05-19 20:42:33 阅读 204 评论 0 字号:大中小 本电子定时器能定时给电器供电或断电,最大时间可以长达 30h,操作使用方便,采用 AT89C2051 单片机控制,4 位共阳数码管显示时间,继电器作电器电源输出控制,其电路简 单。 1.系统硬件电路的设计 (1)芯片的选择 硬件电路要求实现对交流大电流电源的控制、定时时间的设定显示和到点提醒等功能。 若采用 40 脚单片机有利于设计,但会增大电路板的体积。本设计采用 ATMEL 公司的 AT89C2051 单片机,芯片为 20 脚,体积小,工作电压范围宽(2.7V~6V)。 (2)交流控制接口电路 本设计采用继电器控制。也可用可控硅控制等。 (3)显示电路 显示电路采用 4 个 LED 数码管。为了在定时精度达到分的时候能显示出时钟在计时,两 个数码管之间增加了两个发光二极管,以其闪烁来代表秒走动;为了使硬件显示电路简单, 采用单片机直接驱动 LED 数码管(AT89C2051 输出口能吸收 20mA 电流),用动态扫描法实 现 LED 显示。 (4)电源电路 电源电路采用普通三端集成稳压电路。 (5)报警电路 报警电路采用普通 5V 成品小蜂鸣器。 2.系统软件主程序的设计 程序采用模块化、结构化设计,并采用了软件抗干扰技术,其软件的可靠性较好,可维 护性强。其主要程序模块有: (1)主程序 主程序有 3 个状态:待命状态、计时工作状态和到点工作状态。 (2)菜单(设置)程序 菜单程序完成定时方式和定时时间的设定。 (3)到点工作程序
到点工作程序根据所选定的不同定时方式,作不同的处理。 (4)抗干扰(出错)程序 程序跑飞时能被软件陷阱捕获,被抗干扰程序处理,返回复位状态,重新启动系统。 3.操作说明: (1)通电以后,显示窗显示“----”,表示机器处于待命状态。 (2)按功能键(S2),显示窗显示“F-01”,进入功能设置,此时按修改键(S3)选择 不同定时方式: 方式 1:定时关电源,定时范围为 1s ~ 30 min 59 s ; 方式 2:定时关电源,定时范围为 1s ~ 30 h 59 min; 方式 3:定时开电源,定时范围为 1s ~ 30 min 59 s ; 方式 4:定时开电源,定时范围为 1s ~ 30 h 59 min. (3) 选定定时方式后,再按功能键,进入时间设定。先设定秒(方式 1、方式 3)或分 (方式 2、方式 4),再设定分(方式 1、方式 3)或小时(方式 2、方式 4)。按修改键增 加数字,按功能键确定,按住修改键不放可快进。 (4)设定时间完毕,按下功能键,定时器长鸣一声,开始工作。 (5)定时时间到了在定时方式 1 和方式 2,定时器会鸣叫,此时按任意键可停止鸣叫。 (6)在任何情况下,按下复位键( S2 键),定时器重新回到待命状态。 原理图: 实物图:
源代码: ;************* 电子定时器的设计******************; ;*MCU: ;*MCU-crystal: 12M AT892051 ;*Version: 01 ;*Last Updata: 2007-6-14 ;*Author: ;*Description: zhaojun ; ; ; ; ; ; ;定时器 T0、T1 溢出周期为 50MS,T0 为秒计数用 ; ;S2 为功能键、S3 为方式选择键 ;P1 口为字符输出口,采用共阳显示管 ; ; ;P3.2~P3.5 为位选,P1.7 为报警发音,P3.7 为被控继电器 ; ;************************************************; ;****************** ; 伪定义 ; ;****************** EQU 30H SL SH EQU 31H ML MH HL EQU 32H EQU 33H EQU 34H HH EQU 35H ; SL 存放秒的个位数 ; SH 存放秒的十位数 ; ML 存放分的个位数 ; MH 存放分的十位数 ; HL 存放时的个位数 ; HH 存放时的十位数 L0 EQU 36H ; L0~L3:显示数据存储器 L2 L1 EQU 37H EQU 38H L3 EQU 39H DSPLYP EQU 3AH PLYTS EQU 3BH LPLMOD BIT 39H HPLMOD BIT 3AH BRIGHT BIT 3BH ; 显示数据指针(DISPLAY-POINT) ; 显示次数计数器(DISPLAY-TIMES) ; 低两位显示方式(LOW-PLAY-MOD) ; 高两位显示方式(HIGH-PLAY-MOD) ; DISPLAY 子程序参数:亮灭指示位 ; ; ;
TCOUNT EQU 3CH ADDRES EQU 3DH MAX EQU 3EH IFDEC BIT 20H R_MOD EQU 3FH ; 时间计数器(TIME-COUNT) ; 加 1 子程序参数 ; 加 1 子程序参数 ; BCD 加法子程序参数 ; 响铃方式参数 LED4 BIT 30H BELL BIT P1.7 SWITCH BIT P3.7 FKEY MKEY BIT P3.0 BIT P3.1 ; 发光管状态位 ; 蜂鸣器 ; 继电器 ; 功能键 (S1) ; 修改键 (S2) WORKIN BIT 38H ; 工作状态指示位 ; ; ; ; ; NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; ;****************** ; 中断入口 ; ;****************** ORG 0000H START: LJMP MAIN LJMP ERR ; 0000H 引向主程序 ; 0003H LJMP ERR LJMP PGT0 ; 引向出错处理程序 ; 000BH 引向中断处理程序 PGT0 LJMP ERR LJMP ERR ; 引向出错处理程序 ; 0013H INT1 LJMP ERR LJMP ERR ; 001BH T1 LJMP ERR LJMP ERR LJMP ERR LJMP ERR ; 0023H ; 002BH ;************ ; 主程序 ; ;************ MAIN: MOV IE,#00H MOV SP,#57H MOV PSW,#00H ; 关中断 ; 设置堆栈指针 ; 选用寄存器组 0 MOV TMOD,#11H ; 设定中断工作方式为 T0 和 T1 ; MOV A,56H MOV A,57H CJNE A,#0AAH,CSTART ; 判上电复位标志,无标志转冷启动 CJNE A,#55H,CSTART ; 无标志转冷启动 AJMP HSTART ; 有上电复位标志转热启动 NOP NOP ; 软件陷阱,引向出错处理程序 ; 冷启动,全面初始化 LJMP ERR CSTART: MOV P1,#0FFH
MOV P3,#0FFH MOV TCON,#00H MOV TL0,#0B0H ; 计时停止 ; 赋中断 T0 初值 MOV TH0,#3CH MOV TCOUNT,#0AH MOV R5,#00H ; 赋定时器初值 ; R5 为一空单元(备用) MOV R4,#00H ; R4 为工作模式选择寄存器 MOV SL,#00H ; 定时单元清零 MOV SH,#00H MOV ML,#00H MOV MH,#00H MOV HL,#00H MOV HH,#00H ; 秒 ; ; 分 ; ; 时 MOV PLYTS,#64H MOV DSPLYP,#L0 MOV L0,#0AH ; 赋显示次数初值为 100 次 ; 显示指针指向显存单元 ; 送显示数据"-----" MOV L1,#0AH MOV L2,#0AH MOV L3,#04H SETB LED4 ; LED4 为数码管之间的发光二极管 SETB LPLMOD ; 设定显示方式为闪烁 SETB HPLMOD ; SETB BRIGHT CLR WORKIN AJMP SETUP ; 允许显示 ; 清工作标志 , 待命 ; 转开始工作 NOP NOP NOP NOP LJMP ERR ; 软件陷阱 HSTART: MOV SCON,#00H MOV IP,#00H ; 有上电标志,热启动,清串行口控制寄存器 ; 清中断优先控制寄存器 SETB FKEY ; 重设按键 SETB MKEY SETB EA AJMP BEGIN ; 开中断 ; 转向继续工作 LJMP ERR SETUP: SETB EA ; MAIN1: ACALL DISPLY FKEY,JUDGE JB ACALL KEYDLY ; 软件陷阱 ; 开中断 ; 调用显示 ; 按键扫描 ; 延时消抖动 JB FKEY,JUDGE CLR ET0 CLR TR0 ACALL MENU BEGIN: SETB WORKIN SETB ET0 SETB TR0 ; 无键按下转向判断是否到点 ; 功能键被按下,则 ; 暂停计时 ; 调用菜单设置程序 ; 置工作标志位,开始工作 ; 开中断 ; 开始计时 MOV A,R4 ; 移入工作模式选择 RL ; 指针放大 MOV DPTR,#M_TAB A JMP @A+DPTR ; 根据工作模式跳转到相应程序段 M_TAB: AJMP WORK1 AJMP WORK2 AJMP WORK3 AJMP WORK4 LJMP ERR NOP NOP WORK1: WORK2: CLR SWITCH ; 软件陷阱 ; ; 工作方式 1 和 2:开继电器
LJMP ERR ; 软件陷阱 WORK4: SETB SWITCH MAIN2: CLR BELL ; 工作方式 3 和 4:不开继电器 ; 蜂鸣器短鸣一声,以示开始工作 JUDGE: JNB WORKIN,MAIN1 ; 判断是否在定时之中 MOV A,SL ; 判断秒是否为零 AJMP MAIN2 NOP NOP WORK3: ; ACALL DL05S SETB BELL JNZ MAIN1 JNZ MAIN1 JNZ MAIN1 JNZ MAIN1 JNZ MAIN1 MOV A,SH ; 判断秒是否为零 MOV A,ML ; 判断分是否为零 MOV A,MH ; 判断分是否为零 MOV A,HL ; 判断时是否为零 MOV A,HH JNZ MAIN1 CLR ET0 ; 判断时是否为零 ; 若时分秒全为零则 ; 停止计时 CLR TR0 ; ACALL ACTION ; 调用到点工作子程序 AJMP MAIN ; 返回 LJMP ERR ; 软件陷阱 NOP NOP ; PGT0: CLR EA PUSH ACC ; 关中断 ; 保护现场 MOV PSW,#08H CLR TR0 MOV A,#0B7H ; 选用寄存器组 1 ; 暂停计时 ; 中断同步修正 ;****************** ; 倒计时程序 ; ;****************** PUSH PSW PUSH DPL PUSH DPH ADD A,TL0 MOV TL0,A MOV A,#3CH ADD A,TH0 MOV TH0,A SETB TR0 ; 恢复计时 DEC TCOUNT ; 定时器 T0 每 50 000 毫秒溢出一次,则 MOV A,TCOUNT JNZ OUTT0 ; 溢出 10 次为 0.5 秒 ; 判断是否到半秒 MOV TCOUNT,#0AH ; CPL LED4 ; 若到半秒 LED 取反 JNB LED4,OUTT0 MOV R0,#SH SETB IFDEC ACALL ADDBCD ; LED 每闪烁一次是一秒 ; 移入秒位的地址 ; BCD 子程序参数,使其做减法 ; 调用 BCD 子程序, 秒减 1 CJNE R3,#99H,OUTT0 MOV SH,#05H ; 判断秒要否借位 ; 要借位则 MOV SL,#09H MOV R0,#MH ; 送数据 59(否则显示 99) ; 移入分位的地址 ACALL ADDBCD CJNE R3,#99H,OUTT0 ; 分减 1 ; 判断分要否借位
OUTT0: POP DPH ; 恢复现场 MOV MH,#05H MOV ML,#09H MOV R0,#HH ACALL ADDBCD POP DPL POP PSW POP ACC SETB EA NOP NOP ; ; RETI ; 中断返回 LJMP ERR ; 软件陷阱 ;************************** ; BCD 子程序(加 1 或减 1 ) ;************************** ; ADDBCD: MOV A,@R0 DEC R0 ; 移入被操作数的高位 ; 指针减一 SWAP A ORL A,@R0 MOV B,#01H MOV C,IFDEC ; 移入被操作数的低位 ; B 寄存器送立即数#01H ; 若减法标志位为 1,则 MOV B.4,C ; B 寄存器的值被改为#99H MOV B.3,C MOV B.7,C ; ; ADD A,B ; 对一个压缩的 BCD 码加#99H 等于对其减一 A DA MOV R3,A ANL A,#0FH MOV @R0,A MOV A,R3 INC R0 SWAP A ; BCD 码调整 ; 暂存结果 ; 取低位码 ; 存数 ; 取回结果 ; 指针加一 ; 交换 ANL A,#0FH ; 取结果数的高位 MOV @R0,A ; 存数 LJMP ERR ; 软件陷阱 RET NOP NOP ; ;************** ; 加 1 程序 ; ;************** ADDONE: MOV R0,ADDRES ; 移入被加数单元的地址 CLR IFDEC ACALL ADDBCD CLR C MOV A,R3 ; 设定 BCD 子程序做加法 ; 调用 BCD 子程序 ; 判断被加数是否大于 ; 最大值"MAX" CJNE A,MAX,JGOVER JGOVER: JC ENDADO CLR A ; 若大于"MAX",则清零 MOV @R0,A DEC R0 MOV @R0,A ENDADO: RET NOP NOP ; ;****************** ; 调时快进程序 ; LJMP ERR ; 软件陷阱
;****************** CLR HPLMOD QUICK: CLR LPLMOD ; 设定显示方式不闪烁 ACALL ADDONE ; 调用加 1 子程序 MOV L0,R4 INC L0 ; 将工作模式选择数移入显存 ; 加 1 转化成显示值 ACALL KEYDLY ; 延时 ACALL DL100 JNB MKEY,QUICK ; 判断键是否松开 SETB LPLMOD ; 若松开则恢复闪烁显示方式 CJNE R6,#02H,ENDQUK SETB HPLMOD CLR LPLMOD ENDQUK: RET NOP NOP ; ; ;****************** ; 功能菜单程序 ; ;****************** LJMP ERR ; 软件陷阱 MENU: MOV R6,#00H ; 初始化; R6 计功能键按键次数 MOV ADDRES,#05H MOV MAX, #04H ; 将 R5 的地址送入,以便于改变 R4 的值 ; 定义工作模式选择寄存器 R4 的最大值 MOV DSPLYP,#L0 SETB LPLMOD ; 定义显示指针指向显存 ; 设定低两位数闪烁 MOV L0,R4 ; 送显示数据"F-0X" CLR HPLMOD INC L0 MOV L1,#00H MOV L2,#0BH MOV L3,#00H SETB LED4 ; WAITFK: ACALL DISPLY ; 等待 F 键释放 JNB FKEY,WAITFK MENU1: ACALL DISPLY JB MKEY,JGFKEY ACALL KEYDLY JB MKEY,JGFKEY ; M 键扫描 ; 延时消抖动 ; 未按下则转 F 键扫描 CJNE R6,#00H,NEXT1 ; MOV SL,#00H ; 若中途改变定时方式,则清除原计时数据 MOV SH,#00H MOV ML,#00H MOV MH,#00H MOV HL,#00H MOV HH,#00H NEXT1: MOV R2,#00H ; R2 用于判断按键时间是否超过 0.5 秒 NEXT2: ACALL ADDONE ; 调用加 1 程序 MOV L0,R4 ; 移入工作方式选择数 INC L0 CLR C ; ; WAITMK: ACALL DISPLY ; 等待 M 键释放 INC R2 ; R2 自增一 CJNE R2,#0C8H,JGQUIC ; 若 R2 大于等于 200 则调用快进子程序 JGQUIC: JC WATMK1 ACALL QUICK WATMK1: JNB MKEY,WAITMK ; R2 小于 200 则等待 M 键释放 JGFKEY: JB FKEY,MENU1 ACALL KEYDLY ; 功能(F)键扫描 ; 延时消抖动
分享到:
收藏