找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC51单片机为啥向PC发送汉字会出现乱码?

[复制链接]
跳转到指定楼层
楼主
ID:609989 发表于 2019-9-10 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序:(这是网上下载的,刚开始我的程序也这样,排查不出来原因,直接在网上下载了一个,还是这样,求大神指点。_下面还有串口接收的信息。)
//#include <reg52.h>
#include <stdio.h>
#include <stc89.h>

#define uint unsigned int
#define uchar unsigned char


//毫秒级延时函数定义
void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);                 
}


//串口初始化
void UARTInit()
{
        SM0 = 0;        SM1 = 1;//串口工作方式1,8位UART波特率可变
        TR1 = 1;//启动定时器1
        TMOD = 0x20;//定时器1,工作模式2 8位自动重装
        TH1 = 0xfd;
        TL1 = 0xfd;//设置比特率9600
}


void main()
{
        UARTInit(); //串口初始化
        while(1)
        {
                TI = 1;//发送请求标志位
                puts("大家好!欢迎学习单片机");//发送的汉字
                while(!TI);//判断是否发送完成  发送完成出循环
                TI = 0;
                delay(1000);//延迟1秒
        }        
}
串口接收内容:
大家好!欢?暗テ?
大家好!欢迎学习单片??
大家好!欢迎学习单片机
大家好!欢迎学习单片机
大家?茫』队暗テ?机


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

使用道具 举报

沙发
ID:351097 发表于 2019-9-10 17:04 | 只看该作者
你这个函数时无法打印汉字的,需要自己搞个printf函数,我这里有参考的程序
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
/**********************************************
名称:Uart_write
功能:串口发送函数
参数:*pBuf--> 待发送数据指针          len-->数据长度
返回:void
**********************************************/
void Uart_write(uint8 *pBuf,int ulLen)
{
        int i;
    for(i = 0; i < ulLen; i++)
    {
       SBUF=*pBuf;  //数据加载到发送缓冲区
       while(!TI);  //等待发送完成         
           TI=0;                //发送标志清零
           pBuf++;     //数据指针指向下一组数据
    }
}
/*********************************************
名称:printfs
功能:类似printf串口打印函数(采用数组缓存数据)
参数:fmt-->不定参数标志位。如%d,%s等
返回:发送数据长度
注意:在IAR平台正常使用;
但在keil平台,如果输出为以下类型,需要改为动,否则数据不正常。
显示long类型 %d ===> %ld
显示char类型 %d ===> %bd

*********************************************/

int printfs(char*fmt,...)
{  
    char  pBuf[50];
    int ulen;
    va_list ap;
    va_start(ap, fmt);
    ulen = vsprintf(pBuf, fmt, ap);
        va_end(ap);
        Uart_write((uint8*)pBuf, ulen);
    return ulen;
}
然后初始化串口后,直接调用printfs函数:比如printfs("大家好!\r\n");
回复

使用道具 举报

板凳
ID:593646 发表于 2019-9-10 17:16 | 只看该作者
51单片机串口发送应该要用到sbuf吧
回复

使用道具 举报

地板
ID:275826 发表于 2019-9-10 18:07 | 只看该作者
程序没错,估计是硬件,比如晶振不对,地线没接好的原因吧
回复

使用道具 举报

5#
ID:609989 发表于 2019-9-11 08:33 | 只看该作者
恩,谢谢大家,已经解决,给大家分享下原因,我使用keil_5,补丁了一个“keil+汉字+FD补丁”,就OK啦。
1.谢谢1楼的帮助。
2.二楼说的SBUF,我也使用过,是PC或者上位机发送指令字节,printf & puts我是发送汉字,都可以使用,自己习惯,但是使用printf & puts得需要#include <stdio.h>。
回复

使用道具 举报

6#
ID:123289 发表于 2019-9-11 22:22 | 只看该作者
发送函数是引用它人的,未知道应用时是有限制条件的。
回复

使用道具 举报

7#
ID:537172 发表于 2020-5-25 15:21 | 只看该作者
用了楼主的程序,发现在我这是可行的。
网上找到的其他的一些程序在我这会显示部分乱码或者多出一些字。还没找到问题所在。
学习了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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