找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 17265|回復(fù): 32
打印 上一主題 下一主題
收起左側(cè)

LCD1602和單片機(jī)串口通信結(jié)合的程序(上位機(jī)發(fā)送任意字符串,雙行顯示,超屏清屏)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:421451 發(fā)表于 2019-2-18 18:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

本人單片機(jī)小白,第一次發(fā)帖,這是我做的51單片機(jī)串口通信和LCD1602結(jié)合的一個(gè)程序設(shè)計(jì),掉過幾個(gè)坑,前后共花費(fèi)了兩天的時(shí)間。附件里面是程序源代碼,自己寫的代碼,請(qǐng)大家多多指教。之所以寫這個(gè)帖子,一個(gè)算是做一個(gè)總結(jié),另一個(gè)是寫出自己曾經(jīng)踩到的誤區(qū),希望能幫助到其他人。


視頻:


本人使用的是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ù)。


將會(huì)遇到的問題:上位機(jī)發(fā)送字符串,例如123456,LCD1602上只會(huì)顯示12,缺少3456.這個(gè)問題一直困擾了好久,以為是串口通信中斷代碼函數(shù)的錯(cuò)誤,導(dǎo)致單片機(jī)未能完整接收字符串內(nèi)容。然而,你可以將劃線處注釋掉,接著加入:

  1. SBUF =receivedate[num];
  2.    while(!TI);
  3.    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)致)。

將會(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ò)誤代碼:

將會(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)
串口通信LCD1602.rar (41.27 KB, 下載次數(shù): 397)


評(píng)分

參與人數(shù) 3黑幣 +57 收起 理由
譚天說地 + 6 絕世好帖!
隨緣的門匙 + 1 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

來自 2#
ID:421451 發(fā)表于 2019-9-21 23:31 | 只看該作者
我在地鐵吃閘機(jī) 發(fā)表于 2019-9-18 15:02
想知道
SBUF =receivedate[num];
   while(!TI);

好久沒用51了,沒記錯(cuò)的話,應(yīng)該是等待發(fā)送緩沖區(qū)內(nèi)的數(shù)據(jù)發(fā)送完成,如果不完成,TI位的值一直為0,0取反就是1,while(1)一直在這個(gè)空循環(huán)里面重復(fù),等待完成,發(fā)送完成TI會(huì)置1,1取反就是0,也就是while(0),跳出這個(gè)循環(huán)。
回復(fù)

使用道具 舉報(bào)

來自 3#
ID:421451 發(fā)表于 2019-9-21 23:46 | 只看該作者
吳國太真大 發(fā)表于 2019-8-11 20:53
這個(gè)程序確實(shí)能實(shí)現(xiàn)上述功能,但是串口助手接受的數(shù)據(jù)會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,跟這兩句語句有關(guān)//while(!TI) ...

好久沒用51了,當(dāng)時(shí)學(xué)51是為了向32過渡,剛想起這個(gè)論壇,登錄看看,就看到有7個(gè)新評(píng)論了,哈哈。找找原來51的代碼,由于重整了系統(tǒng),數(shù)據(jù)轉(zhuǎn)移時(shí)弄沒了。記不清我當(dāng)時(shí)有沒有注意過會(huì)發(fā)生這種問題,好像測(cè)試的時(shí)候,注重點(diǎn)都放在1602了。這個(gè)代碼寫的還是不滿意,因?yàn)?602顯示字符的速度太慢了,一個(gè)一個(gè)往外冒,后來也試著優(yōu)化,感覺速度提不上去還是選擇實(shí)現(xiàn)的方法本身問題,時(shí)間復(fù)雜度太高。如果移植到32上,用12864,可能會(huì)快些。7月份用32做過一個(gè)類似電子書的東西,上位機(jī)發(fā)送數(shù)據(jù),12864來顯示,支持上下翻頁。思路和51這個(gè)程序有點(diǎn)類似,再加上32的運(yùn)算速度是1ns一句指令,一發(fā)就顯示~~~轉(zhuǎn)眼接觸單片機(jī)大半年了,時(shí)間過得真快。
回復(fù)

