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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助!51單片機基于串口的簡單計算器程序,串口收不到任何東西

[復制鏈接]
跳轉到指定樓層
樓主
10黑幣
emmm,利用串口實現簡易計算器,例如:在發送窗口輸入1+1,接收窗口收到2;

就是這樣的計算器,可以加減乘除,好不容易找到一個完整的代碼,雖然編譯沒有錯誤沒有警告;

存在的問題就是:下載了之后接收串口收不到任何東西,剛入門學單片機,不知道是哪里出了問題,

希望路過的大神幫忙看一下,謝謝啦

串口計算器.rar

35.53 KB, 下載次數: 22

代碼在這里

最佳答案

查看完整內容

129行是SendData 發送的時候要加"=" 如:1+1= 會傳回:1+1=2
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2021-8-22 22:36 | 只看該作者

129行是SendData

發送的時候要加"="
如:1+1=
會傳回:1+1=2
回復

使用道具 舉報

板凳
ID:313048 發表于 2021-8-23 08:55 | 只看該作者
你先解決串口通信試試,看看是不是TX和RX沒有反接,用能正常發送數據的程序先試一下,然后再做你說的計算器啥的。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:959883 發表于 2021-8-23 12:16 | 只看該作者
AUG 發表于 2021-8-23 08:55
你先解決串口通信試試,看看是不是TX和RX沒有反接,用能正常發送數據的程序先試一下,然后再做你說的計算器 ...

串口通信是沒有問題的,用其他的程序都是可以收到東西的
回復

使用道具 舉報

5#
ID:94031 發表于 2021-8-23 14:37 | 只看該作者
程序思路有問題,串口接收題目,應該是題目全部接收完再處理,不能接收一個字節處理一下,這樣在你處理時對方題目已發送完,你沒法接收完全。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:959883 發表于 2021-8-23 15:35 | 只看該作者
xuyaqi 發表于 2021-8-23 14:37
程序思路有問題,串口接收題目,應該是題目全部接收完再處理,不能接收一個字節處理一下,這樣在你處理時對 ...

好 謝謝 可以說一下具體該怎么改嗎?
回復

使用道具 舉報

7#
ID:959439 發表于 2021-8-23 15:39 | 只看該作者
send_data函數改一下
void send_data(u8 dat)
{
    ES=0;
    SBUF=dat;
    while(!TI);
    TI=0;
}
回復

使用道具 舉報

8#
ID:94031 發表于 2021-8-23 16:07 | 只看該作者
殤兩盞 發表于 2021-8-23 15:35
好 謝謝 可以說一下具體該怎么改嗎?

對方發送完題目后應該再發一個結束標志,接收方收到結束標志后再處理。
回復

使用道具 舉報

9#
ID:399417 發表于 2021-8-23 16:13 | 只看該作者
第一步 flag=0 設置就有問題,根本不會運行程序
回復

使用道具 舉報

10#
ID:313048 發表于 2021-8-23 17:14 | 只看該作者
殤兩盞 發表于 2021-8-23 12:16
串口通信是沒有問題的,用其他的程序都是可以收到東西的

那么你現在要考慮的是這個計算程序,你發給他的東西它是否有收到,然后再確認計算完之后是否有發出來,可以用多種方式去測試。
回復

使用道具 舉報

