倒数定时器课程设计
功能说明: 倒数定时器基本功能如下: 1.七段LED显示器来显示目前倒数时间,显示格式为“分分:秒秒”; 2.具有2个按键操作来设置现在想要倒数的时间,中途可作调整; 3.开始倒数计时结束后,继电器会做出相应判断。 4.重置后内定倒数时间为1min,显示“01:00”。 操作键动作如下: 1.操作键K1:可调整1min~99min及停止或中途调整定时; 2.操作键K2:设置倒数为调整分钟的十位还是个位及确认设置完成。 具体操作:1.复位后,按K1暂停定时,同时秒数为“1”; 2.按K1调整倒数定时器分钟的十位数,按K2调整结束; 3.再按K1调整倒数定时器分钟的个位数,按K2确认设置完成; 4.如需再次调整可重复1~3步骤,但无需复位。
倒数定时器的控制电路分为以下几部分: 1.单片机2051 2.七段LED显示器 3.按键控制    程序如下: LO EQU 24;定时器0计时中断低字节 HI EQU 99;定时器0计时中断高字节 CO EQU 200 ;----------------------------------------------- RY1 EQU P3.7 ALB EQU 20H.0;定时设置标志 BUF EQU 30H;30H~33H连续4字节存放七段显示器数据 HOUR EQU 34H;存放小时变量 MIN EQU 35H;存放分钟变量 SEC EQU 36H;存放秒钟变量 DEDA EQU 37H;5ms计数值 SECO EQU 38H;存放旧的秒数 HH EQU 39H;定时1小时变量 MM EQU 3AH;定时1分钟变量 HHS EQU 3BH;定时2小时变量 MMS EQU 3CH;定时2分钟变量 ;----------------------------------------------- K1 EQU P3.4;按键1引脚定义 K2 EQU P3.5;按键2引脚定义 RY1 EQU p3.7;继电器控制引脚
ORG 0000H;程序代码由地址0开始执行 JMP BEGIN ORG 0BH;定时器0中断地址设置 JMP T0_INT ;----------------------------------------------- BEGIN: CLR RY1 MOV HH,#8;内定时间为12点 MOV MM,#0 MOV HHS,#22 MOV MMS,#0
CALL INIT;初始化变量 CALL INIT_TIMER;初始化定时器
;----------------------------------------------- LOOP;无穷循环 CALL TIME_PRO;时间计时处理 CALL SCAN1;扫描显示器 ;----------------------------------------------- JB K1 M1;未按下K1则继续扫描 JNB K1,$ ;K1按下----------------------------------------- CALL SET_TIME;设置目前时间 JMP LOOP ;----------------------------------------------- M1:JB K2,LOOP; 未按下K2则继续扫描 JNB K2,LOOP ;K2按下---------------------------------------- CALL SET_ATIME;设置定时时间 JMP LOOP ;延时子程序------------------------------------- DELAY:;总延时R5*10ms MOV R6,#50 D1:MOV R7,#100    DJNZ R7,$    DJNZ R6,D1    DJNZ R5,DELAY    RET ;短暂延时子程序--------------------------------- DELAY1:;控制七段显示器延迟时间 MOV R6,#1 D2:MOV R7,#100    DJNZ R7,$    DJNZ R6,D1    DJNZ R5,DELAY1    RET ;七段显示器字型数据----------------------------- TLBLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DB 77H,7CH,58H,5EH,79H DB 71H ;----------------------------------------------- SCAN1:    MOV R0,#BUF;指向显示器显示缓冲起始地址    MOV R2,#4;循环4次    MOV ACC,#0FEH;加载扫描输出信号初值 S1:    PUSH ACC    MOV A,@R0;取出七段显示器数据    MOV P1,ACC;由P1口送出七段显示器数据
   POP ACC    MOV P3,ACC;由P3口送出扫描输出信号
   MOV R5,#5;延时    CALL DELAY1
;改变扫描码 EX:XXXX1101    RL A;累加器左移一位    INC R0;显示器显示缓冲区地址加1    DJNZ R2,S1;循环判断是否继续    RET
;----------------------------------------------- INIT:;初始化控制变量 MOV DEDA,#0;5ms计数值清0 MOV SECO,#0;旧秒数清0 MOV SEC,#0;秒钟变量清0 MOV MIN,#0;分钟变量清0 MOV HOUR,#12;时钟变量显示12 RET ;----------------------------------------------- INIT_TIMER:;初始化定时器接口,使用定时器0模式0计时    MOV TMOD,#00H;设置定时器0工作模式为模式0    MOV IE,#10000010B;启用定时器0中断产生    MOV TL0,#LO;加载低字节    MOV TH0,#HI;加载高字节    SETB TR0;启用定时器0开始计时    RET ;----------------------------------------------- T0_INT:;定时器0计时中断程序每隔5ms中断一次    PUSH ACC;将累加器放入堆栈    MOV TL0,#LO;加载低字节    MOV TH0,#HI;加载高字节    INC DEDA;5ms计数加1
MOV A,DEDA CJNE A,#CO,TT1;是否1s到了? MOV DEDA,#0;计数值清0 INC SEC
MOV A,SEC CJNE A,#60,TT1;是否1min到了? MOV SEC,#0;计秒数值清0 INC MIN
MOV A,MIN CJNE A,#60,TT1;是否1h到了? MOV MIN,#0;计分数值清0 INC HOUR
MOV A,HOUR CJNE A,#24,TT1;是否24h到了? MOV SEC,#0;计秒数值清0 MOV MIN,#0;计分数值清0 MOV HOUR,#0;计时数值清0
TT1:    POP ACC;将累加器由堆栈取出    RETI
;转换小时分钟数据------------------------------- CONV:    MOV A,HOUR    MOV B,#10    DIV AB        MOV DPTR,#TABLE    MOVC A,@A+DPTR    MOV BUF,A
   MOV A,B    MOVC A,#A+DPTR    MOV BUF+1,A
   MOV A,MIN    MOV B,#10    DIV AB        MOV DPTR,#TABLE     MOVC A,@A+DPTR    MOV BUF+2,A
   MOV A,B    MOVC A,#A+DPTR    MOV BUF+3,A    RET ;----------------------------------------------- SET_TIME:    CALL CONV    CALL SCAN1    JB K1,X1    JNB K1,$    JMP LOOK_ATIME X1:    JB K2,X2    JNB K2,$    CLR TR0;定时器动作暂停    MOV SEC,#0;秒钟数清0 L0:    CALL SCAN1;扫描显示器    JB K1,L1;未按下K1则继续扫描    INC HOUR    MOV A,HOUR    CJNE A,#24,L11    MOV HOUR,#0        L11:    CALL CONV    CALL SCANS    JMP L0
