⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io232.asm

📁 普通IO口模拟RS232串口 占用定时器0中断 在TH0,TL0中设置波特率的大小 注意不要开定时器0的中断
💻 ASM
字号:
;***********************************************************
;普通IO口模拟RS232串口  占用定时器0中断
;在TH0,TL0中设置波特率的大小 注意不要开定时器0的中断,这里用的是查询方式
;***********************************************************

BT_REC	BIT	P1.2
BT_SND	BIT 	P1.5
        ;占用定时器0
	ORG	0000H
	AJMP	MAIN
main:	MOV	SP,#59H

RS232:	MOV      TMOD,#02	;利用定时器方式0
	MOV      PCON,#80H
        ;****************************************************
        ;9600bps 就是 1000000/9600=104.167微秒
        ;执行的timer是104.167*11.0592/12= 96 256-96=160(0A0H)
        ;执行的timer是104.167*22.1184/12= 192 256-192=64(040H)

        ;19200bps 就是 1000000/19200=52.083微秒
        ;执行的timer是52.083*11.0592/12= 48 256-48=208(0D0H)
        ;执行的timer是52.083*22.1184/12= 96 256-96=160(0A0H)

        ;115200bps 就是 1000000/115200=8.6806微秒 (可能出错,达不到那么高)
        ;执行的timer是8.6806*11.0592/12= 8  256- 8=248(0F8H)
        ;执行的timer是8.6806*22.1184/12= 16 256-16=240(0F0H)

        ;所以,改变TH0,TL0的处置就是改变了波特率
        ;****************************************************
	MOV      TH0,#0A0H
	MOV      TL0,#0A0H
	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,TR0
G_Char: MOV      TL0,TR0
	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,TR0
S_Char:	CLR      TF0
	CLR      BT_SND
	MOV	 R7,#08H
	MOV      TL0,TR0
	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 + -