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

標題: 單片機RS485通訊例程源代碼 [打印本頁]

作者: luyun    時間: 2018-7-7 20:07
標題: 單片機RS485通訊例程源代碼


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit RS485_DIR = P1^7;  //RS485方向選擇引腳

  4. bit flagFrame = 0;  //幀接收完成標志,即接收到一幀新數據
  5. bit flagTxd = 0;    //單字節發送完成標志,用來替代TXD中斷標志位
  6. unsigned char cntRxd = 0;   //接收字節計數器
  7. unsigned char pdata bufRxd[64];  //接收字節緩沖區

  8. extern void UartAction(unsigned char *buf, unsigned char len);

  9. /* 串口配置函數,baud-通信波特率 */
  10. void ConfigUART(unsigned int baud)
  11. {
  12.     RS485_DIR = 0; //RS485設置為接收方向
  13.     SCON  = 0x50;  //配置串口為模式1
  14.     TMOD &= 0x0F;  //清零T1的控制位
  15.     TMOD |= 0x20;  //配置T1為模式2
  16.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  17.     TL1 = TH1;     //初值等于重載值
  18.     ET1 = 0;       //禁止T1中斷
  19.     ES  = 1;       //使能串口中斷
  20.     TR1 = 1;       //啟動T1
  21. }
  22. /* 軟件延時函數,延時時間(t*10)us */
  23. void DelayX10us(unsigned char t)
  24. {
  25.     do {
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();
  29.         _nop_();
  30.         _nop_();
  31.         _nop_();
  32.         _nop_();
  33.         _nop_();
  34.     } while (--t);
  35. }
  36. /* 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度 */
  37. void UartWrite(unsigned char *buf, unsigned char len)
  38. {
  39.     RS485_DIR = 1;  //RS485設置為發送
  40.     while (len--)   //循環發送所有字節
  41.     {
  42.         flagTxd = 0;      //清零發送標志
  43.         SBUF = *buf++;    //發送一個字節數據
  44.         while (!flagTxd); //等待該字節發送完成
  45.     }
  46.     DelayX10us(5);  //等待最后的停止位完成,延時時間由波特率決定
  47.     RS485_DIR = 0;  //RS485設置為接收
  48. }
  49. /* 串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */
  50. unsigned char UartRead(unsigned char *buf, unsigned char len)
  51. {
  52.     unsigned char i;
  53.    
  54.     if (len > cntRxd)  //指定讀取長度大于實際接收到的數據長度時,
  55.     {                  //讀取長度設置為實際接收到的數據長度
  56.         len = cntRxd;
  57.     }
  58.     for (i=0; i<len; i++)  //拷貝接收到的數據到接收指針上
  59.     {
  60.         *buf++ = bufRxd[i];
  61.     }
  62.     cntRxd = 0;  //接收計數器清零
  63.    
  64.     return len;  //返回實際讀取長度
  65. }
  66. /* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
  67. void UartRxMonitor(unsigned char ms)
  68. {
  69.     static unsigned char cntbkp = 0;
  70.     static unsigned char idletmr = 0;

  71.     if (cntRxd > 0)  //接收計數器大于零時,監控總線空閑時間
  72.     {
  73.         if (cntbkp != cntRxd)  //接收計數器改變,即剛接收到數據時,清零空閑計時
  74.         {
  75.             cntbkp = cntRxd;
  76.             idletmr = 0;
  77.         }
  78.         else                   //接收計數器未改變,即總線空閑時,累積空閑時間
  79.         {
  80.             if (idletmr < 30)  //空閑計時小于30ms時,持續累加
  81.             {
  82.                 idletmr += ms;
  83.                 if (idletmr >= 30)  //空閑時間達到30ms時,即判定為一幀接收完畢
  84.                 {
  85.                     flagFrame = 1;  //設置幀接收完成標志
  86.                 }
  87.             }
  88.         }
  89.     }
  90.     else
  91.     {
  92.         cntbkp = 0;
  93.     }
  94. }
  95. /* 串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用 */
  96. void UartDriver()
  97. {
  98.     unsigned char len;
  99.     unsigned char pdata buf[40];

  100.     if (flagFrame) //有命令到達時,讀取處理該命令
  101.     {
  102.         flagFrame = 0;
  103.         len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區中
  104.         UartAction(buf, len);  //傳遞數據幀,調用動作執行函數
  105.     }
  106. }
  107. /* 串口中斷服務函數 */
  108. void InterruptUART() interrupt 4
  109. {
  110.     if (RI)  //接收到新字節
  111.     {
  112.         RI = 0;  //清零接收中斷標志位
  113.         if (cntRxd < sizeof(bufRxd)) //接收緩沖區尚未用完時,
  114.         {                            //保存接收字節,并遞增計數器
  115.             bufRxd[cntRxd++] = SBUF;
  116.         }
  117.     }
  118.     if (TI)  //字節發送完畢
  119.     {
  120.         TI = 0;   //清零發送中斷標志位
  121.         flagTxd = 1;  //設置字節發送完成標志
  122.     }
  123. }