L1:       JB K2,L0;未按下K2则继续扫描    JNB K2,$ L2:    CALL SCAN1;扫描显示器    JB K1,L3;未按下K1则继续扫描    INC MIN    MOV A,MIN    CJNE A,#60,L21    MOV MIN,#0  L21:     CALL CONV    CALL SCANS
L3:JB K2,L2;未按下K2则继续扫描    JNB K2,$    SETB TR0    JMP LOOP X2:JMP SET_TIME ;----------------------------------------------- SCANS:;扫描七段显示器    MOV R4,#55 SS:    CALL SCAN1    DJNZ R4,SS    RET ;----------------------------------------------- TIME_OUT:    SETB RY1    RET ;----------------------------------------------- TIME_OUT2:     CLR RY1     RET ;----------------------------------------------- LOOK_ATIME:   CALL CONVA
   MOV B,#0 LO1:CALL SCAN1    DJNZ B,LO1
   CALL CONVB    MOV B,#0 LO2:CALL SCAN1    DJNZ B,LO2
   CALL CONV    RET ;----------------------------------------------- CONVA:    MOV A,HH    MOV B,#10    DIV AB         MOV DPTR,#TABLE    MOVC A,@A+DPTR    MOV BUF,A
   MOV A,B    MOVC A,#A+DPTR    MOV BUF+1,A
   MOV A,MM    MOV B,#10    DIV AB        MOV DPTR,#TABLE    MOVC A,@A+DPTR    MOV BUF+2,A
   MOV A,B    MOVC A,#A+DPTR    MOV BUF+3,A    RET  ;----------------------------------------------- CONVB:    MOV A,HHS    MOV B,#10    DIV AB        MOV DPTR,#TABLE    MOVC A,@A+DPTR    MOV BUF,A
   MOV A,B    MOVC A,#A+DPTR    MOV BUF+1,A
   MOV A,MMS    MOV B,#10    DIV AB        MOV DPTR,#TABLE    MOVC A,@A+DPTR    MOV BUF+2,A      MOV A,B    MOVC A,#A+DPTR    MOV BUF+3,A    RET  ;----------------------------------------------- SET_ATIME:;设置定时时间
   CALL CONVA    CALL SCAN1    JB K1,V1    JNB K1,$    CALL SET_BTIME V1:    JB K2,V2    JNB K2,$ N0:    CALL SCAN1    JB K1,N1    INC HH    MOV A,HH    CJNE A,#24,N11    MOV HH,#0 N11:    CALL CONVA    CALL SCANS    JMP N0 N1:    JB K2,N0    JNB K2,$
N2:    CALL SCAN1    JB K1,N3    INC MM    MOV A,MM    CJNE A,#60,N21    MOV MM,#0 N21:    CALL CONVA    CALL SCANS    JMP N2
N3:      JB K2,N2    JNB K2,$
;-----------------------------------------------    CALL CONVB N4:    CALL SCAN1    JB K1,N5    INC HHS    MOV A,HHS    CJNE A,#24,N51    MOV HHS,#0 N51:    CALL CONVB    CALL SCANS    JMP N4
N5:     JB K2,N4    JNB K2,$
N6:    CALL SCAN1    JB K1,N7    INC MMS    MOV A,MMS    CJNE A,#60,N61    MOV MMS,#0 N61:    CALL CONVB    CALL SCANS    JMP N6 N7:   JB K2,N6   JNB K2,$   CALL CONV   RET   ;----------------------------------------------- SET_BTIME:    JB K1,B1    JNB K1,$    CPL ALB    JMP LOOP  B1:JB K2,B2    JNB K2,$    JMP LOOP B2:JMP SET_BTIME
;----------------------------------------------- TIME_PRO:    MOV A,SEC    MOV B,SEC0    CJNE A,B,TI1    JMP TI2 TI1:    CALL CONV    MOV SEC0,SEC TI2:    JB ALB, TI3    JB ALB, T14    RET TI3:    MOV A,HOUR    MOV B,HH    CJNE A,B,BK        MOV A,MIN    MOV B,MM    CJNE A,B,BK    CALL TIME_OUT BK:RET ;----------------------------------------------- TI4:    MOV A,HOUR    MOV B,HHS    CJNE A,B,BK        MOV A,MIN    MOV B,MMS    CJNE A,B,BK1    CALL TIME_OUT BK1:    RET END ;-----------------------------------------------
附图


|
|