![]() |
發布時間: 2023-6-4 20:16
正文摘要:不理解邏輯。 單片機是通過010101這種的高低電平模擬二級制記錄數據的,這里是接收數據部分,PIN_RXD引腳的高低電平這里是如何控制的? #include <reg52.h> sbit PIN_RXD = P3^0; sbit PIN_TXD = P3^1; ... |
wulin 發表于 2023-6-5 06:05
我的理解: 波特率就是傳輸二進制的速率,這里選用的是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。 |
哈蘭德 發表于 2023-6-5 01:30 參考9樓給你的代碼,這是典型的3分波特率,每個位的間隔為3次中斷,收到起始信號時為4個時間中斷,就是從1.333的位置開始接受。 |
【PIN_RXD引腳的高低電平這里是如何控制的?】 由發送方進行控制。 控制的邏輯依據串行協議。 接收方由單片機內部嵌入的UART硬件完成,當然也會按照同樣的協議進行解碼。 |
wulin 發表于 2023-6-5 06:05 TL1 = 0xE8; T0可以用嗎 |
大漠落日 發表于 2023-6-5 09:25 就是接收部分的 TL0 = 256 - ((256 - TH0)>>1); 不理解怎么改 |
有邏輯分析儀,厲害 |
用硬件接收,看你的狀態,還沒有完全搞明白串口通信與接收的采樣位關系。先用硬件串口吧,軟件要實現一時半會你可能調試不出結果。 |
哈蘭德 發表于 2023-6-4 20:48 軟件模擬串口示例
|
188610329 發表于 2023-6-5 00:13 接收部分,是從每個比特位的中間部分接收的,不太理解如何從1.3-1.5接收 |
你接收程序有問題, 接收到起始位后,要 錯位 半個時間位才能 正確收到數據,即要在收到起始位后,經過1.3~ 1.5個位 的時間后 才開始接收 第一位數據。所以,廣泛會用 3分波特率 或4分波特率方式。 |
我理解如下: 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.發送停止位 |
沙發,詳情見下面回復 |