新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 模擬串口自動測量波特率的單片機程序

模擬串口自動測量波特率的單片機程序

作者: 時間:2012-08-02 來源:網(wǎng)絡(luò) 收藏

我這個程序能夠測量串口的,并且將自身的設(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;
}
}


上一頁 1 2 下一頁

關(guān)鍵詞: 模擬串口 自動測量 波特率

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