?? theserialcommunicationbetweenmcuandvbofeastchina.txt
字號:
ORG0000H
LJMP MAIN
ORG0023H
LJMP SRT ;串行中斷入口
ORG0030H
MAIN: MOV SP,#60H
MOV TMOD,#20H ;設(shè)T1為方式2,作波特率發(fā)生器
MOV PSON,#80H ;位SMOD=1
MOV TH0,#0FDH ;波特率=19.2K
MOV R0,#30H ;串行接收、發(fā)送緩沖區(qū)首址
SETB TR1
CLR ET1;禁止T1中斷
MOV SCON,#50H ;串行方式1,REN=1
SETB ES ;允許串行中斷
SJMP $
SRT: ;串行中斷子程序
CLR ES ;關(guān)閉串行中斷
CLR TI
CLR RI
GET: MOV A,SUBF
CJNE A,#13,GO ;若接收到回車符,結(jié)束
SJMP EXIT
GO: MOV@R0,A ;接收到的字符存入緩沖區(qū)
INC R0
WAIT: JBC RI,GET
SJMP WAIT
EXIT: MOV A,R0
SUB A,#30H ;接收到的有效字符個數(shù)
MOV R2,A
DEC R0
SEND: MOV SUBF,@R0;按反序發(fā)送剛接收到得字符串
WAIT1: JNB TI,WAIT1
CLR TI
DEC R0
DJNZ R2,SEND
WAIT2: MOV SUBF,#13;發(fā)送回車,結(jié)束標(biāo)志。
JNB TI,WAIT2
CLR TI
SETB ES ;允許串行中斷,準(zhǔn)備下次通信
RETI
(6)編寫串行通信子程序
PrivateSubsend(outstring,n)
DiminstringAsString’定義接收字符串instring
MSComm1.CommPort=1’定義該通信控件屬性,用端口COM1
MSComm1.Settings=”19200,n,8,1”’波特率19200,無奇偶校驗,8位數(shù)據(jù),1個停止位
MSComm1.InputLen=0’當(dāng)輸入占用時,告訴控件讀入整個緩沖區(qū)
MSComm1.PortOpen=True’打開端口
MSComm1.RThreshold=n’接收的字符串長度此處將是n
MSComm1.Output=outstring+Chr(&HD)’發(fā)送以回車符結(jié)尾的字符串
以下是采用查詢方式從端口獲得單片機(jī)方發(fā)來的數(shù)據(jù)
Do
DoEvents
LoopUntilMSComm1.InBufferCount>=n’等待,直到輸入緩沖區(qū)計數(shù)大于或等于n
Print”InBufferCount=”;MSComm1.InBufferCount’顯示接收到的字符串長度
instring=MSComm1.Input’取得接收到的字符串
Print”O(jiān)k,get:”;instring’顯示接收到的字符串
MSComm1.PortOpen=False’關(guān)閉端口
EndSub
(7)上述子程序中也可以采用事件驅(qū)動的方法從端口獲得單片機(jī)方發(fā)來的數(shù)據(jù)。把上述
部分(從Do開始到關(guān)閉端口)改為下列子程序:
PrivateSubMSComm1_OnComm()
DiminstringAsString
SelectCaseMSComm1.CommEvent
’errer捕捉每一個事件或錯誤,把代碼寫在對應(yīng)的case語句后面
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -