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

標(biāo)題: [已解決]51單片機(jī)串口程序問題(在最后說明此次遇到的問題以及解決辦法) [打印本頁]

作者: 1045964948    時間: 2021-10-10 21:32
標(biāo)題: [已解決]51單片機(jī)串口程序問題(在最后說明此次遇到的問題以及解決辦法)
目前需要用到51單片機(jī)串口控制單片機(jī),但是我程序接受發(fā)送都沒有問題,不知道哪里有問題,希望大佬幫助解決一下非常感謝,下面是程序,
  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;                        //設(shè)置為工作方式1
  13.         TMOD=0X20;                        //設(shè)置計數(shù)器工作方式2
  14.         TH1=0XF9;                        
  15.         TL1=0XF9;
  16.         PCON=0x80;
  17.         ES=1;                                                //打開接收中斷
  18.         EA=1;                                                //打開總中斷
  19.         TR1=1;                                        //打開計數(shù)器
  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. }
復(fù)制代碼

波特率是9600


再一次感謝幫助解答我疑問的各位,本人因為不熟悉51單片機(jī)串口,所以在寫串口程序的時候直接將SBUF的數(shù)據(jù)送給一個變量然后拿這個變量去判斷,最后發(fā)現(xiàn)其實單片機(jī)是一位一位發(fā)送的,最后使用   變量&0x0f  解決問題,感謝大家的幫助

作者: 188610329    時間: 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;
        }
作者: wulin    時間: 2021-10-11 06:36
12M晶振加倍用9600波特率高了,誤差太大。改4800或2400即可。
作者: glinfei    時間: 2021-10-11 08:52
  while(1)后面少了分號,能編譯過嗎?
作者: 1045964948    時間: 2021-10-11 16:09
glinfei 發(fā)表于 2021-10-11 08:52
while(1)后面少了分號,能編譯過嗎?

下面有大括號,跟后面帶分號一樣的
作者: 1045964948    時間: 2021-10-11 16:10
wulin 發(fā)表于 2021-10-11 06:36
12M晶振加倍用9600波特率高了,誤差太大。改4800或2400即可。

這個收發(fā)數(shù)據(jù),數(shù)據(jù)回顯沒有問題,因為需要跟藍(lán)牙通信,藍(lán)牙最低9600所以單片機(jī)用的9600
作者: 188610329    時間: 2021-10-11 16:29
? 還沒搞定么?按我說的那樣改依然沒有反應(yīng)么?
作者: 1045964948    時間: 2021-10-11 16:46
188610329 發(fā)表于 2021-10-10 23:41
改兩個地方, 有反映了再討論其他

          switch(temp & 0x03)

你好,根據(jù)你修改的有反應(yīng),目前只有0x01和0x02有反應(yīng),可以反轉(zhuǎn),0x03和0x00只能點(diǎn)亮不能反轉(zhuǎn)
作者: 188610329    時間: 2021-10-11 16:58
1045964948 發(fā)表于 2021-10-11 16:46
你好,根據(jù)你修改的有反應(yīng),目前只有0x01和0x02有反應(yīng),可以反轉(zhuǎn),0x03和0x00只能點(diǎn)亮不能反轉(zhuǎn)

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

你給單片機(jī)發(fā)送的數(shù)據(jù),不是按16進(jìn)制格式發(fā)的吧? 是文本格式吧? 不清楚你電腦用什么軟件發(fā)的,你仔細(xì)看看軟件,應(yīng)該有地方勾選類似“HEX”,如果你是16進(jìn)制格式發(fā)送,應(yīng)該都能翻轉(zhuǎn)。
作者: 1045964948    時間: 2021-10-11 17:10
188610329 發(fā)表于 2021-10-11 16:58
既然如此,我大膽的猜測一下,

你給單片機(jī)發(fā)送的數(shù)據(jù),不是按16進(jìn)制格式發(fā)的吧? 是文本格式吧? 不清 ...

我使用的16進(jìn)制發(fā)送的,根據(jù)您修改的程序只能反轉(zhuǎn)01和02,其他兩個點(diǎn)亮后就不能熄滅了

作者: 1045964948    時間: 2021-10-11 17:29
188610329 發(fā)表于 2021-10-11 16:58
既然如此,我大膽的猜測一下,

