串行口的4種工作方式中的方式0是移位寄存器工作方式,主要用于擴展并行I/O用,并不用于串行通信。串行口的方式1~3是用于串行通信的,下面介紹串行口的方式1~3的雙機串行通信軟件編程。應當說明的是,下面介紹的雙機串行通信的編程實際上與各種串行標準的硬件接口電路無關,因為采用不同的標準串行通信接口僅僅是由雙機串行通信距離、傳輸速率以及抗干擾性能來決定的。
1.串行口方式1應用編程
例如:采用方式1進行雙機串行通信,收、發(fā)雙方均采用6 MHz晶振,波特率為2400 bit/s,一幀信息為10位,第0位為起始位,第1~8位為數(shù)據(jù)位,最后1位為停止位。發(fā)送方以78H、77H單元的內(nèi)容為首地址,以76H、75H單元內(nèi)容減1為末地址的數(shù)據(jù)塊通過串行口發(fā)送給接收方。
發(fā)送方要發(fā)送的數(shù)據(jù)塊的地址為2000H~201FH。發(fā)送時先發(fā)送地址幀,再發(fā)送數(shù)據(jù)幀;接收方在接收時使用一個標志位來區(qū)分接收的是地址還是數(shù)據(jù),然后將其分別存放到指定的單元中。發(fā)送方可采用查詢方式或中斷方式發(fā)送數(shù)據(jù),接收方可采用中斷或查詢方式接收。下面介紹收發(fā)雙方均采用中斷方式的串行發(fā)送、接收程序。
(1)甲機發(fā)送程序。
中斷方式的發(fā)送程序如下:
(2)乙機接收程序。
中斷方式的接收程序如下:
2.串行口方式2應用編程
方式2和方式1有兩點不同之處。方式2接收/發(fā)送11位信息,第O位為起始位,第1~8位為數(shù)據(jù)位,第9位是程控位,該位可由用戶置TB8決定,第10位是停止位1,這是方式1和方式2的一個不同點。另一個不同點是方式2的波特率變化范圍比方式1小,方式2的波特率一振蕩器頻率/n。
當SMOD=O時,n=64。
當SMOD=1時,n=32。
鑒于方式2的使用和方式3基本一樣(只是波特率不同,方式3的波特率要由定時器Tl的溢出率決定),所以方式2的具體編程應用,可參照下面介紹的方式3應用編程。
3.串行口方式3應用編程
例如:AT89S51單片機用串行通信方式3進行發(fā)送和接收的應用實例。發(fā)送方采用查詢方式發(fā)送地址幀,采用中斷或查詢方式發(fā)送數(shù)據(jù),接收方采用中斷或查詢方式接收數(shù)據(jù)。發(fā)送和接收雙方均采用6 MHz的晶振,波特率為4800 bit/s。
發(fā)送方首先將存放在78H和77H單元中的地址發(fā)送給接收方,然后發(fā)送數(shù)據(jù)OOH~FFH,共256個數(shù)據(jù)。
(1)甲機發(fā)送程序。中斷方式的發(fā)送程序如下:
(2)乙機接收程序。接收方把先接收到的數(shù)據(jù)送給數(shù)據(jù)指針,將其作為數(shù)據(jù)存放的首地址,然后將接下來接收到的數(shù)據(jù)存放到以先前接收的數(shù)據(jù)為首地址的單元中去。
采用中斷方式的接收程序如下:
一般來說,定時器方式2用來確定波特率是比較理想的,它不需要用中斷服務程序設置初值,且算出的波特率比較準確。在用戶使用的波特率不是很低的情況下,建議使用定時器T1的方式2來確定波特率。