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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[已解決]51單片機串口程序問題(在最后說明此次遇到的問題以及解決辦法)

[復制鏈接]
跳轉到指定樓層
樓主
ID:876099 發表于 2021-10-10 21:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
目前需要用到51單片機串口控制單片機,但是我程序接受發送都沒有問題,不知道哪里有問題,希望大佬幫助解決一下非常感謝,下面是程序,
  1. #include <REGX51.H>
  2. unsigned char i,j;
  3. unsigned char temp;
  4. sbit led1=P2^0;
  5. sbit led2=P2^1;
  6. sbit led3=P2^2;
  7. sbit led4=P2^3;
  8. void xie(char k);
  9. void dis();
  10. void UsartInit()
  11. {
  12.         SCON=0X50;                        //設置為工作方式1
  13.         TMOD=0X20;                        //設置計數器工作方式2
  14.         TH1=0XF9;                        
  15.         TL1=0XF9;
  16.         PCON=0x80;
  17.         ES=1;                                                //打開接收中斷
  18.         EA=1;                                                //打開總中斷
  19.         TR1=1;                                        //打開計數器
  20. }

  21. void main()
  22. {
  23.    UsartInit();
  24.    xie('a');
  25.    led1=0;
  26.    while(1)
  27.    {
  28.                      
  29.    }
  30. }

  31. void Usart() interrupt 4
  32. {
  33.   if(RI)
  34.   {
  35.   RI=0;
  36.   temp=SBUF;
  37.   SBUF=temp;
  38.   P0=temp;
  39.   dis();
  40.   }
  41.   if(TI)
  42.   {
  43.     TI=0;
  44.   }
  45. }
  46. void xie(char k)
  47. {
  48. SBUF=k;
  49. while(TI==0);
  50. TI=0;
  51. }
  52. void dis()
  53. {
  54.           switch(temp)
  55.         {
  56.           case 0x01:led1=~led1;break;
  57.           case 0x02:led2=~led2;break;
  58.           case 0x03:led3=~led3;break;
  59.           case 0x04:led4=~led4;break;
  60.           default:break;
  61.         }
  62. }
復制代碼

波特率是9600


再一次感謝幫助解答我疑問的各位,本人因為不熟悉51單片機串口,所以在寫串口程序的時候直接將SBUF的數據送給一個變量然后拿這個變量去判斷,最后發現其實單片機是一位一位發送的,最后使用   變量&0x0f  解決問題,感謝大家的幫助
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-10-10 23:41 | 只看該作者
改兩個地方, 有反映了再討論其他

          switch(temp & 0x03)                     <==
        {
          case 0x01:led1=~led1;break;
          case 0x02:led2=~led2;break;
          case 0x03:led3=~led3;break;
          case 0x00:led4=~led4;break;             <===
          default:break;
        }
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-10-11 06:36 | 只看該作者
12M晶振加倍用9600波特率高了,誤差太大。改4800或2400即可。
回復

使用道具 舉報

地板
ID:844772 發表于 2021-10-11 08:52 | 只看該作者
  while(1)后面少了分號,能編譯過嗎?
回復

使用道具 舉報

5#
ID:876099 發表于 2021-10-11 16:09 | 只看該作者
glinfei 發表于 2021-10-11 08:52
while(1)后面少了分號,能編譯過嗎?

下面有大括號,跟后面帶分號一樣的
回復

使用道具 舉報

6#
ID:876099 發表于 2021-10-11 16:10 | 只看該作者
wulin 發表于 2021-10-11 06:36
12M晶振加倍用9600波特率高了,誤差太大。改4800或2400即可。

這個收發數據,數據回顯沒有問題,因為需要跟藍牙通信,藍牙最低9600所以單片機用的9600
回復

使用道具 舉報

7#
ID:624769 發表于 2021-10-11 16:29 | 只看該作者
? 還沒搞定么?按我說的那樣改依然沒有反應么?
回復

使用道具 舉報

8#
ID:876099 發表于 2021-10-11 16:46 | 只看該作者
188610329 發表于 2021-10-10 23:41
改兩個地方, 有反映了再討論其他

          switch(temp & 0x03)

你好,根據你修改的有反應,目前只有0x01和0x02有反應,可以反轉,0x03和0x00只能點亮不能反轉
回復

使用道具 舉報

9#
ID:624769 發表于 2021-10-11 16:58 | 只看該作者
1045964948 發表于 2021-10-11 16:46
你好,根據你修改的有反應,目前只有0x01和0x02有反應,可以反轉,0x03和0x00只能點亮不能反轉

既然如此,我大膽的猜測一下,

你給單片機發送的數據,不是按16進制格式發的吧? 是文本格式吧? 不清楚你電腦用什么軟件發的,你仔細看看軟件,應該有地方勾選類似“HEX”,如果你是16進制格式發送,應該都能翻轉。
回復

使用道具 舉報

10#
ID:876099 發表于 2021-10-11 17:10 | 只看該作者
188610329 發表于 2021-10-11 16:58
既然如此,我大膽的猜測一下,

你給單片機發送的數據,不是按16進制格式發的吧? 是文本格式吧? 不清 ...

我使用的16進制發送的,根據您修改的程序只能反轉01和02,其他兩個點亮后就不能熄滅了
回復

使用道具 舉報

