色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于51單片機(jī)的MODBUS通信C語(yǔ)言程序(從機(jī))

          基于51單片機(jī)的MODBUS通信C語(yǔ)言程序(從機(jī))

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          #include "reg52.h"
          typedef unsigned char uint8;
          typedef unsigned int uint16;
          typedef unsigned long uint32;
          #define TIMER_HIGHT 0xf8
          #define TIMER_LOW 0xcd
          sbit bRunLED =P3^4; //運(yùn)行指示燈
          sbit bWatchDog=P1^7; //看門狗復(fù)位
          sbit b485Send= P1^3; //75LBC184 發(fā)送接收控制
          uint32 dwTickCount,dwIntTick; //時(shí)鐘
          uint8 idata sendBuf[16],receBuf[16]; //發(fā)送接收緩沖區(qū)
          uint8 idata checkoutError; // ==2 偶校驗(yàn)錯(cuò)
          uint8 idata receTimeOut; //接收超時(shí)
          uint8 idata c10ms; //10ms 計(jì)時(shí)
          bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定時(shí)標(biāo)志位
          // 串行中斷程序
          void commIntProc() interrupt 4
          {
          if(TI)
          {
          TI = 0;
          if(sendPosi < sendCount)
          {
          sendPosi++;
          ACC = sendBuf[sendPosi];
          TB8 = P; //加上校驗(yàn)位
          SBUF = sendBuf[sendPosi];
          }
          else
          {
          b485Send = 0; //發(fā)送完后將485置于接收狀態(tài)
          receCount = 0; //清接收地址偏移寄存器
          checkoutError = 0;
          }
          }
          else if(RI)
          {
          RI = 0;
          receTimeOut = 10; //通訊超時(shí)值
          receBuf[receCount] = SBUF;
          ACC = receBuf[receCount];
          if(P != RB8)
          checkoutError = 2; //偶校驗(yàn)出錯(cuò)
          receCount++; //接收地址偏移寄存器加1
          receCount &= 0x0f; //最多一次只能接收16個(gè)字節(jié)
          }
          } // void CommIntProc()
          //定時(shí)器0 1ms 中斷
          void timer0IntProc() interrupt 1
          {
          TL0 = TIMER_LOW;
          TH0 = TIMER_HIGHT;
          dwIntTick++;
          bt1ms = 1;
          c10ms++;
          if(c10ms >= 10)
          {
          c10ms = 0; //10ms計(jì)時(shí)器清零
          bt10ms = 1;
          }
          } // void Timer0IntProc()
          //外部中斷0
          void intEx0Proc(void) interrupt 0
          {
          }
          //計(jì)數(shù)器1中斷
          void counter1IntProc(void) interrupt 3 using 1
          {
          }
          //定時(shí)處理
          void timeProc(void)
          {
          static uint8 c200ms;
          bWatchDog = ~ bWatchDog; //看門狗取反
          b1ms = 0;
          b10ms = 0;
          b100ms = 0;
          ET0 = 0;
          dwTickCount = dwIntTick;
          ET0 = 1;
          if(bt1ms)
          {
          bt1ms = 0;
          b1ms = 1;
          if(receTimeOut>0)
          {
          receTimeOut--;
          if(receTimeOut==0 && receCount>0) //判斷通訊接收是否超時(shí)
          {
          b485Send = 0; //將485置為接收狀態(tài)
          receCount = 0; //將接收地址偏移寄存器清零
          checkoutError = 0;
          }
          }
          }
          if(bt100ms)
          {
          bt100ms = 0;
          b100ms = 1;
          }
          if(bt10ms) //判斷中斷10ms標(biāo)志位是否1
          {
          bt10ms = 0; //清中斷10ms標(biāo)志位
          b10ms = 1;
          c200ms++; //200ms計(jì)時(shí)器加1
          if(c200ms >= 20) //判斷是否計(jì)時(shí)到200ms
          {
          c200ms = 0; //清200ms計(jì)時(shí)器
          bRunLED = ~bRunLED; //取反運(yùn)行指示燈
          }
          }
          } // void TimerProc(void)
          //初始化串口
          void initUart(void)
          {
          //T2 用于波特率 9600
          T2CON = 0x30;
          RCAP2H = 0xff;
          RCAP2L = 0xb8;
          TR2 = 1;
          //偶校驗(yàn)
          SCON = 0xd0;
          PCON = 0;
          ES = 1;
          }//void initUart(void)
          //初始化中斷
          void initInt(void)
          {
          TMOD = 0x51;
          TH0 = TIMER_HIGHT;
          TL0 = TIMER_LOW;
          TR0 = 1;
          ET0 = 1;
          TH1 = 0; //9600
          TL1 = 0;
          TR1 = 0; //定時(shí)器1用于計(jì)數(shù)定時(shí)器2用于波特
          ET1 = 1;
          IT0 = 1;
          IT1 = 1;
          EX0 = 0;
          PX0 = 1;
          EX1 = 0;
          initUart();
          EA = 1;
          } // void initInt(void)
          //初始化
          void initProg(void)
          {
          initInt();
          b485Send = 0;
          }
          void main(void)
          {
          initProg();
          while(1)
          {
          timeProc();
          checkComm0Modbus();
          }
          }



          評(píng)論


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

          關(guān)閉