//主程序开始,在一定测量时间T内,测量脉冲发生器(替代输入脉冲)产生的脉冲数M来测量转速//
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TO
ORG 0030H
MAIN: MOV SP,#60H ; 主程序块,对定时器T0所在计数器进行初始化
MOV B,#0AH
MOV TMOD,#51H ;采用方式1对进行定时
MOV TL0,#0B0H
MOV TH0,#3CH ;每次计时为100ms,10次计时为1s
SETB TR0
SETB ET0
SETB EA ;开启中断
HERE: SJMP HERE
//T0中断处理程序 //
//************************ //
TO: MOV TL0,#0B0H ;外部中断0发生中断处理子程序
MOV TH0,#3CH
DJNZ B,LOOP ;发生外部中断时,对脉冲进行处理,跳转到数据处理和显示模块
CLR TR0
LOOP: RETI
ADAD: MOV A,TH1 ;将1s钟时刻,所测得外部脉冲进行计数后,将高低字节放入到对应的单元
MOV 45H,A
MOV A,TL1
MOV 44H,A
MOV 46H,00H
//1s时间到了,程序数据处理单元,一个4字节除以3字节的程序
//*****************************************************//
//对单片机需要数据处理的需要的单元进行定义
//******************************** //
;定义被除数单元
DIVDLL EQU 40H
DIVDLH EQU 41H
DIVDHL EQU 42H
DIVDHH EQU 43H
;定义除数单元
DIVDL EQU 44H
DIVDM EQU 45H
DIVDH EQU 46H
;定义余数单元
TEMPL EQU 50H
TEMPM EQU 51H
TEMPH EQU 52H
;定义辅助单元
FZ1 EQU 47H
FZ2 EQU 48H
DIV0: MOV 40H,00H ;通过计算,得到被除数,将被除数放入对应的单元当中
MOV 41H,0C0H
MOV 42H,4BH
MOV 43H,03H
MOV A,DIVDH ; 以下四行判断除数是否为零
ORL A,DIVDM
ORL A,DIVDL
JNZ DIV1 ;如果(A)不等于0,则跳转;否则顺序执行
SETB OV ;除数为零,置溢出标志位OV为1,程序结束
SJMP LOOP1
DIV1: MOV TEMPL,#00H ;余数单元清零
MOV TEMPM,#00H
MOV TEMPH,#00H
MOV B,#20H ;置循环次数32次
DIV2: CLR C ;进位位清零
MOV A,DIVDLL ;以下三行被除数最低字节左移一位(带进位)
RLC A
MOV DIVDLL,A
MOV A,DIVDLH ;以下三行被除数低16位高字节左移一位(带进位)
RLC A
MOV DIVDLH,A
MOV A,DIVDHL ;以下三行被除数高16位低字节左移一位(带进位)
RLC A
MOV DIVDHL,A
MOV A,DIVDHH ;以下三行被除数最高字节左移一位(带进位)
RLC A
MOV DIVDHH,A
MOV A,TEMPL ;以下三行余数低字节左移一位(带进位)
RLC A
MOV TEMPL,A
MOV A,TEMPM ;以下三行余数中间字节左移一位(带进位)
RLC A
MOV TEMPM,A
MOV A,TEMPH ;以下三行余数高字节左移一位(带进位)
RLC A
MOV TEMPH,A
MOV A,TEMPL ;把余数最低字节送到累加器A中
CLR C
SUBB A,DIVDL ;用余数减去除数
MOV R7,A ;低字节相减结果送R7保存
MOV A,TEMPL
CJNE A,DIVDL,LP1 ;通过比较运算实现因软件设计原因相减不能借位
;而产生的借位
LP1: MOV A,DIVDM
ADDC A,#00H
MOV FZ1,A ;计算除数中间字节与低字节相减产生的进位位之和
;将结果送FZ1保存
MOV A,TEMPM
CJNE A,FZ1,LP2 ;通过比较运算实现因软件设计原因相减不能借位
;而产生的借位
LP2: PUSH PSW ;对程序状态字PSW压栈保护
MOV F0,C ;将C的值送给F0保存
CLR C
MOV A,TEMPM
SUBB A,FZ1
MOV R6,A ;中间字节带进位相减结果送R6保存
MOV C,F0
POP PSW ;程序状态字PSW弹栈,恢复现场
MOV A,DIVDH
ADDC A,#00H
MOV FZ2,A ;计算除数高字节与中间字节相减产生的进位位之和
;将结果送FZ2保存
MOV A,TEMPH
CJNE A,FZ2,LP3 ;通过比较运算实现因软件设计原因相减不能借位
;而产生的借位
LP3: PUSH PSW ;对程序状态字PSW压栈保护
MOV F0,C
CLR C
MOV A,TEMPH
SUBB A,FZ2 ;高字节带进位相减结果送R5保存
MOV R5,A
MOV C,F0
POP PSW ;程序状态字PSW弹栈,恢复现场
JC DIV3 ;不够减,则跳转到DIV3
DIV4: MOV TEMPL,R7 ;够减,刷新余数单元
MOV TEMPM,R6
MOV TEMPH,R5
MOV R0,#DIVDLL ;够减,将被除数最低位置1
MOV A,@R0
INC A
XCH A,@R0
DIV3: DJNZ B,DIV2 ;判断B是否为零,若为零,循环结束;否则,跳转继续循环
CLR F0
LOOP1: NOP
RET
//对转化后的二字节进行转化为BCD码//
//*******************************//
MOV R2,47H
MOV R3,48H
BINBCD2: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
LOOP2: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP2
RET
//显示模块,让转换过后的bcd码在数码管上得到显示//
//*********************************************//
DISPLAY: MOV DPTR,#TAB
MOV R0,#4
MOV P1,0FFH
DPL1: MOV R1,#250
DPLOP: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.7
ACALL D1MS
SETB P3.7
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
CLR P3.6
ACALL D1MS
SETB P3.6
MOV A,R3
MOVC A,@A+DPTR
MOV P1,A
CLR P3.5
ACALL D1MS
SETB P3.5
MOV A,R4
MOVC A,@A+DPTR
MOV P1,A
CLR P3.4
ACALL D1MS
SETB P3.4
MOV P1,#00H
DJNZ R1,DPLOP
DJNZ R0,DPL1
RET
JDQGZ:
MOV R7,34H
MOV A,#10
SUBB A,R7
JC KAI
SETB P3.3
AJMP JDQFH
KAI: CLR P3.3
JDQFH: RET
D1MS: MOV R7,#0FFH
DJNZ R7,$
DJNZ R7,$
RET
TAB: DB 07DH;0
DB 018H;1
DB 06EH;2
DB 03EH;3
DB 01BH;4
DB 037H;5
DB 077H;6
DB 01CH;7
DB 07FH;8
DB 03FH;9
END
此帖出自
小平头技术问答
一周热门 更多>