11#
ID:959883 發表于 2021-8-24 04:35 | 只看該作者
§uperЦser 發表于 2021-8-23 15:39
send_data函數改一下
void send_data(u8 dat)
{

改了,還是不行啊
回復

使用道具 舉報

12#
ID:744327 發表于 2021-8-24 08:27 | 只看該作者
可能你發的數據沒有收到,多發幾次試一下。
回復

使用道具 舉報

13#
ID:878061 發表于 2021-8-24 08:33 | 只看該作者
你把這句        for(i=lenths2-1;i>=0;i--)改成        for(i=lenths2-1;i>0;i--),把for(i=lenths1-1;i>=0;i--)這句改成for(i=lenths1-1;i>0;i--),這兩句有可能導致死循環了
回復

使用道具 舉報

14#
ID:962030 發表于 2021-8-24 09:34 | 只看該作者
串口助手查看接收不到任何數據,有幾種情況:
1、波特率是否一致;
2、接收中斷是否正確;
3、Uart_Isr()中的RI這個參數初始化未見,且if(RI)中你將RI置為0,下一次接收中斷來時判斷RI,若未在其他地方賦值,就不會進入到if;
4、大問題應該還是if(RI)這兒的問題。需要判斷的是定時器是否計數完(是否沒有外部數據被接收)。
回復

使用道具 舉報

15#
ID:399417 發表于 2021-8-24 16:29 | 只看該作者
我調試通過了,程序的問題太多了,很多邏輯上都不對
回復

使用道具 舉報

16#
ID:399417 發表于 2021-8-24 16:37 | 只看該作者

回復

使用道具 舉報

17#
ID:161164 發表于 2021-8-24 17:50 | 只看該作者
  1. while(Huancun[i]!='+'&&Huancun[i]!='-'&&Huancun[i]!='*'&&Huancun[i]!='/')//<<<<<<<<<<<要用&&,不然會死循環

  2. void Set_DYGS()
  3. {
  4.     u16 linyuhan=1;
  5.     s8 i;//<<<<<<<<<<<<<要用有符號類型,不然在i等于零時i--會溢出變255,令下邊的for進入死循環
  6.     num1=0;
  7.     for(i=lenths1-1; i>=0; i--)


  8. void Set_DEGS()
  9. {
  10.     u16 linyuhan=1;
  11.     s8 i;//<<<<<<<<<<<<<同上
  12.     num2=0;
  13.     for(i=lenths2-1; i>=0; i--)


  14. void Uart_Isr() interrupt 4
  15. {
  16.     if(RI)
  17.     {
  18.         RI=0;
  19.         //TR0=1;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  20.         //hymm=0;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  21.         Huancun[lenths++]=SBUF;
  22.         if(SBUF == '=')flag=1;//<<<<<<<<<<<<<改用"="號來決定開始計算,而不是延時檢測輸入
  23.     }
  24. }



  25. void Printg()
  26. {
  27.     u8 i;
  28.     for(i=0; i<lenths; i++)
  29.     {
  30.         SendData(Huancun[i]);//<<<<<<<<<<<<<<原代碼只會傳回輸入的公式
  31.     }
  32.     lenths=0;
  33.     sprintf(Resultbuff,"%u\r\n",results);//<<<<<<<<<<<<<<用"stdio.h"的sprintf把result轉換為字符串
  34.     for(i=0; i<strlen(Resultbuff); i++)//<<<<<<<<<<<<<<用"string.h"的strlen檢測Resultbuff的長度
  35.     {
  36.         SendData(Resultbuff[i]);//<<<<<<<<<<<<<<
  37.     }
  38. }
復制代碼




評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

18#
ID:959883 發表于 2021-8-27 10:10 | 只看該作者

第一行的while(Huancun!='+'&&Huancun!='-'&&Huancun!='*'&&Huancun!='/')是放在哪里的?
回復

使用道具 舉報

19#
ID:959883 發表于 2021-8-27 10:17 | 只看該作者

可以發一下程序參考一下嗎?
回復

使用道具 舉報

20#
ID:161164 發表于 2021-8-27 10:20 | 只看該作者
殤兩盞 發表于 2021-8-27 10:10
第一行的while(Huancun!='+'&&Huancun!='-'&&Huancun!='*'&&Huancun!='/')是放在哪里的?

替換原來的
while(Huancun!='+'||Huancun!='-'||Huancun!='*'||Huancun!='/')
回復

使用道具 舉報

21#
ID:959883 發表于 2021-8-27 10:23 | 只看該作者

你好,你發的void Set_DYGS()函數少了一部分,可以發一下完整的嗎?
回復

使用道具 舉報

22#
ID:161164 發表于 2021-8-27 10:26 | 只看該作者
殤兩盞 發表于 2021-8-27 10:23
你好,你發的void Set_DYGS()函數少了一部分,可以發一下完整的嗎?

和原本的代碼99%一樣
只是把u8 改成s8
u8是unsigned char
s8是 char
回復

使用道具 舉報

23#
ID:959883 發表于 2021-8-27 10:30 | 只看該作者
lkc8210 發表于 2021-8-27 10:26
和原本的代碼99%一樣
只是把u8 改成s8
u8是unsigned char

好的,請問 Resultbuff 怎么定義的啊
回復

使用道具 舉報

24#
ID:161164 發表于 2021-8-27 11:11 | 只看該作者
殤兩盞 發表于 2021-8-27 10:30
好的,請問 Resultbuff 怎么定義的啊

char Resultbuff[10];
回復

使用道具 舉報

25#
ID:959883 發表于 2021-8-27 12:27 | 只看該作者

嗯嗯改了,還是收不到。。。我也不知道哪里出了問題,總之還是謝謝你好兄弟
回復

使用道具 舉報

26#
ID:161164 發表于 2021-8-27 13:11 | 只看該作者
殤兩盞 發表于 2021-8-27 12:27
嗯嗯改了,還是收不到。。。我也不知道哪里出了問題,總之還是謝謝你好兄弟

把改完的代碼發上來看看
回復

使用道具 舉報

27#
ID:959883 發表于 2021-8-27 13:22 | 只看該作者
lkc8210 發表于 2021-8-27 13:11
把改完的代碼發上來看看
  1. #include <reg52.h>
  2. #include "string.h"
  3. #include "stdio.h"
  4. #include <intrins.h>



  5. #define u8 unsigned char
  6. #define s8  char
  7. #define u16 unsigned int
  8. u8 Huancun[16];//»o′棬óÃóú′¢′æò»′ó¶ÑμÄêy¾Y
  9. u8 DYGS[5];//μúò»¸öêyμÄêy×é
  10. u8 DEGS[5];//μú¶t¸öêyμÄêy×é
  11. u8 ENDGO[5];//½á1ûêy×é
  12. char Resultbuff[10];
  13. u8 Cal;//CalÎa¼ÆËãêyÖμ 1¼ó2¼õ33Ë43y
  14. u8 lenths1,lenths2;//lenths1Îaμúò»¸öêyμÄ3¤¶è  lenths2Îaμú¶t¸öêyμÄ3¤¶è
  15. u16 num1,num2;//ὸöêyμÄêμ¼êÖμ
  16. u16 results;//¼ÆËã½á1û
  17. u8 hymm;
  18. u8 lenths=0;
  19. bit flag=0;

  20. void Timer0Init();  //200usÑóê±¶¨ê±Æ÷1
  21. void Divide_Str();
  22. void Set_DYGS();
  23. void Set_DEGS();
  24. void Calculate();
  25. void Printg();
  26. void SendData(u8 dat);
  27. void UartInit(void);                //9600bps@11.0592MHz

  28. void main()
  29. {
  30.         Timer0Init();
  31.         UartInit();
  32.         while(1)
  33.         {
  34.                 if(flag)
  35.                 {
  36.                         flag=0;
  37.                
  38. Divide_Str();
  39.                 Set_DYGS();
  40.         Set_DEGS();
  41.         Calculate();
  42.                         Printg();//·¢Ëí½á1ûμ½μçÄÔ′®¿úéÏ
  43.                 }
  44.         }
  45. }

  46. void Divide_Str()
  47. {
  48.         u8 i=0;
  49.         lenths1=0;
  50.         lenths2=0;
  51.         while(Huancun[i]!=0x2B&&Huancun[i]!='+'&&Huancun[i]!='-'&&Huancun[i]!='*'&&Huancun[i]!='/')
  52.         {
  53.                 DYGS[lenths1]=Huancun[i]-0x30;
  54.                 lenths1++;
  55.                 i++;
  56.         }
  57.         switch(Huancun[i])
  58.         {
  59.                 case '+':Cal=1;break;
  60.                 case '-':Cal=2;break;
  61.                 case '*':Cal=3;break;
  62.                 case '/':Cal=4;break;
  63.         }
  64.         i++;
  65.         while(Huancun[i]!= '=')
  66.         {
  67.                 DEGS[lenths2]=Huancun[i]-0x30;
  68.                 lenths2++;
  69.                 i++;
  70.         }
  71. }
  72.        
  73. void Set_DYGS()
  74. {
  75.     u16 linyuhan=1;
  76.     s8 i;
  77.     num1=0;
  78.     for(i=lenths1-1; i>=0; i--)
  79.         {
  80.                 num1+=linyuhan*DYGS[i];
  81.                 linyuhan*=10;
  82.         }
  83. }

  84. void Set_DEGS()
  85. {
  86.     u16 linyuhan=1;
  87.     s8 i;
  88.     num2=0;
  89.     for(i=lenths2-1; i>=0; i--)
  90.         {
  91.                 num2+=linyuhan*DEGS[i];
  92.                 linyuhan*=10;
  93.         }
  94. }

  95. void Calculate()
  96. {
  97.         switch(Cal)
  98.         {
  99.                 case 1:results=num1+num2;break;
  100.                 case 2:results=num1-num2;break;
  101.                 case 3:results=num1*num2;break;
  102.                 case 4:results=num1/num2;break;
  103.         }
  104. }

  105. void Printg()
  106. {
  107.     u8 i;
  108.     for(i=0; i<lenths; i++)
  109.     {
  110.         SendData(Huancun[i]);
  111.     }
  112.     lenths=0;
  113.     sprintf(Resultbuff,"%u\r\n",results);
  114.     for(i=0; i<strlen(Resultbuff); i++)
  115.     {
  116.         SendData(Resultbuff[i]);
  117.     }
  118. }

  119. void send_data(u8 dat)
  120. {
  121.    
  122.     SBUF=dat;
  123.     while(!TI);
  124.     TI=0;
  125. }


  126. void UartInit(void)                //9600bps@11.0592MHz
  127. {
  128.         PCON &= 0x7F;                //2¨ìØÂê2»±¶Ëù
  129.         SCON = 0x50;                //8λêy¾Y,¿é±ä2¨ìØÂê
  130.         TMOD &= 0x0F;                //Çå3y¶¨ê±Æ÷1Ä£ê½Î»
  131.         TMOD |= 0x20;                //é趨¶¨ê±Æ÷1Îa8λ×Ô¶ˉ֨װ·½ê½
  132.         TL1 = 0xFD;                //é趨¶¨ê±3õÖμ
  133.         TH1 = 0xFD;                //é趨¶¨ê±Æ÷֨װÖμ
  134.         ET1 = 0;                //½ûÖ1¶¨ê±Æ÷1ÖD¶Ï
  135.         TR1 = 1;                //Æô¶ˉ¶¨ê±Æ÷1
  136.         ES=1;
  137.         EA=1;
  138. }

  139. void Timer0Init()  //200usÑóê±¶¨ê±Æ÷1
  140. {
  141.         TMOD &= 0xF0;                //éèÖö¨ê±Æ÷Ä£ê½
  142.         TMOD |= 0x02;                //éèÖö¨ê±Æ÷Ä£ê½
  143.         TL0 = 0x48;                //éèÖö¨ê±3õÖμ
  144.         TH0 = 0x48;                //éèÖö¨ê±ÖØÔØÖμ
  145.         TF0 = 0;                //Çå3yTF0±êÖ¾
  146.         TR0 = 0;                //¶¨ê±Æ÷0¿aê¼¼Æê±       
  147.         ET0        =        1;
  148. }


  149. void Timer0() interrupt 1
  150. {
  151.         hymm++;
  152.         if(hymm==100)
  153.         {
  154.                 hymm=0;
  155.                 flag=1;
  156.                 TR0=0;
  157.         }
  158. }

  159. void Uart_Isr() interrupt 4
  160. {
  161.     if(RI)
  162.     {
  163.         RI=0;
  164.    
  165.         Huancun[lenths++]=SBUF;
  166.         if(SBUF == '=')flag=1;
  167.     }
  168. }
復制代碼
回復

使用道具 舉報

28#
ID:959883 發表于 2021-8-27 15:26 | 只看該作者
lkc8210 發表于 2021-8-22 22:36
129行是SendData

發送的時候要加"="

好的,謝謝了終于成功了,我會繼續理解代碼,謝謝兄弟這么有耐心為我解決!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91免费福利视频 | 免费观看av网站 | 日本一区高清 | 日韩视频在线免费观看 | 国产精品久久国产精品 | 龙珠z在线观看 | 国产在线视频一区二区董小宛性色 | 午夜国产精品视频 | 免费在线成人 | 亚洲国产精品日韩av不卡在线 | 韩日在线视频 | 在线中文视频 | 欧美一级二级在线观看 | 日韩免费在线 | 午夜久久久久久久久久一区二区 | 91精品国产乱码麻豆白嫩 | 人人干人人爽 | 亚洲国产精品一区二区久久 | 午夜影院视频在线观看 | www国产成人免费观看视频,深夜成人网 | 福利av在线 | 91在线免费视频 | 欧美国产日韩成人 | 精品欧美乱码久久久久久 | 久久国产精品一区二区三区 | 天堂在线中文 | 国产成人在线视频免费观看 | 欧美 日韩 国产 在线 | 久久免费精品视频 | 狠狠干在线 | 美女中文字幕视频 | 国产专区免费 | 在线国产视频 | 久久久久久国产精品免费免费 | 国产精品久久久乱弄 | 在线精品一区二区 | 国产综合视频 | 日韩乱码一二三 | 国产日韩亚洲欧美 | 在线综合视频 | 9色网站|