使用道具 舉報(bào)

來自 4#
ID:421451 發(fā)表于 2019-9-21 23:48 | 只看該作者
17863025410 發(fā)表于 2019-8-31 14:45
全部程序還有嗎,我想借鑒一下

。。。今年暑假重整了系統(tǒng),拷貝D盤數(shù)據(jù)的時(shí)候,32的代碼留下來了,51的好像弄丟了,我剛在D盤找了找,沒找到。只剩這個(gè)論壇還有份記錄了,抱歉~
回復(fù)

使用道具 舉報(bào)

5#
ID:486156 發(fā)表于 2019-3-14 19:52 | 只看該作者
咋么用的,我的顯示不了
回復(fù)

使用道具 舉報(bào)

6#
ID:486156 發(fā)表于 2019-3-14 19:59 | 只看該作者
不能用啊
回復(fù)

使用道具 舉報(bào)

7#
ID:390642 發(fā)表于 2019-3-14 22:13 | 只看該作者
下載 看看   謝謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:421451 發(fā)表于 2019-3-24 15:00 | 只看該作者
呀呀呀呀呀呀米 發(fā)表于 2019-3-14 19:52
咋么用的,我的顯示不了

什么地方用不了?。。。。
回復(fù)

使用道具 舉報(bào)

9#
ID:421451 發(fā)表于 2019-3-24 15:01 | 只看該作者

啥地方用不了。壳蟾嬷覀鞯臅r(shí)候就是自己板子上面跑了能運(yùn)行的那個(gè)文件。。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:421451 發(fā)表于 2019-3-24 15:04 | 只看該作者
有問題的,可以加我企鵝號(hào),14號(hào)的評(píng)論,我竟然今天才發(fā)現(xiàn),23333
回復(fù)

使用道具 舉報(bào)

11#
ID:598751 發(fā)表于 2019-8-11 20:53 | 只看該作者
這個(gè)程序確實(shí)能實(shí)現(xiàn)上述功能,但是串口助手接受的數(shù)據(jù)會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,跟這兩句語句有關(guān)//while(!TI);//TI = 0;加上就好了。
回復(fù)

使用道具 舉報(bào)

12#
ID:544565 發(fā)表于 2019-8-15 16:18 來自手機(jī) | 只看該作者
試了下,是可以,跟8樓說的一樣
回復(fù)

使用道具 舉報(bào)

13#
ID:92746 發(fā)表于 2019-8-18 15:02 | 只看該作者
下載 看看   謝謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:601871 發(fā)表于 2019-8-21 10:55 | 只看該作者
很給力
回復(fù)

使用道具 舉報(bào)

15#
ID:605801 發(fā)表于 2019-8-31 14:45 | 只看該作者
全部程序還有嗎,我想借鑒一下
回復(fù)

使用道具 舉報(bào)

16#
ID:451441 發(fā)表于 2019-9-5 10:11 | 只看該作者
好東西,正好可以借鑒一下
回復(fù)

使用道具 舉報(bào)

17#
ID:600837 發(fā)表于 2019-9-18 15:02 | 只看該作者
想知道
SBUF =receivedate[num];
   while(!TI);
   TI=0;
這行代碼里面,while(!TI)這句能不能給解釋下。。
回復(fù)

使用道具 舉報(bào)

18#
ID:688451 發(fā)表于 2020-2-25 21:20 來自手機(jī) | 只看該作者
里面的hex文件能正確運(yùn)行,但是c文件是錯(cuò)的,運(yùn)行的時(shí)候LCD不顯示
回復(fù)

使用道具 舉報(bào)

19#
ID:699241 發(fā)表于 2020-2-29 16:53 | 只看該作者
大佬 我想問下
回復(fù)

使用道具 舉報(bào)

20#
ID:699241 發(fā)表于 2020-2-29 16:55 | 只看該作者
我想問下 ,溫度數(shù)據(jù)是怎樣存放SBUF中再發(fā)送給電腦的,這部分弄了很久都沒弄好
回復(fù)

