找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1459|回复: 11
打印 上一主题 下一主题
收起左侧

请教一个51单片机奇怪的问题 串口高低电平控制继电器

[复制链接]
跳转到指定楼层
楼主
ID:561375 发表于 2022-10-17 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口高低电平控制继电器。
上位机(8266单片机)给51发送串口数据。
两个单片机一起供电一起启动,上位机给他发送串口,51没反应。

需要把51单独重启一下才能用窗口控制

是程序问题还是硬件问题 请大神指导一下

单片机源程序如下:
  1. #include "51.h"
  2. #include "intrins.h"

  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;

  5. #define FOSC 11059200L          //系统频率
  6. #define BAUD 9600             //串口波特率
  7. #define ON 0
  8. #define OFF 1//改下可以改上电继电器是吸合还是断开


  9. sbit OUT1 = P2^7;   //OUT1
  10. sbit OUT2 = P2^6;   //OUT2

  11. WORD i,temp;
  12. bit busy,Receive;
  13. BYTE  Rec_Buf[60];
  14. void SendData(BYTE dat);
  15. void SendString(char *s);

  16. void Uartinit()
  17. {

  18.     SCON = 0x50;                //8位可变波特率
  19.     T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  20.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  21.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  22.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  23.     ES = 1;                     //使能串口1中断
  24.     EA = 1;
  25. }
  26. void CLR_Buf(void)                           // 串口缓存清理
  27. {
  28.   BYTE k;
  29.   for(k=0;k<20;k++)   
  30.           {
  31.           Rec_Buf[k] = 0;
  32.           }
  33.      i = 0;                    
  34. }

  35. void main()
  36. {
  37.            P1M0 = 0xff;
  38.     P1M1 = 0x00;
  39.            P2M0 = 0xff;
  40.     P2M1 = 0x00;
  41.            P3M0 = 0xfE;
  42.     P3M1 = 0x00;
  43. OUT1 = OFF;OUT2 = OFF;

  44.    Uartinit();
  45.    SendString("1-2\r\nUart Test !\r\n");
  46.     while(1)
  47.         {
  48.         

  49.           if(Receive==1)
  50.           {
  51.           Receive=0;  
  52.                   if((Rec_Buf[0]=='A')&&(Rec_Buf[1]=='1')&&(Rec_Buf[2]=='1'))
  53.                   {
  54.                   OUT1=ON;SendString("OUT1 ON\r\n");CLR_Buf();                                 //第一路打开
  55.                   }
  56.                   if((Rec_Buf[0]=='A')&&(Rec_Buf[1]=='1')&&(Rec_Buf[2]=='0'))
  57.                   {
  58.                   OUT1=OFF;SendString("OUT1 OFF\r\n");CLR_Buf();                        //第一路关闭
  59.                   }
  60.                   if((Rec_Buf[0]=='A')&&(Rec_Buf[1]=='2')&&(Rec_Buf[2]=='1'))
  61.                   {
  62.                   OUT2=ON;SendString("OUT2 ON\r\n");CLR_Buf();                                  //第二路打开
  63.                   }
  64.                   if((Rec_Buf[0]=='A')&&(Rec_Buf[1]=='2')&&(Rec_Buf[2]=='0'))
  65.                   {
  66.                   OUT2=OFF;SendString("OUT2 OFF\r\n");CLR_Buf();                          //第二路关闭
  67.                   }                  

  68.                   
  69.                                             
  70.   }        
  71.         }
  72. }

  73. /*----------------------------
  74. UART 中断服务程序
  75. -----------------------------*/
  76. void Uart() interrupt 4 using 1
  77. {
  78.     if (RI)
  79.     {
  80.      RI = 0;                 //清除RI位
  81.     Rec_Buf[ i]=SBUF;
  82.     if(SBUF=='A') i = 0;
  83.         i++;if(i>30){ i = 0;}
  84.          if(SBUF=='A') Receive=1;
  85. //         if(SBUF=='A') {OUT1=1;SendString("A");}         
  86. //         if(SBUF=='a') {OUT1=0;SendString("a");}
  87.     }
  88.     if (TI)
  89.     {
  90.         TI = 0;                 //清除TI位
  91.         busy = 0;               //清忙标志
  92.     }
  93. }

  94. /*----------------------------
  95. 发送串口数据
  96. ----------------------------*/
  97. void SendData(BYTE dat)
  98. {
  99.     while (busy);               //等待前面的数据发送完成
  100.     ACC = dat;                  
  101.     busy = 1;
  102.     SBUF = ACC;                 //写数据到UART数据寄存器
  103. }

  104. /*----------------------------
  105. 发送字符串
  106. ----------------------------*/
  107. void SendString(char *s)
  108. {
  109.     while (*s)                  //检测字符串结束标志
  110.     {
  111.         SendData(*s++);         //发送当前字符
  112.     }
  113. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:121859 发表于 2022-10-18 08:43 | 只看该作者
虽然是同时启动的,但是两个系统进入工作状态的时间并不相同,复位时间应该是不一样的。你可以在主程序开始,双方串口通讯“握手”一下来解决不同步的问题。
回复

使用道具 举报

板凳
ID:123289 发表于 2022-10-18 09:45 | 只看该作者
你去找人叫了一声,未应,你是否会叫第二声、第三声呢?
回复

使用道具 举报

地板
ID:161164 发表于 2022-10-18 10:30 | 只看该作者
串口中断内的数组处理逻辑不合理
回复

使用道具 举报

5#
ID:561375 发表于 2022-10-18 11:38 | 只看该作者
yzwzfyz 发表于 2022-10-18 09:45
你去找人叫了一声,未应,你是否会叫第二声、第三声呢?

没用,8266上位机。发多少次数据下来。51都没反应。要把51单独重启
回复

使用道具 举报

6#
ID:25310 发表于 2022-10-18 11:54 | 只看该作者
上电先延时一下再发,调试时延时长一点能成功后再缩短到合适的时间。
回复

使用道具 举报

7#
ID:268736 发表于 2022-10-18 12:03 | 只看该作者
yzwzfyz 发表于 2022-10-18 09:45
你去找人叫了一声,未应,你是否会叫第二声、第三声呢?

太好的神比喻!
回复

使用道具 举报

8#
ID:268736 发表于 2022-10-18 12:17 | 只看该作者
cnhkh 发表于 2022-10-18 11:38
没用,8266上位机。发多少次数据下来。51都没反应。要把51单独重启

我手上有 8266 的板子, 用python寫透過 8266 UART發出"1" & "2" & "3", 手上沒有 51, 有 TI MSPˋ430G2553 Launch Board, 用 UART 來接收, 收到 "3" 則 tack LED ON/OFF,
作法上應該是沒有問題,但是實接上共地有嗎? 51的軟體有問題嗎?
回复

使用道具 举报

9#
ID:581305 发表于 2022-10-18 14:06 | 只看该作者
可以在51单片机程序中先加个LED闪灯之类的程序,看看一同上电时是否正常工作
回复

使用道具 举报

10#
ID:195496 发表于 2022-10-18 17:26 | 只看该作者
你的单片机串口接收没有超时与错误处理吧
回复

使用道具 举报

11#
ID:561375 发表于 2022-10-18 20:27 | 只看该作者
大漠落日 发表于 2022-10-18 17:26
你的单片机串口接收没有超时与错误处理吧

有例子参考吗 不太懂
回复

使用道具 举报

12#
ID:561375 发表于 2022-10-18 22:50 | 只看该作者
lkc8210 发表于 2022-10-18 10:30
串口中断内的数组处理逻辑不合理

谢谢 我研究一下看看 要是有例子参考就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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