📄 io232.asm
字号:
;***********************************************************
;普通IO口模拟RS232串口 占用定时器0中断
;condition:11.0592MHz
;在TH0,TL0中设置波特率的大小 注意不要开定时器0的中断,这里用的是查询方式
;***********************************************************
BT_REC BIT P1.2
BT_SND BIT P1.3
;占用定时器0
ORG 0000H
AJMP MAIN
main: MOV SP,#59H
RS232: MOV TMOD,#0x02 ;利用定时器方式0
MOV PCON,#80H
MOV TH0,#0A0H ;9600bps 就是 1000000/9600=104.167微秒
;执行的timer是104.167*11.0592/12= 96 256-96=160(0A0H)
MOV TL0,#0A0H ;所以,改变TH0,TL0的处置就是改变了波特率
SETB TR0 ;开定时器0
;============发送==============
MOV A,#55H
LCALL S_Char
MOV A,#56H
LCALL S_Char
MOV A,#77H
LCALL S_Char
AJMP JIESHU
;============接收=============
STAR: JB BT_REC,$ ;检测是否有开始位
LCALL G_Char
MOV 30H,A ;存储接受来的数据
STAR0: JB BT_REC,$ ;检测是否有开始位
LCALL G_Char
MOV 31H,A
JIESHU: NOP
AJMP JIESHU
;==============子程序=======================
;----------接收1个字节-------
;接收来的数在A中
;用到的资源:TF0,ACC,R7,TR0,TL0,TH0
G_Char: MOV TL0,TH0
SETB TR0
MOV R7,#08H
R_LOOP: CLR TF0 ;等待TIMER0的中断TIMER0中断的时间定了那么波特率也就定了
JNB TF0,$
MOV C,BT_REC
RRC A
DJNZ R7,R_LOOP
CLR TF0
ST_BIT: JB TF0,SADA ;等待停止位
JNB BT_REC,ST_BIT
SADA: CLR TR0
RET
;---------发送1个字节------------
;要发送的数存在R7中
;用到的资源:R7,A,TF0,TRO,TL0,TH0
S_Char: CLR TF0
CLR BT_SND
MOV R7,#08H
MOV TL0,TH0
SETB TR0
LOOP: JNB TF0,$ ;判断定时器是否溢出
RRC A
MOV BT_SND,C
CLR TF0
DJNZ R7,LOOP
JNB TF0,$
SETB BT_SND
CLR TF0
JNB TF0,$
CLR TR0
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -