在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > RS-485的多機(jī)通信程序(主機(jī)端)

            RS-485的多機(jī)通信程序(主機(jī)端)

            作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
            //-----------------------函數(shù)聲明,變量定義---------------------
            #include
            sbit RE_DE=P1^0;
            #define COUNT 10 // 定義接收緩沖區(qū)大小
            #define Slaver_NUM 10
            unsigned char bdata flag; //在可位尋址去定義一個(gè)標(biāo)志變量
            sbittime_over_flag=flag^0; //接收超時(shí)標(biāo)志
            unsigned char buffer[COUNT]; //定義緩沖區(qū)
            unsigned char point; //定義緩沖區(qū)位置指示
            unsigned char Slave_AD[Slaver_NUM]; //定義有效地址存放區(qū)
            unsigned char ADD_num; //有效地址個(gè)數(shù)
            unsigned char idata count_10ms; //用于表示有多少次10ms中斷
            unsigned char idata send_data[7]={
            0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //與定義發(fā)送數(shù)據(jù),共7位
            void UART_init(); //串口初始化函數(shù)
            void COM_send(void); //串口接收函數(shù)
            unsigned char CLU_checkdata(void); //計(jì)算校驗(yàn)位函數(shù)
            //---------------------------------------------------------------
            // 函數(shù)名稱: UART_init()串口初始化函數(shù)
            // 函數(shù)功能: 在系統(tǒng)時(shí)鐘為11.059MHZ時(shí),設(shè)定串口波特率為9600bit/s
            // 串口接收中斷允許,發(fā)送中斷禁止,設(shè)定定時(shí)器中斷允許
            //---------------------------------------------------------------
            void UART_init()
            {
            //初始化串行設(shè)置
            SCON =0x58; //選擇串口工作方式為1,打開接收允許,TB8=1
            TMOD =0x21; //定時(shí)器1工作在方式2,定時(shí)器0工作在方式1
            TR1 =1; //啟動(dòng)定時(shí)器T1
            ES=1; //允許串行口中斷
            PS=1; //設(shè)計(jì)串行口中斷優(yōu)先級(jí)
            //初始化定時(shí)器1
            TH1 =0xfd; //實(shí)現(xiàn)波特率9600(系統(tǒng)時(shí)鐘11.0592MHZ)
            ET1 =0; //定時(shí)器1中斷禁止
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: timer0_init()初始化定時(shí)器0
            // 函數(shù)功能: 設(shè)置timer0工作模式
            //---------------------------------------------------------------
            void timer0_init()
            {
            time_over_flag=0;
            count_10ms=0;
            ADD_num=0;
            TL0=0x0F0; //T0用于產(chǎn)生10ms的中斷
            TH0=0x0D8; //50次T0中斷產(chǎn)生1次超時(shí)溢出
            ET0=1; //允許定時(shí)器0中斷
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: system_init()系統(tǒng)初始化
            // 函數(shù)功能: 調(diào)用串口、定時(shí)器初始化函數(shù),完成系統(tǒng)初始化
            //---------------------------------------------------------------
            void system_init(void)
            {
            //系統(tǒng)總設(shè)置
            UART_init();
            timer0_init();
            EA =1; //單片機(jī)中斷允許
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: com_interrup()串口接收中斷處理函數(shù)
            //函數(shù)功能: 接收包括起始位"S"在內(nèi)的十位數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)
            //---------------------------------------------------------------
            com_interrupt(void) interrupt 4 using 3
            {
            unsigned char RECEIVR_buffer;
            if(RI) //處理接收中斷
            {RI=0; //清除中斷標(biāo)志位
            RECEIVR_buffer=SBUF; //接收串口數(shù)據(jù)
            if(point==0) //如果還沒有接收到起始位
            {
            if(RECEIVR_buffer==0xFE) //判斷是否起始標(biāo)志位
            {
            buffer[point++]=RECEIVR_buffer;//把接收到的數(shù)據(jù)放入接收緩存區(qū)
            }
            else
            point=0; //不是,繼續(xù)等待起始位
            }
            else if(point>0&&point<10) //判斷是否接收夠十位數(shù)據(jù)
            buffer[point++]=RECEIVR_buffer; //不夠,把接收到的數(shù)據(jù)放入接收緩存區(qū)
            else if(point==10)
            {
            if(RECEIVR_buffer==0xEF) //判斷結(jié)束標(biāo)志位是否正確
            {
            buffer[point]=RECEIVR_buffer; //把接收到的數(shù)據(jù)放入接收緩存區(qū)
            Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存儲(chǔ)器
            //表示該地址有有效設(shè)備
            }
            else
            point=0; //不是,繼續(xù)等待起始位
            }
            else point=0; //緩沖區(qū)已滿,清除緩存區(qū)內(nèi)數(shù)據(jù)重新接收
            }
            if(TI) //串口發(fā)送中斷
            {
            TI=0; //清除發(fā)送中斷
            }
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: timer0_interrup()
            // 函數(shù)功能:定時(shí)器T0中斷服務(wù)程序
            //函數(shù)說明:T0枚10ms中斷一次,連續(xù)中斷50次置time_over_flag=1;
            //---------------------------------------------------------------
            timer0_interrupt(void) interrupt 1 using 2
            {
            count_10ms++;
            if(count_10ms==50)
            {
            ET0=0; //關(guān)閉定時(shí)器T0中斷
            TR0=0; //停止定時(shí)器T0
            time_over_flag=1;//設(shè)置接收超時(shí)標(biāo)志
            count_10ms=0x00; //10ms計(jì)數(shù)器復(fù)位
            }
            else
            {
            TL0=0x0F0; //重裝定時(shí)器初始值
            TH0=0x0D8;
            }
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: COM_send()串口發(fā)送函數(shù)
            // 函數(shù)功能: 把數(shù)據(jù)緩沖區(qū)的十位數(shù)據(jù)發(fā)送出去
            //---------------------------------------------------------------
            void COM_send(void)
            {
            RE_DE=1; //設(shè)置MAX483進(jìn)入發(fā)送狀態(tài)
            for(point=0;point<=10,TI=1;point++) //連續(xù)發(fā)送十位數(shù)據(jù)
            //把緩存區(qū)的數(shù)據(jù)都發(fā)送到串口
            {
            SBUF=buffer[point];
            TI=0;
            }
            RE_DE=0; //設(shè)置MAX483進(jìn)入接收狀態(tài)
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: write_buffer()
            //函數(shù)功能: 寫發(fā)送緩沖區(qū)十位數(shù)據(jù)
            //---------------------------------------------------------------
            void write_buffer(unsigned char slaver_add)
            {
            unsigned char i;
            TB8=1; //打開多機(jī)通信方式
            buffer[0]=0xFE;
            buffer[1]=slaver_add;
            for(i=2;i<9;i++) //連續(xù)發(fā)送十位數(shù)據(jù)
            //把緩存區(qū)的數(shù)據(jù)都發(fā)送到串口
            {
            buffer[i]=send_data[i-2];
            }
            buffer[9]=0xEF;
            }
            //---------------------------------------------------------------
            // 函數(shù)名稱: 主函數(shù)
            // 函數(shù)功能: 調(diào)度個(gè)子函數(shù),完成通信過程
            //---------------------------------------------------------------
            void main(void)
            {
            unsigned char i=0;
            system_init(); //系統(tǒng)初始化
            do{ //查旬0到10好地址有沒有對(duì)應(yīng)設(shè)備
            write_buffer(i++); //寫查詢第i號(hào)設(shè)備的發(fā)送信息
            COM_send(); //調(diào)用發(fā)送函數(shù),完成發(fā)送
            timer0_init(); //完成一次查詢,重新初始定時(shí)器0,準(zhǔn)備下一次查詢
            }
            while(time_over_flag&&i<10);
            }


            評(píng)論


            相關(guān)推薦

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

            關(guān)閉