新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的模擬串口代碼

        51單片機的模擬串口代碼

        作者: 時間:2016-11-19 來源:網絡 收藏
        由于8位單片機一般只有一個串行接口,往往不夠用,只能自己寫一個模擬串口的程序,下面這個程序是自己早先寫的,放上來,對別人也許有點用,注意接收端同時接到P3.2(INT0)

        #include
        #define DOUBLE_BAUDRATE

        #define DATA_CORRUPT 0x80
        #define BUFFER_OVERFLOW 0x81

        #define F_OSC 11059200

        #define BAUDRATE 9600 //115200//57600//19200//9600

        #define BAUDRATE_CONST (256 - F_OSC/12/BAUDRATE)

        #define HALF_BAUDRATE (256 - F_OSC/12/BAUDRATE/2)

        #define DELAY_TIME 50;//ms
        #define DELAY_CONST (DELAY_TIME/1000 * F_OSC)/12

        #define DISABLE_RECEIVE() EX0 = 0;
        #define ENABLE_RECEIVE() EX0 = 1;

        #define RXD P1_2
        #define TXD P1_3

        char idata buffer[32] ;

        unsigned char bdata DataBuf;
        sbit DataBuf_0 = DataBuf ^ 0;
        sbit DataBuf_1 = DataBuf ^ 1;
        sbit DataBuf_2 = DataBuf ^ 2;
        sbit DataBuf_3 = DataBuf ^ 3;
        sbit DataBuf_4 = DataBuf ^ 4;
        sbit DataBuf_5 = DataBuf ^ 5;
        sbit DataBuf_6 = DataBuf ^ 6;
        sbit DataBuf_7 = DataBuf ^ 7;

        void send(char len,char * buf)
        {
        char i,j;
        i=j=0;
        DISABLE_RECEIVE();

        TMOD |= 0x02;//MODE 3
        TL0 = BAUDRATE_CONST;//0x40;
        TH0 = BAUDRATE_CONST;//0x40;

        while(i {
        DataBuf = buf[i];
        TL0 = BAUDRATE_CONST;
        TH0 = BAUDRATE_CONST;
        TR0 = 1;

        TXD = 0;//send start bit
        //nop
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_0;//send bit 0
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_1;//send bit 1
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_2;//send bit 2
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_3;//send bit 3
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_4;//send bit 4
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_5;//send bit 5
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_6;//send bit 6
        while(!TF0);
        TF0 = 0;

        TXD = DataBuf_7;//send bit 7
        while(!TF0);
        TF0 = 0;

        TXD = 1;//send end bit 8
        while(!TF0);
        TF0 = 0;

        TR0 =0;//stop timer0
        i++;//next byte
        }

        ENABLE_RECEIVE();
        }

        unsigned char bdata DataBuf;
        unsigned char LastError;
        char recv_len;
        void exint0_receive (void) interrupt 0 using 2
        {
        DISABLE_RECEIVE();
        TMOD |= 0x02;
        TL0 = HALF_BAUDRATE;
        TH0 = BAUDRATE_CONST;

        TR0 = 1; //start timer0

        while(!TF0); //delay 1/2 bit time to go to middle of start bit
        TF0 = 0;
        if(RXD == 1)
        {
        ENABLE_RECEIVE();
        return;
        }
        while(!TF0);//receive data bit 0
        TF0 = 0;
        DataBuf_0 = RXD;

        while(!TF0);//receive data bit 1
        TF0 = 0;
        DataBuf_1 = RXD;

        while(!TF0);//receive data bit 2
        TF0 = 0;
        DataBuf_2 = RXD;

        while(!TF0);//receive data bit 3
        TF0 = 0;
        DataBuf_3 = RXD;

        while(!TF0);//receive data bit 4
        TF0 = 0;
        DataBuf_4 = RXD;

        while(!TF0);//receive data bit 5
        TF0 = 0;
        DataBuf_5 = RXD;

        while(!TF0);//receive data bit 6
        TF0 = 0;
        DataBuf_6 = RXD;

        while(!TF0);//receive data bit 7
        TF0 = 0;
        DataBuf_7 = RXD;

        while(!TF0);//receive end bit
        TF0 = 0;

        if(RXD != 1)
        {
        LastError = 1;
        ENABLE_RECEIVE();
        return ;
        }
        TR0 = 0;//stop timer

        if(recv_len >=32)
        {
        LastError = BUFFER_OVERFLOW;
        ENABLE_RECEIVE();
        return;

        }
        buffer[recv_len++] = DataBuf;

        ENABLE_RECEIVE();
        }

        void InitSimuSerial()
        {
        TMOD |= 0x02;
        TL0 = HALF_BAUDRATE; //wait at
        TH0 = BAUDRATE_CONST;

        IT0 = 1;
        EX0 = 1;
        }

        void main()
        {
        P0 = 0xff;
        P1 = 0xff;
        P2 = 0xff;
        P3 = 0xff;
        InitSimuSerial();
        EA = 1;
        while(1)
        {
        if(recv_len >0)
        {
        send(recv_len,buffer);
        recv_len = 0;
        }
        }
        }


        關鍵詞: 51單片機模擬串

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陕西省| 新晃| 鹿邑县| 夏津县| 朝阳县| 红安县| 恭城| 石嘴山市| 青川县| 隆昌县| 崇州市| 新乡市| 来凤县| 赤壁市| 南通市| 莒南县| 乌拉特中旗| 兖州市| 新兴县| 浦东新区| 三门县| 肃南| 枣阳市| 阿合奇县| 射洪县| 海淀区| 汉阴县| 淮南市| 万山特区| 苍南县| 独山县| 山东| 克山县| 资源县| 嘉黎县| 柞水县| 罗城| 中西区| 华池县| 绵竹市| 英山县|