欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16443|回復: 24
打印 上一主題 下一主題
收起左側

單片機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)


評分

參與人數 1黑幣 +5 收起 理由
zalkaer + 5 贊一個!

查看全部評分

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

使用道具 舉報

沙發
ID:385149 發表于 2018-8-10 23:13 | 只看該作者
謝謝分享。黑幣不夠了。
回復

使用道具 舉報

板凳
ID:385160 發表于 2018-8-11 00:49 來自觸屏版 | 只看該作者
恩,很好,我也想學學
回復

使用道具 舉報

地板
ID:385160 發表于 2018-8-11 00:52 來自觸屏版 | 只看該作者
謝謝分享,我也是黑幣不夠
回復

使用道具 舉報

5#
ID:20672 發表于 2018-10-7 15:41 | 只看該作者
謝謝分享~~~
回復

使用道具 舉報

6#
ID:284846 發表于 2018-10-7 16:23 | 只看該作者
學習中,謝謝!
回復

使用道具 舉報

7#
ID:63317 發表于 2019-1-24 09:04 | 只看該作者
謝謝分享資料
回復

使用道具 舉報

8#
ID:151749 發表于 2019-1-28 23:12 來自觸屏版 | 只看該作者
謝謝提供
回復

使用道具 舉報

9#
ID:63317 發表于 2019-1-29 08:14 | 只看該作者
謝謝分享資料
回復

使用道具 舉報

10#
ID:9727 發表于 2019-1-29 10:33 | 只看該作者
太感謝了
回復

使用道具 舉報

11#
ID:470175 發表于 2019-4-17 09:57 | 只看該作者
不試一遍,不搭一次硬件我是理解不聊了
回復

使用道具 舉報

12#
ID:156532 發表于 2019-4-24 21:06 | 只看該作者
謝謝分享  正好要用到RS485進行通訊
回復

使用道具 舉報

13#
ID:521831 發表于 2019-4-25 22:28 | 只看該作者
請問有不帶DIR端的自動控制流向的模塊的例程嗎?
回復

使用道具 舉報

14#
ID:47652 發表于 2019-4-29 20:03 | 只看該作者
最好有仿真哦
回復

使用道具 舉報

15#
ID:525138 發表于 2019-4-30 14:57 | 只看該作者
謝謝分享。
回復

使用道具 舉報

16#
ID:526259 發表于 2019-5-13 16:29 | 只看該作者
很不錯
回復

使用道具 舉報

17#
ID:125831 發表于 2019-5-13 19:39 | 只看該作者
恩,很好,我也想學學
回復

使用道具 舉報

18#
ID:125831 發表于 2019-5-13 19:45 | 只看該作者
恩,很好,我也想學學
回復

使用道具 舉報

19#
無效樓層,該帖已經被刪除
20#
ID:663724 發表于 2019-12-14 13:20 | 只看該作者
謝謝分享
回復

使用道具 舉報

21#
ID:653902 發表于 2019-12-15 20:07 | 只看該作者
正在學習485通訊,非常感謝樓主。
回復

使用道具 舉報

22#
ID:283261 發表于 2019-12-25 20:44 | 只看該作者
485有點搞不懂,來這里學習來了
回復

使用道具 舉報

23#
無效樓層,該帖已經被刪除
24#
ID:735148 發表于 2020-4-22 13:29 | 只看該作者
很好,贊一個,正好需要這個
回復

使用道具 舉報

25#
ID:735148 發表于 2020-4-24 16:36 | 只看該作者
有沒有人知道這個程序的視頻講解
回復

使用道具 舉報

26#
無效樓層,該帖已經被刪除
27#
無效樓層,該帖已經被刪除
28#
無效樓層,該帖已經被刪除
29#
ID:308785 發表于 2021-1-22 16:14 | 只看該作者
可以借鑒,樓主復制不容易
回復

使用道具 舉報

30#
無效樓層,該帖已經被刪除
31#
ID:886629 發表于 2021-2-26 12:09 | 只看該作者
可以借鑒
回復

使用道具 舉報

32#
無效樓層,該帖已經被刪除
33#
無效樓層,該帖已經被刪除
34#
無效樓層,該帖已經被刪除
35#
無效樓層,該帖已經被刪除
36#
無效樓層,該帖已經被刪除
37#
無效樓層,該帖已經被刪除
38#
無效樓層,該帖已經被刪除
39#
無效樓層,該帖已經被刪除
40#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表