新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51 IO口模擬串口通訊C源程

        51 IO口模擬串口通訊C源程

        作者: 時間:2016-11-23 來源:網絡 收藏
        #include 51.h>
        sbit BT_SND =P1^0;
        sbit BT_REC =P1^1;
        /**********************************************

        IO 口模擬232通訊程序

        使用兩種方式的C程序 占用定時器0

        **********************************************/

        #define MODE_QUICK

        #define F_TM F0

        #define TIMER0_ENABLE TL0=TH0; TR0=1;
        #define TIMER0_DISABLE TR0=0;

        sbit ACC0= ACC^0;
        sbit ACC1= ACC^1;
        sbit ACC2= ACC^2;
        sbit ACC3= ACC^3;
        sbit ACC4= ACC^4;
        sbit ACC5= ACC^5;
        sbit ACC6= ACC^6;
        sbit ACC7= ACC^7;

        void IntTimer0() interrupt 1
        {
        F_TM=1;
        }
        //發送一個字符
        void PSendChar(unsigned char inch)
        {
        #ifdef MODE_QUICK
        ACC=inch;

        F_TM=0;
        BT_SND=0; //start bit
        TIMER0_ENABLE; //啟動
        while(!F_TM);

        BT_SND=ACC0; //先送出低位
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC1;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC2;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC3;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC4;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC5;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC6;
        F_TM=0;
        while(!F_TM);

        BT_SND=ACC7;
        F_TM=0;
        while(!F_TM);

        BT_SND=1;
        F_TM=0;
        while(!F_TM);


        TIMER0_DISABLE; //停止timer
        #else
        unsigned char ii;

        ii=0;

        F_TM=0;
        BT_SND=0; //start bit
        TIMER0_ENABLE; //啟動
        while(!F_TM);

        while(ii<8)
        {
        if(inch&1)
        {
        BT_SND=1;
        }
        else
        {
        BT_SND=0;
        }
        F_TM=0;
        while(!F_TM);
        ii++;
        inch>>=1;
        }
        BT_SND=1;
        F_TM=0;
        while(!F_TM);

        #endif
        TIMER0_DISABLE; //停止timer
        }
        //接收一個字符
        unsigned char PGetChar()
        {
        #ifdef MODE_QUICK

        TIMER0_ENABLE;
        F_TM=0;
        while(!F_TM); //等過起始位
        ACC0=BT_REC;

        TL0=TH0;

        F_TM=0;
        while(!F_TM);
        ACC1=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC2=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC3=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC4=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC5=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC6=BT_REC;

        F_TM=0;
        while(!F_TM);
        ACC7=BT_REC;

        F_TM=0;

        while(!F_TM)
        {
        if(BT_REC)
        {
        break;
        }
        }
        TIMER0_DISABLE; //停止timer
        return ACC;
        #else
        unsigned char rch,ii;
        TIMER0_ENABLE;
        F_TM=0;
        ii=0;
        rch=0;
        while(!F_TM); //等過起始位

        while(ii<8)
        {
        rch>>=1;
        if(BT_REC)
        {
        rch|=0x80;
        }
        ii++;
        F_TM=0;
        while(!F_TM);

        }
        F_TM=0;
        while(!F_TM)
        {
        if(BT_REC)
        {
        break;
        }

        }
        TIMER0_DISABLE; //停止timer
        return rch;

        #endif

        }
        //檢查是不是有起始位
        bit StartBitOn()
        {
        return (BT_REC==0);

        }
        void main()
        {
        unsigned char gch;

        TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位
        自動重裝) */
        PCON=00;

        TR0=0; //在發送或接收才開始使用
        TF0=0;
        TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 執行的
        timer是
        //
        104.167*11.0592/12= 96
        TL0=TH0;
        ET0=1;
        EA=1;

        PSendChar(0x55);
        PSendChar(0xaa);
        PSendChar(0x00);
        PSendChar(0xff);

        while(1)
        {
        if(StartBitOn())
        {
        gch=PGetChar();
        PSendChar(gch);
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丹阳市| 郧西县| 绿春县| 海伦市| 高碑店市| 梁河县| 河间市| 连平县| 岳西县| 上林县| 合山市| 靖远县| 明溪县| 雷州市| 谢通门县| 嘉义县| 玉树县| 津南区| 搜索| 融水| 威信县| 桐梓县| 烟台市| 徐水县| 武强县| 台南县| 廉江市| 滦平县| 西安市| 沂水县| 武强县| 中牟县| 外汇| 新沂市| 武宣县| 弥渡县| 岚皋县| 二连浩特市| 林芝县| 香格里拉县| 桃源县|