找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2144|回復(fù): 11
收起左側(cè)

請教一個51單片機奇怪的問題 串口高低電平控制繼電器

[復(fù)制鏈接]
ID:561375 發(fā)表于 2022-10-17 22:43 | 顯示全部樓層 |閱讀模式
串口高低電平控制繼電器。
上位機(8266單片機)給51發(fā)送串口數(shù)據(jù)。
兩個單片機一起供電一起啟動,上位機給他發(fā)送串口,51沒反應(yīng)。

需要把51單獨重啟一下才能用窗口控制

是程序問題還是硬件問題 請大神指導(dǎo)一下

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

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

  5. #define FOSC 11059200L          //系統(tǒng)頻率
  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));   //設(shè)置波特率重裝值
  20.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  21.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  22.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發(fā)生器
  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();                        //第一路關(guān)閉
  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();                          //第二路關(guān)閉
  67.                   }                  

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

  73. /*----------------------------
  74. UART 中斷服務(wù)程序
  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. 發(fā)送串口數(shù)據(jù)
  96. ----------------------------*/
  97. void SendData(BYTE dat)
  98. {
  99.     while (busy);               //等待前面的數(shù)據(jù)發(fā)送完成
  100.     ACC = dat;                  
  101.     busy = 1;
  102.     SBUF = ACC;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
  103. }

  104. /*----------------------------
  105. 發(fā)送字符串
  106. ----------------------------*/
  107. void SendString(char *s)
  108. {
  109.     while (*s)                  //檢測字符串結(jié)束標志
  110.     {
  111.         SendData(*s++);         //發(fā)送當(dāng)前字符
  112.     }
  113. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:121859 發(fā)表于 2022-10-18 08:43 | 顯示全部樓層
雖然是同時啟動的,但是兩個系統(tǒng)進入工作狀態(tài)的時間并不相同,復(fù)位時間應(yīng)該是不一樣的。你可以在主程序開始,雙方串口通訊“握手”一下來解決不同步的問題。
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2022-10-18 09:45 | 顯示全部樓層
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-10-18 10:30 | 顯示全部樓層
串口中斷內(nèi)的數(shù)組處理邏輯不合理
回復(fù)

使用道具 舉報

ID:561375 發(fā)表于 2022-10-18 11:38 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-10-18 09:45
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?

沒用,8266上位機。發(fā)多少次數(shù)據(jù)下來。51都沒反應(yīng)。要把51單獨重啟
回復(fù)

使用道具 舉報

ID:25310 發(fā)表于 2022-10-18 11:54 | 顯示全部樓層
上電先延時一下再發(fā),調(diào)試時延時長一點能成功后再縮短到合適的時間。
回復(fù)

使用道具 舉報

ID:268736 發(fā)表于 2022-10-18 12:03 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-10-18 09:45
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?

太好的神比喻!
回復(fù)

使用道具 舉報

ID:268736 發(fā)表于 2022-10-18 12:17 | 顯示全部樓層
cnhkh 發(fā)表于 2022-10-18 11:38
沒用,8266上位機。發(fā)多少次數(shù)據(jù)下來。51都沒反應(yīng)。要把51單獨重啟

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

使用道具 舉報

ID:581305 發(fā)表于 2022-10-18 14:06 | 顯示全部樓層
可以在51單片機程序中先加個LED閃燈之類的程序,看看一同上電時是否正常工作
回復(fù)

使用道具 舉報

ID:195496 發(fā)表于 2022-10-18 17:26 | 顯示全部樓層
你的單片機串口接收沒有超時與錯誤處理吧
回復(fù)

使用道具 舉報

ID:561375 發(fā)表于 2022-10-18 20:27 | 顯示全部樓層
大漠落日 發(fā)表于 2022-10-18 17:26
你的單片機串口接收沒有超時與錯誤處理吧

有例子參考嗎 不太懂
回復(fù)

使用道具 舉報

ID:561375 發(fā)表于 2022-10-18 22:50 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-18 10:30
串口中斷內(nèi)的數(shù)組處理邏輯不合理

謝謝 我研究一下看看 要是有例子參考就好了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表