使用道具 舉報(bào)

21#
ID:421451 發(fā)表于 2020-3-3 18:22 | 只看該作者
牛逼的屌 發(fā)表于 2020-2-25 21:20
里面的hex文件能正確運(yùn)行,但是c文件是錯(cuò)的,運(yùn)行的時(shí)候LCD不顯示

不會(huì)吧。。。。。。這么玄學(xué)?我記得我去年沒有沒傳錯(cuò)啊。能運(yùn)行又不顯示。。。到底是行還是不行
回復(fù)

使用道具 舉報(bào)

22#
ID:421451 發(fā)表于 2020-3-3 18:30 | 只看該作者
710253949 發(fā)表于 2020-2-29 16:55
我想問下 ,溫度數(shù)據(jù)是怎樣存放SBUF中再發(fā)送給電腦的,這部分弄了很久都沒弄好

原來是你,哈哈。我把這個(gè)問題關(guān)鍵部分的代碼貼出來。
  1.         SBUF=(temp % 10000 / 1000)+ '0';
  2.         while(!TI);       //是否發(fā)送完成
  3.         TI=0;
  4.         SBUF=(temp % 1000 / 100) + '0';
  5.         while(!TI);       //是否發(fā)送完成
  6.         TI=0;
  7.         SBUF=(temp %  100 / 10) + '0';
  8.         while(!TI);       //是否發(fā)送完成
  9.         TI=0;
  10.         SBUF=(temp %  10 / 1)  + '0';
  11.         while(!TI);       //是否發(fā)送完成
  12.         TI=0;
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

23#
ID:130345 發(fā)表于 2020-4-3 11:19 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

24#
ID:711622 發(fā)表于 2020-4-14 20:59 來自手機(jī) | 只看該作者
顯示亂碼
回復(fù)

使用道具 舉報(bào)

25#
ID:745437 發(fā)表于 2020-5-25 19:29 | 只看該作者
給力  我想了解一下
回復(fù)

使用道具 舉報(bào)

26#
ID:421451 發(fā)表于 2020-6-11 10:39 | 只看該作者

同樣的開發(fā)板?
回復(fù)

使用道具 舉報(bào)

27#
ID:851981 發(fā)表于 2020-12-2 21:41 | 只看該作者
想看看原理圖
回復(fù)

使用道具 舉報(bào)

28#
ID:706762 發(fā)表于 2020-12-6 19:20 | 只看該作者
不知樓主能不能發(fā)個(gè)串口接受12864顯示的程序
回復(fù)

使用道具 舉報(bào)

29#
ID:768564 發(fā)表于 2020-12-10 12:48 | 只看該作者
樓主的帖子很給力,非常棒
回復(fù)

使用道具 舉報(bào)

30#
ID:421451 發(fā)表于 2020-12-11 14:56 | 只看該作者
譚天說地 發(fā)表于 2020-12-6 19:20
不知樓主能不能發(fā)個(gè)串口接受12864顯示的程序

之后在STM32做過,現(xiàn)在看來不難,也就是實(shí)現(xiàn)兩個(gè)外設(shè)驅(qū)動(dòng),一個(gè)串口能正常收發(fā),一個(gè)12864能正常顯示。這兩個(gè)模塊單獨(dú)弄都沒問題了,剩下的也就是邏輯上面的整合去滿足需求了。隱約記得我當(dāng)時(shí)做的STM32一個(gè)任務(wù)是類似一個(gè)MP4電子書那種,能前后翻頁。
回復(fù)

使用道具 舉報(bào)

31#
ID:991519 發(fā)表于 2021-12-13 09:53 | 只看該作者
我也遇到這樣問題
回復(fù)

使用道具 舉報(bào)

32#
ID:991519 發(fā)表于 2021-12-13 09:54 | 只看該作者
解決了
回復(fù)

使用道具 舉報(bào)

33#
ID:1124069 發(fā)表于 2024-6-6 15:16 | 只看該作者
初學(xué),感謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表