找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4526|回复: 0
收起左侧

单片机多机通讯从机程序

[复制链接]
ID:208520 发表于 2017-6-6 19:32 | 显示全部楼层 |阅读模式
从机程序:http://www.51hei.com/bbs/dpj-87068-1.html
主机程序:http://www.51hei.com/bbs/dpj-87067-1.html

  1. #include<reg51.h>
  2. #include<string.h>
  3. #define addr     0x01//从机1的地址
  4. #define _SUCC_   0x0f//数据传送成功
  5. #define _ERR_    0xf0//数据传送失败
  6. unsigned char aa=0xff;//主机与从机之间通信标志
  7. unsigned char Buff[20];//数据缓冲区
  8. //串口初始化函数
  9. void serial_init()
  10. {
  11. TMOD=0x20; //定时器1工作于方式2
  12. TH1=0xfd;  
  13. TL1=0xfd; //波特率为9600
  14. PCON=0;
  15. SCON=0xd0;  //串口工作于方式3
  16. TR1=1;  //开启定时器
  17. TI=0;
  18. RI=0;
  19. }
  20. //接收数据函数
  21. unsigned char RECE_data(unsigned char *Buff)
  22. {
  23. unsigned char i,temp;
  24. unsigned char lenth;
  25. unsigned char check;
  26. RI=0;     //接收数据长度
  27. while(!RI);
  28. if(RB8==1)    //若接收到地址帧,则返回0xfe
  29.   return 0xfe;
  30. lenth=SBUF;
  31. RI=0;     

  32. check=lenth;
  33. for(i=0;i<lenth;i++) //接收数据
  34. {
  35.   while(!RI);
  36.   if(RB8==1)   //若接收到地址帧,则返回0xfe
  37.    return 0xfe;
  38.   Buff[i]=SBUF;   
  39.   check=check^(Buff[i]);
  40.   RI=0;
  41. }
  42. while(!RI);    //接收校验字节
  43. if(RB8==1)    //若接收到地址帧,则返回0xfe
  44.   return 0xfe;
  45. temp=SBUF;
  46. RI=0;

  47. check=temp^check;  //将从主机接收到的校验码与自己计算的校验码比对
  48. if(check!=0)   //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff
  49. {
  50.   TI=0;
  51.   TB8=0;
  52.   SBUF=_ERR_;
  53.   while(!TI);
  54.   TI=0;
  55.   return 0xff;
  56. }
  57. TI=0;           //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00
  58. TB8=0;
  59. SBUF=_SUCC_;
  60. while(!TI);
  61. TI=0;
  62. return 0;
  63. }
  64. void main()
  65. {
  66. serial_init();
  67. while(1)
  68. {
  69.   SM2=1;              //接收地址帧
  70.   while(aa!=addr)  //从机等待主机请求自己的地址
  71.   {
  72.    RI=0;
  73.    while(!RI);
  74.    aa=SBUF;
  75.    RI=0;
  76.   }
  77.   TI=0;     //一旦被请求,从机返回自己的地址作为应答,等待接收数据
  78.   TB8=0;
  79.   SBUF=addr;
  80.   while(!TI);
  81.   TI=0;
  82.   SM2=0;                  //接收数据帧
  83.   aa=0xff;    //从机接收数据,并将数据保存到数据缓冲区
  84.   while(aa==0xff)
  85.   {
  86.    aa=RECE_data(Buff);
  87.   }
  88.   if(aa==0xfe)
  89.    continue;
  90.   P1=Buff[1];      //查看接收到的数据
  91. }
  92. }

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表