復制代碼

所有資料51hei提供下載:
例程源代碼.zip (40.17 KB, 下載次數: 368)



作者: yzchendlei    時間: 2018-8-10 23:13
謝謝分享。黑幣不夠了。
作者: haorizi    時間: 2018-8-11 00:49
恩,很好,我也想學學
作者: haorizi    時間: 2018-8-11 00:52
謝謝分享,我也是黑幣不夠
作者: wdliming    時間: 2018-10-7 15:41
謝謝分享~~~
作者: a9069776    時間: 2018-10-7 16:23
學習中,謝謝!
作者: WFX777888    時間: 2019-1-24 09:04
謝謝分享資料

作者: bruck    時間: 2019-1-28 23:12
謝謝提供
作者: WFX777888    時間: 2019-1-29 08:14
謝謝分享資料
作者: yasi666    時間: 2019-1-29 10:33
太感謝了
作者: 黃燜雞米飯1    時間: 2019-4-17 09:57
不試一遍,不搭一次硬件我是理解不聊了

作者: jyf123    時間: 2019-4-24 21:06
謝謝分享  正好要用到RS485進行通訊
作者: pannnnnda    時間: 2019-4-25 22:28
請問有不帶DIR端的自動控制流向的模塊的例程嗎?
作者: 榆林上校    時間: 2019-4-29 20:03
最好有仿真哦
作者: hili210    時間: 2019-4-30 14:57
謝謝分享。
作者: Wanyling    時間: 2019-5-13 16:29
很不錯
作者: 15808190021    時間: 2019-5-13 19:39
恩,很好,我也想學學
作者: 15808190021    時間: 2019-5-13 19:45
恩,很好,我也想學學
作者: 460984528    時間: 2019-12-14 13:20
謝謝分享
作者: rotga    時間: 2019-12-15 20:07
正在學習485通訊,非常感謝樓主。
作者: 中原    時間: 2019-12-25 20:44
485有點搞不懂,來這里學習來了
作者: 飲酒作樂    時間: 2020-4-22 13:29
很好,贊一個,正好需要這個
作者: 飲酒作樂    時間: 2020-4-24 16:36
有沒有人知道這個程序的視頻講解

作者: suph007    時間: 2021-1-22 16:14
可以借鑒,樓主復制不容易
作者: 1294433629    時間: 2021-2-26 12:09
可以借鑒




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 极品粉嫩国产48尤物在线播放 | 97人人干 | 久久五月婷 | 久久精品综合 | 久久精品小视频 | 91久久精品日日躁夜夜躁国产 | 国产精品免费观看 | 91免费观看 | 欧美二级 | 亚洲日本一区二区 | 中文字幕一区二区三区四区 | 午夜视频在线观看网站 | 国际精品久久 | 精品国产一区二区三区久久 | 国产在线色 | 日韩中文字幕视频在线观看 | 91精品国产91久久久久久密臀 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 毛片一区 | 欧美一区二区三区的 | 久久久国产亚洲精品 | xnxx 日本免费 | 最新国产视频 | 日韩精品久久一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 中文字幕一区二区三区日韩精品 | 中文字幕视频在线 | 2一3sex性hd| 中文字幕二区 | 色吊丝2288sds中文字幕 | 天堂三级 | 欧美一区二区三区 | 亚洲a网| 亚洲在线一区 | 亚洲一区中文字幕 | 日韩精品激情 | 毛片毛片毛片毛片毛片 | 国产欧美一区二区三区在线看蜜臀 | 精品无码久久久久久国产 | 久久久久久亚洲精品不卡 | 欧美一级网站 |