你給單片機(jī)發(fā)送的數(shù)據(jù),不是按16進(jìn)制格式發(fā)的吧? 是文本格式吧? 不清 ...

還有可以解釋一下為什么temp&0x03就可以反轉(zhuǎn)了這個沒搞懂,51沒學(xué)精
作者: wulin    時間: 2021-10-11 17:44
1045964948 發(fā)表于 2021-10-11 16:10
這個收發(fā)數(shù)據(jù),數(shù)據(jù)回顯沒有問題,因為需要跟藍(lán)牙通信,藍(lán)牙最低9600所以單片機(jī)用的9600

如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。
作者: 188610329    時間: 2021-10-11 17:51
1045964948 發(fā)表于 2021-10-11 17:29
還有可以解釋一下為什么temp&0x03就可以反轉(zhuǎn)了這個沒搞懂,51沒學(xué)精

你一共 4個選項, 根據(jù)修改后的CASE  0~3 只有4個結(jié)果, 不管你發(fā)的數(shù)據(jù),是什么,只要你的程序正確運(yùn)行了,temp & 0x03  之后,一定能符合 4選一,所以用這個先保證程序沒問題,接下來只要考慮是不是傳輸問題就可以了。
作者: 188610329    時間: 2021-10-11 18:09
1045964948 發(fā)表于 2021-10-11 17:10
我使用的16進(jìn)制發(fā)送的,根據(jù)您修改的程序只能反轉(zhuǎn)01和02,其他兩個點(diǎn)亮后就不能熄滅了

按你說的,發(fā)的16進(jìn)制格式, 回傳也沒有問題,那么,你接收到的應(yīng)該也是16進(jìn)制顯示,不然,0x00~0x1F,在文本狀態(tài)是什么也顯示不了的,那么我問一下:

你程序中:
   xie('a');  
你這個,接受到什么了?
作者: 1045964948    時間: 2021-10-11 23:39
wulin 發(fā)表于 2021-10-11 17:44
如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。

這個傳輸?shù)臄?shù)據(jù)很穩(wěn)定的,就是我發(fā)送一個A就會返回一個A,目前問題應(yīng)該是怎么提取出數(shù)據(jù)的問題
作者: 1045964948    時間: 2021-10-11 23:40
188610329 發(fā)表于 2021-10-11 18:09
按你說的,發(fā)的16進(jìn)制格式, 回傳也沒有問題,那么,你接收到的應(yīng)該也是16進(jìn)制顯示,不然,0x00~0x1F,在 ...

就接收到了一個a,每次按下復(fù)位鍵就可以接收到一個a
作者: 188610329    時間: 2021-10-11 23:58
1045964948 發(fā)表于 2021-10-11 23:40
就接收到了一個a,每次按下復(fù)位鍵就可以接收到一個a

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

所以,如果,你發(fā)16進(jìn)制 0x01, 0x02, 這些數(shù)據(jù)給單片機(jī),又是怎么確認(rèn)成功了回傳呢? 16進(jìn)制數(shù)回傳的話,你上位機(jī)的串口住手壓根看不到任何東西。 所以再和你確認(rèn)一下,你確定你發(fā)送的是16進(jìn)制的 0x01 0x02 去單片機(jī)么??
作者: 1045964948    時間: 2021-10-12 00:25
wulin 發(fā)表于 2021-10-11 17:44
如果必須使用波特率9600那就必須更換晶振11.0592MHz。否則誤差太大不可能正常傳輸信息。

我重新試了一下12mhz,雖然能傳輸正確的指令,但是后面會帶有亂碼,非常感謝你的幫助
作者: 1045964948    時間: 2021-10-12 00:26
188610329 發(fā)表于 2021-10-11 23:58
那么, 說明你上位機(jī)串口助手,接收的是文本,

所以,如果,你發(fā)16進(jìn)制 0x01, 0x02, 這些數(shù)據(jù)給單片 ...

因為我接收a使用的文本,然后發(fā)送再選中的16進(jìn)制發(fā)送顯示
作者: 1045964948    時間: 2021-10-12 00:28
目前用的89c52,之前晶振使用的是12mhz現(xiàn)在使用11.0592mhz就很穩(wěn)了,感謝大家?guī)椭,明天測試和藍(lán)牙通信,如果沒問題的話我回反饋在下面,非常感謝大家能在百忙之中幫我解答疑問




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1