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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

51單片機UART通信-不理解接收程序 求分析

查看數: 1828 | 評論數: 16 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2023-6-4 20:16

正文摘要:

不理解邏輯。 單片機是通過010101這種的高低電平模擬二級制記錄數據的,這里是接收數據部分,PIN_RXD引腳的高低電平這里是如何控制的? #include <reg52.h> sbit PIN_RXD = P3^0; sbit PIN_TXD = P3^1; ...

回復

ID:1078938 發表于 2023-6-6 09:43
wulin 發表于 2023-6-5 06:05
軟件模擬串口示例
  1.   if (RING)
  2.         {
  3.                 if (--RCNT == 0)
  4.                 {
  5.                         RCNT = 3;                   //重置發送波特率計數器
  6.                         if (--RBIT == 0)
  7.                         {
  8.                                 RBUF = RDAT;            //將數據保存到RBUF
  9.                                 RING = 0;               //停止接收
  10.                                 REND = 1;               //設置接收完成標志
  11.                         }
  12.                         else
  13.                         {
  14.                                 RDAT >>= 1;
  15.                                 if (RXB) RDAT |= 0x80;  //將RX數據轉換為RX緩沖區
  16.                         }
  17.                 }
  18.         }
  19.         else if (!RXB)
  20.         {
  21.                 RING = 1;                       //設置開始接收標志
  22.                 RCNT = 4;                       //初始接收波特率計數器
  23.                 RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  24.         }                                                                                          //初始接收比特數(8個數據位+ 1個停止位)
復制代碼

我的理解:         波特率就是傳輸二進制的速率,這里選用的是1200,每秒傳送1200個比特位,1 / 1200 = 833 us,833us傳輸一個比特位。每次溢出后進入中斷,代表已經時間已經達到一個碼元位,如果向下面理解那么傳輸的比特不應該是對的????

接收代碼的理解:
    1.當遇到低電平RXB的時候,代表UART通信開始接收,先把RING = 1 , 比特計數器RCNT = 4 , 比特數RBIT = 9。
    2.下次再進入中斷,RCNT自動減1,經過4次中斷進入后,直到RCNT = 0,然后賦值RCNT = 3,比特數RBT減少一位,這時候認為數據是有效的,把RXB電平的數據記錄到RDAT中。
    3. 每個比特位都需要RCNT減3次后才把RXB的數據賦值給RDAT。同時,把RBIT數據也減1,直到等于0就代表接收完畢,然后恢復RING = 0。








ID:624769 發表于 2023-6-5 11:26
哈蘭德 發表于 2023-6-5 01:30
接收部分,是從每個比特位的中間部分接收的,不太理解如何從1.3-1.5接收

參考9樓給你的代碼,這是典型的3分波特率,每個位的間隔為3次中斷,收到起始信號時為4個時間中斷,就是從1.333的位置開始接受。
ID:123289 發表于 2023-6-5 10:43
【PIN_RXD引腳的高低電平這里是如何控制的?】
由發送方進行控制。
控制的邏輯依據串行協議。
接收方由單片機內部嵌入的UART硬件完成,當然也會按照同樣的協議進行解碼。
ID:1064915 發表于 2023-6-5 10:35
wulin 發表于 2023-6-5 06:05
軟件模擬串口示例

TL1 = 0xE8; T0可以用嗎
ID:1078938 發表于 2023-6-5 10:32
大漠落日 發表于 2023-6-5 09:25
用硬件接收,看你的狀態,還沒有完全搞明白串口通信與接收的采樣位關系。先用硬件串口吧,軟件要實現一時半 ...

就是接收部分的    TL0 = 256 - ((256 - TH0)>>1);  不理解怎么改
ID:1064915 發表于 2023-6-5 10:16
有邏輯分析儀,厲害
ID:195496 發表于 2023-6-5 09:25
用硬件接收,看你的狀態,還沒有完全搞明白串口通信與接收的采樣位關系。先用硬件串口吧,軟件要實現一時半會你可能調試不出結果。
ID:213173 發表于 2023-6-5 06:05
哈蘭德 發表于 2023-6-4 20:48
我理解如下:
PIN_RXD是接收數據的引腳,1就是高,0就是低。
以接收 1010 0101為例子舉例。

