qjy822 发表于 2026-4-16 19:08:44

请教下这个模拟串口程序里面怎么改波特率

各位大师们,请教下这个模拟串口程序里面怎么改波特率,谢谢!程序是“STC15系列只用一个定时器的红外接收程序”例程里面的,默认是9600,想改为115200应该要怎么改呢?
这部分应该就是调整延时来调整波特率的吧,就是不太清这个数值是怎么计算的。




/********************** 模拟串口相关函数************************/

void        BitTime(void)        //位时间函数
{
        uint i;
        i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;                //根据主时钟来计算位时间
        while(--i);
}


qjy822 发表于 2026-4-16 19:10:08

只要能发送就行了,不需要接收。

狂热主宰 发表于 2026-4-16 19:14:44

按比例调整时间
高速通信稳定性有影响

狂热主宰 发表于 2026-4-16 19:17:02

得看接收和发生的设备
是否支持更高的速度
有可能出现乱码

qjy822 发表于 2026-4-16 19:20:27

就用USB转串口小板来接收,就是不知道这个比例怎么算啊

qjy822 发表于 2026-4-16 19:23:03

调整140000这个值吗?主要是不知道怎么计算的,难道要一个个值去试?

梁工 发表于 2026-4-16 22:07:35

115200对应8.68us一个位,值需要调整BitTime(void)的时间是8.68us就可以了,这个跟主频有关,你可以简化一下:
注意要关闭全局中断,模拟串口发送不可以被打断。
void      BitTime(void)      //位时间函数
{
      u8 i;
      i = 192/3 - 2;      //主时钟=22.1184MHz, 8.68*22.1184=192
//      i = 208/3 - 2;      //主时钟=24MHz, 8.68*24=208
      while(--i);
   //NOP(2);            //根据实际情况添加NOP来精确调整位时间
}

qjy822 发表于 2026-4-17 08:39:53

梁工 发表于 2026-4-16 22:07
115200对应8.68us一个位,值需要调整BitTime(void)的时间是8.68us就可以了,这个跟主频有关,你可以简化一 ...
其它昨晚我按比例修改数值后已经可以用了,但是晶振要上到33.1776M才比较稳定没有乱码,我有空再试下这个,谢谢!

zhp 发表于 2026-4-17 10:00:01

i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;
等价于下面的语句
i = MAIN_Fosc / 9600 / 14 - 1;

如果需要将波特率改为115200,这条语句可以改为
i = MAIN_Fosc / 115200 / 14 - 1;


需要注意:软件延时产生的波特率,波特率越高,误差越大,可能需要微调

qjy822 发表于 2026-4-17 10:46:46

zhp 发表于 2026-4-17 10:00
i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;
等价于下面的语句
i = MAIN_Fosc / 9600 / 14 - 1;


谢谢版主的回复,就是还有一点不明白,这个14-1这个数是怎么来的,代表什么呢?
页: [1] 2
查看完整版本: 请教下这个模拟串口程序里面怎么改波特率