ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:18.31KB ,
资源ID:10638670      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10638670.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(485通信.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

485通信.docx

1、485通信主机的关键部分:/*485多机通讯-通讯规则: 1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 2:通讯连接采用硬件MAX485,双向单工 3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量) 4:每个上行/下行的数据包都采用CRC8校验 5:数据接收采用中断+查询的方式 6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包 7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收 8:从机之间不能相互通讯,必须通过主机才能交换数据 9:无效地址是0,主机地址是1,从机地址是2.

2、3.4.广播地址是255 */ #include #include #include delay.h #include 1602.h #include usart.h #include crc8.h /CRC校验函数就在这个文件里面 #include key.h #define amount 10 /设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧) unsigned char sendamount; /发件箱 unsigned char inboxamount; /收件箱 unsigned char n=0; /记忆中断次数 unsigned char flag_me=0; /个人数据

3、标志unsigned char flag_all=0; /广播数据标志/-主机接收子程序- #pragma interrupt_handler RXC_Int: 12void RXC_Int(void) /接收中断 unsigned char ERROR=0; if(UCSRA&0x08|UCSRA&0x10 )ERROR=1; /奇偶效验错误(avr自动完成)或者帧错误就记录下来inboxn=UDR;n+; /记忆中断次数 if(ERROR) inbox0=0; /如果通讯有错,收件箱的地址帧就标记成无效地址0 void int_485(void) /接收程序,在中断中调用或者扫描调用/if

4、(n3) 如果接收到的数据还不到3个,那么就是通讯线路故障 /如果收件箱已经收到amount个数据,并且crc8校验成功就. if(n=amount & inboxamount-1=crc8(inbox,amount-1) if(inbox0=1)flag_me=1; /主机地址/接收完数据后会置标志位,在读取数据后要把标志位置零 if(inbox0=255) flag_me=1; /广播地址,接收后不要回复/接收完数据后会置标志位,在读取数据后要把标志位置零 void out_485(unsigned char address,unsigned char *ptr)unsigned char

5、 i;n=0; /中断次数清0 inbox0=0; /收件箱地址清0 /请更新准备发送的数据 /send1=? /. /sendn=? send0=address; /改变这个地址就可以实现与某个从机对话 for(i=1;i);break;case -:address=3;LCD_write_string(4,0,3);break;case =: out_485(address,key);break;case C:j=0;LCD_write_string(7,0, );break;default: if(j8&i=0)keyj+=i;LCD_write_char(j+6,0,i);LCD_wr

6、ite_string(4,1,inbox);LCD_write_string(12,1, );/数组没有结束符,所以要修正液晶后面多余的乱码/- 从机部分:#include #include #include 1602.h #include delay.h #include usart.h #include crc8.h /CRC校验函数就在这个文件里面 #define amount 10 /设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧) #define address 2 /请在这里设定本机地址 unsigned char sendamount; /发件箱 unsigned cha

7、r inboxamount; /收件箱 unsigned char n=0; /记忆中断次数 unsigned char flag_me=0; /个人数据标志unsigned char flag_all=0; /广播数据标志/-从机接收子程序- #pragma interrupt_handler RXC_Int: 12void RXC_Int(void) /接收中断 unsigned char ERROR=0; if( UCSRA&0x04 | UCSRA&0x10 ) ERROR=1; /记录奇偶效验错误或者帧错误 inboxn=UDR; /把接收到的数据保存到收件箱 n+;/记忆接收的次数

8、 if(ERROR) /如果通讯有错. /n=0; /接收计数清0 inbox0=0; /把地址改为无效地址0 UCSRA|=0x01; /重新打开接收器的地址帧筛选功能 /如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能 (关闭是为了保证后面的数据全部接收到)if(inbox0=address |inbox0=0xff) UCSRA&=0x01; if(n=amount) /接收到amount个数据以后. n=0; /接收计数清0 UCSRA|=0x01; /重新打开接收器的地址帧筛选功能 if(inboxamount-1=crc8(inbox,amount-1) /如果crc8

9、校验正确就. if(inbox0=address)flag_me=1; /本机地址/接收完数据后会置标志位,在读取数据后要把标志位置零 if(inbox0=255) flag_me=1; /广播地址,接收后不要回复/接收完数据后会置标志位,在读取数据后要把标志位置零 void out_485(unsigned char *ptr)unsigned char i;send0=1; /发件箱地址指向主机 for(i=1;iamount-1;i+)send=*ptr+;/把发送的数据方到发信箱 sendamount-1=crc8(send,amount-1); /计算发件箱的crc8校验码 usar

10、t_out(send,amount); /将发件箱的数据send发送出去/-主函数-void main(void) usart_init(); SEI(); LCD_init();LCD_write_string(0,0,out:);LCD_write_string(0,1,int:);while (1) while(flag_me) LCD_write_string(4,1,inbox);n=0; /中断次数清0 inbox0=0; /收件箱地址清0 flag_me=0;out_485(2,ok!);LCD_write_string(4,0,send);LCD_write_string(13

11、,0, );LCD_write_string(13,1, ); /end这是我用ATmega162做的协议转换的程序,带通讯协议,RS485就是在RS232的程序基础上加上发送和接收的控制即可,用CVAVR软件编的,如果有不明白之处,请发信息void ReturnXMTA808(unsigned char pvAddr);void putchar1(char c);#define RXB8 1#define TXB8 0#define UPE 2#define OVR 3#define FE 4#define UDRE 5#define RXC 7#define FRAMING_ERROR (

12、1FE)#define PARITY_ERROR (1UPE)#define DATA_OVERRUN (1OVR)#define DATA_REGISTER_EMPTY (1UDRE)#define RX_COMPLETE (1RXC) unsigned int tempdat=0; char ttup=0; char ttdown=0; char temp=0; char SlaveAddr=0;/ USART0 Receiver buffer#define RX_BUFFER_SIZE0 8char rx_buffer0RX_BUFFER_SIZE0;unsigned char rx_w

13、r_index0,rx_counter0;/rx_rd_index0,/ This flag is set on USART0 Receiver buffer overflowbit rx_buffer_overflow0;/bit slaveokflag;/ USART0 Receiver interrupt service routine/gather XMTA808interrupt USART0_RXC void usart0_rx_isr(void)char status,data;status=UCSR0A;data=UDR0;if (status & (FRAMING_ERROR

14、 | PARITY_ERROR | DATA_OVERRUN)=0) rx_buffer0rx_wr_index0=data; if (+rx_wr_index0 = RX_BUFFER_SIZE0) rx_wr_index0=0; if (+rx_counter0 = RX_BUFFER_SIZE0) if(rx_buffer02=0x55) rx_wr_index0=0; rx_counter0=0; rx_buffer_overflow0=1; / return current temperature tempdat = (unsigned int)(unsigned int)(rx_b

15、uffer01*0x100)+(rx_buffer00); ttup = (char)(tempdat&0x03ff)/100)&0x0f; temp = (char)(tempdat%100); ttdown = bin2bcd(temp); EnRS485M; putchar1(0x3a); putchar1(SlaveAddr); putchar1(0x03); putchar1(0x00); putchar1(ttup); putchar1(ttdown); putchar1(0x0D); putchar1(0x0A); putchar1(0x0D); putchar1(0x0A);

16、DiRS485M; else /worry & re rx_counter0=0;rx_wr_index0=0; ReturnXMTA808(SlaveAddr); / Write a character to the USART0 Transmittervoid putchar(char c)while (UCSR0A & DATA_REGISTER_EMPTY)=0);UDR0=c;/ USART1 Receiver buffer#define RX_BUFFER_SIZE1 8char rx_buffer1RX_BUFFER_SIZE1;/ This flag is set on USA

