找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2913|回复: 27
收起左侧

求助!51单片机基于串口的简单计算器程序,串口收不到任何东西

[复制链接]
ID:959883 发表于 2021-8-22 22:36 | 显示全部楼层 |阅读模式
10黑币
emmm,利用串口实现简易计算器,例如:在发送窗口输入1+1,接收窗口收到2;

就是这样的计算器,可以加减乘除,好不容易找到一个完整的代码,虽然编译没有错误没有警告;

存在的问题就是:下载了之后接收串口收不到任何东西,刚入门学单片机,不知道是哪里出了问题,

希望路过的大神帮忙看一下,谢谢啦

串口计算器.rar

35.53 KB, 下载次数: 22

代码在这里

最佳答案

查看完整内容

129行是SendData 发送的时候要加"=" 如:1+1= 会传回:1+1=2
回复

使用道具 举报

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没有反接,用能正常发送数据的程序先试一下,然后再做你说的计算器 ...

串口通信是没有问题的,用其他的程序都是可以收到东西的
回复

使用道具 举报

ID:94031 发表于 2021-8-23 14:37 | 显示全部楼层
程序思路有问题,串口接收题目,应该是题目全部接收完再处理,不能接收一个字节处理一下,这样在你处理时对方题目已发送完,你没法接收完全。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:959883 发表于 2021-8-23 15:35 | 显示全部楼层
xuyaqi 发表于 2021-8-23 14:37
程序思路有问题,串口接收题目,应该是题目全部接收完再处理,不能接收一个字节处理一下,这样在你处理时对 ...

好 谢谢 可以说一下具体该怎么改吗?
回复

使用道具 举报

ID:959439 发表于 2021-8-23 15:39 | 显示全部楼层
send_data函数改一下
void send_data(u8 dat)
{
    ES=0;
    SBUF=dat;
    while(!TI);
    TI=0;
}
回复

使用道具 举报

ID:94031 发表于 2021-8-23 16:07 | 显示全部楼层
殇两盏 发表于 2021-8-23 15:35
好 谢谢 可以说一下具体该怎么改吗?

对方发送完题目后应该再发一个结束标志,接收方收到结束标志后再处理。
回复

使用道具 举报

ID:399417 发表于 2021-8-23 16:13 | 显示全部楼层
第一步 flag=0 设置就有问题,根本不会运行程序
回复

使用道具 举报

ID:313048 发表于 2021-8-23 17:14 | 显示全部楼层
殇两盏 发表于 2021-8-23 12:16
串口通信是没有问题的,用其他的程序都是可以收到东西的

那么你现在要考虑的是这个计算程序,你发给他的东西它是否有收到,然后再确认计算完之后是否有发出来,可以用多种方式去测试。
回复

使用道具 举报

ID:959883 发表于 2021-8-24 04:35 | 显示全部楼层
§uperЦser 发表于 2021-8-23 15:39
send_data函数改一下
void send_data(u8 dat)
{

改了,还是不行啊
回复

使用道具 举报

ID:744327 发表于 2021-8-24 08:27 | 显示全部楼层
可能你发的数据没有收到,多发几次试一下。
回复

使用道具 举报

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--),这两句有可能导致死循环了
回复

使用道具 举报

ID:962030 发表于 2021-8-24 09:34 | 显示全部楼层
串口助手查看接收不到任何数据,有几种情况:
1、波特率是否一致;
2、接收中断是否正确;
3、Uart_Isr()中的RI这个参数初始化未见,且if(RI)中你将RI置为0,下一次接收中断来时判断RI,若未在其他地方赋值,就不会进入到if;
4、大问题应该还是if(RI)这儿的问题。需要判断的是定时器是否计数完(是否没有外部数据被接收)。
回复

使用道具 举报

ID:399417 发表于 2021-8-24 16:29 | 显示全部楼层
我调试通过了,程序的问题太多了,很多逻辑上都不对
回复

使用道具 举报

ID:399417 发表于 2021-8-24 16:37 | 显示全部楼层
1.png
回复

使用道具 举报

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. }
复制代码


2021-08-24_175004.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:959883 发表于 2021-8-27 10:10 | 显示全部楼层

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

使用道具 举报

ID:959883 发表于 2021-8-27 10:17 | 显示全部楼层

可以发一下程序参考一下吗?
回复

使用道具 举报

ID:161164 发表于 2021-8-27 10:20 | 显示全部楼层
殇两盏 发表于 2021-8-27 10:10
第一行的while(Huancun!='+'&&Huancun!='-'&&Huancun!='*'&&Huancun!='/')是放在哪里的?

替换原来的
while(Huancun!='+'||Huancun!='-'||Huancun!='*'||Huancun!='/')
回复

使用道具 举报

ID:959883 发表于 2021-8-27 10:23 | 显示全部楼层

你好,你发的void Set_DYGS()函数少了一部分,可以发一下完整的吗?
回复

使用道具 举报

ID:161164 发表于 2021-8-27 10:26 | 显示全部楼层
殇两盏 发表于 2021-8-27 10:23
你好,你发的void Set_DYGS()函数少了一部分,可以发一下完整的吗?

和原本的代码99%一样
只是把u8 改成s8
u8是unsigned char
s8是 char
回复

使用道具 举报

ID:959883 发表于 2021-8-27 10:30 | 显示全部楼层
lkc8210 发表于 2021-8-27 10:26
和原本的代码99%一样
只是把u8 改成s8
u8是unsigned char

好的,请问 Resultbuff 怎么定义的啊
回复

使用道具 举报

ID:161164 发表于 2021-8-27 11:11 | 显示全部楼层
殇两盏 发表于 2021-8-27 10:30
好的,请问 Resultbuff 怎么定义的啊

char Resultbuff[10];
回复

使用道具 举报

ID:959883 发表于 2021-8-27 12:27 | 显示全部楼层

嗯嗯改了,还是收不到。。。我也不知道哪里出了问题,总之还是谢谢你好兄弟
回复

使用道具 举报

ID:161164 发表于 2021-8-27 13:11 | 显示全部楼层
殇两盏 发表于 2021-8-27 12: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. }
复制代码
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表