新聞中心

        51單片機(jī)-串口

        作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
        SM0,SM1工作方式選擇位,SM2多機(jī)通信控制位,REN允許串行接收位,TI發(fā)送中斷標(biāo)志位,RI接
        收中斷標(biāo)志位。串行發(fā)送停止位的開始時,由內(nèi)部硬件使TI置1,向CPU發(fā)出中斷申請。在中斷服務(wù)
        程序中,必須用軟件將其清0,取消此中斷申請。
        電源管理寄存器PCON也是一個特殊功能寄存器,字節(jié)地址為87H,不能位尋址,PCON用來管理單片
        機(jī)的電源部分,包括上電復(fù)位檢測,掉電模式,空閑模式等。單片機(jī)復(fù)位時PCON全部被清0。
        SMOD該位與串口波特率有關(guān),SMOD=0,串口方式1,2,3時,波特率正常。SMOD=1,串口方式1,2,3時,波特率加倍。
        用軟件置REN為1時,接收器會以所選擇波特率的16倍速采樣RXD引腳電平,檢測到RXD引腳輸入電平發(fā)生
        負(fù)跳變時,則說明起始位有效,將其移入輸入移位寄存器,并開始接受這一幀信息的其余位。接受過
        程中,數(shù)據(jù)從輸入移位寄存器的右邊輸入,起始位移至輸入移位寄存器最左邊時,控制電路進(jìn)行最后
        一次移位。當(dāng)RI = 0,且SMOD = 0(或接受到的停止位為1)時,將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)
        裝入接受SBUF,第9位進(jìn)入RB8,并置RI=1,向CPU中斷請求。
        在具體操作串行口之前,需要對單片機(jī)一些與串行口有關(guān)的特殊功能寄存器進(jìn)行初始化設(shè)置:
        確定T1的工作方式(編程TMOD寄存器)
        計算T1的初值,裝載TH1,TL1
        開啟T1(編程TCON中的TR1位)
        設(shè)置串口的工作方式(編程SCON寄存器)
        串行口工作在中斷方式下,要進(jìn)行中斷設(shè)置(IE寄存器)
        波特率計算公式:
        方式0的波特率=fosc/12。
        方式1的波特率=(2^smod/32)*(T1溢出率)。
        方式2的波特率=(2smod/64)*fosc。
        方式3的波特率=(2smod/32)*(T1溢出率)。
        T1溢出率=fosc/{12*[256-(TH1)]}
        fosc為系統(tǒng)晶振頻率,通常為12MHZ或11.05926MHZ
        異步串口通信兩種方式:輪詢和中斷
        下面是一個中斷程序,使用串口調(diào)試工具發(fā)出什么返回什么。
        #include <reg52.h>
        unsigned char a,flag;
        void main(){
        TMOD = 0x20; //工作方式2,8位自動重裝定時/計數(shù)器
        TH1 = 0xfd; //波特率為9600bps,系統(tǒng)晶振頻率為11.0592MHZ時需要裝入的
        TL1 = 0xfd; //TH1,TL1的值可以通過公式 T1溢出率=fosc/{12*[256-(TH1)]}
        EA = 1; //開啟CPU中斷允許位
        ES = 1; //開始串口中斷允許位
        SM1 = 1; //設(shè)置串口的工作方式為01即方式1,10位異步收發(fā)(8位數(shù)據(jù))
        TR1 = 1; //T1開啟
        REN = 1; //允許串行接受位
        while(1){
        if(flag == 1){
        ES = 0; //關(guān)閉串口中斷,防止發(fā)送數(shù)據(jù)時產(chǎn)生中斷
        SBUF = a; //將數(shù)據(jù)送到發(fā)送緩沖寄存器
        while(!TI); //發(fā)送當(dāng)停止位開始時,會產(chǎn)生中斷,把TI置1
        TI = 0;
        flag = 0;
        ES = 1; //允許中斷
        }
        }
        }
        void uart() interrupt 4{
        a = SBUF; //當(dāng)產(chǎn)生RI中斷時說明數(shù)據(jù)接收完畢,把數(shù)據(jù)賦給變量a
        RI = 0; //軟件方法把RI置0
        flag = 1;
        }
        輪詢方式,如果有數(shù)據(jù)輸入發(fā)送給串口,當(dāng)停止位開始時,蜂鳴器響起。
        #include <reg52.h>
        #define uchar unsigned char
        sbit buzzer=P3^4;
        void delay(uchar z)
        {
        uchar x,y;
        for(x=1000;x>1;x--)
        for(y=z;y>1;y--);

        關(guān)鍵詞: 51單片機(jī)串口信息交

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 漯河市| 涞水县| 黑河市| 清镇市| 黄石市| 武清区| 沅江市| 呈贡县| 辽宁省| 团风县| 西宁市| SHOW| 海安县| 依兰县| 克山县| 沧州市| 科尔| 绥化市| 观塘区| 正宁县| 鲁甸县| 安乡县| 长海县| 玉龙| 澄江县| 秭归县| 长岭县| 香格里拉县| 图们市| 台湾省| 镇远县| 房山区| 集安市| 聂荣县| 积石山| 上思县| 攀枝花市| 中超| 博野县| 互助| 曲沃县|