17、RT1 Receiver buffer overflowbit RevReadyflag; bit RevDatflag; bit EndCRflag; bit EndLFflag; char Longcode=0; / USART1 Receiver interrupt service routineinterrupt USART1_RXC void usart1_rx_isr(void)char status,SBUF;status=UCSR1A;SBUF=UDR1;rx_counter0=0;rx_wr_index0=0;if (status & (FRAMING_ERROR | PAR

18、ITY_ERROR | DATA_OVERRUN)=0) if(SBUF = 0x3a) & (RevReadyflag = 0) RevReadyflag = 1; RevDatflag = 0; EndCRflag = 0; EndLFflag = 0; else if(SBUF = 0x11 |SBUF = 0x12) & (RevReadyflag=1) & (RevDatflag=0) RevDatflag=1; Longcode=0x00; SlaveAddr = SBUF; else RevReadyflag=0; /- if(RevDatflag=1) & (SBUF!=0x0

19、d) & (SBUF!=0x0a) rx_buffer1Longcode=SBUF; Longcode+; else if(SBUF=0x0d) & (RevDatflag=1)EndCRflag=1; else if(SBUF=0x0a) & (EndCRflag=1) & (RevDatflag=1) EndLFflag=1; RevReadyflag=0; RevDatflag=0; Longcode=0; switch(rx_buffer11) case 0x03: ReturnXMTA808(SlaveAddr);break; case 0x08: EnRS485M; putchar

20、1(0x3a); /loopback putchar1(SlaveAddr); putchar1(0x08); putchar1(0x0D); putchar1(0x0A); putchar1(0x0D); putchar1(0x0A); DiRS485M; break; default:break; void putchar1(char c)while (UCSR1A & DATA_REGISTER_EMPTY)=0);UDR1=c;voidReturnXMTA808(char pvAddr) EnRS485S; putchar(pvAddr+0x80); putchar(pvAddr+0x80); putchar(0x52); putchar(0x00); putchar(0x00); putchar(0x00); putchar(0x52+pvAddr); putchar(0x00); rx_counter0=0;rx_wr_index0=0; DiRS485S;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1