找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1993|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

請教一個(gè)51單片機(jī)奇怪的問題 串口高低電平控制繼電器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:561375 發(fā)表于 2022-10-17 22:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
串口高低電平控制繼電器。
上位機(jī)(8266單片機(jī))給51發(fā)送串口數(shù)據(jù)。
兩個(gè)單片機(jī)一起供電一起啟動(dòng),上位機(jī)給他發(fā)送串口,51沒反應(yīng)。

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

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

單片機(jī)源程序如下:
  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模式, 并啟動(dòng)定時(shí)器2
  22.     AUXR |= 0x01;               //選擇定時(shí)器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;               //清忙標(biāo)志
  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é)束標(biāo)志
  110.     {
  111.         SendData(*s++);         //發(fā)送當(dāng)前字符
  112.     }
  113. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2022-10-18 09:45 | 只看該作者
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?
回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2022-10-18 10:30 | 只看該作者
串口中斷內(nèi)的數(shù)組處理邏輯不合理
回復(fù)

使用道具 舉報(bào)

5#
ID:561375 發(fā)表于 2022-10-18 11:38 | 只看該作者
yzwzfyz 發(fā)表于 2022-10-18 09:45
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?

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

使用道具 舉報(bào)

6#
ID:25310 發(fā)表于 2022-10-18 11:54 | 只看該作者
上電先延時(shí)一下再發(fā),調(diào)試時(shí)延時(shí)長一點(diǎn)能成功后再縮短到合適的時(shí)間。
回復(fù)

使用道具 舉報(bào)

7#
ID:268736 發(fā)表于 2022-10-18 12:03 | 只看該作者
yzwzfyz 發(fā)表于 2022-10-18 09:45
你去找人叫了一聲,未應(yīng),你是否會叫第二聲、第三聲呢?

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

使用道具 舉報(bào)

8#
ID:268736 發(fā)表于 2022-10-18 12:17 | 只看該作者
cnhkh 發(fā)表于 2022-10-18 11:38
沒用,8266上位機(jī)。發(fā)多少次數(shù)據(jù)下來。51都沒反應(yīng)。要把51單獨(dú)重啟

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

使用道具 舉報(bào)

9#
ID:581305 發(fā)表于 2022-10-18 14:06 | 只看該作者
可以在51單片機(jī)程序中先加個(gè)LED閃燈之類的程序,看看一同上電時(shí)是否正常工作
回復(fù)

使用道具 舉報(bào)

10#
ID:195496 發(fā)表于 2022-10-18 17:26 | 只看該作者
你的單片機(jī)串口接收沒有超時(shí)與錯(cuò)誤處理吧
回復(fù)

使用道具 舉報(bào)

11#
ID:561375 發(fā)表于 2022-10-18 20:27 | 只看該作者
大漠落日 發(fā)表于 2022-10-18 17:26
你的單片機(jī)串口接收沒有超時(shí)與錯(cuò)誤處理吧

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

使用道具 舉報(bào)

12#
ID:561375 發(fā)表于 2022-10-18 22:50 | 只看該作者
lkc8210 發(fā)表于 2022-10-18 10:30
串口中斷內(nèi)的數(shù)組處理邏輯不合理

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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