久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1958|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色888www视频在线观看 | 本道综合精品 | 免费一级黄色电影 | 成人一区二区视频 | 福利影院在线看 | 欧美综合在线观看 | 久久1区| 欧洲一区二区视频 | 国产精品成人一区二区 | 国产精品a级 | 欧美精品一区在线发布 | 精品亚洲一区二区三区四区五区 | 亚洲国产精品久久久久久 | 成人免费视频网站在线观看 | 欧美国产一区二区 | 欧美日韩成人网 | 国产黄色在线观看 | 成年人在线 | 高清黄色 | 九一视频在线播放 | 成人精品久久 | 亚洲日本一区二区三区四区 | 国产一级一级毛片 | 亚洲综合色丁香婷婷六月图片 | 草比网站 | 亚洲二区在线 | av色站 | 在线日韩 | 欧美aa在线 | 国产精品揄拍一区二区 | 欧美成人一区二免费视频软件 | 你懂的在线视频播放 | 久久九九免费 | 日韩中文字幕av | 国产在线看片 | 日韩欧美一区在线 | 亚洲三区视频 | 中文字幕一区二区不卡 | 日韩欧美三级 | 九色.com| 91精品国产一区二区三区 |