新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機串口通信軟件程序集

        51單片機串口通信軟件程序集

        作者: 時間:2016-11-18 來源:網絡 收藏
        串口通信單片機程序

        beepbit p3.7;蜂鳴器定義

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

        org 00h

        jmp main

        org 23h ;串行中斷入口地址

        jmp com_int ;串行中斷服務程序

        ;***********主程序開始*******************

        org 30h

        main:mov sp,#30h;設置堆棧

        lcall rest ;初始化

        lcall comm ;串口初始化

        jmp $;原地等待

        ;************* 初始化 *********************

        rest:mov p0,#00h ;禁止數碼管顯示

        mov p2,#255

        clrbeep;禁止蜂鳴器

        mov p1,#255;禁止LED顯示

        RET;返回

        ; **************串口初始化 *****************

        ;設置串行口工作方式1,定時器1作為波特率發生器

        ;波特率設置為 2400;

        comm: mov tmod,#20h;設置定時器T1工作方式2

        mov tl1,#0f3h ;定時器計數初值,波特率 2400

        mov th1,#0f3h;定時器重裝值

        setb ea ;允許總的中斷

        setb es ;允許串行中斷

        mov pcon,#00h;波特率不倍增

        mov scon,#50h;設置串口工作方式1,REN = 1 允許接收

        setb tr1 ;定時器開始工作

        ret ;返回

        ;***************串口中斷服務程序 ***********

        ;如果接收0FF表示上位機需要聯機信號,單片機發送 0FFH作為

        ;應答信號,如果接收到 數字 1~ n,表示相應的功能;

        ;這里,如果收到 1 ,則單片機向計算機發送字符H;

        ;如果收到 2 ,則單片機向計算機發送字符e;

        ;如果收到其他的數據,則發送J;

        com_int:clr es;禁止串行中斷

        clr ri;清除接收標志位

        mov a,sbuf ;從緩沖區取出數據

        mov p1,a

        mov dptr,#tab

        cjne a,#0ffh,in_1;檢查數據

        mov sbuf,#255;收到聯機信號,發送聯機信號

        jnb ti,$;等待發送完畢

        clr ti;清除發送標志

        setb es ;允許串行中斷

        reti;中斷返回

        in_1: cjne a,#1H, in_2 ;如果收到1

        movc a,@a+dptr

        mov sbuf,a ;發送 h

        jnb ti,$;等待發送完畢

        clrti ;清除發送中斷標志

        setb es ;允許串行中斷

        reti;中斷返回

        in_2: cjne a,#2,in_3 ;接收到2

        movc a,@a+dptr

        mov sbuf,a ;發送 e

        jnb ti,$;等待發送完畢

        clrti ;清除發送中斷

        setb es ;允許串行中斷

        reti;中斷返回

        in_3: mov a,#03h

        movc a,@a+dptr

        mov sbuf,a ;發送 j

        jnb ti,$;等待發送完畢

        clr ti;清除發送中斷標志

        setb es ;允許串行中斷

        reti;返回

        tab:db 2,h,e,j

        end

        51單片機串口調試程序一例

        /*定義為中斷方式串口處理*/

        #define INTERSENDSTR

        /*不為8032系列芯片 */

        //#define CHIP_8032

        #include

        #include

        #include

        #include "err.h"

        #ifdef INTERSENDSTR

        unsigned char xdata sSendComBuf[256],sRecComBuf[256];

        unsigned char data bOut,bIn,bSout,bSin;

        #else

        #define DEFSENDCHAR TI=0;SBUF=ACC;while(!TI);TI=0;

        #endif

        //bps設置 9600就是 PSetBps(96)(11.0592Mhz)

        unsigned charPSetBps(unsigned int bps) SMALL

        {

        unsigned int t1;

        unsigned char t2;

        #ifdef INTERSENDSTR

        /*如果使用中斷方式發送數據,必須等待發送數據完畢才能更換波特率 */

        while(bSin!=bSout)

        {

        ;

        }

        ES=0;

        #endif

        #ifdef CHIP_8032

        if(3456%bps)

        {

        return ERR_SET_BPS;

        }

        t1=3456/bps;

        t1--;t1=~t1;

        RCAP2H=t1/256;RCAP2L=t1;

        T2MOD=0x00;

        /*使用定時器2做波特率發生器 */

        T2CON=0x34;/*TF2=0;EXF2=0;RCLK=1;TCLK=1;EXEN2=0;TR2=1;C/T2=0;CP/RL2=0

        */

        #else

        t1=576/bps;

        if((576%bps)||((t1==0))||(t1>=2*256))

        {

        return ERR_SET_BPS;

        }

        if(t1>256)

        {

        PCON=00;

        t2=256-(288/bps);

        }

        else

        {

        PCON=0x80;

        t2=256-t1;

        }

        TH1=t2;TL1=t2;

        TR1=1;

        #endif

        /*模式3*/

        SM0=0;

        RI=0;TI=0;

        REN=1;

        SM1=1;

        SM2=1;

        #ifdef INTERSENDSTR

        bOut=bIn;

        bSout=bSin;

        ES=1;

        #endif

        return OK;

        }

        void PSendChar(unsigned char ch) SMALL

        {

        #ifdef INTERSENDSTR

        unsigned char tch;

        tch=bSin+1;

        while(tch==bSout)

        {

        ;

        }

        sSendComBuf[bSin]=ch;

        ES=0;

        if((bSout==bSin))

        {

        SBUF=sSendComBuf[bSin];

        bSin++;

        }

        else

        {

        bSin++;

        }

        ES=1;

        #else

        ACC=ch;

        DEFSENDCHAR;

        #endif

        }

        unsigned char PGetChar() SMALL

        {

        unsigned char ch;

        #ifdefINTERSENDSTR

        ch=sRecComBuf[bOut];

        bOut++;

        return ch;

        #else

        ch=SBUF;

        RI=0;

        #endif

        }

        bit PCharInCom() SMALL

        {

        #ifdefINTERSENDSTR

        if(bIn!=bOut)

        {

        return 1;

        }

        return 0;

        #else

        return RI;

        #endif

        }

        void PSendString(unsigned char *st) SMALL

        {

        while(*st)

        {

        PSendChar(*st);

        st++;

        }

        }

        void PSendArray(unsigned char*st,unsigned intlen) SMALL

        {

        unsigned int ii;

        for(ii=0;ii

        {

        PSendChar(st[ii]);

        }

        }

        #ifdefINTERSENDSTR

        void PSerialInt() interrupt 4

        {

        if(RI)

        {

        sRecComBuf[bIn]=SBUF;

        bIn++;

        RI=0;

        }

        if(TI)

        {

        TI=0;

        if(bSout!=bSin)

        {

        bSout++;

        }

        if(bSout!=bSin)

        {

        SBUF=sSendComBuf[bSout];

        }

        }

        }

        #endif



        關鍵詞: 51單片機串口通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 剑阁县| 会昌县| 邛崃市| 舟山市| 许昌市| 绥棱县| 湟源县| 咸丰县| 溧阳市| 桂东县| 广东省| 边坝县| 九台市| 清水河县| 哈密市| 土默特左旗| 神池县| 荔浦县| 博乐市| 喜德县| 永善县| 嘉鱼县| 农安县| 中卫市| 枞阳县| 康平县| 巴东县| 手游| 吴堡县| 喀什市| 扬中市| 防城港市| 深圳市| 永清县| 宜都市| 伊宁市| 兴城市| 青海省| 嘉定区| 绵阳市| 吉首市|