51單片機(jī)modbus協(xié)議程序_第1頁(yè)
51單片機(jī)modbus協(xié)議程序_第2頁(yè)
51單片機(jī)modbus協(xié)議程序_第3頁(yè)
51單片機(jī)modbus協(xié)議程序_第4頁(yè)
51單片機(jī)modbus協(xié)議程序_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、51單片機(jī)modbus協(xié)議程序#include;#defineuint8unsignedchar#defineuint16unsignedint#defineFOSC16000000uint16BAUD=9600;uint16TEMP_Alert=1000;/字地址0-255(只取低8位)/位地址0-255(只取低8位)uint16TempRegister;/用于測(cè)試字址址16uint8localAddr=0x01;/單片機(jī)限制板的地址uint8sendCount;/發(fā)送字節(jié)個(gè)數(shù)uint8receCount;/接收到的字節(jié)個(gè)數(shù)/uint8sendPosi;/發(fā)送位置uint8xdatarece

2、Buf1;uint8xdatasendBuf1;voidcheckComm0Modbus(void);uint16getRegisterVal(uint16addr,uint16*tempData);voidswitch_BAUD(uint16value);波特率調(diào)整函數(shù)尸*;/函數(shù)功能:調(diào)整串口通信波特率/串口工作在工作方式1,即8位波特率可變模式/*voidswitch_BAUD(uint16value)switch(value)case0x0001:BAUD=9600;break;case0x0002:BAUD=14400;break;case0x0003:BAUD=19200;brea

3、k;TR1=0;/停止定時(shí)器1ES=0;/關(guān)閉串口中斷TH1=TL1=-(FOSC/12/32/BAUD);/設(shè)置波特率TR1=1;/開啟定時(shí)器1ES=1;/使能串口中斷尸*CRC校驗(yàn)碼生成函數(shù)*/函數(shù)功能:生成CR或驗(yàn)碼/本代碼中使用查表法,以提升運(yùn)算速度/*/uint16crc16(uint8*puchMsg,uint16usDataLen)(uint8uchCRCHi=0xFF;/*高CRC節(jié)初始化*/uint8uchCRCLo=0xFF;/*低CRC字節(jié)初始化*/uint16uIndex;/*CRC循環(huán)中的索引*/while(usDataLen-)/*傳輸消息緩沖區(qū)*/(uIndex=

4、uchCRCHiA*puchMsg+;/*計(jì)算CRC*/uchCRCHi=uchCRCLoaauchCRCHiuIndex;uchCRCLo=auchCRCLouIndex;)return(uchCRCLo;>8;sendBufi+4=tempData&0xff;)sendBuf0=localAddr;sendBuf1=3;/functioncode:03sendBuf2=byteCount;byteCount+=3;/加上前面的地址,功能碼,地址共3+byteCount個(gè)字節(jié)crcData=crc16(sendBuf,byteCount);sendBufbyteCount=cr

5、cData&0xff;/CRC代碼低位在前byteCount+;sendBufbyteCount=crcData>>8;/高位在后sendCount=byteCount+1;/例如byteCount=49,貝UsendBuf中實(shí)際上有49+1個(gè)元素待發(fā)Begin_send();/voidreadRegisters(void)*從機(jī)響應(yīng)主機(jī)問詢函數(shù),functioncode:16設(shè)置多個(gè)存放器值*/函數(shù)功能:叢機(jī)根據(jù)串口接收到的數(shù)據(jù)包receBuf口里面的內(nèi)容,根據(jù)被強(qiáng)制存放器/的起始地址,去設(shè)置相應(yīng)存放器的值,響應(yīng)數(shù)據(jù)包同詢問數(shù)據(jù)包/的內(nèi)容相同,經(jīng)過串口發(fā)送到主機(jī).戶*/詢

