新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機與PC機通信示例

        單片機與PC機通信示例

        作者: 時間:2016-11-18 來源:網絡 收藏
        #include "STC89C51RC_RD_PLUS.h"

        #define SENDBUFSIZE 0x0f
        #define BR_19K20xfd
        #defineRMAX0x10//必須是2的整數次冪。21ic上看到的,好像是“劉前輩”的創意
        unsigned char xdata*cpSendBufPtr;
        unsigned charcFront;
        unsigned charcBack;
        unsigned charsendData;
        bitcTranFlag;
        unsigned charcTranData;
        bitcRecFlag;
        unsigned charcRecData;
        bitcJudge;
        unsigned chartemp;

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

        void HardWareInit();
        void Uart_Init(void);
        void Uart_Init(void);
        void COMM_Init(unsigned char cBaudRate, bit bSMOD); //初始化UART

        //sfr AUXR = 0x8E;
        //MODE COM4 19200,0,8,1;ASSIGN COM4 SOUT
        //波特率為19200Hz,將串口接收到的數據,重新轉發出去?
        //數據接收速度可能大于發送速度,增加緩沖區,優先保存接收的數據
        main()
        {
        sendData=0;
        cFront=0; //
        cBack=0;//
        cRecFlag=0; //還未接收到數據
        cTranFlag=1;//系統復位后,只要隊列非空,隨時可以發送數據
        RS0 = RS1 = 0;// 使用寄存器組0
        AUXR = 0x01; //禁止ALE信號輸出
        EA = 0;
        P1 = 0xFF;
        P2 = 0xFF;
        P3 = 0xFF;
        P4 = 0xFF;

        ES = 0;
        TR1 = 0;
        TMOD = TMOD & 0x0f | 0x20;
        TH1 = BR_19K2;
        TL1 = BR_19K2;////------------------------------------------------------------------------------------------
        PCON = 0x80; // 若SMOD=1, 波特率倍增

        SCON = 0x50;// 8位
        IP = 0x10;// 串口優先中斷
        ES = 1;

        // wifi模塊: 波特率19200/38400/57600/115200bps 數據位:8bits 校驗位:無 停止位:1bits 流控 :無
        EA = 1;
        TR1 = 1;
        //SBUF=0x12;
        while(1)
        {
        /*
        */// 14 15 16 17 18 19 20 21
        if(cRecFlag)
        {
        temp=((cFront+1)^cBack)&0x0f;

        if(temp!=0)//循環鏈表還沒有填滿,可以繼續添加數據
        {
        cFront=cFront+1;
        cFront=cFront&(RMAX-1);
        cpSendBufPtr[cFront]=cRecData;
        cRecFlag=0;
        }
        }
        if(cTranFlag)
        {
        temp=(cBack^cFront)&0x0f;//發送了一個新的數,這一個地方是cBack而不是cBack+1

        if(temp!=0)//循環鏈表非空時可以發送數據
        {

        cBack=cBack+1;
        SBUF=cpSendBufPtr[cBack];
        cpSendBufPtr[cBack]=0x00;
        cBack=cBack&(RMAX-1);
        cTranFlag=0;
        }
        }
        }
        }

        /*******************************************************************************
        // 功能: UART完成數據收發產生中斷程序
        // 輸入參數: 無
        // 輸出參數: 無
        // 返回值: 無
        *******************************************************************************/
        void COMM_INT() interrupt 4 using 3
        {
        if(RI)//若正在處理接受的數據,則丟棄SBUF中的數據^cRecFlag
        {
        cRecData=SBUF;
        cRecFlag=1;
        RI=0;
        }
        if(TI)
        {
        cTranFlag=1;
        TI=0;
        }//發送完成,同時cTranData被賦新值*/
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 扶余县| 青川县| 锡林郭勒盟| 军事| 田林县| 顺平县| 涪陵区| 株洲县| 湖北省| 东乡族自治县| 武邑县| 慈利县| 横山县| 平泉县| 卢湾区| 桂阳县| 益阳市| 淮滨县| 花莲市| 黄石市| 淅川县| 滁州市| 二连浩特市| 三明市| 江城| 行唐县| 个旧市| 广饶县| 马边| 金沙县| 依安县| 保山市| 奉化市| 镇雄县| 辉南县| 郓城县| 甘泉县| 积石山| 永和县| 武义县| 东阳市|