找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6661|回复: 6
打印 上一主题 下一主题
收起左侧

51单片机串口接受数据有乱码

[复制链接]
跳转到指定楼层
楼主
各位大佬,一个简单的串口发送程序,代码如下
  1. void main()
  2. {
  3.    UartInit();
  4.    while(1)
  5.    {
  6.          UsartSend(12345);
  7.          Delay_ms(1000);
  8.    }
  9. }

  10. void UartInit(void)                //4800bps@11.0592MHz
  11. {
  12.         PCON |= 0x80;                //使能波特率倍速位SMOD
  13.         SCON = 0x50;                //8位数据,可变波特率
  14.         TMOD &= 0x0F;                //清除定时器1模式位
  15.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  16.         TL1 = 0xF4;                //设定定时初值
  17.         TH1 = 0xF4;                //设定定时器重装值
  18.         ET1 = 0;                //禁止定时器1中断
  19.         TR1 = 1;                //启动定时器1
  20. }

  21. void UsartSend(int temp)
  22. {
  23.   u8 i;
  24.   SendTemp[6]=temp / 10000 + 48;                         //百位
  25.   SendTemp[5]=temp % 10000 / 1000 + 48;                 //十位
  26.   SendTemp[4]=temp % 1000 / 100 + 48;                 //个位
  27.   SendTemp[3]='.';
  28.   SendTemp[2]=temp % 100 / 10 + 48;                         //十分位
  29.   SendTemp[1]=temp % 10 + 48;                                 //百分位
  30.   SendTemp[0]='\n' ;

  31.   for(i=6;i>=0;i--)
  32.   {
  33.        if(!TI)
  34.            {
  35.        SBUF=SendTemp[i];
  36.            while(!TI);                                   //等待发送完成
  37.            TI=0;
  38.            }
  39.   }
  40. }
复制代码

串口接收到的数据如下,怎么会有乱码呢
123.45

QQ截图20170914210515.png (25.47 KB, 下载次数: 58)

QQ截图20170914210515.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:158375 发表于 2017-9-15 09:53 | 只看该作者
你用的是多少 Mhz 的晶体呢?
估计是波特率不合适。
回复

使用道具 举报

板凳
ID:158375 发表于 2017-9-15 09:58 | 只看该作者
你看一下波特率,包括串口助手
回复

使用道具 举报

地板
ID:233291 发表于 2017-9-15 12:43 | 只看该作者

重写了完整的代码,试一下

本帖最后由 STCSTC 于 2017-9-15 13:01 编辑

#include<reg51.h>
unsigned char SendTemp[7];


void UartInit(void)                //4800bps@11.0592MHz
{
     TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFA;
    TL1 = TH1;
    PCON = 0x00;
    TR1 = 1;
}

void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 180;
        j = 73;
        do
        {
                while (--j);
        } while (--i);
}


void UsartSend(unsigned int temp)
{
  unsigned char i;
  SendTemp[0]=temp/10000 + 48;                         //百位
  SendTemp[1]=temp % 10000 / 1000 + 48;                 //十位
  SendTemp[2]=temp % 1000 / 100 + 48;                 //个位
  SendTemp[3]='.';
  SendTemp[4]=temp % 100 / 10 + 48;                         //十分位
  SendTemp[5]=temp % 10 + 48;                                 //百分位
  SendTemp[6]='\n';

  for(i=0;i<7;i++)
  {

       SBUF=SendTemp;
           while(!TI);                                   //等待发送完成
           TI=0;

  }
}

void main()
{
   UartInit();
   while(1)
   {
      UsartSend(12345);
     Delay100ms();
   }
}

串口发送.JPG (15.48 KB, 下载次数: 57)

串口发送.JPG
回复

使用道具 举报

5#
ID:197626 发表于 2017-9-15 15:16 | 只看该作者
笨笨兔 发表于 2017-9-15 09:58
你看一下波特率,包括串口助手

晶振是11.0592MHz,波特率4800
回复

使用道具 举报

6#
ID:197626 发表于 2017-9-15 15:36 | 只看该作者
STCSTC 发表于 2017-9-15 12:43
#include
unsigned char SendTemp[7];

谢谢大佬,看了你的程序后,我就把for循环改了一下,把for(i=6;i>=0;i--)改成了for(i=0;i<7;i++)然后就能正确就收数据了,但是我还是不明白,这两个明显是一个意思呀,为什么结果却不同呢
回复

使用道具 举报

7#
ID:117433 发表于 2017-9-21 11:22 | 只看该作者
有乱码是正常的,只要不是每次都是乱码,我的经验就是,在发送端把要发的数据*2发送,然后在接收断做个判断,错的就直接舍去,然后就留下没有乱码的了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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