📄 wbxs.asm
字号:
RX BIT P3.0
;I2C-24c02
IICSCL EQU P1.6 ;数据
IICSDA EQU P3.4 ;时钟
SLA EQU 0A0H ;24C02的写寻址字节
SLAR EQU 0A1H ;24C02的读寻址字节
;NO_ACK BIT 27H.1 ;无应答IICSDA
;I2C_BUSY BIT 27H.2 ;忙
;BUS_FAULT BIT 27H.3 ;总线出错
SUBADR EQU 1DH ;取存储地址
NUMBYT EQU 1BH ;数据字节计数器
;MRD24C02 EQU 3EH ;接收数据缓冲区首址
MTD24C02 EQU 1CH ;发送数据缓冲区首址
;主程序 IE,T2CON,TH2,TL2,RCAP2H,RCAP2L
ORG 0000H
LJMP START
ORG 0023H
LJMP COM1
ORG 0030H
;------------------------------------
START: MOV R0,#7FH
CLR A
CLRRAM: MOV @R0,A
DJNZ R0,CLRRAM
MOV P0,#00H
MOV P1,#0ffH
MOV P2,#0FFH
MOV P3,#0FFH
MOV SP,#60H
; MOV TH1,#0FFH
; MOV TL1,#0F8H
; MOV TMOD,#20H
; MOV TCON,#40H
MOV 0CBH,#0FFH
MOV 0CAH,#0F8H
MOV 0C8H,#34H
MOV SCON,#0d0H ;0D0H
MOV PCON,#00H ;00H
clr p3.2
CLR P2.3
CLR P2.0
SETB PS
setb ren
SETB P1.0
SETB EA ;开中断
SETB ES ;允许串口中断
MOV R1,#49H
mOV R0,#20H
ddd: lcall xs
LCALL YS
AJMP ddd
;_________________________________________________
COM1: CLR EA ;关中断
PUSH Acc
PUSH 00H
PUSH 01H
RX1: MOV A,SBUF
MOV A,1FH
MOV R0,1EH
CJNE A,#01H,AA1D
MOV A,SBUF
MOV @R0,A
INC R0
MOV 1EH,R0
CJNE R0,#25H,RETURN
MOV 1FH,#00H
AJMP RETURN
AA1D: MOV A,1FH
MOV R0,1DH
CJNE A,#02H,AA1
MOV A,SBUF
MOV @R0,A
INC R0
MOV 1DH,R0
CJNE R0,#35H,RETURN
MOV 38H,34H
MOV 37H,33H
MOV R7,#03H
MOV R0,#39H
MOV R1,#36H
LCALL BCDA
MOV 1FH,#00H
AJMP RETURN
AA1: MOV A,SBUF
CJNE A,#9FH,AA2
MOV 1EH,#20H ; R0
MOV 1FH,#01H
AA2: MOV A,SBUF
CJNE A,#0D3H,RETURN
MOV 1FH,#02H
MOV 1DH,#30H ;R0
AJMP RETURN
RETURN: POP 01H
POP 00H ; 3034304
; 123547
POP ACC
SETB EA
CLR RI
RETi
;____________________________________________
YS: MOV R5,#01H ; 延时子程序
YS1: MOV R4,#03H
YS2: MOV R6,#64H
DJNZ R6,$
DJNZ R4,YS2
DJNZ R5,YS1
RET
;_____________________________________________
;模拟串口,51汇编代码编写9600
;T2作为波特率控制
;UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调
;用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。
;UART_TXD 是任何其它IO即可。
;**************延时104μs 子程序*****
DEL833: MOV R7 ,#31h ;104
MS11: DJNZ R7,MS11
RET
;******** 89C51发送数据给PC 机子程序****
INPUT: CLR C
MOV p1.0,C ;发送起始位
; MOV TXD,C ;????????????
LCALL DEL833 ;延时
MOV R3,#8
REP: RRC A
MOV p1.0 ,C
LCALL DEL833
DJNZ R3,REP ;发送8 位数据
SETB C ;发送停止位
MOV p1.0,C
LCALL DEL833
RET
;=======================================
xs:
MOV A,4FH
LCALL CB1
;MOV A,#84h ;3EH
PP: MOV P0,A
SETB P2.0 ;#####
CLR P2.0
SETB P2.0
MOV P0,#0FFH
MOV A,#01H
MOV P0,A
SETB P2.3 ; ;4F 100 4E 1000 4D 1 4C 10 4B 0.1
CLR P2.3 ;4C 0.1 4E 1 4D 0.01 4F 100
SETB P2.3 ; 4c(0.1)
MOV P0,#0FFH ;4A 4B
lcall ys
MOV A,4CH ;3FH 4e
LCALL CB1
PP1: MOV P0,A
SETB P2.0
CLR P2.0
SETB P2.0
; MOV P0,#0FFH
MOV A,#02H
MOV P0,A
SETB P2.3
CLR P2.3
SETB P2.3
MOV P0,#0FFH
lcall ys
;04 1 04 4E
MOV A,4DH ; 4E C
LCALL CB1
MOV P0,A
SETB P2.0
CLR P2.0
SETB P2.0 ;04 3 1(0.1)
MOV P0,#0FFH
MOV A,#04H
MOV P0,A
SETB P2.3
CLR P2.3
SETB P2.3
MOV P0,#0FFH
; ;08 0.1 '08 4c------------
lcall ys
MOV A,4AH ; C
LCALL CB1
MOV P0,A
SETB P2.0
CLR P2.0
SETB P2.0
MOV P0,#0FFH
MOV A,#08H
MOV P0,A
SETB P2.3
CLR P2.3
SETB P2.3
MOV P0,#0FFH
lcall ys
RET
;______________________________________
;加法子程序
;入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息:和在[R0]中,最高位进位在CY中。
;影响资源:PSW、A、R2 堆栈需求: 2字节 36 39 38 36
BCDA:
MOV A,R7; ;取字节数至R2中
MOV R2,A
ADD A,R0; ;初始化数据指针 3C
MOV R0,A
MOV A,R2 ;39
ADD A,R1 ;39
MOV R1,A
CLR C
BCD1: DEC R0; ;调整数据指针 3B
DEC R1 ;38
MOV A,@R0
ADDC A,@R1; ;按字节相加
DA A; ;十进制调整
MOV @R0,A; ;和存回[R0]中 38 37 36
DJNZ R2,BCD1; ;处理完所有字节
MOV R1,#4FH
BCD2: MOV A,@R0
ANL A,#0FH
MOV @R1,A
MOV A,@R0 ;4F 100 4E 1000 4D 1 4C 10 4B 0.1
DEC R1
SWAP A
ANL A,#0FH
MOV @R1,A
DEC R1
INC R0
DJNZ R7,BCD2
RET
;___________________________________________
CB1: MOV DPTR,#SZH
;MOV A,3EH
MOVC A,@A+DPTR
RET
;________________________________
SZH: db 0E7h,84h,0D3h,0D6h,0B4h,76h,77h,0C4h,0F7h,0F6h;0 1 2 3 4 5 6 7 8 9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -