在我的理解中,我把單片機編程分為4種,這4種編程風格,或者說是算法風格,基本代表了電子工程師編程的四個階段吧。
1:學院派編程方法
? ? ? ? ? 之所以稱之為學院派編程方法,是因為這個編程方法在大學校園比較流行,也正是因為這個原因,剛畢業的大學生也大多采取這類編程方法。我非常不建議這類編程方法,下面以按鍵檢測舉例分析:
? ? ? ? ?這樣檢測按鍵是不行的,因為單片機是在死等按鍵釋放而不執行其他任何操作。老師講解的時候,只是告訴你了最基本的方法,用最簡單的方法讓你明白怎樣使用單片機檢測按鍵,這樣做既對又不對。對是因為的確達到了教學目的,完成了傳道授業的任務;不對是因為給同學們造成了很大誤導,甚至說是交給了同學們錯誤的方法,直到某一天跳進深坑還渾然不知。如果項目的要求是通過按鍵調整數碼管顯示的數據,在按鍵按下的時間里,單片機在死等,那么數碼管的顯示是無法刷新數據的,這顯然是不合理的,事實上也不會有開發者會采用這樣的方式。
2:傳統編程方法
? ? ? ? ? 有的同學會問,既然死等不可以,那我不死等好了,或者說我不一直死等,并且我用延時一段時間的方式消抖,效果也挺不錯的。敲黑板,這里的延時方式消抖,恐怕也是大學老師教給你的吧。(在這里沒有惡意,實在是感覺這類方法不適合再出現在大學課堂之上了,已經害了許多人,作者就是受害者之一。)
? ? ? ?我們一邊看圖一邊分析,這個按鍵檢測的思路比起第一種方法有很大進步,放棄了死等按鍵釋放的方式,先檢測按鍵是否按下,如果按下,消抖延時20ms,防止誤觸發,如果20ms后檢測按鍵還是按下的,執行相對應的動作。可是再回到剛剛問過的問題,如果項目要求數碼管顯示,這20ms實在是太長了,數碼管20ms刷新一次,給人的感覺是閃爍的很厲害,這顯然不是我們想要的效果。而且20ms延時消抖,這樣的消抖方式也是我不推薦的,至于采用什么樣的消抖方式,下文會講到。
? ? ? ? ?同時,我還想提出一個問題,如果我的端口非常緊張,只剩下一個按鍵,這時候,要用一個按鍵代表兩種功能——長按和短按,面對這樣的問題,采用第二種方法就不足以解決了。實際上,第二種方法存在的問題不止這些,稍微考慮不嚴密,就可能造成邏輯錯誤。慎用delay!慎用delay!慎用delay!重要的事情說三遍。
3:時間片+狀態機編程方法
? ? ? ? 所謂時間片+狀態機編程方法,就是一個任務分解,利用狀態機分步執行。這樣做的好處是邏輯清晰,軟件維護成本小。首先,實現這種編程方法要有一個時間基準,我一般采用的方法是定時器中斷,每過一段時間定時器溢出,在中斷函數里把標志位置1,然后再主函數里檢查標志位的狀態來判斷時間點是否來臨。舉個LED閃爍例子來說明一下這個編程方法。當然,這個方法可以用到其他方面,后面我會在文章里詳細說說這種方法。
4:嵌入式系統編程方法
這個編程方法目前我還不是很懂,所以就不過多講述,目前我的理解是,嵌入式系統編程的方法是在程序中加入了操作系統的概念,基本的原理和時間片+狀態機編程方法類似,但是要比前者復雜的多,其中還涉及到內存、堆棧等概念。一般簡單的應用不必采用操作系統的編程方法,有點大炮打蚊子的感覺,但是涉及到人機交互等復雜應用的場合,嵌入式系統編程方法會讓軟件編程變得有條不紊,穩定可靠。
我是一名從事傳感器開發的電子工程師,很高興在簡書遇到你。如果有什么好的建議和意見,歡迎您和我取得聯系,您可以選擇留言和發送郵件,郵件地址:zz_dxf@163.com