1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3509|回復: 6
收起左側(cè)

STC51單片機為啥向PC發(fā)送漢字會出現(xiàn)亂碼?

[復制鏈接]
ID:609989 發(fā)表于 2019-9-10 16:45 | 顯示全部樓層 |閱讀模式
程序:(這是網(wǎng)上下載的,剛開始我的程序也這樣,排查不出來原因,直接在網(wǎng)上下載了一個,還是這樣,求大神指點。_下面還有串口接收的信息。)
//#include <reg52.h>
#include <stdio.h>
#include <stc89.h>

#define uint unsigned int
#define uchar unsigned char


//毫秒級延時函數(shù)定義
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;//發(fā)送請求標志位
                puts("大家好!歡迎學習單片機");//發(fā)送的漢字
                while(!TI);//判斷是否發(fā)送完成  發(fā)送完成出循環(huán)
                TI = 0;
                delay(1000);//延遲1秒
        }        
}
串口接收內(nèi)容:
大家好!歡?暗テ?
大家好!歡迎學習單片??
大家好!歡迎學習單片機
大家好!歡迎學習單片機
大家?茫』隊暗テ?機


回復

使用道具 舉報

ID:351097 發(fā)表于 2019-9-10 17:04 | 顯示全部樓層
你這個函數(shù)時無法打印漢字的,需要自己搞個printf函數(shù),我這里有參考的程序
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
/**********************************************
名稱:Uart_write
功能:串口發(fā)送函數(shù)
參數(shù):*pBuf--> 待發(fā)送數(shù)據(jù)指針          len-->數(shù)據(jù)長度
返回:void
**********************************************/
void Uart_write(uint8 *pBuf,int ulLen)
{
        int i;
    for(i = 0; i < ulLen; i++)
    {
       SBUF=*pBuf;  //數(shù)據(jù)加載到發(fā)送緩沖區(qū)
       while(!TI);  //等待發(fā)送完成         
           TI=0;                //發(fā)送標志清零
           pBuf++;     //數(shù)據(jù)指針指向下一組數(shù)據(jù)
    }
}
/*********************************************
名稱:printfs
功能:類似printf串口打印函數(shù)(采用數(shù)組緩存數(shù)據(jù))
參數(shù):fmt-->不定參數(shù)標志位。如%d,%s等
返回:發(fā)送數(shù)據(jù)長度
注意:在IAR平臺正常使用;
但在keil平臺,如果輸出為以下類型,需要改為動,否則數(shù)據(jù)不正常。
顯示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;
}
然后初始化串口后,直接調(diào)用printfs函數(shù):比如printfs("大家好!\r\n");
回復

使用道具 舉報

ID:593646 發(fā)表于 2019-9-10 17:16 | 顯示全部樓層
51單片機串口發(fā)送應該要用到sbuf吧
回復

使用道具 舉報

ID:275826 發(fā)表于 2019-9-10 18:07 | 顯示全部樓層
程序沒錯,估計是硬件,比如晶振不對,地線沒接好的原因吧
回復

使用道具 舉報

ID:609989 發(fā)表于 2019-9-11 08:33 | 顯示全部樓層
恩,謝謝大家,已經(jīng)解決,給大家分享下原因,我使用keil_5,補丁了一個“keil+漢字+FD補丁”,就OK啦。
1.謝謝1樓的幫助。
2.二樓說的SBUF,我也使用過,是PC或者上位機發(fā)送指令字節(jié),printf & puts我是發(fā)送漢字,都可以使用,自己習慣,但是使用printf & puts得需要#include <stdio.h>。
回復

使用道具 舉報

ID:123289 發(fā)表于 2019-9-11 22:22 | 顯示全部樓層
發(fā)送函數(shù)是引用它人的,未知道應用時是有限制條件的。
回復

使用道具 舉報

ID:537172 發(fā)表于 2020-5-25 15:21 | 顯示全部樓層
用了樓主的程序,發(fā)現(xiàn)在我這是可行的。
網(wǎng)上找到的其他的一些程序在我這會顯示部分亂碼或者多出一些字。還沒找到問題所在。
學習了。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表