51多机通信相关(TB8、RB8配置)

2019-07-15 10:03发布

    多机通讯调试过程中,我把单片机的TXD、RXD引脚短接后,为什么把TB8置1后发送数据,收到的数据还是RB8=0?
    程序源码如下,串口助手的调试结果如图。调了好久也没找出问题。。。求大佬们提点。
    之前发的帖子沉了,新人积分少,还望大家多多包涵。(没找到在哪里删除旧帖,如有知道的麻烦告知,管理大大请原谅我的重复发贴)

  1. //==================================================================================
  2. // 多机通讯从机1程序
  3. //注:从机先接收地址,然后与自己的地址比较,正确了再接收数据,修改地址可挂多个从机
  4. //==================================================================================
  5. #include "reg52.h"
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. //#define addr 0x31 //从机1地址
  9. #define addr1 0x31 //从机1地址
  10. #define addr2 0x32 //从机2地址

  11. sfr AUXR=0x8E;

  12. /*蜂鸣器相关*/
  13. //=====================================蜂鸣器相关=========================================//
  14. sbit spk=P1^7;
  15. uchar code period[6]={1,2,5,10,30,100};
  16. uchar code time[6]={1,30,15,10,6,3};

  17. void delay10ms() //@11.0592MHz
  18. {
  19. unsigned char i = 108, j = 145;
  20. do
  21. {
  22. while (--j);
  23. }
  24. while (--i);
  25. }

  26. void delay(uint a)
  27. {
  28. while(a--)
  29. {
  30. delay10ms();
  31. }
  32. }

  33. void beep(uchar k) //T是闹钟固定周期,t响铃次数
  34. {
  35. uint runtime;
  36. while(runtime!=time[k])
  37. {
  38. spk=!spk;
  39. delay(period[k]);
  40. spk=!spk;;
  41. delay(period[k]);
  42. runtime++;
  43. }
  44. runtime=0;
  45. }
  46. //=====================================蜂鸣器相关=========================================//

  47. void Uart_Init(void)
  48. {
  49. PCON &= 0x7F; //波特率不倍速
  50. SCON = 0xf0; //8位数据,可变波特率
  51. // SCON = 0x50;
  52. AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
  53. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  54. TMOD=0x20; //定时器T1使用工作方式2
  55. TL1 = 0xFD; //设定定时初值
  56. TH1 = 0xFD; //设定定时器重装值
  57. ET1 = 0; //禁止定时器1中断
  58. TR1 = 1; //启动定时器1
  59. RI=1;
  60. TI=1;
  61. }
  62. void send(uchar Data) //发送数据程序
  63. {
  64. while(!TI); //等待发送完毕
  65. TI=0;
  66. SBUF=Data;
  67. // while(!TI);
  68. }

  69. void main()
  70. {
  71. // uchar tem,Data,n=0x30,m=0;
  72. Uart_Init();
  73. SM2=1;
  74. while(1)
  75. {
  76. delay(50);
  77. TB8=1; //地址帧
  78. send(0x31); //发送地址
  79. send(RB8);
  80. if(RB8==0) beep(0);
  81. if(RB8==1) beep(5);
  82. delay(50);
  83. TB8=0; //数据帧
  84. send(0x32); //发送数据
  85. send(RB8);
  86. if(RB8==0) beep(0);
  87. if(RB8==1) beep(5);
  88. }
  89. }
复制代码 纳尼.jpg


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
gfzgmd
1楼-- · 2019-07-17 09:01
blust 发表于 2017-7-31 16:37
还有,别人回复都是希望对你有所帮助的,哪怕找来的资料你看了确实没什么帮助,也要有感激的心态,毕竟没有谁是万能的。

这个我明白,无论是否有帮助都应该心存感激。但是在自己都没有理解搜集到的材料,甚至说都没有细看,就完完全全的复制粘贴上来真的好么?而且直接扒别人的东西还不注明出处也不大好吧?
gfzgmd
2楼-- · 2019-07-17 12:49
 精彩回答 2  元偷偷看……
太子的空间
3楼-- · 2019-07-17 15:03
不管是谁的资料,只要不犯法,只要对大家有帮助,都可以用来学习,提高自己的能力,难道我们中国人自己对自己还要说侵权问题吗,,谁能保证自己发的帖子都是原创,举个例子,难道你小时候没有抄过别人的作业吗?或者是这个程序是你自己写的吗?不管怎么说,大家互相帮助互相学习,才能提高自己的知识,往大的说不是提高我们国家的知识吗
blust
4楼-- · 2019-07-17 20:26
gfzgmd 发表于 2017-7-31 17:19
老哥,TB8、RB8在多机通讯里作为一对标志位出现。主机TB8置1后发送地址,TB8清零发送送数据。
从机检测RB8判断收到的是数据还是地址。TB8作为标志位,下一次发送(0x31等)时位于数据的第九位。
我后来发送RB8是为了看从机的RB8是否跟着TB8改变。 ...

那你做测试的是主机还是从机?

一周热门 更多>