版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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编辑采访面试题及答案解析
- 2026编码算法面试题及答案
- 2026博物馆面试题目及答案
- 中国AI大模型市场大盘2026
- 二元一次方程组的解法(第1课时)课件2025-2026学年华师大版七年级数学下册
- 2026四川内江市隆昌市石燕桥镇李市小学招聘1人笔试题库含答案详解【黄金题型】
- 2026北京通州区65所中小学及幼儿园招聘啦笔试题库附完整答案详解【有一套】
- 2026辽宁盘锦市双台子区招聘公益性岗位人员88人参考题库含答案详解【突破训练】
- 2026广东茂名化州市招聘教师304人(编制)模拟试卷附答案详解(模拟题)
- 北京市昌平区清悦幼儿园诚聘英才备考题库及参考答案详解(A卷)
- 2026福建泉州晋江市市场监督管理局招聘编外工作人员16人考试备考试题及答案详解
- 2026年地方病控制副主任医师试题解析及答案
- 【新教材】统编版(2024)八年级下册道德与法治全册知识点背诵提纲(表格式)
- 2026龙江银行县域支行招聘43人备考题库及答案详解一套
- 血透室感染监测采样方法
- 2026年四川水电投资经营集团招聘题汇 总笔试试题
- 2025年江苏辅警面试试题及答案
- 2026年履带吊车行业分析报告及未来发展趋势报告
- 2026年IPA国际注册对外汉语教师资格认证考试真题含答案
- 泉州市七年级数学下册期末压轴题考试题及答案
- (4)-陕甘宁边区的大生产运动
评论
0/150
提交评论