找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机开发板UART通讯错误

[复制链接]
跳转到指定楼层
楼主
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
void UsartInit()
{
        TMOD=0X20;                        //设置计数器工作方式2
        TH1=0XF3;                                //计数器初始值设置,注意波特率是9600的
        TL1=0XF3;
        TR1=1;                                 //启动计数器   
        PCON=0X80;                        //波特率加倍
        SCON=0X50;                        //设置为工作方式1       
        ES=1;                                //打开接收中断
        EA=1;                                //打开总中断                               
}
void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}
void Usart() interrupt 4
{
        u8 receiveData;
        receiveData=SBUF;//接收到的数据
        RI=0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);                         //等待发送数据完成
        TI=0;                                //清除发送完成标志位
}
求教,我按照教学视频的代码,烧到开发板,连接串口工具后,打开串口,输入1,就一直收到无效字符,现象如图,请问这是为什么?

1616298120(1).png (65.84 KB, 下载次数: 36)

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

使用道具 举报

沙发
ID:18307 发表于 2021-3-21 16:37 | 只看该作者
反复进入发送中断引起的。进中断,第1次是接收中断,后面的都是发送中断。接收的第1个数据应是你发送的数据,可能是波特率不对,或者没有接收到,后面的都是0是对的
回复

使用道具 举报

板凳
ID:213173 发表于 2021-3-21 20:48 | 只看该作者
楼主串口初始化程序UsartInit()只适合12MHz晶振,波特率4800。不可用于9600,误差太大。
如果用11.0592MHz晶振波特率4800,寄存器改为TH1=0XF4;TL1=0XF4;
回复

使用道具 举报

地板
ID:893226 发表于 2021-3-28 10:18 | 只看该作者
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

void UsartInit()
{

        TMOD=0X20;                        //设置计数器工作方式2
        TH1=0XF4;                                //计数器初始值设置,注意波特率是9600的
        TL1=0XF4;
        TR1=1;                                 //启动计数器
   
        PCON=0X00;                        //波特率不加倍
        SCON=0X50;                        //设置为工作方式1,REN置1       
        ES=1;                                //打开接收中断
        EA=1;                                //打开总中断
                               
}

void main()
{       
        UsartInit();  //        串口初始化
        while(1);               
}


void Usart() interrupt 4
{
    u8 receiveData;
        receiveData=SBUF;//接收到的数据
         RI=0;
        SBUF=receiveData;
        while(!TI);
    TI=0;       
}

波特率4800,请问为什么始终无法做到输入一个字符,输出一个相同的字符呢?

1616897711(1).png (55.16 KB, 下载次数: 38)

串口打印截图

串口打印截图

fd2d47e2b052d19427199f30c85af90.jpg (217.14 KB, 下载次数: 40)

开发板型号

开发板型号
回复

使用道具 举报

5#
ID:814525 发表于 2021-3-28 11:19 | 只看该作者
应该是串口设置不对,以下是STC_ISP软件 波特率计数器自动生成


void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        ES=1;
        TR1 = 1;                //启动定时器1
}

1.程式烧录频率选择11.0592MHz
2.串口软件波特率选择9600bps
3.串口软件校验方式选择无校验
回复

使用道具 举报

6#
ID:207421 发表于 2021-3-28 12:41 | 只看该作者
1. 设置 波特率 不加倍 ,通讯用4800,其它不需要设置。
2. 12MHz晶振是有一点点误差的。
3. 用STC-ISP软件,里面有串口助手,会对你有很多帮助的,软件里面有源码,计算器,资料都齐全。
回复

使用道具 举报

7#
ID:893226 发表于 2021-3-28 20:09 | 只看该作者
#include "reg52.h"
sfr AUXR =0x8E;                       //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

void UartInit(void)                //4800bps@12.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0x8F;                //设定定时初值
        TH1 = 0xFD;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}


void main()
{      
        UartInit();  //        串口初始化
        while(1);               
}


void Usart() interrupt 4
{
    u8 receiveData;
    receiveData=SBUF;//接收到的数据
    RI=0;
    SBUF=receiveData;
    while(!TI);
    TI=0;      
}



还是不行,试了11.0592MHz和12Mhz的,串口输入之后,没有返回值

1616933259(1).png (39.35 KB, 下载次数: 49)

1616933259(1).png

1616933319(1).png (49.17 KB, 下载次数: 43)

1616933319(1).png
回复

使用道具 举报

8#
ID:814525 发表于 2021-3-29 08:36 | 只看该作者
由于是STC89系列,如图波特率生成的时候,定时器时钟必须选12T。系统频率选择和仿真板上晶体一样。另外串口使能要自己加上去ES=1;串口助手收发选择HEX模式载试试

捕获.PNG (220.75 KB, 下载次数: 28)

捕获.PNG
回复

使用道具 举报

9#
ID:814525 发表于 2021-3-29 09:45 | 只看该作者
波特率计算的时候,开发板的晶体是多少频率就选多少频率。用的是STC89系列,定时器时钟必须选12T,因为此芯片时钟达不到1T。设置完后,串口使能打开,你忘了打开。串口助手用HEX模式等等。再去摸索吧
回复

使用道具 举报

10#
ID:893226 发表于 2021-3-29 21:19 | 只看该作者
本帖最后由 zc222 于 2021-3-29 21:30 编辑

恩恩 试过可以了 多谢指点我看着普中51单片机教学视频学习的,感觉那个教程里面对UART的操作和开发板并不完全匹配,我自己学的有些费劲,请问有没有其他的51的教学视频可以让初学者入门的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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