cxk521aoligei 2023-10-14 14:35 采纳率: 90.9%
浏览 7

51单片机方式1串口通信问题

做单片机串口通讯问题时设计的程序应该是利用串口助手给单片机发送一个数据,然后单片机返回一个数据给电脑,但是实验时单片机一电会自动发给串口助手一个数据,不知道程序哪里有问题。


#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管wei选
uchar num;//数码管显示的值
void display(uchar i)
{
    static uchar wei;         //静态变量程序运行阶段都存在,再次调用值不变
    P0 = 0XFF;//清除断码
    WE = 1;//打开位选锁存器
    P0 = SMGwei[wei];
    WE = 0;//锁存位选数据
    switch(wei)
    {
        case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
        case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;    
        case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;        
    }
    wei++;
    if(wei == 3)
        wei = 0;
}
//定时器0初始化
void timer0Init()
{
    EA = 1;    //打开总中断
    ET0 = 1;//打开定时器0中断
    TR0 = 1;     //启动定时器0
    //REN = 1;//允许串口接收  //这把ren打开,scon此时是0,串口将被设置为工作方式0因为刚上电scon是0x00 同步移位脉冲就开始发,开始采rxd的电平
    TMOD |= 0X01; //定时器工作模式116位定时模式
    TH0 = 0xED;
    TL0 = 0xFF; //定时5ms
}
//串口初始化
void UARTInit()
{
    EA = 1;    //打开总中断
    ES = 1; //打开串口中断
    SM0 = 0;    SM1 = 1;//串口工作方式1,8位UART波特率可变 方式0的采样已经结束 rxd的引脚始终为1
    TR1 = 1;//启动定时器1 // 第一次接受中断的断点 现在sbuf装好了 sbuf是0xff  ri=1 第二次也在这跳 sbuff=0x31
    TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
    REN = 1;//串口允许接收
    TH1 = 0xfd;
    TL1 = 0xfd;//设置比特率9600
}
void main()//main函数自身会循环
{    
    timer0Init();//定时器0初始化
    UARTInit();//串口初始化
    while(1);    //等待阶段一直在采样但都没往移位寄存器里放
}

//定时器0中断函数
void timer0() interrupt 1
{
    TH0 = 0xED;
    TL0 = 0xFF; //定时5ms
    display(num); //数码管显示函数    
}
//串口中断函数
void UART() interrupt 4
{
    uchar temp;
    if(RI)//判断接收是否完成
    {
    num = SBUF;//读SBUF,读出串口接收到的数据 zheshisbuf里是0xff 第二次sbuff变0x31了
         RI = 0;//软件清零接收标志位    
        //num = SBUF;
        //temp = num;//为啥写这一步?为了不变化num的值 因为要显示发过来的数据
        SBUF = ++num;//写SBUF,把要发送的数据送给发送缓存器
    }
    if(TI)//判断是否发送完成
        TI = 0;//清零发送完成标志位    
} 

单片机上电后打开后,串口助手会接收到00

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-14 19:05
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    根据您提供的代码,发现单片机上电后,串口助手会接收到00的原因是因为在UART中断函数中,在接收到数据后,您给SBUF赋值的是++num,即自增后的num值,所以首次接收到的数据是0x00。

    解决方法是在接收数据后,将接收到的数据保存到一个临时变量temp中,并将temp赋值给SBUF,即将接收到的数据原样返回给串口助手。

    您可以按照以下代码修改UART中断函数:

    //串口中断函数
    void UART() interrupt 4
    {
        uchar temp;
        if(RI)//判断接收是否完成
        {
            temp = SBUF;//将接收到的数据保存到临时变量temp中
            RI = 0;//软件清零接收标志位
            SBUF = temp;//将temp的值赋给SBUF,返回接收到的数据给串口助手
        }
        if(TI)//判断是否发送完成
            TI = 0;//清零发送完成标志位
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月14日

悬赏问题

  • ¥60 用r语言进行数据分析
  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。