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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2714|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)軟件模擬UART,無法實(shí)現(xiàn)+1發(fā)回,怎么回事

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:722595 發(fā)表于 2021-10-8 19:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用串口助手模擬UART,發(fā)送數(shù)據(jù)+1,發(fā)回,但是這段程序發(fā)回的數(shù)據(jù)不是+1,好像有點(diǎn)沒規(guī)律,請(qǐng)問是什么原因,看了大半天沒看出來問題。
單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. sbit pRXD=P3^0;
  3. sbit pTXD=P3^1;        
  4. bit RxDorTXD=0;            //給中斷程序來判斷是處于接收狀態(tài)還是發(fā)送狀態(tài),   1:表示發(fā)送          0:表示接收
  5. bit  RXDEnd=0;                       //接收結(jié)束標(biāo)識(shí)
  6. bit  TXDEnd=0;
  7. unsigned char RXDBuf;      //接收緩沖器
  8. unsigned char TXDBuf;           //發(fā)送緩沖器

  9. void configUART(unsigned int baud);
  10. void receive();
  11. void sent(unsigned char dat);
  12.         
  13. void main(){
  14. EA=1;                      //開啟中斷總開關(guān)
  15. configUART(9600);                           //配置波特率

  16. while(1){
  17. while (pRXD);
  18. receive();                  //接收數(shù)據(jù)
  19. sent(RXDBuf);                                 //發(fā)送數(shù)據(jù)
  20. while(!TXDEnd);

  21. }
  22. }

  23. void configUART (unsigned int baud){
  24. TMOD=0x02;                                         //讓TMOD工作在02模式下,即TH0可以直接重置到TL0上 書本P59
  25. TH0=256-11059200/baud/12;        //配置TH0的重置值
  26. }               

  27. void receive (){
  28. TR0=1;
  29. ET0=1;
  30. TL0=256-((256-TH0)>>1);
  31. RxDorTXD=0;
  32. }

  33. void sent(unsigned char dat){
  34. ET0=1;
  35. TR0=1;
  36. RxDorTXD=1;
  37. TXDBuf=dat+1;
  38. }
  39.    
  40. void interrupttimer0() interrupt 1{
  41. static int cnt=0;
  42. if(RxDorTXD==0){                                                //如果RXDorTXD為0,則開始接收數(shù)據(jù)
  43.     if(cnt==0){
  44.            if(pRXD==0){
  45.               RXDBuf=0;
  46.                   cnt++;
  47.                   }
  48.            else {
  49.                  TR0=0;
  50.                   }
  51.                   }
  52. else if(cnt<=8){
  53.             RXDBuf>>=1;
  54.                 if(pRXD==1){
  55.                 RXDBuf|=0x80;
  56.                 }
  57.                 cnt++;
  58.                  }
  59. else {
  60.           cnt=0;
  61.           TR0=0;
  62.           if(pRXD==1){
  63.           RXDEnd=1;
  64.           }
  65.           }        }
  66.   
  67.          
  68. if(RxDorTXD==1){                                                 //RXDorTXD為1,則開始發(fā)送數(shù)據(jù)
  69.     cnt++;
  70.     if(cnt<=8){
  71.        pTXD=TXDBuf & 0x01;
  72.        TXDBuf>>=1;
  73.               }
  74.     else if(cnt==9){
  75.          pTXD=1;}
  76.     else {
  77.         cnt=0;
  78.         TR0=0;
  79.         TXDEnd=1;
  80.   }
  81.   }
  82.   }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-10-8 22:20 | 只看該作者
void receive (){
TR0=1;
ET0=1;
TL0=256-((256-TH0)>>1);
RxDorTXD=0;
}

按你的代碼,你必須要主動(dòng)運(yùn)行了  receive () 才開定時(shí)器,才定義半步步進(jìn)值,才開始接收上位機(jī)數(shù)據(jù),你覺得上位機(jī)會(huì)乖乖配合這個(gè)時(shí)候才發(fā)數(shù)據(jù)么?

軟件模擬串口,如果光發(fā)送,隨便你怎么玩,但是,如果要正常接收,只有兩條路。
要么,4分或者3分波特率,定時(shí)器常開,反復(fù)查驗(yàn)上位機(jī)有沒有送數(shù)據(jù),
要么,開外部中斷,上位機(jī)一有動(dòng)作,通過外部中斷,開定時(shí)器,以及設(shè)置半波特率步進(jìn)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:722595 發(fā)表于 2021-10-9 08:57 | 只看該作者
188610329 發(fā)表于 2021-10-8 22:20
void receive (){
TR0=1;
ET0=1;

receive ()前面有句while (pRXD),也就是當(dāng)P3.0接收到低電平時(shí)就會(huì)配置到receive函數(shù)。
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-10-9 11:52 | 只看該作者
召喚師 發(fā)表于 2021-10-9 08:57
receive ()前面有句while (pRXD),也就是當(dāng)P3.0接收到低電平時(shí)就會(huì)配置到receive函數(shù)。

那么,假如你正在運(yùn)行 while(1)里面的 sent(RXDBuf);    的時(shí)候, 上位機(jī)發(fā)數(shù)據(jù)的話,這時(shí)候,怎么處理?
回復(fù)

使用道具 舉報(bào)

5#
ID:722595 發(fā)表于 2021-10-9 12:57 | 只看該作者
188610329 發(fā)表于 2021-10-9 11:52
那么,假如你正在運(yùn)行 while(1)里面的 sent(RXDBuf);    的時(shí)候, 上位機(jī)發(fā)數(shù)據(jù)的話,這時(shí)候,怎么處理?

因?yàn)檫@是簡(jiǎn)單的模擬,都是一應(yīng)一答,就是說這是我自己用串口助手來給單片機(jī)發(fā)數(shù)據(jù)的。目前還不會(huì)在發(fā)送的時(shí)候還接收到數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

