新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC16F877A與PC機(jī)串行通信C語(yǔ)言源程序

        PIC16F877A與PC機(jī)串行通信C語(yǔ)言源程序

        作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏
        //*******串口通信程序*********
        //*******定義變量*************
        #include
        #define unchar unsigned char
        #define uint unsigned int
        unchar RC_label;//標(biāo)志位起始位為1結(jié)束位為0
        unchar caiji_label;//采集幀格式標(biāo)志位正確為1錯(cuò)誤為0
        unchar data RC[100];//存儲(chǔ)接收到的數(shù)據(jù)
        unchar data TX1[100];//存儲(chǔ)自身參數(shù)
        unchardataTX2[100];//存儲(chǔ)出錯(cuò)指示ERROR
        int RC_buff;//
        int i=0,j=0,k=0;//
        //*****變量定義完畢************
        //*****子程序區(qū)****************
        //*****串口初始化程序開(kāi)始**********
        void initRS232()
        {
        //設(shè)置TXSTA
        CSRC=0;//
        TX9=0;//8位數(shù)據(jù)發(fā)送
        TXEN=1;//發(fā)送使能
        SYNC=0;//選擇異步模式
        BRGH=1;//高速
        TRMT=1;//發(fā)送寄存器空
        TX9D=0;//
        //設(shè)置RCSTA
        SPEN=1;//允許串口工作
        RX9=0;//接收8位數(shù)據(jù)
        SREN=1;//
        CREN=1;//使能連續(xù)接收
        ADDEN=0;//
        FERR=0;//
        OERR=0;//無(wú)超速錯(cuò)誤
        RX9D=0;//
        TRISC=0X80;//設(shè)置C口
        SPBRG=0X19;//設(shè)置波特率為9600
        }
        //*******初始化232完畢********
        //*******延時(shí)子程序開(kāi)始*********
        void delay(int i)
        {for(i;--i;) continue;}
        //******延時(shí)子程序完畢*******
        //******中斷初始化子程序開(kāi)始******
        void int_interrupt(void)
        {
        GTE=1;//
        PEIE=1;//
        RCIE=1;//
        }
        //*******中斷初始化子程序完畢********
        //********中斷服務(wù)子程序開(kāi)始*********
        void interrupt receive(void)
        {
        if(OERR==1)//判斷有無(wú)超速錯(cuò)誤
        {
        CREN=0;
        CREN=1;
        }
        if(RCIF==1)
        {
        RC_buff=RCREG;
        if(RC_buff==0x2a)//判斷是否是起始標(biāo)志*
        {
        RC_label=1;
        }
        if(RC_buff==0x23)//判斷是否是結(jié)束標(biāo)志#
        {
        RC_label=0;
        }
        }

        if(RC_label==1)
        RC[k++]=RC_buff;//將接收到的數(shù)據(jù)存儲(chǔ)在數(shù)組中
        else if(RC_label==0)
        k=0;
        if(RC[1]==0XFE&&RC[2]==0XC0&&RC[3]==0X34&&RC[5]==0X12)//判斷數(shù)據(jù)采集幀格式是否正確
        caiji_label=1;
        else caiji_label=0;
        //********中斷服務(wù)子程序完畢**********
        //********參數(shù)發(fā)送子程序開(kāi)始**********
        void TX_serve(void)
        {
        TX1[]={0X2A,0XFD,0X26,0X30,0X31,0X32};//自身參數(shù)存儲(chǔ)在TX1中
        TX2[]={0X56,0X52,0X52,0X4F,0X52};//出錯(cuò)指示存儲(chǔ)在TX2中
        if(caiji_label==1)//如果數(shù)據(jù)采集幀格式正確則發(fā)送自身參數(shù)幀
        {
        for(j=0;j<6;j++)
        {
        TXREG=TX1[j];
        delay(20);
        }
        }
        if(caiji_label==0) //如果數(shù)據(jù)采集幀格式錯(cuò)誤則發(fā)送出錯(cuò)指示
        {
        for(j=0;j<5;j++)
        {
        TXREG=TX2[j];
        delay(20);
        }
        }
        }
        //********參數(shù)發(fā)送子程序完畢**********
        //********主程序開(kāi)始**************
        void main()
        {
        int_interrupt();
        initRS232();
        TX_serve();
        end
        }


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 土默特右旗| 湛江市| 漯河市| 盐山县| 南丹县| 莱芜市| 榆中县| 汉寿县| 临泽县| 达拉特旗| 巨野县| 安平县| 和林格尔县| 汉川市| 应城市| 邛崃市| 封开县| 东莞市| 凤阳县| 吉安市| 南和县| 湾仔区| 乐至县| 平南县| 洪洞县| 贵德县| 南丰县| 余姚市| 萨迦县| 六安市| 镇宁| 运城市| 宁远县| 留坝县| 黄浦区| 鄯善县| 阳曲县| 农安县| 巴林左旗| 尤溪县| 永川市|