標(biāo)題: 51單片計(jì)算機(jī)串口開發(fā)詳解 [打印本頁]

作者: dagu    時(shí)間: 2014-12-26 00:00
標(biāo)題: 51單片計(jì)算機(jī)串口開發(fā)詳解
一.51單片計(jì)算機(jī)串口結(jié)構(gòu)圖如下:


二. SCON 是一個(gè)特殊功能寄存器說明:
         用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志


        各位功能如下:
        SM0和SM1 為工作方式選擇位
   

        SM2,多機(jī)通信控制位,主要用于方式2和方式3。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來控制是否激活RI(RB8=0時(shí)不激活RI,收到的信息丟棄;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時(shí),不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時(shí)RB8不具有控制RI激活的功能)。通過控制SM2,可以實(shí)現(xiàn)多機(jī)通信。
在方式0時(shí),SM2必須是0。在方式1時(shí),若SM2=1,則只有接收到有效停止位時(shí),RI才置1。
        REN,允許串行接收位。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。
        TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用?梢杂米鲾(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。
在方式0和方式1中,該位未用。
        RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。
        TI,發(fā)送中斷標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行發(fā)送停止位的開始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請(qǐng)。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng)。
        RI,接收中斷標(biāo)志位。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請(qǐng)。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請(qǐng)。

三.串口開發(fā)例程,下面程式實(shí)現(xiàn)向單片機(jī)發(fā)關(guān)信息后,它收完后再返回送回來。

#include<reg52.h>
unsigned  char flag,a;
void main()
{

   TMOD=0x20; //設(shè)置定時(shí)器1為工作方式2,串口是靠在、定時(shí)器工作的
   TH1=0xfd;
   TL1 =0xfd; //裝串口初值,設(shè)置串口波特率9600,計(jì)算出來的
   TR1=1;//打開定時(shí)器

   REN=1;  // 打開串口允許位
   SM0=0;
   SM1=1;//設(shè)置串口工作方式1
   EA=1;  //打開總中斷
   ES=1;  //打開串口中斷
   
   while(1)
   {
        if (RI==1)  //這個(gè)是用來讀取到P1口
       {
         RI=0;
         P1=SBUF:
       }


        if(flag==1)   //表明串口收到的數(shù)據(jù)可以用來發(fā)送
        {
          ES=0;  //防止TI進(jìn)入串口中斷關(guān)串口中斷
          flag=0;
          SBUF=a; //向發(fā)送SBUF送a
          while(!TI); //等待 發(fā)送結(jié)束。未發(fā)送結(jié)束之前T1一直是0
          TI=0;      // 通過軟件將TI置0防止中斷后進(jìn)入中斷服務(wù)程序
          ES=1;
         }
   }
}
void ser() interrupt 4  
{
   RI=0;
   P1=SBUF;
   a=SBUF;
   flag=1;
}

附:max232芯片接線圖

max 232 內(nèi)部合并了MC1488和MC1489能夠?qū)崿F(xiàn)TTL電平和232電平的雙向轉(zhuǎn)換


除了232接口外還有其它的接口,都有自己不同的特性



           RS-485是一點(diǎn)對(duì)多點(diǎn)的通信接口,一般采用雙絞線的結(jié)構(gòu)。普通的PC機(jī)一般不帶RS485接口,因此要使用RS-232C/RS-485轉(zhuǎn)換器。對(duì)于單片機(jī)可以通過芯片MAX485來完成TTL/RS-485的電平轉(zhuǎn)換。在計(jì)算機(jī)和單片機(jī)組成的RS-485通信系統(tǒng)中,下位機(jī)由單片機(jī)系統(tǒng)組成,上位機(jī)為普通的PC機(jī),負(fù)責(zé)監(jiān)視下位機(jī)的運(yùn)行狀態(tài),并對(duì)其狀態(tài)信息進(jìn)行集中處理,以圖文方式顯示下位機(jī)的工作狀態(tài)以及工業(yè)現(xiàn)場(chǎng)被控設(shè)備的工作狀況。系統(tǒng)中各節(jié)點(diǎn)(包括上位機(jī))的識(shí)別是通過設(shè)置不同的站地址來實(shí)現(xiàn)的。


作者: zllarry    時(shí)間: 2014-12-27 22:21
值得擁有
作者: machinnneee    時(shí)間: 2014-12-30 11:45
很詳細(xì)的資料,謝謝分享
作者: machinnneee    時(shí)間: 2014-12-30 11:51
經(jīng)過驗(yàn)證,程序可用
作者: lxl2255    時(shí)間: 2015-1-7 13:14
詳細(xì)的資料,謝謝
作者: yyxtj    時(shí)間: 2015-4-16 20:28
好東西,學(xué)習(xí)一下,謝謝!
作者: 眾生作廢    時(shí)間: 2015-5-15 10:22
    SM2,多機(jī)通信控制位,主要用于方式2和方式3。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來控制是否激活RI(RB8=0時(shí)不激活RI,收到的信息丟棄;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時(shí),不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時(shí)RB8不具有控制RI激活的功能)。通過控制SM2,可以實(shí)現(xiàn)多機(jī)通信。
在方式0時(shí),SM2必須是0。在方式1時(shí),若SM2=1,則只有接收到有效停止位時(shí),RI才置1。
        REN,允許串行接收位。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。
        TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用?梢杂米鲾(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。
在方式0和方式1中,該位未用。
        RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。
        TI,發(fā)送中斷標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行發(fā)送停止位的開始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請(qǐng)。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng)。
        RI,接收中斷標(biāo)志位。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請(qǐng)。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請(qǐng)。

作者: 51hei電控04261    時(shí)間: 2015-12-24 11:45
很好的帖子
作者: 迷戀520冬天    時(shí)間: 2016-3-17 23:11
很好的帖子   幫助很大
作者: qq529593957    時(shí)間: 2016-3-18 00:34
很好的帖子   幫助很大很好的帖子   幫助很大
作者: 淺水初探    時(shí)間: 2016-9-1 15:11
我用這個(gè)程序在我的實(shí)驗(yàn)板上調(diào)試,可以通過,但燒入單片機(jī)運(yùn)行,串口無顯示,為何?
作者: qzyhlf    時(shí)間: 2019-1-25 10:52
值得擁有
作者: wengjiamin    時(shí)間: 2021-1-9 21:07
RS-485還要在終端接120歐姆電阻,防止信號(hào)反射

作者: zhangweiyu    時(shí)間: 2021-2-17 15:50
真是個(gè)好貼,我正好在學(xué)習(xí),謝謝!
作者: lsh04    時(shí)間: 2021-2-20 23:20
很詳細(xì)的資料,謝謝分享
作者: robter    時(shí)間: 2021-2-22 10:44
感謝樓主,很好的學(xué)習(xí)資料




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1