本人單片機小白,第一次發帖,這是我做的51單片機串口通信和LCD1602結合的一個程序設計,掉過幾個坑,前后共花費了兩天的時間。附件里面是程序源代碼,自己寫的代碼,請大家多多指教。之所以寫這個帖子,一個算是做一個總結,另一個是寫出自己曾經踩到的誤區,希望能幫助到其他人。
視頻:
0.png (246.56 KB, 下載次數: 138)
下載附件
2019-2-18 20:15 上傳
本人使用的是STC89C52普中的開發板。
需要實現的效果:在液晶上顯示從PC機串口上下發的數據,超屏后清屏并將多余字符從頭顯示。
總體思路:代碼是采用多文件寫的,更體現模塊化設計,在查找修改錯誤時更加方便。由于將LCD1602設置為兩行顯示,一行顯示16個字節,兩行共32個字節,因此設置一個receivedata[32]的數組,用于存放上位機發送置單片機接收緩存區SBUF的數據,再將數組內容運用LCD1602writedata(uchar)函數,使其能在LCD1602液晶屏上顯示。通過數組下標或重新設置一個變量統計液晶屏幕上已顯示的字節數,當字節數為16的倍數且不為32的倍數時換行,當字節數為32的倍數時清屏,將多余字符從頭顯示。
誤區一:LCD1602writedata(uchar)函數放入中斷函數。
QQ圖片20190218175143.png (11.55 KB, 下載次數: 136)
下載附件
2019-2-18 17:52 上傳
將會遇到的問題:上位機發送字符串,例如123456,LCD1602上只會顯示12,缺少3456.這個問題一直困擾了好久,以為是串口通信中斷代碼函數的錯誤,導致單片機未能完整接收字符串內容。然而,你可以將劃線處注釋掉,接著加入:
- SBUF =receivedate[num];
- while(!TI);
- TI=0;
復制代碼在串口通信助手軟件上,你會發現上位機發送的數據,單片機就能完整地發送回來。貌似是存在函數之間的某種沖突,也有可能是代碼本身存在著其他錯誤導致的。總之,LCD1602writedata(uchar)函數最好放在主函數里面。將其移至主函數里面時,不要忘了在中斷里面做一個標示,例如flag = 1之類的,使中斷完成之后,主函數if(flag)判斷語句接收到flag=1為真后,才執行LCD1602writedata(uchar)函數。不然,由于while(1)這個大循環里面,只有一個光禿禿的LCD1602writedata(uchar)函數,你的LCD1602液晶屏上會不斷的寫入某一字符。
誤區二:數組下標num,將num++放入主函數中,企圖通過LCD1602初始化設置的指令——每增加一字符,光標自動右移來實現數組數據的顯示,且未注意num值在中斷結束時的值(因對串口中斷不完全理解導致)。
QQ圖片20190218181029.png (1.76 KB, 下載次數: 125)
下載附件
2019-2-18 18:11 上傳
將會遇到的問題:上位機發送字符,LCD1602上總是只會在同一處地方顯示一位字節。需要將num++移回中斷,數組接收下標增加要在中斷中完成,只要一有中斷信號就會觸發,中斷函數它不會在主函數里面等num++,之后再去響應中斷信號,中斷就是一個連續的過程,可以說是中間沒有停頓的一次性將接受緩沖區SBUF里面的數據都存放到數組中,然而,將num++放入中斷函數中,若不加注意,這又牽扯到我原本程序中的另一個錯誤,未注意num中斷結束時的值,即主函數中LCDwritedata(receivedate[num])執行時,num并不等于0的。即數據并不是從頭開始輸出到LCD液晶屏上。這里就需要使用一個for循環函數。
誤區三:未注意數組下標的值和for循環次數n的值,或者說邏輯不清晰,例如原本的錯誤代碼:
QQ圖片20190218183301.png (26.87 KB, 下載次數: 120)
下載附件
2019-2-18 18:41 上傳
將會遇到的問題:例如輸入1234,上位機第一次發送,LCD1602顯示正常,第二次發送,LCD1602顯示1234會重復兩邊,第三次發送,LCD1602顯示1234會重復三遍,以此類推。。。。。。原因是num = 0放錯位置,中斷中的num++會使num值不斷增加,然而n==32的判定值也會是num=0幾乎如同天方夜譚,我在這里就犯了邏輯混亂的錯誤,靜下來重新再理一遍就會發現問題,重新定義一個變量total,專門用來計數已經在LCD液晶屏上顯示過的字節總數,不再依靠數組下標來判斷什么時候換行,什么時候清屏。
誤區三錯誤效果演示:
[已上傳至附件]
單片機的學習結果是充滿歡樂的,但過程是痛苦的,尤其是遇到問題,百度搜索也找不到自己想要的答案。希望這篇貼文能填補一些空缺,幫助到需要幫助的人。
全部資料51hei下載地址:
誤區三錯誤效果演示.rar
(4.89 MB, 下載次數: 114)
2019-2-18 22:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
串口通信LCD1602.rar
(41.27 KB, 下載次數: 397)
2019-2-18 17:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5