找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc8g单片机串口接收数据乱码是为什么呢

[复制链接]
跳转到指定楼层
楼主
单片机是stc8g1k08a,程序用的是一位大佬分享的,单片机直接和电脑usb连接,isp发送一个数据到单片机,就能接收到0-65536,但是接收到的是一样的数据。频率设置成30MHz,波特率是9600。是我哪里没有设置好吗,还是硬件这样子连会有干扰呢



//使用STC-ISP软件的串口助手显示,波特率9600,需要自动发送一个字符。文本模式接收显示 0~65535
typedef unsigned char         u8;
typedef unsigned short         u16;
u8 code ASCII[16]={"0123456789ABCDEF"};

#include "STC8.H"                                        //选择头文件,单片机STC8                                                                                 
                                       
#define FOSC 30000000UL                                /设置系统频率,30M

u16 xdata Uart1_Byte[3]={0x5a9b,0xFFED,0x55};/需要打印的变量
bit Uart1_Flag=0;                                        /这个标志位写1 就开始打印

//串口初始化,根据设计需要,波特率来源选择:定时器1、定时器2、BRT独立波特率,以下配置都是12分频。
void Uart1_Init()
{               
        AUXR&=0xBF;                                                //定时器T1(16位自装),STC15/STC8,定时器时钟12T模式
        AUXR&=0xFE;                                                //定时器T1(16位自装),STC15/STC8,串口1选择定时器1为波特率发生器
        TMOD&=0x0F;                                                /定时器T1(16位自装),STC15/STC8,设置定时器模式16位自动重装
        TL1=(65536-FOSC/9600/4/12);                //定时器T1(16位自装),STC15/STC8,设置定时初始值
        TH1=(65536-FOSC/9600/4/12)>>8;        //定时器T1(16位自装),STC15/STC8,设置定时初始值
        ET1=0;                                                        //定时器T1(16位自装),STC15/STC8,不需要定时器1的中断
        TR1=1;//*/                                                //定时器T1(16位自装),STC15/STC8,定时器1开始计时

        //以下代码,这三行是必须的。
        SCON|=0x50;                                                //8位数据,可变波特率。
        ES = 1;                                                        //串口1中断闸刀闭合,向CPU申请中断。
        EA=1;                                                        //总中断闸刀闭合导通。
}


