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