11#
ID:876099 發表于 2021-10-11 17:29 | 只看該作者
188610329 發表于 2021-10-11 16:58
既然如此,我大膽的猜測一下,

你給單片機發送的數據,不是按16進制格式發的吧? 是文本格式吧? 不清 ...

還有可以解釋一下為什么temp&0x03就可以反轉了這個沒搞懂,51沒學精
回復

使用道具 舉報

12#
ID:213173 發表于 2021-10-11 17:44 | 只看該作者
1045964948 發表于 2021-10-11 16:10
這個收發數據,數據回顯沒有問題,因為需要跟藍牙通信,藍牙最低9600所以單片機用的9600

如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。
回復

使用道具 舉報

13#
ID:624769 發表于 2021-10-11 17:51 | 只看該作者
1045964948 發表于 2021-10-11 17:29
還有可以解釋一下為什么temp&0x03就可以反轉了這個沒搞懂,51沒學精

你一共 4個選項, 根據修改后的CASE  0~3 只有4個結果, 不管你發的數據,是什么,只要你的程序正確運行了,temp & 0x03  之后,一定能符合 4選一,所以用這個先保證程序沒問題,接下來只要考慮是不是傳輸問題就可以了。
回復

使用道具 舉報

14#
ID:624769 發表于 2021-10-11 18:09 | 只看該作者
1045964948 發表于 2021-10-11 17:10
我使用的16進制發送的,根據您修改的程序只能反轉01和02,其他兩個點亮后就不能熄滅了

按你說的,發的16進制格式, 回傳也沒有問題,那么,你接收到的應該也是16進制顯示,不然,0x00~0x1F,在文本狀態是什么也顯示不了的,那么我問一下:

你程序中:
   xie('a');  
你這個,接受到什么了?
回復

使用道具 舉報

15#
ID:876099 發表于 2021-10-11 23:39 | 只看該作者
wulin 發表于 2021-10-11 17:44
如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。

這個傳輸的數據很穩定的,就是我發送一個A就會返回一個A,目前問題應該是怎么提取出數據的問題
回復

使用道具 舉報

16#
ID:876099 發表于 2021-10-11 23:40 | 只看該作者
188610329 發表于 2021-10-11 18:09
按你說的,發的16進制格式, 回傳也沒有問題,那么,你接收到的應該也是16進制顯示,不然,0x00~0x1F,在 ...

就接收到了一個a,每次按下復位鍵就可以接收到一個a
回復

使用道具 舉報

17#
ID:624769 發表于 2021-10-11 23:58 | 只看該作者
1045964948 發表于 2021-10-11 23:40
就接收到了一個a,每次按下復位鍵就可以接收到一個a

那么, 說明你上位機串口助手,接收的是文本,

所以,如果,你發16進制 0x01, 0x02, 這些數據給單片機,又是怎么確認成功了回傳呢? 16進制數回傳的話,你上位機的串口住手壓根看不到任何東西。 所以再和你確認一下,你確定你發送的是16進制的 0x01 0x02 去單片機么??
回復

使用道具 舉報

18#
ID:876099 發表于 2021-10-12 00:25 | 只看該作者
wulin 發表于 2021-10-11 17:44
如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。

我重新試了一下12mhz,雖然能傳輸正確的指令,但是后面會帶有亂碼,非常感謝你的幫助
回復

使用道具 舉報

19#
ID:876099 發表于 2021-10-12 00:26 | 只看該作者
188610329 發表于 2021-10-11 23:58
那么, 說明你上位機串口助手,接收的是文本,

所以,如果,你發16進制 0x01, 0x02, 這些數據給單片 ...

因為我接收a使用的文本,然后發送再選中的16進制發送顯示
回復

使用道具 舉報

20#
ID:876099 發表于 2021-10-12 00:28 | 只看該作者
目前用的89c52,之前晶振使用的是12mhz現在使用11.0592mhz就很穩了,感謝大家幫助,明天測試和藍牙通信,如果沒問題的話我回反饋在下面,非常感謝大家能在百忙之中幫我解答疑問
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品永久免费 | 91新视频| 国产三级一区二区三区 | 欧美v在线| 亚洲电影一区二区三区 | 亚洲欧美第一视频 | 国产精品日韩在线观看 | 国产视频久久久 | 中文字幕一区在线观看视频 | 欧美日韩视频 | 91视在线国内在线播放酒店 | 国产aⅴ爽av久久久久久久 | 精品美女视频在线观看免费软件 | 黄色大全免费看 | 精品免费国产一区二区三区四区介绍 | 小草久久久久久久久爱六 | 久久久青草婷婷精品综合日韩 | 亚洲国产一区二区三区在线观看 | 欧美成人自拍视频 | 91免费观看 | 久久精品99国产精品日本 | 欧美精品综合在线 | h视频在线观看免费 | 国产成人精品综合 | 91九色视频在线 | 超碰导航 | 久久综合一区 | 国产美女自拍视频 | 国产成人综合在线 | 91一区二区三区在线观看 | 精品国产乱码久久久久久中文 | caoporn国产精品免费公开 | 国产一区不卡 | 国产日韩精品视频 | 久久国产一区二区三区 | 天天综合天天 | 免费高清av| 麻豆精品国产91久久久久久 | 国产精品福利视频 | 亚洲国产精品久久久 | 国产精品一区在线观看你懂的 |