新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機串行通信奇偶校驗的設置方法

        51單片機串行通信奇偶校驗的設置方法

        作者: 時間:2016-11-22 來源:網絡 收藏
        通常,串行通信的一幀的格式是8-n-1,即8位數據、無校驗、1個停止位。

        有時為了提高準確度,需要增加一個“奇”校驗位或者“偶”校驗位。
        對于高級語言的做法是很簡單的,只要把格式命令“8-n-1”,改為“8-P-1”或“8-O-1”即可。

        本文引用地址:http://www.104case.com/article/201611/319592.htm

        串行口在帶有校驗位的通信方式中,是先發送8位數據,然后再發送校驗位。

        51單片機也可以按照帶有校驗位的方式進行串行通信,這在51單片機中稱為9位數據方式。
        51單片機中有兩個位,分別稱為TB8和RB8,它們在“無校驗”的時候,并沒有用處。
        當51單片機用9位數據方式進行串行通信的時候,TB8和RB8的作用如下:
        51單片機在發送的時候,先發送8位數據,然后發送TB8中的內容;
        51單片機在接收的時候,先接收8位數據,然后接收校驗位,存到RB8中。

        編寫51單片機程序的時候,應該在發送數據之前,在TB8中,寫好待發送的校驗位。

        8位數據的校驗位,可以利用單片機中奇偶標志位P來自動生成,程序如下。

        MOV A, #待發數據 ;數據進了A,即刻生成奇偶標志位P
        MOV C, P
        MOV TB8, C ;校驗位送到TB8
        MOV SBUF, A ;發送數據,以及P

        由于P = 1則說明A中有奇數個1,所以上述程序是“偶”校驗的形式。
        如果要求的是“奇”校驗,則需要增加一條取反指令,如下:

        MOV C, P
        CPL C
        MOV TB8, C ;校驗位送到TB8

        接收方會把收到的8位數送到SBUF,第9位數,送到RB8,然后自動設立RI = 1。
        之后,就可以用RB8中的內容,對剛才收到的8位數進行正確性檢驗。

        另一個問題:51單片機如何初始化成8-n-1(8數據位,無奇偶校驗位,1停止位)波特率,是用串口的模式幾?
        本來想用串口的模式1,可是仔細一看,模式1是10異步通信方式,1起始位,8數據位,1停止位?
        懸賞分:20 - 解決時間:2009-12-1 13:26
        問題補充:首先感謝一樓的回答。我還有些疑問,剛才用示波器看了下,當發送0xFF時,示波器顯示一位低電平,其余為高電平,這點應該是對的,因為起始位是0.可是為什么發送0xAA時,示波器的(起始位+數據位+停止位)序列是:0 + 0101 0101 + 1,而0x55的序列為:0 +1010 1010 + 1,這兩個值好像不對,是相反了,要是調一下剛好對?
        ;-----------------------------------------------------------------
        最佳答案用串口的模式1,是10位異步通信方式。
        1起始位,8數據位,1停止位,沒有奇偶校驗位。
        這種模式就是:8-n-1(8數據位,無奇偶校驗位,1停止位)的模式。
        完全符合你的要求。
        --------------------
        帶奇偶校驗位的,要用方式2或方式3。
        把奇偶校驗位,放到TB8上,就可以發送了,這就是偶校驗。
        接收的奇偶校驗位,在RB8中。
        --------------------
        呵呵,你還用上了示波器,奢侈!
        你觀察的很正確。
        記住:串行通信,是“低位在前”。這就對了。
        你補充的提問太多了,都足夠再開一、二個問題了,這20分,真值!
        ;-----------------------------------------------------------------



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 涿鹿县| 饶阳县| 六枝特区| 和平区| 沾益县| 昌乐县| 鄂托克前旗| 洛浦县| 湖北省| 郁南县| 东丽区| 东丰县| 佳木斯市| 凤庆县| 彰化市| 武功县| 新源县| 壤塘县| 横山县| 怀柔区| 绥化市| 淳安县| 南阳市| 潜山县| 普陀区| 咸阳市| 弥渡县| 黎川县| 武邑县| 湘乡市| 阿拉善右旗| 宁海县| 临泽县| 来宾市| 内丘县| 焦作市| 铜山县| 民丰县| 金门县| 喜德县| 布尔津县|