模擬串口自動測量波特率的單片機程序
我這個程序能夠測量串口的波特率,并且將自身的波特率設(shè)置到通訊波特率。
這個在STC89C52/STC15F104(其實主要針對STC15F104,因為它沒有串口)上面通過。不過因為是模擬串口,在11.0592 12T的情況下,最多到19200。
然后在STC15F104上面,要適量的減少補償值……
順便說一句,編譯器建議使用sdcc。keil的SB printf函數(shù)搞死我了……在22.1184 6T的情況下大約能到57600.
當然在STC15F系列到115200毫無壓力,可是是半雙工的。要做全雙工只能減倍波特率……
測量波特率的方法很簡單。校準他的波特率的方法就是發(fā)送沒有連續(xù)低電平的字符,類似0x55/0xff/0x7f之類的。使用這個特性還可以將它用在STC自動冷啟動下載器中。不過注意要限制校準波特率。否則你的正常串口通訊可能會被干擾,因為你比如115200通訊的時候,正好波形類似57600的7F,校準上去了把你的連接掐了,估計很多人都會看看程序是不是跑飛了……所以一定要把同步波特率降到4800以下,因為STC-ISP的默認最低波特率是從1200~4800.
這個也可以適用于不準晶振的單片機和計算機通訊。方法就是計算機以不同波特率發(fā)送校準信號,找出誤碼率最低的波特率,然后發(fā)送確認,讓單片機在這個重載值下運行,也適用于時鐘速度可能變化的單片機/懶得計算重載值的人使用。
然后低于4800的波特率在11.0592的速度下面只能分頻,這也是不得已的……
上代碼:
/*
* 自適應(yīng)波特率模擬串口程序,
* 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 //發(fā)送數(shù)據(jù)端口
#define RX1 P1_1 //接收數(shù)據(jù)端口
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;
}
}
評論