作者:Snake0301 親愛的各位同志,前面和大家分享了如何利用各種資源為自己的學習之路獲取必要的裝備,主要提到了TI公司的大學計劃,其實很多其他的芯片廠家都有相關(guān)的大學計劃活動,大家可以根據(jù)興趣來選擇。感謝新中國為我們提供了如此肥沃的土壤,全世界無產(chǎn)階級萬歲,全世界人民大團結(jié)萬歲。 記得科任老師曾經(jīng)給我打過一個比喻,如果把數(shù)電、模電和高頻電子電路(有些學校也叫通信電子電路或非線性電路)比作三座大山,那么數(shù)電大可看做秦嶺,攀登起來較為輕松,但是也必須花費相當?shù)捏w力才能欣賞到沿途的風景;模擬電子電路則像是五岳,必須具備堅強的意志和充沛的體力,才能體會個中美味;而高頻電子電路,則像是珠穆朗瑪,真正能夠達到頂峰的筒子屈指可數(shù),只有超過常人的付出,才能夠到達那種高度。高手總是寂寞的,高處不勝寒啊。 小弟才疏學淺,并且還是半路出家,這里不敢在科班出身的筒子面前妄談。前面提這么多,主要是想和大家分享一下MCU的入門,玩MCU,首先要了解基本的硬件結(jié)構(gòu),也就涉及到數(shù)電、模電了。提到微控制器,不得不提到51內(nèi)核的MCU,一個經(jīng)典的產(chǎn)品就是愛特梅爾的AT89S51。這貨使用起來實在是太簡便了,外設非常少,雙向IO口的控制寄存器非常簡單,不需要處理IO方向,不需要處理IO翻轉(zhuǎn),不需要set,不需要clear,不需要……,直接對IO端口寫1或者寫0就能夠控制輸出的高或者低電平,直接讀IO端口就能獲得IO端口狀態(tài)。如果之前您玩過其他外設特別多的MCU,會覺得尼瑪S51的世界是如此清凈,原來生活是如此美好,控制是如此簡單。還是那句話,功能越多,寄存器越復雜,結(jié)構(gòu)越簡單,過程越復雜。這么看來,其實51內(nèi)核的MCU是用來入門的核彈啊,所以這里建議大家能夠從51下手,建立起基本的概念,然后再深入去了解其他的MCU。 在入門之前,必須要有一定的C語言基礎,說到C語言,理工科的童鞋們應該都不陌生。MCU入門,其實對C語言要求并不是非常高,只需要掌握基本的語法和結(jié)構(gòu)就好了,千萬不能出現(xiàn)代碼里面出現(xiàn)多個main函數(shù)的情況,呵呵。隨著學習的深入,再慢慢接觸一些比較高深的C語言思想和結(jié)構(gòu),C語言啊,深了去了。再就是編譯平臺,其實就是一個編譯器,可以生成各種MCU所需的文件,基本流程就是 環(huán)境設置-代碼編寫-build-download,編譯平臺純粹是一個操作性工作,多用幾次也就熟悉了。 好多教材里面,上來就使出吃奶的勁去分析51內(nèi)核,系統(tǒng)總線結(jié)構(gòu),內(nèi)部各種模塊,新手們往往就去年買了個表:想玩?zhèn)單片機,還得先成為數(shù)字系統(tǒng)高手。其實個人感覺必要性不是很大,我們使用集成電路,更多的時候是將其看做一個黑匣子,我們只關(guān)心它的輸入與輸出的關(guān)系,至于內(nèi)部如何工作,我們不想知道,也沒興趣去知道,對吧。如果日后需要,再去了解也不遲。Ok,下面舉幾個例子,來看看簡單的MCU控制。 點燈 就好像偉大的程序猿們,學習一門新的語言時,先會嘗試打印一句“Hello World!”一樣,高手們拿到一塊新的MCU,往往都會先拿來點亮一個LED。不要小看這個點亮LED,雖然很簡單,但是至少要求有基本的模電知識和了解這塊MCU的IO端口寄存器的基本操作。LED啊LED,PN結(jié)啊PN結(jié),導通啊導通,發(fā)光啊發(fā)光。在模電里面我們知道,LED其實就是個摻入了電致發(fā)光材料的PN結(jié),只要PN結(jié)導通,并有電流流過,就能夠發(fā)光。瞧瞧上面的兩種接法,假設IO口是P1.1,D1在IO口輸出什么電平的情況下發(fā)光呢?看看接法1,D1陽極連接Vcc,陰極連接IO口,D1導通的前提是PN結(jié)正偏,陽極電壓要大于陰極電壓,且差值要大于某個值,這個值由D1的材料特性決定。到這里,P1.1要輸出啥,D1才會亮呢?吼吼,必須是一個低電平喲。那好,代碼里面,我們寫上“P1.1=0;”,編譯下載,“咣機”,瞧瞧是不是燈亮了?要是我們再寫一個300ms延時函數(shù)delay(),“P1.1=1;delay();P1.1=0;delay();”,重新編譯下載,瞧瞧,燈是不是閃起來了?吼吼,控制就是這么簡單。還有接法2,大家可以自己分析一下了。在這個基礎上,還有更多的玩法,跑馬燈、呼吸燈等等。 ![]() 中斷 這部分涉及IO口操作很少,基本上都是內(nèi)部中斷寄存器的操作。中斷,其實就是優(yōu)先級更高的一個任務;比如周末有一打算睡到12點的任務,當您正在呼呼大睡的時候,突然老板9點鐘打來一個電話中斷了睡覺任務,并給出12點前完成深入開展當?shù)娜罕娐肪的高質(zhì)量個人對照檢查材料的任務,睡覺任務被打斷了,只能起床苦逼地進行寫材料的任務,10點鐘完成材料的撰寫并發(fā)送任務后,繼續(xù)睡覺到12點。上面這個流程,基本上就是一個中斷的基本流程。而我們操作內(nèi)部中斷寄存器,主要是為了確定是否應答中斷和中斷如何開始。S51的中斷寄存器常用的有6個,中斷允許控制寄存器IE是決定系統(tǒng)是否響應中斷,如果需要中斷,這個寄存器必須要置位;定時器控制寄存器TCON決定系統(tǒng)是否采用定時器方式來激活中斷;定時器工作方式控制寄存器TMOD用于選擇定時器的工作方式,一般需要先使用定時器初值賦予寄存器(TH0/TH1,TL0/TL1)來裝載一個初始值,然后根據(jù)TMOD來確定是加計數(shù)至溢出來產(chǎn)生中斷,還是減計數(shù)至0來產(chǎn)生中斷;串口控制寄存器SCON則是確定是否由串口數(shù)據(jù)傳輸來激活中斷;而中斷優(yōu)先控制寄存器IP則是用于控制多個中斷產(chǎn)生時,系統(tǒng)響應的順序。當然,最最重要的還是中斷服務程序,也就是一旦中斷來臨,系統(tǒng)需要進行的動作,一般情況下,建議中斷服務程序還是盡可能的簡單,不要進行復雜的數(shù)據(jù)運算或長時間的延時,最好只是給出一個事件標志,由main函數(shù)根據(jù)這個事件標志去完成相對應的動作。 中斷是MCU里面的壓軸貨,從應用層面來講,可以實現(xiàn)簡單多任務,如果中斷high不起來,誰也不能說自己精通S51。 外設驅(qū)動 一個系統(tǒng),只有51單片機,那叫光桿司令,絕大部分情況下,51單片機外圍會連接各種各樣的芯片,這些芯片會以各種總線形式與單片機相連接,常見的有1-wire、I2C、SPI、Can等等。物理連接后,單片機與芯片之間必須建立起某種協(xié)議才能正常進行通信。啥叫協(xié)議?聽上去很牛逼,其實說白了就一句話,語言、習慣要相通。先說語言,就好像說話,單片機說漢語,外設芯片說德語,咋溝通交流?再說習慣,就好像喝酒猜拳,外設芯片猜拳前要開場詞“哥倆好”,單片機單刀直入直接喊拳碼,這樣哥倆明顯不能同步,不能交流了撒。一般情況下,都需要利用數(shù)電知識仔細研究外設芯片的操作時序,操作時序圖直接描述了外設芯片的語言習慣,對單片機編程時,必須符合外設芯片的語言習慣,兄弟倆才能正常溝通。以I2C總線為例,I2C總線空閑時,單片機以啟動信號START來掌管總線,以停止信號STOP來釋放總線;每次通訊以START開始,以STOP結(jié)束;啟動信號START并后緊接著發(fā)送一個地址字節(jié),其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R/W位為0表示由單片機向被控器件寫數(shù)據(jù),R/W為1表示由單片機向被控器件讀數(shù)據(jù);當被控器件檢測到收到的地址與自己的地址相同時,在第9個時鐘期間反饋應答信號ACK;單片機檢測到ACK信號后,開始數(shù)據(jù)的傳輸,每個字節(jié)數(shù)據(jù)傳輸結(jié)束,都會發(fā)送一次ACK信號,如果全部結(jié)束則發(fā)送NACK信號,每個數(shù)據(jù)字節(jié)在傳送時都是高位(MSB)在前。這個例子其實可以很明顯地看出,要想完成外設芯片的驅(qū)動,必須通過迪特希特的時序圖了解它的習慣,讓單片機去適應它,最后達到天人合一,魚水交融的境界,就像把妹一樣。邪惡了,吼吼。 小結(jié) 上面是小弟在學習過程中的一點點小認識,由于能力關(guān)系肯定會有不對的地方,歡迎各路大神,各種品牌、各種材質(zhì)的板磚。 其實單片機入門沒有那么困難,特別是用簡單方便的51單片機來入門,簡直是無敵了,但前提是要熟悉編譯環(huán)境和一定的C語言基礎。學51單片機和屌絲們把妹是一樣一樣的,你用心去對待它,用熱情去融化它,用真誠去感動它,女神也會被推倒。 |