;***********************************************************
;普通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
串囗模擬
更新時間: 2006-03-16 14:44:33來源: 粵嵌教育瀏覽量:3875