版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、modbus(C语言程序) 2009-10-15 09:31:28| 分类: 默认分类|字号 订阅#include <REGX52.H>#include<intrins.h>/_nop_();#define OSFREQ 11059200char TimeInterval;char MyAddress; char data DI6=1,2,3,4,5,6;
2、 char data DO6=6,7,8,9,10,11; char data AI6=11,12,13,14,15,16;char data AO6=16,17,18,19,20,21; unsigned char data ReceiveData14;unsigned char data countnumber;sbit Recenable =P16;/控制端 sbit led =P27;/控制端/*-函数说明:CRC 高位字节值表-*/static unsigned char
3、 code auchCRCHi = 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,
4、60; 0x80, 0x41, 0x01, 0xC0, 0x80, 0x4
5、1, 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, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x
6、80, 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, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0
7、xC1, 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,1 / 140x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
8、0x40, 0x01, 0xC0,0x80, 0x41, 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, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
9、 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ;/*-函数说明:CRC低位字节值表-*/static unsigned char code auchCRCLo = 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,0x0F, 0xCF, 0xCE,
10、 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6
11、, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE
12、1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x
13、7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0
14、x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40;/*-调用方式:unsigned int CRC16(unsigned char *puchMsg, unsigned int usDataLen)函数说明:CRC校验-*/unsigned int CRC16(unsigned char *puch
15、Msg, unsigned int usDataLen) unsigned char uchCRCHi = 0xFF ; / 高CRC字节初始化 unsigned char uchCRCLo = 0xFF ; / 低CRC 字节初始化 unsigned uIndex ; /
16、CRC循环中的索引 while (usDataLen-) / 传输消息缓冲区 uIndex = uchCRCHi *puchMsg+ ; / 计算CRC uchCRCHi = u
17、chCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; return (uchCRCHi << 8 | uchCRCLo) ;/*-调用方式:unsigned char getbit(unsigned int address,unsigned char function)函数说明:取出所给地址的位值-*/unsigned char getbit(unsigned int address,unsigned char fun
18、ction) unsigned char data Offset; unsigned char data temp; unsigned char data *Myaddress; Offset=(char)address&0x07; switch (function) /根据功能码不同进行相应处理
19、160; case 2: Myaddress=DI; break; case 1: Myaddress=DO;
20、; break; default: return 2; temp=(char)(address>>3); temp=*(Myaddress+temp); temp>>=(Offset); i
21、f (temp&0x01) return 1; else return 0;/*-调用方式:void SendData(unsigned char *output,unsigned char Outlength)函数说明:发送数据至窗口-*/void SendData(unsigned char *output,unsigned char Outlength) ES=0; while(Outlength-)&
22、#160; TI=0; ACC=*output; TB8=P; SBUF=*(output+); while(!TI); TI=0; ES=1;/*-调用方式:void Function12(unsigned char address,unsigned char len)
23、函数说明:功能码1,2处理-*/void Function12(unsigned char address,unsigned char len) unsigned int data i; unsigned char data j; unsigned char data length; unsigned char data *send; unsigned int data temp; unsigned char data function; length=0; send=ReceiveData;
24、60; function=send1; for (i=1;i<=len;i+) length+; *(send+2+length)=0; for (j=0;j<8;j+) *(send+2+length)=*(send+2+length)|getbit(address,function)<<j; address+;
25、160; i+; if(i>len)break; i-; *(send+2)=length; /数据长度 temp=CRC16(send,length+3);
26、 /DI状态数据 *(send+3+length)=(char)(temp>>8); /CRC校验高 *(send+4+length)=(char)temp; /CRC校验低
27、60; SendData(send,length+5); /调用A发送程序/*-调用方式:void Function3(unsigned char address,unsigned char len)函数说明:功能码3处理-读取寄存器-*/void Function3(unsigned char address,unsigned char len)
28、; unsigned char data i; unsigned char data *send; unsigned int data temp; send=ReceiveData; *(send+2)=2*len; /数据长度高 address=2*
29、address; for(i=0;i<len;i+) /取输入寄存器数据 *(send+3+2*i)=AOaddress+; *(send+4+2*i)=AOaddress+; temp=CRC16(sen
30、d,2*len+3); /CRC校验 *(send+3+2*len)=(char)(temp>>8); *(send+4+2*len)=(char)temp; SendData(send,2*len+5);
31、; /调用A发送程序/*-调用方式:void Function4(unsigned char address,unsigned char len)函数说明:功能码处理4-读取输入寄存器-*/void Function4(unsigned char address,unsigned char len) unsigned char data i; unsigned char data *send; unsigned int data temp; send=Receiv
32、eData; *(send+2)=2*len; address=2*address; for(i=0;i<len;i+) /取数据 *(send+4+2*i)=AIaddress+; *(send+3+2*i
33、)=AIaddress+; temp=CRC16(send,2*len+3); *(send+3+2*len)=(char)(temp>>8); *(send+4+2*len)=(char)temp; SendData(send,2*len+5); /*-调用方式:void Function6(unsigned char address)函数说明:写单路寄存器-*/void Function6(unsigned char address) int temp; unsigned char
34、data *WriteData; temp=2*address; WriteData=AO; /将写入的数据进行处理 /your code to add here to deal with the write value *(WriteData+temp)=ReceiveData4; *(WriteData+temp+1)=ReceiveData5; SendData(ReceiveData,countnumber); /调用发送程序,返回
35、与主机相同的报文/*-调用方式:void SendError(char ErrorCode)函数说明:-*/void SendError(char ErrorCode) unsigned char data *send; unsigned int data temp; send=ReceiveData; *(send+1)=ReceiveData1|0x01;/最高位置1 *(send+2)=ErrorCode; temp=CRC16(send,3); *(send+3)=(char)(temp>>
36、8); *(send+4)=(char)temp; SendData(send,countnumber); /调用发送程序,返回错误代码/*-调用方式:void Deal()函数说明:接收数据处理-*/void Deal() unsigned int data temp; unsigned char data address; unsigned char data length;&
37、#160; unsigned char data counter; unsigned char data *Pointer; Pointer=ReceiveData; counter=countnumber; if (counter<=3 ) return; temp=Pointercounter-2<<8; temp= temp|Pointercounter-1; if( temp=CRC16(Pointer,counter-2) &
38、#160; /较验正确 address=Pointer3; length=Pointer5; if(address<48) switch (Pointer1)
39、 /根据功能码不同进行相应处理*/ case 1: Function12(address,length); break; case 2:
40、60; Function12(address,length); break; case 3: address=address-1; &
41、#160; Function3(address,length); break; case 4: address=address-1; Function4(address
42、,length); break; case 6: address=address-1; Function6(address); de
43、fault: SendError(0x81); break; else SendError(
44、0x82); countnumber=0;/*bit Chargetbit(unsigned char character,unsigned char Number) if(character>>Number&0x01=1) return 1; else return 0;/设定某一位的值*unsigned char SetBit(unsigned char Character,unsigned char num,bit bool
45、en) unsigned char code bit_value=1,2,4,8,16,32,64,128; if(boolen) return Character|bit_valuenum; else return Character&bit_valuenum;*/*-调用方式:void Init_timer2(unsigned int baudrate)函数说明:定时器2的初始化-*/void Init_timer2(unsigned int baudrate)&
46、#160; unsigned int data TimReg2; T2CON = 0x00; T2MOD = 0x00; TimReg2=65536-(OSFREQ/384/baudrate*11); RCAP2L=TimReg2&0x00ff; RCAP2H=(TimReg2>8); /RCAP2H=TimReg2/256 RCAP2L=0; RCAP2H=0; TL2 = RCAP2L; &
47、#160; / TH2 = RCAP2H;
48、60; / TR2=1; / T2CON.2 start timer ET2=0; &
49、#160; / 开定时器2中断/*-调用方式:void Init_SerialPort(unsigned int baudrate)函数说明:串口初始化-*/void Init_SerialPort(unsigned int b
50、audrate) unsigned char TimReg2; SCON = 0xd0; / 方式3, 8-bit UART, enable rcvr TMOD = 0
51、x21; / T0方式1(16位), T1方式2,8位重装 TimReg2=256-(OSFREQ/384/baudrate); TH1 = T
52、imReg2; / 定时器1,在11.0592MHz下,波特率为9600 TL1 = TH1; TR1= 1;
53、; / TR1: 定时开始
54、; /PS=1; / 串行中断优先 ES=1; &
55、#160; / 接收中断/*-函数说明:主函数-*/main() EA=1;
56、0; /开总中断 Init_SerialPort(9600); Init_timer2(9600); Recenable=0;
57、60; /接收允许 MyAddress=0x01; /本机地址 while(1) /*-调用方式:void SeiralA() interrupt 4 using 0函数说明:通讯中断-*/void SeiralA() interrupt 4 using 0 if(RI) if(TimeInterval>2)&&(TimeInterval<=4) countnumber=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年怒江州交通运输局公益性岗位招聘(1人)考试备考试题及答案解析
- 2025河北秦皇岛市第五中学等2所学校公开招聘教师2名(第二批)考试备考试题及答案解析
- 2026年西安市鄠邑区就业见习基地见习招聘(163人)考试参考题库及答案解析
- 2026中国华电集团有限公司广东公司本部及科创中心一般管理人员招聘7人考试参考试题及答案解析
- 2026年济南市历城区教育和体育局所属事业单位第一批公开招聘教师(200人)考试备考试题及答案解析
- 2026浙江宁波市江北区城市建设投资发展有限公司及下属子公司招聘7人考试参考试题及答案解析
- 2026徽商银行总行金融科技岗社会招聘考试备考题库及答案解析
- 2026年春季云南曲靖市关工委麒麟希望学校学期教师招聘4人笔试模拟试题及答案解析
- 2026年碑林区柏树林社区卫生服务中心招聘康复治疗师内科主治医师B超医师康复医师备考题库及完整答案详解一套
- 2026年普洱市永德昆西医院、普洱西盟仁康医院招聘备考题库带答案详解
- GB/T 9439-2023灰铸铁件
- 空调铜管规格尺寸及重量计算
- YY/T 0992-2023内镜清洗工作站
- 建筑工程材料见证取样以及试验检测内容大全
- ADCOLE+操作手册模版
- 七年级下册数学期末考试试卷共十套
- 餐饮部物品清单
- 碧桂园展示区品质验收评分表(2017版)
- GB/T 25974.3-2010煤矿用液压支架第3部分:液压控制系统及阀
- FZ/T 81006-2017牛仔服装
- 脊椎保养理疗课件
评论
0/150
提交评论