新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機IO口模擬rs232串口通訊C51程序

        單片機IO口模擬rs232串口通訊C51程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        此程序已經應用在本人的一個項目中非常穩定,編寫過程中參考了51hei網站里面的http://www.51hei.com/mcu/1541.html 這篇文章.部分子程序節選于此.

        #include "reg52.h"
        #include "intrins.h"
        #include "math.h"
        #include "stdio.h"
        sbit BT_SND =P1^5;
        sbit BT_REC =P1^6;
        sbit LED =P1^7;
        bit LED_flage=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;

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

        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);
        }
        //定時器1初始化
        void Time1_Init(void)
        {
        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;
        }
        //發送字符串
        void Send_Char(char *byte)
        {
        int i=0;
        for(i=0;*(byte+i)!=

        主站蜘蛛池模板: 邛崃市| 睢宁县| 花莲县| 澳门| 泰宁县| 长春市| 辰溪县| 白银市| 彭水| 泗水县| 昭平县| 乌拉特前旗| 霍林郭勒市| 平顶山市| 石渠县| 祥云县| 左贡县| 西安市| 蒙自县| 纳雍县| 建始县| 云浮市| 定远县| 浦江县| 彰化市| 江油市| 沈阳市| 乐都县| 甘南县| 盘山县| 麻江县| 柳河县| 绵阳市| 瓦房店市| 桑日县| 三江| 大兴区| 稷山县| 武穴市| 郓城县| 宜都市|