軟件模擬串口示例
  1. #include "reg51.h"

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. sbit RXB = P3^0;         //定義UART TX/RX端口
  5. sbit TXB = P3^1;

  6. uchar TBUF,RBUF;
  7. uchar TDAT,RDAT;
  8. uchar TCNT,RCNT;
  9. uchar TBIT,RBIT;
  10. bit TING,RING;
  11. bit TEND,REND;
  12. uchar t, r;
  13. uchar buf[16];

  14. //初始UART模塊
  15. void UART_INIT()
  16. {
  17.         TING = 0;
  18.         RING = 0;
  19.         TEND = 1;
  20.         REND = 0;
  21.         TCNT = 0;
  22.         RCNT = 0;
  23.         TMOD = 0x02;   //8位自動重載12T模式
  24.         TL1 = 0xE8;                //設定定時初值(波特率1200)
  25.         TH1 = 0xE8;                //設定定時器重裝值
  26. //        TMOD = 0x00;   // 16位自動重載模式中的Time0
  27. //        AUXR = 0x80;   // 1T工作模式
  28. //        TL0 = BAUD;
  29. //        TH0 = BAUD>>8; // 初始Time0和設置重載值
  30.         TR0  = 1;      // tiemr0開始運行
  31.         ET0  = 1;      // 啟用Time0中斷
  32.         PT0  = 1;      // 提高定時中斷優先級
  33.         EA   = 1;      // 打開全局中斷開關
  34. }
  35. //
  36. void main()
  37. {
  38.         UART_INIT();   //初始UART模塊
  39.         while (1)
  40.         {              //用戶功能
  41.                 if (REND)   //接收完成標志為真
  42.                 {
  43.                         REND = 0;//接收完成標志清0
  44.                         buf[r++ & 0x0f] = RBUF;//保存在緩存中
  45.                 }
  46.                 if (TEND)
  47.                 {
  48.                         if (t != r)
  49.                         {
  50.                                 TEND = 0;
  51.                                 TBUF = buf[t++ & 0x0f];//發送緩存中數據
  52.                                 TING = 1;
  53.                         }
  54.                 }
  55.         }
  56. }
  57. //UART定時器中斷例程
  58. void tm0() interrupt 1 using 1
  59. {
  60.         if (RING)
  61.         {
  62.                 if (--RCNT == 0)
  63.                 {
  64.                         RCNT = 3;                   //重置發送波特率計數器
  65.                         if (--RBIT == 0)
  66.                         {
  67.                                 RBUF = RDAT;            //將數據保存到RBUF
  68.                                 RING = 0;               //停止接收
  69.                                 REND = 1;               //設置接收完成標志
  70.                         }
  71.                         else
  72.                         {
  73.                                 RDAT >>= 1;
  74.                                 if (RXB) RDAT |= 0x80;  //將RX數據轉換為RX緩沖區
  75.                         }
  76.                 }
  77.         }
  78.         else if (!RXB)
  79.         {
  80.                 RING = 1;                       //設置開始接收標志
  81.                 RCNT = 4;                       //初始接收波特率計數器
  82.                 RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
  83.         }                                                                                          //初始接收比特數(8個數據位+ 1個停止位)
  84.         if (--TCNT == 0)
  85.         {
  86.                 TCNT = 3;                       //重置發送波特率計數器
  87.                 if (TING)                       //判斷是否發送
  88.                 {
  89.                         if (TBIT == 0)
  90.                         {
  91.                                 TXB = 0;                //發送起始位
  92.                                 TDAT = TBUF;            //加載數據 TBUF 到 TDAT
  93.                                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  94.                         }                                                                        //初始發送比特數(8個數據位+ 1個停止位)
  95.                         else
  96.                         {
  97.                                 TDAT >>= 1;             //將數據轉換到CY
  98.                                 if (--TBIT == 0)
  99.                                 {
  100.                                         TXB = 1;
  101.                                         TING = 0;           //停止發送
  102.                                         TEND = 1;           //設置發送完成標志
  103.                                 }
  104.                                 else
  105.                                 {
  106.                                         TXB = CY;           //將CY寫入TX端口
  107.                                 }
  108.                         }
  109.                 }
  110.         }
  111. }
復制代碼
ID:1078938 發表于 2023-6-5 01:30
188610329 發表于 2023-6-5 00:13
你接收程序有問題, 接收到起始位后,要 錯位 半個時間位才能 正確收到數據,即要在收到起始位后,經過1.3~ ...

接收部分,是從每個比特位的中間部分接收的,不太理解如何從1.3-1.5接收
ID:624769 發表于 2023-6-5 00:13
你接收程序有問題, 接收到起始位后,要 錯位 半個時間位才能 正確收到數據,即要在收到起始位后,經過1.3~ 1.5個位 的時間后 才開始接收 第一位數據。所以,廣泛會用 3分波特率 或4分波特率方式。
ID:1078938 發表于 2023-6-4 20:48
我理解如下:
PIN_RXD是接收數據的引腳,1就是高,0就是低。
以接收 1010 0101為例子舉例。
1 . 數據確定是從起始位開始后,RxdBuf  = 0;
2.1  RxdBuf = 0 ,
       PIN_RXD這時候接收為高電平,RxdBuf |= 1000 0000 ===> RxdBuf = 1000 0000
2.2 PIN_RXD 接收低電平 ,RxdBuf = 0100 0000 (右移了一位)
2.3 PIN_Rxd接收高電平  , RxdBuff >>=  0010 0000  ==>1010 0000
2.4 PIN_Rxd低, RxdBuf  ==> 0101 0000
2.5 Pin_Rxd為低 , RxdBuf ==> 0010 1000
2.6 Pin_Rxd高, Rxdbuf ===>1001 0100
2.7 Pin_Rxd低,RxdBuf ===> 0100 1010
2.8 Pin_Rxd高, RxdBuf ==> 1010 0101

3.發送停止位
ID:1078938 發表于 2023-6-4 20:36
沙發,詳情見下面回復

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99综合| 亚洲在线 | 一呦二呦三呦国产精品 | 欧美日韩免费一区二区三区 | 欧美一区视频 | 亚洲综合久久网 | 女女百合av大片一区二区三区九县 | 在线日韩福利 | 一级日批片| 日韩免费毛片视频 | 久草精品视频 | 久久精品亚洲 | 成人美女免费网站视频 | 久久精品99国产精品日本 | 国产精品久久一区二区三区 | 国产精品久久久久久久久大全 | 一级片网址 | 美女久久久久久久 | 午夜精品一区二区三区在线 | 全免费a级毛片免费看视频免费下 | 一区二区三区中文字幕 | 亚洲性视频在线 | 国产视频一区二区三区四区五区 | 亚洲一区二区三区四区五区午夜 | 国产在线a | 97视频在线观看网站 | 欧美二区三区 | 精品久久久久久久久久久久久 | 亚洲二区在线 | 亚洲国产一区二区三区在线观看 | 久久精品一区二区三区四区 | 精品一区二区三 | 精品一区二区三区在线播放 | 国产免费自拍 | 91精品久久久久久久久久 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 日本天堂一区二区 | www.亚洲视频.com | 久久青青| 一级做a爰片久久毛片免费看 | 日韩精品免费视频 |