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