主机的关键部分:.doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主机的关键部分:.doc

主机的关键部分: /******************************************************************************* ?????????????????????????? 485多机通讯 -------------------------------------------------------------------------------- 通讯规则: 1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 2:通讯连接采用硬件MAX485,双向单工 3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量) 4:每个上行/下行的数据包都采用CRC8校验 5:数据接收采用中断+查询的方式 6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包 7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收 8:从机之间不能相互通讯,必须通过主机才能交换数据 9:无效地址是0,主机地址是1,从机地址是2.3.4......广播地址是255 ********************************************************************************/ #include iom16v.h #include macros.h #include delay.h #include 1602.h #include usart.h #include crc8.h //CRC校验函数就在这个文件里面 #include key.h #define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧) unsigned char send[amount];? //发件箱 unsigned char inbox[amount]; //收件箱 unsigned char n=0; ??? //记忆中断次数 unsigned char flag_me=0;???? //个人数据标志 unsigned char flag_all=0;??? //广播数据标志 ? //-------------------主机接收子程序-------------------------------- #pragma interrupt_handler RXC_Int: 12 void RXC_Int(void) ??? ???? ? //接收中断 { ?unsigned char ERROR=0; ?if(UCSRA0x08||UCSRA0x10 )ERROR=1; //奇偶效验错误(avr自动完成)或者帧错误就记录下来 ?inbox[n]=UDR; ?n++; //记忆中断次数 ?if(ERROR) inbox[0]=0; ??? ??? //如果通讯有错,收件箱的地址帧就标记成无效地址0 } void int_485(void)????? //接收程序,在中断中调用或者扫描调用 { ?//if(n3) 如果接收到的数据还不到3个,那么就是通讯线路故障 ?//如果收件箱已经收到amount个数据,并且crc8校验成功就... ?? if(n==amount inbox[amount-1]==crc8(inbox,amount-1)) ??? { ???? if(inbox[0]==1)flag_me=1; ?? //主机地址 ? //接收完数据后会置标志位,在读取数据后要把标志位置零? ? if(inbox[0]==255) flag_me=1;??? //广播地址,接收后不要回复 ? //接收完数据后会置标志位,在读取数据后要把标志位置零? ?? ??? } ? } ? void out_485(unsigned char address,unsigned char *ptr) {unsigned char i; ?? n=0;?? ??? ? ?? ??? ??//中断次数清0 ?? inbox[0]=0; ?????//收件箱地址清0 ?? ????????//请更新准备发送的数据 ?? //send[1]=? ?? //...... ?? //send[n]=? ?? send[0]=address; ???//改变这个地址就可以实现与某个从机对话 ?? for(i=1;iamount-1;i++)send[i]=*ptr++;//把发送的数据方到发信箱 ?? ? ?? send[amount-1]=crc8(send,amount-1);??

文档评论(0)

wsh1288 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档