• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51单片机手动设置波特率收发数据不对

小葱拌豆腐 2021-03-08 浏览量:655
#include <intrins.h>
#include "config.h"
#include "stdio.h"//用于调用printf函数原型

/@@* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    RS485_DIR = 0; //RS485设置为接收方向
   
    g_rs485_uart_pop_ptr = 0; //当 g_uart_pop_ptr + 1 = g_uart_push_ptr 时缓存为空
    g_rs485_uart_push_ptr = 1;  //此处加1是指针加1,即计算下一个指针

    rs485_sbuf.out_index = 0;  //----
    rs485_sbuf.in_index = 1;
    rs485_sbuf.send_runing = FALSE;
   
    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
     P_SW1 = ACC;                //(P3.0/RxD P3.1/TxD)
   
    SCON  = 0x50;  //配置串口为模式1
    AUXR = 0x40;    //定时器1为1T模式   
    AUXR &= 0xFE;        
    TMOD = 0x00;    //定时器1为模式0(16位自动重载)
    TL1 = (65536 - (FOSC/4/baud));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/baud))>>8;
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
    EA=1;

}

当调用这个ConfigUART(unsigned int baud);写入9600、57600时通过串口助手接收发关送数据正确,当写入115200时通过串口助手接收发关送数据不对
如果把上面的   

     TL1 = (65536 - (FOSC/4/baud));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/baud))>>8;
改为:   

    TL1 = (65536 - (FOSC/4/115200));   //设置波特率重装值
    TH1 = (65536 - (FOSC/4/115200))>>8;
时通过串口助手接收发关送数据正确。

请各位大神指教函数那里错了!!!!!


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 由于是51单片机,int这个类型参数只能16位的,也就是到65535,115200大于这个数,所以会出错,解决办法把参数的int改成long就可以了
    • 发布于 2021-03-08
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
  • 这说明,传入函数的值不是115200,你可以用串口输出这个值,并输出TL1与TH1的值看一下大小
    • 发布于2021-03-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 51单片机unsiged int是16位的,最大65535,,,当你入参是115200时超过了。。。可以单步看下这个值...
    • 发布于2021-03-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 51应该没有32位的数据,最大是16位的,115200超过了65535了
    • 发布于2021-03-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51单片机手动设置波特率收发数据不对