6、問數(shù)據(jù)包格式:/receBuf0receBuf1receBuf2receBuf3receBuf4receBuf5receBuf6receBuf7receBuf8.receBuf9receBuf10/詢問數(shù)據(jù)格式:receBuf口=從站地址,功能碼,起始地址高位,起始地址低位,存放器數(shù)高位,存放器數(shù)低位,字節(jié)計(jì)數(shù),數(shù)據(jù)高位,數(shù)據(jù)低位,校驗(yàn)碼低位,校驗(yàn)碼高位/響應(yīng)數(shù)據(jù)包內(nèi)容為除去詢問數(shù)據(jù)包中的字節(jié)計(jì)數(shù)和數(shù)據(jù)上下位的其他內(nèi)容voidpresetMultipleRegisters(void)(uint8addr;uint8tempAddr;uint8byteCount;uint8setCount;ui

7、nt16crcData;uint16tempData;uint8i;/addr=(receBuf2;>8;/sendBuf3=addr&0xff;/sendBuf4=setCount>>8;/位sendBuf5=setCount&0xff;/位sendBuf6=crcData&0xff;/CRC存放器地址高位存放器地址低位待設(shè)置存放器數(shù)量高待設(shè)置存放器數(shù)量低生成CR或驗(yàn)碼代碼低位在前crcData=crc16(sendBuf,6);/sendBuf7=crcData>>8;/高位在后sendCount=8;Begin_send();/voi

8、dpresetMultipleRegisters(void)尸*查詢uart接收的數(shù)據(jù)包內(nèi)容函數(shù)*/函數(shù)功能:叢機(jī)根據(jù)串口接收到的數(shù)據(jù)包receBuf1里面的內(nèi)容,即functioncode執(zhí)行/相應(yīng)的命令/*voidcheckComm0Modbus(void)uint16crcData;uint16tempData;if(receCount>4)switch(receBuf1)case3:/讀取保持存放器(一個(gè)或多個(gè))if(receCount>=8)/receCount應(yīng)該等于8從詢問數(shù)據(jù)包格式可知,/接收完成一組數(shù)據(jù)/應(yīng)該關(guān)閉接收中斷if(receBuf0=localAddr)

9、/核對(duì)地址crcData=crc16(receBuf,6);/核對(duì)校驗(yàn)碼if(crcData=receBuf7+(receBuf6;=tempData)if(receBuf0=localAddr)crcData=crc16(receBuf,tempData-2);if(crcData=(receBuftempData-2<<8)+receBuftempData-1)presetMultipleRegisters();)receCount=0;)break;)default:break;)/voidcheckComm0(void)1m*讀取存放器內(nèi)容函數(shù)*/函數(shù)功能:根據(jù)存放器地址讀

10、取相應(yīng)存放器內(nèi)容/*/取存放器值返回0表示成功uint16getRegisterVal(uint16addr,uint16*tempData)(uint16result=0;uint16tempAddr;tempAddr=addr&0xfff;switch(tempAddr&0xff)case0x00:*tempData=TempRegister;break;/讀取01開關(guān)A溫度case0x01:*tempData=TempRegister;break;/讀取01開關(guān)A溫度case0x02:*tempData=TempRegister;break;/讀取01開關(guān)A溫度case0

11、x03:*tempData=TempRegister;break;/讀取02開關(guān)A溫度case0x05:*tempData=TempRegister;break;/讀取02開關(guān)A溫度case0x06:*tempData=TempRegister;break;/讀取02開關(guān)A溫度case0x07:*tempData=TempRegister;break;/讀取02開關(guān)周邊溫度case0x08:*tempData=TempRegister;break;/讀取03開關(guān)A溫度case0x09:*tempData=TempRegister;break;/讀取03開關(guān)A溫度case0x0a:*tempDa

12、ta=TempRegister;break;/讀取03開關(guān)A溫度case0x0b:*tempData=TempRegister;break;/讀取03開關(guān)周邊溫度case0x0c:*tempData=TempRegister;break;/讀取04開關(guān)A溫度case0x0d:*tempData=TempRegister;break;/讀取04開關(guān)A溫度讀取04開關(guān)周邊溫度case0x10:*tempData=TempRegister;break;/讀取05開關(guān)A溫度case0x11:*tempData=TempRegister;break;/讀取05開關(guān)A溫度case0x12:*tempDat

13、a=TempRegister;break;/讀取05開關(guān)A溫度case0x13:*tempData=TempRegister;break;/讀取05開關(guān)周邊溫度case0x14:*tempData=TempRegister;break;/讀取06開關(guān)A溫度case0x15:*tempData=TempRegister;break;/讀取06開關(guān)A溫度case0x16:*tempData=TempRegister;break;/讀取06開關(guān)A溫度case0x17:*tempData=TempRegister;break;/讀取06開關(guān)周邊溫度case0x18:*tempData=TempRegi

14、ster;break;/讀取07開關(guān)A溫度讀取07開關(guān)A溫度case0x1b:*tempData=TempRegister;break;/讀取07開關(guān)周邊溫度case0x1c:*tempData=TempRegister;break;/讀取08開關(guān)A溫度case0x1d:*tempData=TempRegister;break;/讀取08開關(guān)A溫度case0x1e:*tempData=TempRegister;break;/讀取08開關(guān)A溫度case0x1f:*tempData=TempRegister;break;/讀取08開關(guān)周邊溫度case0x20:*tempData=TempRegis

15、ter;break;/讀取09開關(guān)A溫度case0x21:*tempData=TempRegister;break;/讀取09開關(guān)A溫度case0x22:*tempData=TempRegister;break;/讀取09開關(guān)A溫度case0x23:*tempData=TempRegister;break;/讀取09開關(guān)周邊溫度讀取10開關(guān)A溫度case0x26:*tempData=TempRegister;break;/讀取10開關(guān)A溫度case0x27:*tempData=TempRegister;break;/讀取10開關(guān)周邊溫度case0x28:*tempData=TempRegist

16、er;break;/讀取11開關(guān)A溫度case0x29:*tempData=TempRegister;break;/讀取11開關(guān)A溫度case0x2a:*tempData=TempRegister;break;/讀取11開關(guān)A溫度case0x2b:*tempData=TempRegister;break;/讀取11開關(guān)周邊溫度case0x2c:*tempData=TempRegister;break;/讀取12開關(guān)A溫度case0x2d:*tempData=TempRegister;break;/讀取12開關(guān)A溫度case0x2e:*tempData=TempRegister;break;/讀

17、取12開關(guān)A溫度case0x2f:*tempData=TempRegister;break;/讀取13開關(guān)A溫度case0x31:*tempData=TempRegister;break;/讀取13開關(guān)A溫度case0x32:*tempData=TempRegister;break;/讀取13開關(guān)A溫度case0x33:*tempData=TempRegister;break;/讀取13開關(guān)周邊溫度case0x34:*tempData=TempRegister;break;/讀取14開關(guān)A溫度case0x35:*tempData=TempRegister;break;/讀取14開關(guān)A溫度cas

18、e0x36:*tempData=TempRegister;break;/讀取14開關(guān)A溫度case0x37:*tempData=TempRegister;break;/讀取14開關(guān)周邊溫度case0x38:*tempData=TempRegister;break;/讀取15開關(guān)A溫度case0x39:*tempData=TempRegister;break;/讀取15開關(guān)A溫度讀取15開關(guān)周邊溫度case0x3c:*tempData=TempRegister;break;/讀取16開關(guān)A溫度case0x3d:*tempData=TempRegister;break;/讀取16開關(guān)A溫度case

19、0x3e:*tempData=TempRegister;break;/讀取16開關(guān)A溫度case0x3f:*tempData=TempRegister;break;/讀取16開關(guān)周邊溫度case0x40:*tempData=TempRegister;break;/讀取17開關(guān)A溫度case0x41:*tempData=TempRegister;break;/讀取17開關(guān)A溫度case0x42:*tempData=TempRegister;break;/讀取17開關(guān)A溫度case0x43:*tempData=TempRegister;break;/讀取17開關(guān)周邊溫度case0x44:*temp

20、Data=TempRegister;break;/讀取18開關(guān)A溫度讀取18開關(guān)A溫度case0x47:*tempData=TempRegister;break;/讀取18開關(guān)周邊溫度case0x48:*tempData=TempRegister;break;/讀取19開關(guān)A溫度case0x49:*tempData=TempRegister;break;/讀取19開關(guān)A溫度case0x4a:*tempData=TempRegister;break;/讀取19開關(guān)A溫度case0x4b:*tempData=TempRegister;break;/讀取19開關(guān)周邊溫度case0x4c:*tempD

21、ata=TempRegister;break;/讀取20開關(guān)A溫度case0x4d:*tempData=TempRegister;break;/讀取20開關(guān)A溫度case0x4e:*tempData=TempRegister;break;/讀取20開關(guān)A溫度case0x4f:*tempData=TempRegister;break;/讀取20開關(guān)周邊溫度讀取21開關(guān)A溫度case0x52:*tempData=TempRegister;break;/讀取21開關(guān)A溫度case0x53:*tempData=TempRegister;break;/讀取21開關(guān)周邊溫度case0x54:*tempDa

22、ta=TempRegister;break;/讀取22開關(guān)A溫度case0x55:*tempData=TempRegister;break;/讀取22開關(guān)A溫度case0x56:*tempData=TempRegister;break;/讀取22開關(guān)A溫度case0x57:*tempData=TempRegister;break;/讀取22開關(guān)周邊溫度case0x58:*tempData=TempRegister;break;/讀取23開關(guān)A溫度case0x59:*tempData=TempRegister;break;/讀取23開關(guān)A溫度case0x5a:*tempData=TempRegi

23、ster;break;/讀取23開關(guān)A溫度case0x5b:*tempData=TempRegister;break;/讀取24開關(guān)A溫度case0x5d:*tempData=TempRegister;break;/讀取24開關(guān)A溫度case0x5e:*tempData=TempRegister;break;/讀取24開關(guān)A溫度case0x5f:*tempData=TempRegister;break;/讀取24開關(guān)周邊溫度case0x60:*tempData=TempRegister;break;/讀取25開關(guān)A溫度case0x61:*tempData=TempRegister;break;

24、/讀取25開關(guān)A溫度case0x62:*tempData=TempRegister;break;/讀取25開關(guān)A溫度case0x63:*tempData=TempRegister;break;/讀取25開關(guān)周邊溫度case0x64:*tempData=TempRegister;break;/讀取26開關(guān)A溫度case0x65:*tempData=TempRegister;break;/讀取26開關(guān)A溫度讀取26開關(guān)周邊溫度case0x68:*tempData=TempRegister;break;/讀取27開關(guān)A溫度case0x69:*tempData=TempRegister;break;/

25、讀取27開關(guān)A溫度case0x6a:*tempData=TempRegister;break;/讀取27開關(guān)A溫度case0x6b:*tempData=TempRegister;break;/讀取27開關(guān)周邊溫度case0x6c:*tempData=TempRegister;break;/讀取28開關(guān)A溫度case0x6d:*tempData=TempRegister;break;/讀取28開關(guān)A溫度case0x6e:*tempData=TempRegister;break;/讀取28開關(guān)A溫度case0x6f:*tempData=TempRegister;break;/讀取28開關(guān)周邊溫度c

26、ase0x70:*tempData=TempRegister;break;/讀取29開關(guān)A溫度讀取29開關(guān)A溫度case0x73:*tempData=TempRegister;break;/讀取29開關(guān)周邊溫度case0x74:*tempData=TempRegister;break;/讀取30開關(guān)A溫度case0x75:*tempData=TempRegister;break;/讀取30開關(guān)A溫度case0x76:*tempData=TempRegister;break;/讀取30開關(guān)A溫度case0x77:*tempData=TempRegister;break;/讀取30開關(guān)周邊溫度ca

27、se0x78:*tempData=localAddr;break;/讀取設(shè)備地址case0x79:*tempData=BAUD;break;/讀取串口通信波特率case0x7a:*tempData=TEMP_Alert;break;/case讀取報(bào)警溫度上限0x7b:*tempData=TempRegister;break;/讀取年存放器case0x7c:*tempData讀取月存放器case0x7d:*tempData讀取日存放器case0x7e:*tempData讀取時(shí)存放器case0x7f:*tempData讀取分存放器case0x80:*tempData讀取秒存放器default:br

28、eak;)returnresult;=TempRegister;break;/=TempRegister;break;/=TempRegister;break;/=TempRegister;break;/=TempRegister;break;/uint16getRegisterVal(uint16/*數(shù)*/addr,uint16&data)設(shè)置存放器內(nèi)容函/函數(shù)功能:根據(jù)存放器地址設(shè)置相應(yīng)存放器內(nèi)容戶*/設(shè)置存放器值返回0表示成功uint16setRegisterVal(uint16addr,uint16tempData)(uint16result=0;uint16tempAddr;

29、tempAddr=addr&0xfff;switch(tempAddr&0xff)(case0x78:localAddr=tempData;break;/設(shè)置設(shè)備地址,設(shè)備地址初始值為0x01case0x79:BAUD=tempData;switch_BAUD(BAUD);break;/設(shè)置串口通信波特率,串口通信波特率寄存器值為1:9600,2:14400,3:19200,初始值為1case0x7a:TEMP_Alert=tempData;break;/設(shè)置報(bào)警溫度上限,報(bào)警溫度值存儲(chǔ)方式:精確到0.1&deg;C,以擴(kuò)大10倍的數(shù)值放在存放器里面,例如溫度值為100

30、.1,那么讀寫值為1001case0x7b:TempRegister=tempData;break;/設(shè)置年存放器case0x7c:TempRegister=tempData;break;/設(shè)置月存放器case0x7d:TempRegister=tempData;break;/設(shè)置日存放器設(shè)置時(shí)存放器case0x7f:TempRegister=tempData;break;/設(shè)置分存放器case0x80:TempRegister=tempData;break;/設(shè)置秒存放器default:break;returnresult;/*CRC高位字節(jié)值表*/constuint8codeauchCRC

31、Hi口=0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0/*/,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x8

32、0,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x8

33、0,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x0

34、1,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40/*CRC低位字節(jié)值表*/constuint8codeauchCRCLo=0x00,0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論