新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)模擬串口C語(yǔ)言程序代碼

        51單片機(jī)模擬串口C語(yǔ)言程序代碼

        作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

        void soft_rs232_interrupt( void )
        {
        if (rs_f_RI_enable == 1)
        {
        if (rs_shift_count == 0) //移位計(jì)數(shù)器==0, 表示檢測(cè)到起始位的起點(diǎn)
        {
        if ( rs_RXD == 1 )
        {
        soft_receive_enable (); //起始位錯(cuò), 從新開始
        }
        else
        {
        //下次中斷在數(shù)據(jù)位或停止位中的某時(shí)刻發(fā)生
        rs_timerL += rs_FULL_BIT_L + 0x10;
        rs_timerH = rs_FULL_BIT_H;
        rs_shift_count++;
        rs_BUF = 0; //清移位緩沖變量
        }
        }
        else
        {
        rs_timerL += rs_FULL_BIT_L; //下次中斷在數(shù)據(jù)位或停止位中發(fā)生
        rs_timerH = rs_FULL_BIT_H;
        rs_shift_count++; //2--9:數(shù)據(jù)位 10:停止位
        if ( rs_shift_count == 9)
        {
        rs_BUF = rs_BUF >> 1; //接收第8位
        rs_BUF_bit7 = rs_RXD;
        // if( ReceivePoint rs_RECEIVE_MAX)
        // { //保存收到的字節(jié)
        rs232buffer[ReceivePoint++] = rs_BUF;
        // }
        // else
        // {
        // rs_f_RI_enable = 0; //緩沖區(qū)滿, 禁止接收
        // }
        }
        else
        {
        if (rs_shift_count 9 ) //收到的是數(shù)據(jù)位 1 -- 7
        {
        rs_BUF = rs_BUF >> 1;
        rs_BUF_bit7 = rs_RXD;
        }
        else
        { //收到停止位,繼續(xù)檢測(cè) PC 機(jī)發(fā)出的下一個(gè)起始位
        soft_receive_init();
        }
        }
        }
        TCON_TFx = 0; //清定時(shí)器中斷標(biāo)志
        }
        else
        {
        if (rs_f_TI_enable == 1)
        {
        rs_timerL += rs_FULL_BIT_L;//下次中斷在數(shù)據(jù)位的末尾時(shí)刻
        rs_timerH = rs_FULL_BIT_H;
        rs_shift_count--; //0:停止位末尾時(shí)刻到
        //1:發(fā)送停止位
        //2--9:發(fā)送數(shù)據(jù)位
        if (rs_shift_count > 9) //錯(cuò)誤狀態(tài)
        {
        rs_shift_count = 9;
        rs_BUF = 0xFF;
        }
        if (rs_shift_count > 1) //2--9:發(fā)送數(shù)據(jù)位
        {
        ACC = rs_BUF;
        ACC = ACC >> 1;
        rs_TXD = CY;
        rs_BUF = ACC;
        }
        else
        {
        if (rs_shift_count == 0) //0:停止位末尾時(shí)刻到
        {
        rs_TXD = 1;
        rs_f_TI = 1; //已發(fā)送完畢一個(gè)字節(jié)
        }
        else
        {
        rs_TXD = 1; //1:發(fā)送停止位
        }
        }
        }
        }
        }
        //由收轉(zhuǎn)到發(fā)時(shí),要先調(diào)用 soft_send_enable ()
        void rs_send_byte(INT8U SendByte) //發(fā)送一個(gè)字節(jié)
        {
        while ( rs_f_TI == 0); //等待發(fā)送完畢前一個(gè)字節(jié)
        rs_TXD = 1;
        rs_timerL = rs_START_BIT_L; //下次中斷在起始位的末尾時(shí)刻
        rs_timerH = rs_START_BIT_H;
        rs_BUF = SendByte;
        rs_shift_count = 10;
        rs_TXD = 0; //發(fā)送起始位
        rs_f_TI = 0; //清已發(fā)送完畢一個(gè)字節(jié)的標(biāo)志
        }
        void initiate_MCU (void) //系統(tǒng)初始化
        {
        soft_rs232_init(); //串口初始化
        EA = 1; //開中斷
        }
        void delay (INT16U useconds)
        {
        for(;useconds>0;useconds--);
        }
        void send(uint8_t *temp,char j)
        {
        char i=0;
        for (i=0;i=j-1;i++) //按發(fā)送數(shù)據(jù)的長(zhǎng)度來(lái)發(fā)送數(shù)據(jù)
        {
        ACC=*(temp+i);
        SBUF=ACC; //發(fā)送數(shù)據(jù)
        while(TI==0); //發(fā)送數(shù)據(jù)完畢時(shí),TI會(huì)自動(dòng)置高
        TI=0; //發(fā)送數(shù)據(jù)完畢,將TI清零,準(zhǔn)備下一次發(fā)送
        }
        }
        GsmSend(char * CmdTmp)
        {
        char i;
        for(i=0;i
        send(&CmdTmp[i],1);
        }
        void initial()
        {
        PCON= PCON & 0X7F;
        TR1=0;
        TMOD=TMOD | 0x20; //定時(shí)器1為自動(dòng)裝入方式 模式2、自動(dòng)再裝入8位計(jì)數(shù)器
        ET1 = 0;
        SCON=0x40; //串行口工作方式1:10位URAT,數(shù)據(jù)傳輸率可變
        TH1=0xFD;
        TL1=0xFD;
        //設(shè)置數(shù)據(jù)格式
        //低位在前
        SM0=0;
        SM1=1;
        RI=0;
        TI=0;
        REN=1;
        ES=1;
        TR1=1;
        }
        void main (void)
        {
        //首先發(fā)送 128 個(gè)字節(jié) 00H--7FH, 然后等待 PC 機(jī)發(fā)送的數(shù)據(jù)。當(dāng)收到 128
        //個(gè)字節(jié)后,立刻將收到的 128 個(gè)數(shù)據(jù)回發(fā)送給 PC 機(jī),然后繼續(xù)等待下一個(gè)
        //數(shù)據(jù)塊。
        word i;
        initial();
        // initiate_MCU(); //系統(tǒng)初始化:定時(shí)器模式1、
        while(1)
        {
        rs232buffer[0]= 主站蜘蛛池模板: 卢龙县| 株洲县| 利津县| 色达县| 茌平县| 城市| 东乌珠穆沁旗| 德安县| 虞城县| 独山县| 米易县| 铜川市| 伊宁市| 乌拉特前旗| 麟游县| 北流市| 郧西县| 辽宁省| 谢通门县| 子洲县| 常宁市| 乐平市| 古浪县| 资阳市| 杭州市| 阿克苏市| 平原县| 达拉特旗| 射洪县| 密山市| 大邑县| 商都县| 南丰县| 黔南| 丹东市| 兴化市| 湘潭市| 金川县| 德阳市| 东兴市| 通城县|