新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 模拟串口自动测量波特率的单片机程序

模拟串口自动测量波特率的单片机程序

作者:时间:2012-08-02来源:网络收藏

我这个程序能够测量串口的,并且将自身的设置到通讯
这个在STC89C52/STC15F104(其实主要针对STC15F104,因为它没有串口)上面通过。不过因为是,在11.0592 12T的情况下,最多到19200。
然后在STC15F104上面,要适量的减少补偿值……
顺便说一句,编译器建议使用sdcc。keil的SB printf函数搞死我了……在22.1184 6T的情况下大约能到57600.
当然在STC15F系列到115200毫无压力,可是是半双工的。要做全双工只能减倍波特率……
测量波特率的方法很简单。校准他的波特率的方法就是发送没有连续低电平的字符,类似0x55/0xff/0x7f之类的。使用这个特性还可以将它用在STC自动冷启动下载器中。不过注意要限制校准波特率。否则你的正常串口通讯可能会被干扰,因为你比如115200通讯的时候,正好波形类似57600的7F,校准上去了把你的连接掐了,估计很多人都会看看程序是不是跑飞了……所以一定要把同步波特率降到4800以下,因为STC-ISP的默认最低波特率是从1200~4800.
这个也可以适用于不准晶振的单片机和计算机通讯。方法就是计算机以不同波特率发送校准信号,找出误码率最低的波特率,然后发送确认,让单片机在这个重载值下运行,也适用于时钟速度可能变化的单片机/懒得计算重载值的人使用。
然后低于4800的波特率在11.0592的速度下面只能分频,这也是不得已的……
上代码:

/*
* 自适应波特率程序,
* BY 万致远@rwzy.co.cc
* CRYSTAL:任意
*/
#include hwconfig.h>
#include type-def.h>
#include stdio.h>
#define MIS_0 0
#define MIS_2 1
#define MIS_4 2
#define MIS_8 3
#define MIS_16 4
#define TX1 P1_0 //发送数据端口
#define RX1 P1_1 //接收数据端口
BYTE min_mode;//减倍模式
void WaitTF1()
{
while(!TF1);
TF1=0;
if(min_mode==MIS_2)
{// /2
while(!TF1);
TF1=0;
}
else if(min_mode == MIS_4)
{// /4
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
}
else if(min_mode == MIS_8)
{// /8
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
}
else if(min_mode == MIS_16)
{// /16
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
while(!TF1);
TF1=0;
}
}


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