<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于51單片機(jī)的RS-485的多機(jī)通信

          基于51單片機(jī)的RS-485的多機(jī)通信

          作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          //-----------------------函數(shù)聲明,變量定義---------------------

          #include

          本文引用地址:http://www.ex-cimer.com/article/201611/322565.htm

          sbit RE_DE=P1^0;

          #define COUNT 10 // 定義接收緩沖區(qū)大小

          #define Slaver_NUM 10

          unsignedcharbdata flag;//在可位尋址去定義一個(gè)標(biāo)志變量

          sbit time_over_flag =flag^0;//接收超時(shí)標(biāo)志

          unsignedcharbuffer[COUNT];//定義緩沖區(qū)

          unsignedcharpoint;//定義緩沖區(qū)位置指示

          unsignedcharSlave_AD[Slaver_NUM];//定義有效地址存放區(qū)

          unsignedcharADD_num;//有效地址個(gè)數(shù)

          unsignedcharidata count_10ms;//用于表示有多少次10ms中斷

          unsignedcharidata send_data[7]={

          0x31,0x32,0x33,0x34,0x35,0x36,0x37};//與定義發(fā)送數(shù)據(jù),共7位

          voidUART_init();//串口初始化函數(shù)

          voidCOM_send(void);//串口接收函數(shù)

          unsignedcharCLU_checkdata(void);//計(jì)算校驗(yàn)位函數(shù)

          //---------------------------------------------------------------

          // 函數(shù)名稱: UART_init()串口初始化函數(shù)

          // 函數(shù)功能: 在系統(tǒng)時(shí)鐘為11.059MHZ時(shí),設(shè)定串口波特率為9600bit/s

          // 串口接收中斷允許,發(fā)送中斷禁止,設(shè)定定時(shí)器中斷允許

          //---------------------------------------------------------------

          voidUART_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工作模式

          //---------------------------------------------------------------

          voidtimer0_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)初始化

          //---------------------------------------------------------------

          voidsystem_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 4using3

          {

          unsignedcharRECEIVR_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ù)等待起始位

          }

          elseif(point>0&&point<10)//判斷是否接收夠十位數(shù)據(jù)

          buffer[point++]=RECEIVR_buffer;//不夠,把接收到的數(shù)據(jù)放入接收緩存區(qū)

          elseif(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ù)等待起始位

          }

          elsepoint=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 1using2

          {

          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ā)送出去

          //---------------------------------------------------------------

          voidCOM_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ù)

          //---------------------------------------------------------------

          voidwrite_buffer(unsignedcharslaver_add)

          {

          unsignedchari;

          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ù),完成通信過程

          //---------------------------------------------------------------

          voidmain(void)

          {

          unsignedchari=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)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();