之前發(fā)過一篇博文《MCU-51串口通信程序》,程序挺好用的,之后一直把串口當做測試用途,像正在調(diào)試USB,用的是CH372,PC通過CH372(USB)發(fā)一個字符到單片機,單片機再通過串口回傳這個字符,從而驗證CH372是否收到字符,結(jié)果出現(xiàn)意想不到的錯誤,錯誤還挺有規(guī)律的。就是發(fā)16位字符0A,接收到字符用16位顯示是8A;發(fā)2A,顯示AA;發(fā)2B,顯示AB,就是最高位(第8位)0變?yōu)?了,試驗了幾個都是一樣。
點擊看原圖
之前老板也是同樣的問題(可見這事是多么普遍),不過當時由于不是我的事,就沒管。問了一下老板,才知道是晶振的問題,之前板子是用11.0952MHz晶振,現(xiàn)在的板子是12MHz,程序中串口通信也沒改預(yù)置值,直接就下載了,結(jié)果是誤差太多,前面的碼沒事,但誤差積累,最后的碼0就變成1了。敲響警鐘!
程序中串口初始化
可是板子用的是12MHz晶振。
通過這個小程序,可以看到誤差為8.5%,通常要求不出現(xiàn)誤碼的話,誤差要求在4.5%以下,而對于傳統(tǒng)的51單片機來說,最好是選擇11.0592的晶振,因為這個頻率,不會有誤差,也就不可能誤碼。
做單片機的串口通信,要注意單片機所用的晶振。