|
MCS-51系列單片機(jī)的串行口有4種工作方式。方式0為移位寄存器方式,用于外接同步I/O設(shè)備或擴(kuò)展I/O口,不算起始位和停止位。方式1為8位異步串行通訊,方式2和方式3為9位異步串行通訊。方式2和方式3中的第9位是可程控位,即可由軟件來確定第9位是“0”還是“1”。也就是說,MCS-51系列單片機(jī)不像某些專用串行芯片,如INTEL8051、8050、TLC16C550等那樣,可根據(jù)初始化條件自動加入串行通訊中的奇偶校驗位發(fā)送出去,而是需要軟件參與產(chǎn)生奇偶校驗位。用軟件產(chǎn)生奇偶校驗位是根據(jù)MCS-51系列單片機(jī)的狀態(tài)寄存器PSW的定義:當(dāng)累加器A中為1的個數(shù)為奇數(shù)時,P=1,否則P=0,來編程的。假定待發(fā)送的數(shù)據(jù)已放入累加器A中,可用如下匯編語言來實現(xiàn)(串行口工作于方式2): MOV C,P; 把奇偶標(biāo)志送給進(jìn)位位 MOV TB8,C; 把進(jìn)位位送給TB8 MOV SBUF,A; 把待發(fā)送的數(shù)據(jù)放入串行口 用C語言來編寫時,因累加器A對編程者不透明,則會帶來問題。例如,假定待發(fā)送的數(shù)據(jù)已放入變量VARIABLE中,若要從串行口發(fā)送出去,想當(dāng)然地認(rèn)為使用如下語句即可: TB8=P; /*語句1*/ SBUF=VARIABLE /*語句2*/ 實際上,2條語句并不能可靠地產(chǎn)生奇偶校驗位。因為在語句1前面的語句所對應(yīng)的匯編語言中的累加器A中為1的個數(shù)是不確定的,而 語句2又是不可分割的。語句1和2對應(yīng)的匯編語言程序為: MOV C,P; 語句3 MOV TB8,C; 語句4 MOV A,VARIABLE; 語句5 MOV SBUF,A; 語句6 可以看出,只有將語句3、4放到語句5和語句6之間時,才能正確地產(chǎn)生奇偶校驗位。為了達(dá)到這一目的,可引入全局變量VARIABLE1相應(yīng)的C語言程序如下: VARIABLE1=0; /* 語句7*/ VARIABLE +=VARIABLE1; /* 語句8*/ TB8=P; /*語句9 */ SBUF=VARIABLE; /*語句10*/ 需要強(qiáng)調(diào)的是: 1.在串行中斷服務(wù)程序中,VARIABLE1一定要設(shè)置為全局變量,若設(shè)置為局部變量,則可能引起意想不到的后果。 2.語句7和語句8盡量不要縮寫成: VARIABLE +=0; /* 語句10*/ 而把全局變量VARIABLE1省掉。這主要是為了防止編譯程序在某種可能的編譯優(yōu)化條件下將語句10也省略掉。 |