//串口发送函数。主函数调用,或者串口发送完中断后马上调用
void Uart1_Up_Data_Drive()
{
        static u8 xdata count=0;
        if(Uart1_Flag)                                        //标志允许,发送一个字节
        {
                Uart1_Flag=0;                                //标志位翻转,只允许发送一个字节
                count++;                                        //字节编号增加。
                switch(count)                                                                                                //打印成十六进制显示
                {
                        case 1 : SBUF='\r';break;                                                                // 回车
                        case 2 : SBUF='\n';break;                                                                // 换行
                        case 3 : SBUF='0';break;                                                                // 0
                        case 4 : SBUF='x';break;                                                                // x         
                        case 5 : SBUF=ASCII[Uart1_Byte[0]/256/16];break;                //字节0
                        case 6 : SBUF=ASCII[Uart1_Byte[0]/256%16];break;                //字节0
                        case 7 : SBUF=ASCII[Uart1_Byte[0]%256/16];break;                //字节0
                        case 8 : SBUF=ASCII[Uart1_Byte[0]%256%16];break;                //字节0
                        case 9 : SBUF=' ';break;                                                                // 空格
                        
                        case 10 : SBUF='0';break;                                                                // 0
                        case 11 : SBUF='x';break;                                                                // x         
                        case 12 : SBUF=ASCII[Uart1_Byte[1]/256/16];break;                //字节1
                        case 13 : SBUF=ASCII[Uart1_Byte[1]/256%16];break;                //字节1
                        case 14 : SBUF=ASCII[Uart1_Byte[1]%256/16];break;                //字节1
                        case 15 : SBUF=ASCII[Uart1_Byte[1]%256%16];break;                //字节1
                        case 16 : SBUF=' ';break;                                                                // 空格
                        
                        case 17 : SBUF='0';break;                                                                // 0
                        case 18 : SBUF='x';break;                                                                // x         
                        case 19 : SBUF=ASCII[Uart1_Byte[2]/256/16];break;                //字节2
                        case 20 : SBUF=ASCII[Uart1_Byte[2]/256%16];break;                //字节2
                        case 21 : SBUF=ASCII[Uart1_Byte[2]%256/16];break;                //字节2
                        case 22 : SBUF=ASCII[Uart1_Byte[2]%256%16];break;                //字节2
                        case 23 :count=0;break;//最后一步 没有发送字节,串口TI不会置1,所以不再发送
                }
        }
}
//串口中断,接收一个字节,马上发送N个字节,发送数组显示到电脑
void Uart1_Routine() interrupt 4
{
        static char Uart1_ser_n=0;                //用于接收计数
        if(RI)                                                        //如果接收到一个字节
        {
                RI=0;                                                //标志位清除
                Uart1_Flag=1;                                //串口发送允许
                if(SBUF==0x7f)                                //最低波特率9600,最高波特率9600,判断连续多个0x7f
                {
                        Uart1_ser_n++;                        //判断连续多个0x7f
                        if(Uart1_ser_n>=10)                //判断连续多个0x7f
                        {
                                Uart1_ser_n=0;                //清0
                                IAP_CONTR|=0xe0;        //执行自动软复位,可以做调试用,STC12、STC15、STC8
                                //ISP_CONTR|=0xe0;        //执行自动软复位,可以做调试用,STC89
                        }
                }
                else
                {
                        Uart1_ser_n=0;
                }
        }
        if(TI)                                                        //如果上一个字节发送完成了        
        {
                TI=0;                                                //标志位清除
                Uart1_Flag=1;                                //串口发送允许
                Uart1_Up_Data_Drive();                //执行串口发送下一个字节
        }
}

void Uart1_Allot()
{
        static u16 idata count;
        count++;
        if(count>50000)
        {
                count=0;
                Uart1_Flag=1;
        }
}

void main()
{
        Uart1_Init();
        while(1)
        {
                Uart1_Up_Data_Drive();
                Uart1_Allot();
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2025-4-16 16:51 | 只看该作者
我也用这个下载工具,但是为何我这里没有显示串口?
回复

使用道具 举报

板凳
ID:624769 发表于 2025-4-16 18:04 | 只看该作者
哪里乱码了? 看截图,不是正确打印了么?

u16 xdata Uart1_Byte[3]={0x5a9b,0xFFED,0x55};/需要打印的变量
完全一样不是么?
回复

使用道具 举报

地板
ID:1076567 发表于 2025-4-17 09:18 | 只看该作者
xiaobendan001 发表于 2025-4-16 16:51
我也用这个下载工具,但是为何我这里没有显示串口?

是扫描串口没显示到吗,这个下载工具一插到电脑上就会显示出来,没显示的话你按手册里制作USB-Link1D主控芯片的步骤试一下
回复

使用道具 举报

5#
ID:1076567 发表于 2025-4-17 09:31 | 只看该作者
188610329 发表于 2025-4-16 18:04
哪里乱码了? 看截图,不是正确打印了么?

u16 xdata Uart1_Byte[3]={0x5a9b,0xFFED,0x55};/需要打印的变量 ...

嗷嗷是这样的啊,那请问一下代码中的0、x是什么呀,我看接收数据的时候都没显示出来,一直重复那行变量
回复

使用道具 举报

6#
ID:1034262 发表于 2025-4-17 16:18 | 只看该作者
Dokkis 发表于 2025-4-17 09:31
嗷嗷是这样的啊,那请问一下代码中的0、x是什么呀,我看接收数据的时候都没显示出来,一直重复那行变量

编程最基本的知识也不具备?0x表示是十六进制数据
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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