新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機串口通信的注記

        51單片機串口通信的注記

        作者: 時間:2016-11-20 來源:網絡 收藏
        最近折騰51單片機,當然學到的都是比較基礎的東西,可能我認為比較復雜的概念有“中斷” 和“串口通信”,這篇主要是講串口通信

        使用的自然是山大王STC89C52RC的芯片來學習

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

        串口通信主要是C51單片機的RXD 和TXD 與上位機進行通信,由于上位機一般是電腦,所以要TTL轉成電腦能讀出的RS232的電路來支持 一般使用MAX232 芯片 串口通信電路如下


        之后就可以電腦的串口與這里的串口頭子接了,注意 串口先要交叉一下 即電腦的TXD 對應下位機的RXD

        C信模式有4種,最常用的是第一種

        方式0 同步移位寄存器方式 ,一般用來擴展I/O口,

        方式1 10位異步收發(8位數據),波特率可變(由定時器1的溢出率控制)

        方式2 11位異步收發(9位數據),波特率固定

        方式4 11位異步收發,波特率可變(定時器1溢出率決定)


        各種需要配置的參數如下所示


        TI
        發送中斷標志位
        當發送一幀完畢后,由硬件使TI=1,向外部發送中斷申請,在中斷服務程序中,必須用軟件手動TI = 0,否則一直卡在中斷里(測試一下)

        RI
        接受中斷標志位
        當接收一幀完畢后,由硬件使RI = 1, 向外部發送中斷申請,也必須要在中斷服務程序中,用軟件將其清0,取消此次中斷申請

        ES
        串行中斷允許位
        1 為開打 0為關閉

        REN
        允許串行接受位
        1 為打開 0 為關閉

        SBUF
        串口緩存
        在讀寫完畢后,存儲的是相應的讀/寫值(注意,SUBF實際有兩個寄存器,一個放寫一個放讀)

        SM0/1
        串口設置工作方式
        設置4種工作方式,注意,最好是設置好工作方式再開串口傳授

        EA
        終端總開關

        TR1
        定時器1開關

        TH1/TL1
        定時器初值
        為了滿足9600 的波特率 所以需要將TH1 TL1 設置為0xfd

        TMOD
        定時器運行模式
        在串口通信的1號方式的時候 需要打開T1的串口通信 TMOD= 0x20 ,即第二種方式,8位自動重裝

        ET0/1
        中斷允許開關
        time0 time1

        之后是我的印象筆記的兩篇關于串口通信筆記的分享

        http://app.yinxiang.com/shard/s20/sh/6abe8da0-d4b8-4407-9848-3142dde1bed5/ba2a0a6debaab317aaca09185ce65c71
        http://app.yinxiang.com/shard/s20/sh/0faa2671-1e95-4d08-9d12-b1bdedc0eadd/13e7a915ea347b0daf3aca30fd9a6a74

        我自己寫的個簡單的串口通信

        #include
        #define uint unsigned int
        #define uchar unsigned char
        uchar code table[] = "Hi ";

        uchar receiveFlag=0;

        void init(){
        TMOD = 0x20;
        TH1 = 0xfd;
        TL1 = 0xfd;

        SM0 = 0;
        SM1 = 1;
        REN = 1;


        EA = 1;
        TR1 = 1;
        }

        void main(){
        uchar serVal,i;
        init();
        receiveFlag = 1;

        while(1){
        if(receiveFlag == 1){
        ES = 1;
        while(RI==0);
        serVal = SBUF;

        RI = 0;
        receiveFlag = 0;
        }
        if(receiveFlag==0){ //need to send msg;
        for(i =0;i<3;i++){
        SBUF = table[i];
        while(TI==0);
        TI = 0;
        }
        SBUF = serVal;
        while(TI ==0);
        TI = 0;
        receiveFlag = 1;
        }
        }

        }


        void receive_data() interrupt 4{
        RI = 0;//手動清0
        ES = 0;
        receiveFlag = 0;

        }



        關鍵詞: 51單片機串口通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 历史| 五常市| 永德县| 肇州县| 巴里| 林周县| 鄂州市| 宾阳县| 武山县| 白山市| 和平区| 余江县| 方正县| 曲沃县| 怀柔区| 加查县| 汕尾市| 峡江县| 晋州市| 克拉玛依市| 洱源县| 泰顺县| 苏尼特右旗| 稻城县| 南昌县| 门源| 梅州市| 和静县| 安溪县| 大新县| 新竹市| 瑞安市| 信阳市| 革吉县| 武清区| 徐水县| 乌海市| 广宗县| 武川县| 宁陕县| 资中县|