AT89C2051电流通断计时器
这是我的第一个51项目(很久没写过程序了,顺便活动下大脑,不然要生锈了)。
原理:变化的电场产生变化的磁场,变化的磁场切割线圈产生感应电流。经过全波整流,直接将电平信号送入AT89C2051,利用芯片自带的比较器(P1.0、P1.1)和存放比较结果P3.6。通过轮询P3.6的状态,启动或停止计时中断,每次计时清空计时器,计时时间小于0.1S不显示结果(屏蔽了部分由于干扰而产生的误动作)
电路设计:
焊接完成的电路板:
51汇编代码:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AT89C2051通断计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 定时器T0溢出周期为10MS,P1.0(同相端)、P1.1(反相端)作为电压比较器
; P3.6为比较器的输出结果,P1.2-P1.7和P3.0、P3.1口(A-DP)为字符输出口,采用共阳显示管。
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序执行开始地址
LJMP MAIN ;跳到标号MAIN执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
RETI ;定时器T1中断返回
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
MAIN:
MOV R0,#70H ;清70H-77H共8个内存单元
MOV R7,#08H ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 70H,#07H;初始化信息显示
MOV 71H,#06H
MOV 72H,#0AH
MOV 73H,#0BH
MOV TMOD,#01H ;设T0为16位定时器
CLR C ;清进位标志
MAIN1:
LCALL DISPLAY ;调用显示子程序
LCALL DS8MS;调用延迟减少误动作
JB P3.6,START ;P3.6口为1时开启定时器
JC STOP;据进位标志位判断是否关停T0
SJMP MAIN1
STOP:
CLR C;清除标志位
CLR TR0 ;关闭T0定时器
CLR ET0 ;关闭T0中断
CLR EA ;关闭总中断
SJMP MAIN1
START:
JC MAIN1;据标志位情况判断是否需清零重新开启T0
SETB C
MOV R0,#75H
ACALL CLR0 ;计时单元清0
MOV R0,#77H
ACALL CLR0 ;计时单元清0
MOV TL0,#0f0H ;10MS定时初值(T0计时用)
MOV TH0,#0D8H ;10MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
SJMP MAIN1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 10毫秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0F7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#0d8H ;中断响应时间同步修正
ADDC A,TH0 ;高8位初值修正
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
MOV R0,#75H ;指向毫秒计时单元(74H-75H)
ACALL ADD1 ;调用加1程序
CLR C ;清进位标志
CJNE R4,#9Ah,ADDMM ;判断是否等于100毫秒
ADDMM: JC OUTT0 ;小于100毫秒时中断退出
ACALL CLR0 ;大于或等于100毫秒时对毫秒计时单元清0
MOV R0,#77H ;指向秒计时单元(76H-77H)
ACALL ADD1 ;秒计时单元加1秒
CLR C ;清进位标志
CJNE R4,#9Ah,ADDSS ;
ADDSS: JC OUTT0 ;小于100秒时中断退出
ACALL CLR0 ;大于或等于100秒计时单元清0
OUTT0:
MOV R0,#75H
MOV A,@R0
MOV R3,#02H
FOR:INC R0
ORL A,@R0
DJNZ R3,FOR ;小于0.1秒不做输出显示
JZ DIS
MOV 70H,74H
MOV 71H,75H
MOV 72H,76H
MOV 73H,77H
DIS:
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1操作
MOV R4,A;保留用于判断是否进位
DA A ;十进制调整
MOV R3,A ;移入R3寄存器
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回前一地址单元
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当削地址单元中
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序(70个机器周期+4*20*25*2=4070us) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-73H单元内,用4位LED共阳数码管显示,P1.2-P1.7和P3.0、P3.1口(A-DP)输出段码数据,P3.3-P3.5、P3.7口(10ms|100ms|1S|10S)作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
;P3.3扫描显示
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TABP3;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
ANL A,#0F7H;显示端口
MOV P3,A;段码和端口放入P3口
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TABP1 ;取段码表地址
MOVC A,@A+DPTR
MOV P1,A ;段码放入P1口
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
;P3.4扫描显示
MOV A,@R1
MOV DPTR,#TABP3
MOVC A,@A+DPTR
ANL A,#0EFH
MOV P3,A
MOV A,@R1
MOV DPTR,#TABP1
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
INC R1
;P3.5扫描显示
MOV A,@R1
MOV DPTR,#TABP3
MOVC A,@A+DPTR
ANL A,#0DEH
MOV P3,A
MOV A,@R1
MOV DPTR,#TABP1
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
INC R1
;P3.7扫描显示
MOV A,@R1
MOV DPTR,#TABP3
MOVC A,@A+DPTR
ANL A,#07FH
MOV P3,A
MOV A,@R1
MOV DPTR,#TABP1
MOVC A,@A+DPTR
MOV P1,A
LCALL DL1MS
MOV P3,#0FFH ;一次显示结束,P3口复位
MOV P1,#0FFH ;P1口复位
RET ;子程序返回
TABP3: DB 0FFH,0FFH,0FDH,0FDH,0FDH,0FDH,0FDH,0FFH,0FDH,0FDH,0FDH,0FDH
TABP1: DB 003H,0E7H,093H,0C3H,067H,04BH,00BH,0E3H,003H,043H,047H,00FH
;共阳段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "y" "b"
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;8MS延时程序
DS8MS: ACALL DISPLAY
ACALL DISPLAY
RET
;
END ;程序结束
将以上代码编译链接成.HEX文件,烧入AT89C2051,上机
通电初始化信息:“BY 67”
测试通电时间(显示范围0.1S-99.99S):
感觉很HAPPY,一直在前进,学无止尽。。。。