6#
ID:624769 發(fā)表于 2021-10-9 13:26 | 只看該作者
這就不好說了,

要不你試試3分波特率的方法吧,個(gè)人覺得沒有外部中斷觸發(fā)的情況,還是三分波特率靠譜,

STC15F104E_模擬串口三分波特率.rar (34.28 KB, 下載次數(shù): 11)

這是我做的軟件模擬串口的報(bào)時(shí)程序,電腦串口助手發(fā)16進(jìn)制指令,單片機(jī)回傳時(shí)間。你可以看看。和你的對(duì)照一下,
回復(fù)

使用道具 舉報(bào)

7#
ID:722595 發(fā)表于 2021-10-9 13:33 | 只看該作者
188610329 發(fā)表于 2021-10-9 13:26
這就不好說了,

要不你試試3分波特率的方法吧,個(gè)人覺得沒有外部中斷觸發(fā)的情況,還是三分波特率靠譜,
...

謝謝,我還在學(xué),我是對(duì)著教材自己寫的,教材上是可以。。。真見鬼,看了半天看不出來問題。
回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2021-10-9 13:42 | 只看該作者
召喚師 發(fā)表于 2021-10-9 13:33
謝謝,我還在學(xué),我是對(duì)著教材自己寫的,教材上是可以。。。真見鬼,看了半天看不出來問題。

嗯,串口通訊這東西確實(shí)有點(diǎn)搞,畢竟沒有時(shí)鐘線,尤其是 起始位,停止位,還要算寬度,當(dāng)初也是搞了很久,后來的結(jié)論是:發(fā)送這塊簡(jiǎn)單,接收的話……,要么三分波特率(甚至4分5分),要么只能靠外部中斷,只有這兩個(gè)選擇。

時(shí)間隔得太久,看你的代碼,也看不出明顯的錯(cuò)誤,只好給你一個(gè)我這里測(cè)試沒問題的,你去看看了。
回復(fù)

使用道具 舉報(bào)

9#
ID:123289 發(fā)表于 2021-10-9 14:04 | 只看該作者
能收就能發(fā),你收到了嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:964463 發(fā)表于 2022-12-8 20:17 | 只看該作者
這個(gè)我也有問題,發(fā)的是1,收的是0x81
回復(fù)

使用道具 舉報(bào)

11#
ID:964463 發(fā)表于 2022-12-8 20:17 | 只看該作者
奇怪,不知道是不是代碼問題,和書上一樣都不行
回復(fù)

使用道具 舉報(bào)

12#
ID:964463 發(fā)表于 2022-12-8 23:25 | 只看該作者
希望后來人可以看到,這是宋雪松老師的代碼,可能因電腦而異,修改為發(fā)送什么返回什么之后,我的是發(fā)送1,返回0x81,但是把TL0改成數(shù)字211這些,就沒問題了,也就是說,代碼中的TL0計(jì)算是不準(zhǔn)確的,可能是我電腦的問題。
回復(fù)

使用道具 舉報(bào)

13#
ID:883242 發(fā)表于 2022-12-9 13:42 | 只看該作者
杠精本人 發(fā)表于 2022-12-8 23:25
希望后來人可以看到,這是宋雪松老師的代碼,可能因電腦而異,修改為發(fā)送什么返回什么之后,我的是發(fā)送1, ...

232的最高位在最前面,你現(xiàn)在的現(xiàn)象明顯是波特率不對(duì),誤差在前7位還在忍受范圍之內(nèi),到第8位就出錯(cuò)了。
回復(fù)

使用道具 舉報(bào)

14#
ID:401564 發(fā)表于 2022-12-9 14:15 | 只看該作者
單片機(jī)本身就有串口,為什么要模擬串口呢?
這玩意就像ADC0832一樣,上古時(shí)期的產(chǎn)物,不學(xué)也罷
回復(fù)

使用道具 舉報(bào)

15#
ID:284226 發(fā)表于 2023-5-11 19:21 | 只看該作者
樓主。我也在看。你那個(gè)看懂了?    發(fā)送時(shí),pTXD=TXDBuf & 0x01;為什么先要&這個(gè)一步,還有接收時(shí)
RXDBuf|=0x80;為什么要走這一步
回復(fù)

使用道具 舉報(bào)

16#
ID:1064915 發(fā)表于 2023-5-24 15:25 | 只看該作者
TH0=256-11059200/baud/12;
改成TH0=256-11059200/baud/12/16;
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人一区二区三区 | 日韩精品久久久 | 在线免费观看黄色网址 | 亚洲精品在线免费 | 久久网一区二区 | 国产精品久久久久久久久久了 | 欧美综合色 | 久久久久国产一区二区三区四区 | 久久99久久99 | 久久精品手机视频 | 午夜播放器在线观看 | 欧美久久久久久久 | 日本不卡一区二区三区在线观看 | 亚洲一区二区三区在线播放 | 久久精品免费一区二区三 | 亚洲二区精品 | 成人在线视频免费播放 | 亚洲精品一区二三区不卡 | 欧美一区二区三区在线 | 日韩网站在线观看 | 人人人干| 久久大| av成人在线观看 | 国产视频中文字幕在线观看 | www.久久精品 | 中文字幕国产视频 | 欧洲妇女成人淫片aaa视频 | 中文在线一区 | 91成人精品 | 草比av | 伊人精品久久久久77777 | 精国产品一区二区三区四季综 | 精品视频一区二区 | 日韩免费电影 | 日韩和的一区二区 | 久久一| 青青久久av北条麻妃海外网 | 亚洲欧美一区二区三区在线 | 亚洲一区视频在线播放 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 国产a区 |