北京交通大學(xué)海濱學(xué)院電子與電氣工程學(xué)院 沈 敏 張 靜 王東振 金 鈺
串口是單片機(jī)與其他單片機(jī)或計算機(jī)系統(tǒng)進(jìn)行異步串行通信的標(biāo)準(zhǔn)I/O接口,在系統(tǒng)設(shè)計中應(yīng)用非常廣泛。以教學(xué)中使用的CPU字長是8位的51單片機(jī)為例,實現(xiàn)雙機(jī)間多數(shù)據(jù)串行傳輸,在多數(shù)據(jù)發(fā)送時為每個數(shù)據(jù)增加特征值,接收的時候通過特征值判斷接收的數(shù)據(jù),此方法最多可以實現(xiàn)雙機(jī)間16個數(shù)據(jù)的傳送,適用于5-8個通道的數(shù)據(jù)采集系統(tǒng)。將此設(shè)計思想應(yīng)用在0-999s的秒表系統(tǒng)設(shè)計中,系統(tǒng)運行穩(wěn)定,實現(xiàn)預(yù)期效果。
單片機(jī)串口是異步串行通信,發(fā)送方發(fā)送數(shù)據(jù)并不考慮接收方什么時候接收,如果是傳送1個數(shù)據(jù)比較好處理,串口無論工作在查詢方式下還是中斷方式下,接收方的CPU只要檢測RI=1,就可以接收數(shù)據(jù)。
如果發(fā)送方發(fā)送的是多個數(shù)據(jù),接收方接收的是發(fā)送方發(fā)送的多個數(shù)據(jù)的哪一個?發(fā)送方發(fā)送的多個數(shù)據(jù)是動態(tài)變化的,盡管發(fā)送方發(fā)送多個數(shù)據(jù)的順序在編程中是固定不變的,但是串口通信是異步的,接收方接收時,無法知道此次接收的數(shù)據(jù)是發(fā)送方發(fā)送的哪一個數(shù)據(jù),所以接收方必須有能力判斷接收到的是哪一個數(shù)據(jù)才能真正實現(xiàn)異步串行通信多數(shù)據(jù)的正確傳送。
要想讓接收方有能力判斷接收的數(shù)據(jù)是哪一個數(shù)據(jù),可以對要發(fā)送的數(shù)據(jù)做加密處理,數(shù)據(jù)加密技術(shù)是網(wǎng)絡(luò)中最基本的安全技術(shù),主要是通過對網(wǎng)絡(luò)中傳輸?shù)男畔⑦M(jìn)行數(shù)據(jù)加密來保障其安全性。本設(shè)計借用數(shù)據(jù)加密的思想,對要發(fā)送的數(shù)據(jù)采用增加特征值的加密處理方法,乙機(jī)接收數(shù)據(jù)后,通過解密獲取特征值,就可以知道接收的是哪一個數(shù)據(jù)了。特征值的選取要視發(fā)送數(shù)據(jù)的范圍,本文以發(fā)送壓縮BCD碼說明數(shù)據(jù)加密的原理及編程實現(xiàn)。
壓縮BCD碼是用4位二進(jìn)制表示1位十進(jìn)制,由于設(shè)計中使用的單片機(jī)CPU的字長是8位的,所以一次可以處理1個字節(jié)數(shù)據(jù),用字節(jié)表示1位BCD碼的時候,高4位一定是“0”,低4位是”0-9”中的1個數(shù)字,這樣用高4位的“0”就可以實現(xiàn)對數(shù)據(jù)加密處理。使用邏輯或指令,對傳送數(shù)據(jù)的高4位用1-4個“1”做邏輯或的運算,增加一個特征值。從0001一直到1111,一共可以加密15個數(shù)據(jù),如果加上0000,則可以實現(xiàn)對16個BCD碼數(shù)據(jù)的高4位做加密處理。在實際雙機(jī)通信系統(tǒng)中,下位機(jī)在現(xiàn)場檢測數(shù)據(jù),并把檢測的數(shù)據(jù)做二進(jìn)制到十進(jìn)制的轉(zhuǎn)換,將轉(zhuǎn)換的結(jié)果通過串口發(fā)送給上位機(jī)進(jìn)行顯示,如果檢測數(shù)據(jù)范圍在0-999的范圍,則上述加密方法可以對5個數(shù)據(jù)采集通道的數(shù)據(jù)做加密處理;如果檢測數(shù)據(jù)范圍在0-99的范圍,則可以對8個數(shù)據(jù)采集通道的數(shù)據(jù)加密,該加密方法可以滿足大部分雙機(jī)通信系統(tǒng)設(shè)計中。
圖1 數(shù)據(jù)加密及發(fā)送流程圖
本文以0-999秒的秒表作為應(yīng)用背景,發(fā)送方相當(dāng)于下位機(jī)檢測數(shù)據(jù),發(fā)送方使用51單片機(jī)的定時器0工作在方式1、12MHZ晶振下,再利用“軟計數(shù)”做1S定時,定時秒數(shù)的個位、十位和百位分別用R1、R2、R3分別存放,數(shù)據(jù)發(fā)送時串口工作方式2下,以查詢的方式發(fā)送數(shù)據(jù),對這3個數(shù)據(jù)做加密和發(fā)送的流程圖如圖1所示。
如果要發(fā)送的數(shù)據(jù)比較多,可以使用單片機(jī)集成的片內(nèi)RAM來存放要發(fā)送的數(shù)據(jù),具體的處理過程是一樣的,只是可以使用寄存器間接尋址,通過循環(huán)的方式來加密、發(fā)送多個數(shù)據(jù)。
對圖1流程圖的匯編語言編程實現(xiàn)如下:
圖2 數(shù)據(jù)接收算法流程圖
MOV A,R1;取要發(fā)送的第1個數(shù)據(jù)
ORL A,#80H;加密,特征值是80H
MOV SBUF,A;發(fā)送
JNB TI,$;等待發(fā)送完成
CLR TI;清發(fā)送標(biāo)志位,準(zhǔn)備發(fā)送第2個數(shù)據(jù)
MOV A,R2;取要發(fā)送的第2個數(shù)
ORL A,#40H;加密,特征值是40H
MOV SBUF,A;發(fā)送
JNB TI,$;等待發(fā)送完成
CLR TI;清發(fā)送標(biāo)志位,準(zhǔn)備發(fā)送第3個數(shù)據(jù)
MOV A,R3;取第3個數(shù)據(jù)
ORL A,#20H;加密,特征值是20H
MOV SBUF,A;發(fā)送
JNB TI,$;等待發(fā)送完成
CLR TI;清發(fā)送標(biāo)志位
51單片機(jī)的串口是異步通信,發(fā)送方與接收方工作時序不同步,所以當(dāng)發(fā)送方發(fā)送多個數(shù)據(jù)時,接收方需要能判斷接收的是哪一個數(shù)據(jù),后續(xù)才能做出正確的處理。
接收數(shù)據(jù)的解密要根據(jù)發(fā)送方加密數(shù)據(jù)的方法進(jìn)行,由于數(shù)據(jù)加密是利用壓縮BCD碼的高4位全是“0”,通過給高4位補(bǔ)充0-4個“1”的特征值的方法進(jìn)行的,接收方接收的數(shù)據(jù)通過提取特征值的方法,就可以判斷當(dāng)前接收的數(shù)據(jù)是哪一個數(shù)據(jù),接收方接收數(shù)據(jù)也是工作在查詢方式下,具體的算法流程圖如圖2所示。
LP:JNB RI,$;等待接收完成
CLR RI;接收完成,清接收標(biāo)志位,準(zhǔn)備接收下一個數(shù)據(jù)
MOV A,SBUF;接收數(shù)據(jù)
MOV 30H,A;保存
ANL A,#0F0H;提取特征值
CJNE A,#80H,NEXT;與特征值80H比較,不相等繼續(xù)比較,否則是第1個數(shù)據(jù)
MOV A,30H;取回保存在30H中的數(shù)據(jù)
ANL A,#0FH;提取第1個數(shù)據(jù)
MOV R1,A;保存第1個數(shù)據(jù)
SJMP XIAN
NEXT:CJNE A,#40H,NEXT1;與特征值40H比較,不相等繼續(xù)比較,否則是第2個數(shù)據(jù)
MOV A,30H;取回保存在30H中的數(shù)據(jù)
ANL A,#0FH;提取第2個數(shù)據(jù)
MOV R2,A;保存第2個數(shù)據(jù)
SJMP XIAN
NEXT1:CJNE A,#20H,AGAIN;與特征值20H比較,不相等等待接收數(shù)據(jù),否則是第3個數(shù)據(jù)
MOV A,30H;取回保存在30H中的數(shù)據(jù)
ANL A,#0FH;提取第3個數(shù)據(jù)
MOV R3,A;保存第3個數(shù)據(jù)
XIAN:ACALL DISP
AGAIN:SJMP LP
接收方在識別出接收的是哪一個數(shù)據(jù)后,通過調(diào)用顯示子程序可以把識別的數(shù)據(jù)送到乙機(jī)數(shù)碼管上顯示,這樣乙機(jī)上0-999s的秒數(shù)可以穩(wěn)定的顯示。
總結(jié):保證雙機(jī)通信多數(shù)據(jù)正確傳輸?shù)年P(guān)鍵是對發(fā)送的多個數(shù)據(jù)“加密”,具體的處理方法可以是對每個發(fā)送數(shù)據(jù)分別“加密”,然后接收方對接收的數(shù)據(jù)解密后根據(jù)加密特征值逐一對比,也可以只對發(fā)送一組數(shù)據(jù)的首個數(shù)據(jù)做特征值的“加密”處理,接收時只在接收到包含特征值的數(shù)據(jù)后才開始逐一接收,這樣對發(fā)送數(shù)據(jù)的個數(shù)就沒有限制了。