文档库

最新最全的文档下载
当前位置:文档库 > 单片机脉冲计数C程序

单片机脉冲计数C程序

;-----------------------------------------------------------------------------
ORG 0000H
LJMP START ;转发送主程序
;-----------------------------------------------------------------------------
ORG 001BH
LJMP STOP ;转发送中断服务
;-----------------------------------------------------------------------------
;主程序
START: MOV SP,#60H ;堆栈SP=60H
MOV TMOD,#15H ;T0为计算器,工作方式1,T1为定时器,工作方式1
MOV P0,#03FH
MOV P1,#0FFH
MOV P2,#0FFH ;P0,P1,P2口赋初值
MOV TH0,#00H
MOV TL0,#00H ;TO从0开始计数
MOV TH1,#00H
MOV TL1,#00H ;T1定时 时间为65.5ms
MOV 59H,#00H ;计数器溢出的数累计存放在59H单元
CLR 30H ;将停止标志位清零
MOV 30H,#00H ;设预置数70000
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#07H
MOV 35H,#00H
MOV 36H,#00H
MOV 37H,#00H
LCALL CT6 ;显示预置数
START1: JB P1.0,START1
LCALL DELY
JB P1.0,START1 ;电机是否启动
LL0: JB 30H,STOP1 ;电机是否停止
LL1: SETB TR1 ;开定时器
SETB EA
SETB ET1 ;开中断
SETB TR0 ;开计数器
CLR P1.3 ;启动电机
LL2: LCALL CT ;显示
LL3: SETB RS1 ;选择2区工作寄存器组
CJNE R7,#00H,LL0
CJNE R6,#00H,LL0
CJNE R5,#07H,LL0
CJNE R4,#00H,LL0 ;预置数到否
LL4: SETB P1.3 ; 关电机
CLR TR0 ; 关计数器
CLR TR1 ; 关定时器
CLR ET1
CLR EA ; 关中断
LL5: JB P1.2,LL6
LCALL DELY
JB P1.2,LL6 ;清零否
LJMP START ;清零调转到START
LL6: LCALL CT ; 显示
LJMP LL5 ; 不清零调转到LL5
RET
;------------------------------------------------------------------------------
STOP1: SETB P1.3 ;关电机
CLR 30H ;停止标志位清零
CLR TR0 ;关计数器
CLR TR1 ;关定时器
CLR EA
CLR ET1 ;关中断
STOP2: LCALL CT ;显示

START2: JB P1.0,ST1
LCALL DELY
JB P1.0,ST1 ; 继续启动电机否
LJMP LL1 ; 继续启动电机,调转到LL1
ST1: JB P1.2,STOP1
LCALL DELY
JB P1.2,STOP1 ; 清零否
LJMP START ; 清零后,调转到START
RET
;------------------------------------------------------------------------------
;中断子程序
STOP: JB P1.1,STP
LCALL DELY
JB P1.1,STP ;是否停


SETB 30H ;停止,标志位置1
STP: RETI
;------------------------------------------------------------------------------
;显示子程序
CT: CLR RS1 ;选择0区通用工作寄存器组
MOV R6,TH0 ;计数器高八位传给R6
MOV R7,TL0 ;计数器低八位传给R7
JNB TF0,HB ;计数器是否溢出
INC 59H ;将溢出的数累加后存在59H单元
CLR TF0 ;溢出标志位清零

HB: MOV R5,59H ;将累加后的溢出数传给R5
SETB RS1 ;选择2区通用工作寄存器组
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,A ;清零
MOV R2,#24 ;24次移位

H_B: CLR RS1 ;选择0区通用工作寄存器组
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A

SETB RS1 ;选择2区通用工作寄存器组
MOV A,R7
ADDC A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R2,H_B ;二进制数转十进制

CT1: SETB RS1 ;选择2区通用工作寄存器组
MOV R0,#30H ;拆字,十进制数由低位到高位依次存放到30H-37H
MOV A,R7
LCALL C_T
MOV A,R6
LCALL C_T
MOV A,R5
LCALL C_T
MOV A,R4
LCALL C_T

CT6: MOV R3,#5 ;循环显示5次
CT2: MOV DPTR,#TAB ;查表
MOV R0,#30H
CT3: MOV R1,#80H
CT4: MOV A,R1
MOV P2,A ;送字位
RR A
MOV R1,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A ;送字形
MOV R2,#4FH
DJNZ R2,$
INC R0
CJNE R1,#80H,CT4
DJNZ R3,CT2
CT5: RET
;------------------------------------------------------------------------------
C_T: MOV R1,A ;拆字子程序
ACALL PTDS1
MOV A,R1
SWAP A
PTDS1: ANL A,#0FH
MOV @R0,A
INC R0
RET
;------------------------------------------------------------------------------
DELY: SETB RS0 ;消抖延时子程序
MOV R5,#04H
DEL1: MOV R4,#0FFH
DJNZ R4,$
DJNZ R2,DEL1
CLR RS0
RET
;------------------------------------------------------------------------------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H
;------------------------------------------------------------------------------
END