📄 cartest.asm
字号:
MOV A,60H
CJNE A,#00H,NEXT
SETB JPBZ
NEXT: JNB TCBZ,NEX
setb ZENG
SETB FAN ;停车
CLR ZUO ;转向复位
SETB YOU
CLR TR0
NEX: AJMP YJ1
;******************电机转动1**********************************************
;QIDONG1: MOV TIME3,#20 ; 启动正转子程序
;ZZHUAN101: SETB FAN ; 正转50ms=10*5ms
;CLR ZENG ;低脉冲启动正转
;MOV A,#200
;MOV TIME2,A ; 低脉冲控制
;ACALL D50us
;SETB ZENG ;高脉冲停止
;SETB FAN
;MOV A,#10
;MOV TIME2,A
;ACALL D50us
;DJNZ TIME3, ZZHUAN101
;RET
;******************电机转动**********************************************
QIDONG: JBC BAOZI,LLLA
MOV TIME3,#20 ; 启动正转子程序
ZZHUAN10: SETB FAN ; 正转50ms=10*5ms
CLR ZENG ;低脉冲启动正转
MOV DPTR,#TAB3
MOV A,60H
MOVC A,@A+DPTR
MOV TIME2,A ; 低脉冲控制
ACALL D50us ;4500us
SETB ZENG ;高脉冲停止
SETB FAN
MOV A,#100
MOV TIME2,A ;500us
ACALL D50us
DJNZ TIME3, ZZHUAN10
RET
TAB3: DB 96H,8CH,82H,78H ;十个速度挡
DB 6EH,64H,5AH,50H
DB 46H,3CH
LLLA: ACALL CHULI ;转处理接受数据程序
AJMP QIDONG
CHULI: MOV A,5BH
MOV B,#2
MUL AB ;A*2
MOV DPTR,#TAB4
JMP @A+DPTR ;跳转到“转移表”
TAB4: AJMP GN1 ;功能0
AJMP GN2
AJMP GN3
AJMP GN4
AJMP GN5
GN1: ACALL ZUOZUAN ;调用左转程序
AJMP GNEND
GN2: ACALL YOUZUAN ; 调用右转程序
AJMP GNEND
GN3: SETB ZUO ;转向复位
SETB YOU
AJMP GNEND
GN4: SETB FAN ;停车
SETB ZENG
AJMP GNEND
GN5: ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
ACALL FZHUAN
SETB ZENG
SETB FAN
YS: MOV YANSHI,#200
ACALL D100MS
DJNZ YANSHI,YS
GNEND: RET
FZHUAN: MOV TIME3,#50 ; 正转子程序
ZZHUAN0A: SETB ZENG ; 正转250ms
CLR FAN ;低脉冲启动正转
MOV TIME2,#30 ; 低脉冲控制 bsl*50us
ACALL D50us
SETB ZENG ;高脉冲停止
SETB FAN
MOV TIME2,#10 ; bsh*50us
ACALL D50us
DJNZ TIME3, ZZHUAN0A
RET
ZUOZUAN: SETB YOU
CLR ZUO ;低脉冲启动左转
RET
YOUZUAN: SETB ZUO
CLR YOU ; 低脉冲启动 右转
RET
;*************************读24C08子程序*******************************************
ST: CLR SCL ;c08起始
SETB SDA
SETB SCL
CLR SDA
RET
ACK: CLR SCL ;c08应答
SETB SDA
SETB SCL
RET
ACKR: CLR SCL ;连续读时的应答
CLR SDA
SETB SCL
CLR SCL
SETB SDA
RET
STOP: CLR SCL ;c08停止
CLR SDA
SETB SCL
SETB SDA
RET
;向24C08中传输8位数据
Tc08: MOV B,A
TC08A: MOV BIT_COUNT,#8 ;每字节由8位组成
Tc081: CLR SCL
RLC A
MOV SDA,C
SETB SCL
CLR SCL
DJNZ BIT_COUNT,Tc081
ACALL ACK
JB SDA,TC082 ;有应答(SDA=0)返回、无应答重发1遍
RET
TC082: MOV A,B
AJMP TC08A
;从24C08中读8位数据
Rc08: MOV BIT_COUNT,#8
Rc081: CLR SCL
SETB SCL
MOV C,SDA
CLR SCL
RLC A
DJNZ BIT_COUNT,Rc081
RET
;从24C08中C08QS开始连续读C08WS字节数据
R24C0800: ACALL ST ;产生起始条件
MOV A,#0A0H ;写控制字节(24c08的高位地址也由此决定)
ACALL Tc08
MOV A,C08QS ;读c08中XXH开始连续字节内容(低位地址)
ACALL Tc08
ACALL ST
MOV A,#0A1H ;读控制字节(24c08的高位地址也由此决定)
ACALL Tc08
ACALL Rc08
Acall STOP
MOV @R0,A
DJNZ C08WS,R24C0800A
RET
R24C0800A: INC R0
INC C08QS
AJMP R24C0800
;***************写24C08子程序*****************************************************
WS08: MOV A,45H
MOV 61H,A
MOV A,46H
MOV 62H,A
MOV A,47H
MOV 63H,A
MOV C08QS,#00H ;注入参数:从01H开始注入到07H开始的7位
INC C08QS
MOV C08WS,#04H ;读(写)的24C08的位数
MOV R0,#60H
ACALL W24C0800A
RET
;向24C08中C08QS开始连续写C08WS字节数据
W24C0800A: LCALL ST ;保存当前数据到24c08
MOV A,#0A0H
LCALL TC08
MOV A,C08QS ;写c08要保存的地址
LCALL Tc08
MOV A,@R0
LCALL TC08
LCALL STOP
DJNZ C08WS,W24C0800B
LCALL D10MS
RET
W24C0800B: INC R0
INC C08QS
LCALL D10MS
LJMP W24C0800A
;******************串口发程序*************************
TANSFER: CLR ES ;串口发送程序
TANSFER2: MOV SBUF,A
JNB TI,$
CLR TI
SETB ES
RET
;*****************串口收中断程序**********************
CANKOU: PUSH ACC
PUSH PSW
JNB RI,CKEND ;判断是否由接收引起的中断
MOV A,SBUF
MOV 5BH,A
SETB BAOZI
CKEND: CLR RI
POP PSW
POP ACC
RETI
;******************时钟中断程序***********************
TINTRUP: PUSH ACC
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H
INC 26H
MOV A,26H
CJNE A,#20,LOOP
;MOV A,QS
;MOV 27H,A
ACALL SD
MOV 26H,#0
INC 25H
MOV A,25H
CJNE A,#10,LOOP
MOV 25H,#0
INC 24H
MOV A,24H
CJNE A,#9,LOOP
SETB TCBZ
SETB SJT
LOOP: POP PSW
POP ACC
RETI
;******************圈数中断程序********************************
ts: INC R4
INC R2
ACALL LC
RETI
;;******************计算路程****************************
LC: MOV A,R4 ;半圈数
MOV B,#12 ;半圈长度
MUL AB
MOV NR4,B
MOV NR5,A
MOV 5CH,NR4
MOV 5DH,NR5 ;暂存
MOV NR2,#0
MOV NR3,#0
MOV NR6,#03H
MOV NR7,#0E8H ;除1000
ACALL DIVD ;调用除法 双字节商在NR2、NR3中
MOV 39H,NR3
MOV NR6,#03H ;NR3*1000
MOV NR7,#0E8H
ACALL MULD ;调用乘法 乘积在NR2、NR3、NR4、NR5中
MOV NR2,5CH ;5CH,5DH-NR4,NR5
MOV NR3,5DH
MOV NR6,NR4
MOV NR7,NR5
ACALL SUB ;结果在NR4、NR5中
MOV 40H,NR4 ;被除数高位
MOV 41H,NR5 ;被除数低位
CLR C ;除以100,商存放在42H(米个位)
MOV R7,#100
MOV A,40H
SUBB A,R7
JC DV50
SETB OV
DV50: MOV R6,#8
DV51: MOV A,41H
RLC A
MOV 41H,A
MOV A,40H
RLC A
MOV 40H,A
MOV F0,C
CLR C
SUBB A,R7
CPL F0
ANL C,F0
JC DV52
MOV 40H,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,40H
ADD A,40H
SUBB A,R7
JC DV54
DV54: CLR OV
MOV 42H,R3 ;存放商,米的个位
MOV A,40H
MOV 43H,A ;存放余数
MOV A,43H ;分米存43H,厘米44H
MOV B,#10
DIV AB
MOV 43H,A
MOV 44H,B
MOV 41H,39H ;米的十位
RET
;***************************************************
;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
; 影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
MOV A,NR3
SUBB A,NR7
MOV A,NR2
SUBB A,NR6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,NR5
RLC A
MOV NR5,A
MOV A,NR4
RLC A
MOV NR4,A
MOV A,NR3
RLC A
MOV NR3,A
XCH A,NR2
RLC A
XCH A,NR2
MOV F0,C ;保存溢出位
CLR C
SUBB A,NR7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,NR2
SUBB A,NR6
ANL C,/F0 ;结果判断
JC DVD3
MOV NR2,A ;够减,存放新的余数
MOV A,R1
MOV NR3,A
INC NR5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,NR4 ;将商移到R2R3中
MOV NR2,A
MOV A,NR5
MOV NR3,A
CLR OV ;设立成功标志
RET
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
; 出口信息:乘积在R2、R3、R4、R5中。
; 影响资源:PSW、A、B、R2~R7 堆栈需求: 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -