Proteus仿真與實際的差別
弄了幾天的Proteus仿真,終于覺得自己想做的東西,已經(jīng)全部用Proteus仿真過了,應(yīng)該可以動手做了。于是先用Proteus畫好原理圖,再用ARES畫好PCB板圖——雖然我只是用洞洞板焊接,但是有個PCB板圖做參照,連線會容易很多?;藘蓚€小時,去中關(guān)村買了必要的原件,開始動手。
單片機用的是STC89C552RC,原因除了價廉物美之外,最大的原因是,STC的單片機可以直接使用串口往里面下程序,這樣我可以直接焊接好板子,然后連接好串口,一邊寫一邊調(diào)試,不用把單片機拿來拿去了。為了焊的好看些,把線基本都布在了反面,前前后后,修修改改,共焊了3天才弄好,搞得眼睛一閉上都是洞洞板的圈圈。
不過通過這次的實際制作,還真發(fā)現(xiàn)了不少Proteus仿真中不會想到的問題,現(xiàn)記錄如下,希望以后再碰到時,可以作為參考。
碰到的第一個問題,就是程序怎么也下載不到單片機中去。在Proteus仿真的時候,并不需要往單片機中寫程序,編譯好后,程序就已經(jīng)在單片機中了,但是實際制作時,就得編譯一次程序,下載一次。結(jié)果我在下載時,發(fā)現(xiàn)提示“不能連接到串口”,讓我實在是頭疼不已。試著用“串口助手”往單片機發(fā)數(shù)據(jù)時,發(fā)現(xiàn)數(shù)據(jù)指示類會閃爍,說明線路是通了。百思不得其解之下,同事提醒我說,是不是你這兩個數(shù)據(jù)傳送指示燈有問題?雖然我覺得成分的不可能,可是試著把兩個LED燈去掉之后,還真可以了……
這是先前的電路圖(省略MAX232芯片)
結(jié)果串口在給單片機發(fā)數(shù)據(jù)的時候,燈是會閃爍的,讓我堅定的以為,串口的通路是沒問題的。后來把電路改成這樣,串口不能通信,不能下載程序的問題就好了
終于把串口弄好了,程序下載到了單片機上,結(jié)果效果和proteus上模擬的完全不一樣。Proteus上的話,1602顯示器直接就顯示數(shù)據(jù)了,結(jié)果到了現(xiàn)實,什么都沒有……死命的調(diào)節(jié)對比度電阻,也還是什么都沒有,真的感覺無從下手了。后來去群里問,群里的老大給了一個示例程序,用上去也還是不行,這讓我真的是感覺要崩潰了。不過想想焊了這么多天,放棄實在是不甘心,于是把所有和液晶顯示不相關(guān)的代碼全注釋掉了,突然發(fā)現(xiàn)莫名其妙的,液晶出現(xiàn)了色塊——當時感覺是太開心了,一天了,終于液晶上有顯示了!不過此時仍然不能設(shè)置顯示字符,不過相比沒有任何顯示已經(jīng)好太多了。
同樣的代碼,為什么這次可以了呢?仔細的分析了代碼,發(fā)現(xiàn)這次的代碼,唯一的不同,就是我為了少寫幾個字,延時函數(shù)用的是群里老大給的。這是唯一的不同之處。比對一下兩個延時1毫秒的函數(shù)。
我自己的:
?
1
2
3
4
5
6void delay(unsigned char ms)
{
unsigned char i,j;
for(i=0; i
for(j=0; j<120; j++);
}
群里老大給的:
?
1
2
3
4
5
6void delay(int ms)
{
int i,j;
for(i=0; i
for(j=0; j<120; j++);
}
沒錯,兩個函數(shù)唯一的區(qū)別,就是變量的類型,我寫的時候,看變量都不會超過255,為了省點空間,定義的都是unsigned char,而一般的延時函數(shù),用的是int類型,就是這兩個變量類型的不同,導(dǎo)致了延時的不同,同樣是想延時1毫秒,我的函數(shù)實際上只能延時0.4到0.5毫秒左右,就是這個的區(qū)別,讓我在操作液晶時,各個時序的延時不夠,給液晶的命令不能到達。后來修改后,再修改了一下程序其他地方,終于讓液晶正確的顯示了。
再說一個比較郁悶的事情,在Proteus里面,1602是這樣顯示的
買來實物后,我也理所當然的認為,有焊點的是下方(事實上我確實認為這樣比較符合心理,哈哈)。結(jié)果程序?qū)懞蠛茫伙@示出來,全倒過來了…………
不管怎么說,今天總算讓板子上的元件都工作正常了。明天開始改程序,實現(xiàn)具體功能。