版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1。找本書大概了解一下單片機(jī)結(jié)構(gòu),大概了解就行。不用都看懂,又不讓你出書的。(三天)2。找學(xué)習(xí)板練習(xí)編寫程序,學(xué)單片機(jī)就是練編程序,遇到不會(huì)的再問(wèn)人或查書找。 (二十天)3。自己網(wǎng)上找些小電路類的資料練習(xí)設(shè)計(jì)外圍電路。焊好后自己調(diào)試,熟悉過(guò)程。 (十天)4。自己完全設(shè)計(jì)具有個(gè)人風(fēng)格的電路,產(chǎn)品,。你已經(jīng)是高手了。 。看到了嗎?下功夫一個(gè)多月你就能成為高手,我就講這么多了,學(xué)不學(xué)得會(huì),下不下得了功夫就看你的了。接下是匯編語(yǔ)言的指令部分,整個(gè)過(guò)程武慶生老師用了大量的實(shí)例這部分你得十二份的認(rèn)真對(duì)待,日后你要用這些語(yǔ)言寫東東的!往下是定時(shí)器/計(jì)數(shù)器,串行接口,中斷系統(tǒng)這三部分可謂是單片機(jī)的核心,有了定
2、時(shí)器/計(jì)數(shù)器單片機(jī)才會(huì)自動(dòng)控制,有了中斷系統(tǒng)單片機(jī)才會(huì)有了智慧,有了串行接口單片機(jī)才會(huì)知道外面的世界有多大!再往下是系統(tǒng)擴(kuò)展和接口技術(shù),盡管我是很認(rèn)真的看完的,這里邊的I/O口的擴(kuò)展,鍵盤接口,A/D,D/A等等,在里有的已有交待,比較輕松的!有的也只限于了解就可以了,因?yàn)閷?lái)的單片機(jī)里象A/D,D/A等等是芯片自帶的,你可以有選擇的應(yīng)用便可!學(xué)跑時(shí),最好找一些簡(jiǎn)單的現(xiàn)存的小程序玩玩!然后想辦法改程序,看看能不能再跑起來(lái),我就是這樣跑起來(lái)的!玩比較大一些程序時(shí)盡量找現(xiàn)存的子程序(就是一些大蝦們說(shuō)的模塊)作為你的子程序,這樣就比較可靠了!我們假設(shè)你已經(jīng)跑起來(lái)了(跑不起來(lái)才怪)!劉潤(rùn)華老師的的視頻
3、教程我們假設(shè)你沒(méi)有太多的空時(shí)間,劉潤(rùn)華老師的的視頻教程,你用了15天,學(xué)這個(gè)東西最好是連著看,可不要斷斷續(xù)續(xù)的,三天打魚二天曬網(wǎng)的后果你是知道的學(xué)了C語(yǔ)言就算把單片機(jī)搞定了吧!是的搞定了!但搞定是要你自己感覺(jué)的,這時(shí)候我建議你看看,這里會(huì)跟你說(shuō)說(shuō)什么是編程!看過(guò)后你就有了一種更上一層樓的驚喜!什么是結(jié)構(gòu)化編程,什么是面向?qū)ο缶幊?使你對(duì)程序結(jié)構(gòu)和你的編程水平有了質(zhì)的提升!1. 學(xué)單片機(jī)理論 同時(shí)重抓匯編編程!2. 真正學(xué)會(huì)c語(yǔ)言;3. 經(jīng)常改源程序&編寫自己的單片機(jī)程序做開發(fā)板實(shí)驗(yàn)。4. 看模電,數(shù)電書,結(jié)合教學(xué)視頻。5. 經(jīng)常做一些簡(jiǎn)單的外圍電路設(shè)計(jì)。6. (前五項(xiàng)同時(shí)學(xué)習(xí)進(jìn)行?。?. 看朱
4、清新老師的和相關(guān)單片機(jī)c語(yǔ)言編程提高類 書籍,可從圖書館和網(wǎng)絡(luò)查閱。8. 結(jié)合實(shí)際案例(可參考相關(guān)書籍和網(wǎng)絡(luò)資料)做開發(fā)。9. 設(shè)計(jì)自己的產(chǎn)品!單片機(jī)C語(yǔ)言學(xué)習(xí)(非常通俗易懂?。┺D(zhuǎn)載 回復(fù)數(shù):16,點(diǎn)擊數(shù):1400 _人生無(wú)需驚天動(dòng)地,快樂(lè)就好; 友誼無(wú)需甜言蜜語(yǔ),想著就好; 金錢無(wú)需車載斗量,夠用就好; 朋友無(wú)需遍及天下,有你就好。 QQ:568138191 E-mail: (一) 相信很多愛(ài)好電子的朋友,對(duì)單片機(jī)這個(gè)詞應(yīng)該都不會(huì)陌生了吧。不過(guò)有些朋友可能只聽說(shuō)他叫單片機(jī),他的全稱是什么也許并不太清楚, 更不用說(shuō)他的英文全稱和簡(jiǎn)稱了。單片機(jī)是一塊在集成電路芯片上集成
5、了一臺(tái)有一定規(guī)模的微型計(jì)算機(jī)。簡(jiǎn)稱為:?jiǎn)纹⑿陀?jì)算機(jī)或單片機(jī) (SingleChipComputer)。單片機(jī)的應(yīng)用到處可見(jiàn),應(yīng)用領(lǐng)域廣泛,主要應(yīng)用在智能儀表、實(shí)時(shí)控制、通信、家電等方面。不過(guò)這一切都沒(méi) 什么關(guān)系,因?yàn)槲遥ó?dāng)然也包括任何人)都是從不知道轉(zhuǎn)變成知道的,再轉(zhuǎn)變成精通的?,F(xiàn)在我只想把我學(xué)習(xí)單片機(jī)的經(jīng)歷,詳細(xì)地講敘給大 家聽聽,可能有些大蝦會(huì)笑話我,想:那么簡(jiǎn)單的東西還在這里賣弄。但是你錯(cuò)了,我只是把我個(gè)人學(xué)習(xí)的經(jīng)歷講述一遍而已,僅僅對(duì)那些想 學(xué)習(xí)單片機(jī),但又找不到好方法或者途徑的朋友,提供一個(gè)幫助,使他們?cè)趯W(xué)習(xí)過(guò)程中,盡量少走些彎路而已! 首先,你必須有學(xué)習(xí)單片機(jī)的熱情,不是說(shuō)今天去
6、圖書館看了一個(gè)下午關(guān)于單片機(jī)的書,而明天玩上半天,后天就不知道那個(gè)本書在講什 么東西了。還是先說(shuō)說(shuō)我吧,我從大二的第一個(gè)學(xué)期期末的時(shí)候才開始接觸單片機(jī),但在這之前,正如上面所說(shuō)的:我知道有種芯片叫單片機(jī), 但是具體長(zhǎng)成什么樣子,卻一點(diǎn)也不知道!看到這里很多朋友一定會(huì)忍不住發(fā)笑。嘿嘿,你可千萬(wàn)別笑,有些大四畢業(yè)的人也同樣不知道單片 機(jī)長(zhǎng)成什么樣子呢!而我對(duì)單片機(jī)的癡迷更是常人所不能想象的地步,大二的期末考試,我全放棄了復(fù)習(xí),每當(dāng)室友拿著書在埋頭復(fù)習(xí)的時(shí)候, 我卻捧著自己從圖書館借的單片機(jī)書在那看,雖然有很多不懂,但是我還是堅(jiān)持了下來(lái),當(dāng)時(shí)我就想過(guò),為了單片機(jī)值不值得我這樣去付出, 或許這也是在一
7、些三流學(xué)校的好處吧,考試掛科后,明年開學(xué)交上幾十元一門的補(bǔ)考費(fèi),應(yīng)該大部分都能過(guò)了。于是,我橫下一條心,堅(jiān)持看 我的單片機(jī)書和資料。 當(dāng)你明白了單片機(jī)是這么一回事的時(shí)候,顯而易見(jiàn)的問(wèn)題出來(lái)了:我要選擇那種語(yǔ)言為單片機(jī)編寫程序呢?這個(gè)問(wèn)題,困擾了我好久。具 體選擇C51還是A51呢?匯編在我們大二之前并沒(méi)有開過(guò)課,雖然看著人家的講解,很容易明白單片機(jī)的每一時(shí)刻的具體工作情況,但是一合上 書或者資料,自己卻什么也不知道了,根本不用說(shuō)自己寫程序了。于是,我最終還是決定學(xué)C51,畢竟C51和我們課上講的C語(yǔ)言,有些類似, 編程的思想可以說(shuō)是相通的。而且C51還有更大的優(yōu)點(diǎn)就是編寫大程序時(shí)的優(yōu)越性更不言
8、而喻,當(dāng)然在那時(shí),我并沒(méi)有想的那么深遠(yuǎn),C51的特 點(diǎn),還是在后來(lái)的實(shí)踐過(guò)程中,漸漸體會(huì)到的!朋友如果你選擇了C51,那么請(qǐng)繼續(xù)往下看,如果你選擇了A51,那么你可以不要看了!因?yàn)橄旅嬷v 的全是C方面的,完全在浪費(fèi)你的時(shí)間!呵呵_ 第二,既然你想學(xué)好單片機(jī),你必須得舍得花錢,如果不買些芯片回來(lái)自己動(dòng)手焊焊拆拆的(但是在后期會(huì)介紹給大家一個(gè)很好用的硬件 仿真軟件,并不需要你用實(shí)驗(yàn)板和仿真器了,直接在你的PC上完成,但是軟件畢竟是軟件,從某個(gè)特定的意義上來(lái)說(shuō)是并不能代替硬件的),即使 你每天捧著本書,把那本書翻爛,也永遠(yuǎn)學(xué)不會(huì)單片機(jī)的!剛接觸單片機(jī)的朋友,看了資料,一定會(huì)對(duì)以下幾個(gè)詞見(jiàn)的比較多,但
9、是具體的概 念還是比較模糊,現(xiàn)作如下說(shuō)明: (1)編程器編程器是用來(lái)燒單片機(jī)芯片的,是把HEX或者BIN文件燒到單片機(jī)ROM里的,供單片機(jī)運(yùn)行的。 (2)實(shí)驗(yàn)板實(shí)驗(yàn)板是專為初學(xué)者根據(jù)某些要求而特做的板,一般上面就有一個(gè)單片機(jī)的最小系統(tǒng),使用者只需寫好程序,燒好芯片,放 到上面加以驗(yàn)證的這么一個(gè)工具。有了實(shí)驗(yàn)板,對(duì)與初學(xué)者來(lái)說(shuō),省去了焊?jìng)€(gè)最小系統(tǒng)的麻煩。但是對(duì)于電子開發(fā)人員來(lái)說(shuō),作用并不是很大 (3)仿真器仿真器是直接把HEX或者BIN文件暫時(shí)放在一個(gè)芯片里,再通過(guò)這個(gè)芯片的引腳連接到實(shí)驗(yàn)板或者系統(tǒng)上工作。這樣以來(lái),可 以省去了來(lái)回插拔芯片帶來(lái)的不必要麻煩。 我一開始也不知道上面3個(gè)的概念和作用
10、,嘿嘿,原本想買個(gè)實(shí)驗(yàn)板(不想焊板,因?yàn)椴豢赡転榱它c(diǎn)亮幾個(gè)流水燈,而去焊?jìng)€(gè)單片機(jī)的最小系統(tǒng)) 的,可是結(jié)果,確和我想的正好相反,人家出售的是編程器。等貨物寄到后,才知道自己搞錯(cuò)了!汗。嘿嘿?,F(xiàn)在想想實(shí)在是又氣又笑。我花 了160大樣買了個(gè)編程器(很不幸的是,這個(gè)編程器更本用不了,一燒芯片,芯片就燒壞了)把我給氣的,這個(gè)編程器,現(xiàn)在還躺在我的抽屜里 呢不過(guò),現(xiàn)在想想,唯一讓我覺(jué)得欣慰的是,那個(gè)老板每次能解答我的問(wèn)題,連那種超級(jí)幼稚的問(wèn)題,他也能不嫌麻煩地盡量幫我解答!這點(diǎn)讓 我很感動(dòng)! 第三,想學(xué)單片機(jī)的必需品-PC。因?yàn)閷懗绦?,編譯或者是仿真都是通過(guò)PC完成的。如果沒(méi)有PC,什么也做不了!有了
11、PC最好還要可 以上網(wǎng),因?yàn)槿绻銢](méi)有可以和你交流單片機(jī)的人,遇到自己解決不了的問(wèn)題,一直都想不通,那么估計(jì)你學(xué)習(xí)單片機(jī)的熱情就會(huì)隨著時(shí)間的 推移而慢慢耗盡。如果你能上網(wǎng)通過(guò)論壇或者QQ群,問(wèn)題就很快得到解決。這樣的學(xué)習(xí)效率一定很高!真正的高手是從論壇中泡出來(lái)的! 有了上述3個(gè)條件后,你就可以開始學(xué)你的單片機(jī)了。但是,真的做起來(lái)并沒(méi)有我所說(shuō)的那么簡(jiǎn)單。你一定會(huì)遇到很多很多的問(wèn)題。比如 為了讓單片機(jī)實(shí)現(xiàn)某個(gè)功能,你可能不知道怎么去寫某個(gè)程序?;蚴悄憧炊速Y料上某個(gè)相似的程序,你自己卻寫不出來(lái)。遇到類似的情況, 記住:千萬(wàn)不要急噪,就行! (二) 說(shuō)了這么多了,相信你也看了很多資料了,手頭應(yīng)該也有
12、必備的工具了吧!(不要忘了上面講過(guò)幾個(gè)條件的哦)。那個(gè)單片機(jī)究竟有什么 功能和作用呢?先不要著急!接下來(lái)讓我們點(diǎn)亮一個(gè)LED(搞電子的應(yīng)該知道LED是什么吧_) 我們?cè)趩纹瑱C(jī)最小系統(tǒng)上接個(gè)LED,看我們能否點(diǎn)亮它!對(duì)了,上面也有好幾次提到過(guò)單片機(jī)最小系統(tǒng)了,所謂單片機(jī)最小系統(tǒng)就是在單片機(jī) 上接上最少的外圍電路元件讓單片機(jī)工作。一般只須連接晶體、VCC、GND、RST即可,一般情況下,AT89C51的31腳須接高電平。 #include/頭文件定義?;蛴?include其具體的區(qū)別在于:后者定義了更多的地址空間。 /在Keil安裝文件夾中,找到相應(yīng)的文件,比較一下便知! sbitP1_0=P10
13、;/定義管腳 voidmain(void) while(1) P1_0=0;/低電平有效,如果把LED反過(guò)來(lái)接那么就是高電平有效 就那么簡(jiǎn)單,我們就把接在單片機(jī)P1_0上的LED點(diǎn)亮了,當(dāng)然LED是低電平,才能點(diǎn)亮。因?yàn)槲覀儼袻ED的正通過(guò)電阻接至VCC。 P1_0=0;類似與C語(yǔ)言中的賦值語(yǔ)句,即把0賦給單片機(jī)的P1_0引腳,讓它輸出相應(yīng)的電平。那么這樣就能達(dá)到了我們預(yù)先的要求了。 while(1)語(yǔ)句只是讓單片機(jī)工作在死循環(huán)狀態(tài),即一直輸出低電平。如果我們要試著點(diǎn)亮其他的LED,也類似上述語(yǔ)句。這里就不再講了。 點(diǎn)亮了幾個(gè)LED后,是不是讓我們聯(lián)想到了繁華的街區(qū)上流動(dòng)的彩燈。我們是不是也可
14、以讓幾個(gè)LED依次按順序亮呢?答案是肯定的!其 實(shí)顯示的原理很簡(jiǎn)單,就是讓一個(gè)LED滅后,另一個(gè)立即亮,依次輪流下去。假設(shè)我們有8個(gè)LED分別接在P1口的8個(gè)引腳上。硬件連接,在 P1_1-P1_7上再接7個(gè)LED即可。例程如下: #include sbitP1_0=P10; sbitP1_1=P11; sbitP1_2=P12; sbitP1_3=P13; sbitP1_4=P14; sbitP1_5=P15; sbitP1_6=P16; sbitP1_7=P17; voidDelay(unsignedchara) unsignedchari; while(-a!=0) for(i=0;i1
15、25;i+);/一個(gè);表示空語(yǔ)句,CPU空轉(zhuǎn)。 /i從0加到125,CPU大概就耗時(shí)1毫秒 voidmain(void) while(1) P1_0=0; Delay(250); P1_0=1; P1_1=0; Delay(250); P1_1=1; P1_2=0; Delay(250); P1_2=1; P1_3=0; Delay(250); P1_3=1; P1_4=0; Delay(250); P1_4=1; P1_5=0; Delay(250); P1_5=1; P1_6=0; Delay(250); P1_6=1; P1_7=0; Delay(250); P1_7=1; sbit定義
16、位變量,unsignedchara定義無(wú)符字符型變量a,以節(jié)省單片機(jī)內(nèi)部資源,其有效值為0255。main函數(shù)調(diào)用Delay()函數(shù)。 Delay函數(shù)使單片機(jī)空轉(zhuǎn),LED持續(xù)點(diǎn)亮后,再滅,下一個(gè)LED亮。while(1)產(chǎn)生循環(huán)。 (三) 上面我們講了如何使LED產(chǎn)生流動(dòng),但是你是否發(fā)現(xiàn)一個(gè)問(wèn)題:寫的太冗長(zhǎng)了!能不能再簡(jiǎn)單點(diǎn)呢?可以!可以使用C51的內(nèi)部函數(shù) INTRINS.H實(shí)現(xiàn)。函數(shù)unsignedchar_crol_(unsignedchara,unsignedcharn)可以使變量a循環(huán)左移n位,如果我們先給P1口賦 00000001那么當(dāng)n為1時(shí),便會(huì)產(chǎn)生和上面一樣的效果! #inc
17、lude #include voidDelay(unsignedchara) unsignedchari; while(-a!=0) for(i=0;i125;i+); voidmain(void) unsignedcharb,i; while(1) b=0xfe; for(i=0;iNewProject-輸入文件名-選擇我們所以使用的芯片(這里我們一般用到Atmel的 AT89C51或AT89C2051,點(diǎn)確定。 3.點(diǎn)File-New-輸入我們編寫的程序,保存為.C文件。(一般情況下,我們保存的文件名和前面的工程名一樣。) 4.展開Target1-右擊SourceGroup1-AddFil
18、estoGroupSourceGroup1-選擇剛才保存的.C文件點(diǎn)擊ADD后,關(guān)閉對(duì) 話框。這樣.C文件就被加到了SourceGroup1下。 5.右擊Target1-OptionsforTarget1-Target中填寫晶體的大小,Output中,在CreateHEXFiles前打上鉤,點(diǎn)確 定。 6.點(diǎn)Project-RebuildAllTragetFiles,若提示 creatinghexfilefromXXX. XXX-0Error(s),0Waring(s). 表示編譯和生成HEX文件成功!接下來(lái)的就是把HEX文件燒到單片機(jī)中,或是仿真器上,看是否達(dá)到預(yù)先的目的! 嘿嘿!現(xiàn)在是否自
19、己好有成就感了,如果讓你去做個(gè)流水彩燈,開發(fā)一個(gè)簡(jiǎn)單的產(chǎn)品,只要加上驅(qū)動(dòng)電路,就可以做出漂亮的流動(dòng)彩燈 了!到現(xiàn)在為止,你應(yīng)該知道單片機(jī)的功能有多強(qiáng)大了吧,如果單純的用數(shù)字電路或模擬電路的知識(shí)去設(shè)計(jì)一個(gè)流動(dòng)彩燈,可能要花點(diǎn)工夫 和時(shí)間才行,有了單片機(jī),那就不一樣了,你只要寫程序控制他就行!有人說(shuō)過(guò)這樣一句話,也并不無(wú)道理的,學(xué)單片機(jī),程序思想很重要! (四) 呵呵,朋友!相信你的流水燈也做的不錯(cuò)了吧,現(xiàn)在能玩出幾種花樣了?你可能會(huì)說(shuō),只要你想得到,想怎么流就怎么流!呵呵,是的。 但是工程師們?cè)O(shè)計(jì)這么一個(gè)單片機(jī),并不是只為了讓它做流水燈的,那樣也太浪費(fèi)點(diǎn)了吧._ 學(xué)過(guò)數(shù)字電路的朋友,一定動(dòng)手做過(guò)
20、8路或者6路的搶答器。用純粹的數(shù)字電路知識(shí)來(lái)做,自己設(shè)計(jì)電路,感到比較困難!搶答器上用的顯 示器多為7段數(shù)碼管,這里我們來(lái)講講,如何用單片機(jī)讓數(shù)碼管顯示0-9。搶答器的實(shí)現(xiàn),我們放到后面再來(lái)探討,因?yàn)閾尨鹌鬟€涉及了鍵盤的 內(nèi)容。8段數(shù)碼管分為共陰和共陽(yáng)兩種。8段數(shù)碼管是由8個(gè)LED組成(還包括一個(gè)小數(shù)點(diǎn))。若為共陽(yáng),則8個(gè)LED的陽(yáng)級(jí)是連接在一起的,同理 若為共陰,則陰極連接在一起。8個(gè)LED對(duì)應(yīng)的標(biāo)號(hào)如下:(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/0-9數(shù)字) a0123456789 _00111111,00000110,0100
21、1111,01011011 f|b |_| |g|c e|_|.dp d 一般情況下,為了計(jì)算或取碼的方便,我們把a(bǔ)-dp依次接到單片機(jī)某個(gè)口上的Px.0-Px.7上。x表示0,1,2,3其中的一個(gè)。這樣我們只 要給某個(gè)口,賦一個(gè)值,則相應(yīng)的LED段就被點(diǎn)亮,但是在硬件連接上要注意了:?jiǎn)纹瑱C(jī)可能不能直接驅(qū)動(dòng)LED,所以我們可以通過(guò)控制三級(jí)管 的導(dǎo)通或截止,來(lái)控制LED的亮與滅! 如果我們把共陰的數(shù)碼管的a-dp依次接到單片機(jī)的P0.0-P0.7上,注意:P0口需接上拉電阻。何為上拉電阻,簡(jiǎn)單的說(shuō),就是把電平拉 高,以提高驅(qū)動(dòng)能力。那么比如:P0=0X3F;則顯示為數(shù)字0。因?yàn)?X3F即為2進(jìn)制
22、的00111111我們低位往高位數(shù),依次為11111100, 其I/O的電平分別為高、高、高、高、高、高、低、低,即對(duì)應(yīng)的a-dp為亮、亮、亮、亮、亮、亮、滅、滅,由上圖我們可以看出g和dp段不 亮其他段均亮,即為我們所看到的數(shù)字0字樣。其他的數(shù)字或字符,也同理可以得到。但是有些朋友就會(huì)問(wèn),那我們每取一個(gè)字模,豈不是 很麻煩?還有自己考慮高低電平什么的?-呵呵,其實(shí)網(wǎng)上有很多LED取模軟件,如果有一定計(jì)算機(jī)編程語(yǔ)言的朋友,也可以試著自己寫個(gè) 取模的程序,讓計(jì)算機(jī)為我們計(jì)算,諸如上述0X3F的數(shù)值。 #include voidDelay(unsignedchara) unsignedchari;
23、 while(-a!=0) for(i=0;i125;i+); voidmain(void) P0=0X3F;/顯示0 Delay(250);/延時(shí) P0=0X00;/短暫的關(guān)閉顯示,若不關(guān)閉,可能會(huì)造成顯示模糊不清。 P0=0X06;/顯示1 Delay(250); P0=0X00; ./以下顯示數(shù)字2-F,略。 看到這里,想必大家一定可以把0-F顯示出來(lái)了吧!但是如果要你顯示兩位數(shù),三位數(shù)呢?或許,有的朋友會(huì)這么想:在P0口上接一個(gè) 數(shù)碼管,再在P1口上接個(gè)數(shù)碼管!但是,如果要顯示4位、5位的數(shù)字呢?那豈不是一塊AT8951都接不過(guò)來(lái)!難到就不能接4位或5位以上的嗎? 肯定不是的! 說(shuō)到這
24、里,我們來(lái)講講數(shù)碼管的顯示方式,可分為兩種:動(dòng)態(tài)掃描和靜態(tài)顯示。上面我們所說(shuō)的即為靜態(tài)顯示。但是如果我們采用動(dòng)態(tài)掃 描顯示,那么就可以解決上面的問(wèn)題,即可以顯示多個(gè)數(shù)碼管了。上面我們所說(shuō)的靜態(tài)顯示把數(shù)碼管的COM腳接至VCC或GND端,其他的接至PX 口上,這樣只要PX口上輸出相應(yīng)的高低電平,就可以顯示對(duì)應(yīng)的數(shù)字或字符。但是如果我們采用動(dòng)態(tài)掃描的方法,比如顯示6個(gè)數(shù)碼管,硬件 連接可以這樣解決:a-dp還是接至P0.0-P0.7上,還有6個(gè)COM腳再接至另外口的P2.0-P2.5。P0口作段選(控制數(shù)字字符)P2口作位選(選 通哪個(gè)數(shù)碼管導(dǎo)通)這樣我們控制P0和P2口就可以控制6個(gè)數(shù)碼管了。但
25、是,細(xì)心的朋友,會(huì)問(wèn)這樣的問(wèn)題:P2位選,是讓數(shù)碼管一個(gè)一個(gè)亮 的,那還是不能控制6個(gè)一起亮或滅嘛!?_想想好象是對(duì)的哦?怎么辦.難道錯(cuò)了? 嘿嘿,問(wèn)你個(gè)問(wèn)題?黑夜里,拿著一支煙,在你面前快速的晃動(dòng),你會(huì)發(fā)現(xiàn)什么樣的現(xiàn)象?是不是原本不連續(xù)的點(diǎn)變成了一條看上去連 續(xù)的曲線或者直線!再回過(guò)頭來(lái),仔細(xì)想想我們的數(shù)碼管!原理是一樣的,你可別忘了,我們的單片機(jī)可是一個(gè)計(jì)算機(jī)哦,計(jì)算機(jī)的運(yùn)算速 度,大家可想而知吧! 這里再說(shuō)說(shuō)51單片機(jī)的機(jī)器周期和時(shí)鐘周期等概念。所謂機(jī)器周期就是訪問(wèn)一次存儲(chǔ)器的時(shí)間。而1個(gè)機(jī)器周期包括12個(gè)時(shí)鐘周期。如果 單片機(jī)工作在12M晶體下,那么一個(gè)時(shí)鐘周期為:1/12微妙。一個(gè)機(jī)
26、器周期12*1/12=1微妙。如果晶體為6M,時(shí)鐘周期和機(jī)器周期各是多少呢 ?在匯編中,我們還要關(guān)心,指令執(zhí)行的機(jī)器周期長(zhǎng)短不一,有1個(gè)周期、2個(gè)周期和4個(gè)周期等。 說(shuō)著說(shuō)著,跑了這么遠(yuǎn)了.還是回到原來(lái)的話題,如果我們把位選的P2也看作上面的“煙”一劃而過(guò),那么我們看到的是不是6個(gè)一起亮 或一起滅了!_哈哈,原來(lái)如此.記住,在任何某一時(shí)刻,有且只有一個(gè)數(shù)碼管能發(fā)光。如果你能把這句話理解了,你是真明白 我的意思了!朋友,現(xiàn)在給你個(gè)任務(wù),讓6個(gè)數(shù)碼管分別顯示1、2、3、4、5、6??茨阕约嚎梢愿愣ú??你自己先試著寫寫看咯. #include voidDelay(unsignedchara) uns
27、ignedchari; while(-a!=0) for(i=0;i125;i+); voidmain(void) while(1) P0=0x06;/1的碼段 P2=0x01;/選通一位,或者P2_0=1; Delay(20);/延時(shí)約20毫秒 P0=0X00;/關(guān)閉顯示 P0=0x5b;/2的碼段 P2=0x02;/選通一位,或者P2_1=1; Delay(20); P0=0X00; P0=0x4f;/3的碼段 P2=0x04;/選通一位,或者P2_2=1; Delay(20); P0=0X00; P0=0x66;/4的碼段 P2=0x08;/選通一位,或者P2_3=1; Delay(20
28、); P0=0X00; P0=0x6d;/5的碼段 P2=0x10;/選通一位,或者P2_4=1; Delay(20); P0=0X00; P0=0x7d;/6的碼段 P2=0x20;/選通一位,或者P2_5=1; Delay(20); P0=0X00; (五) 相信大家一定見(jiàn)過(guò)數(shù)字時(shí)鐘,教學(xué)樓大廳一定有吧。每次路過(guò),基本上只是隨便瞟上一眼,根本沒(méi)去想過(guò)他的工作原理什么。但是今天 你也可以把他做出來(lái)了,是不是覺(jué)得自己很有成就感呢!呵呵!_ 接上面所講的,我們先來(lái)做個(gè)簡(jiǎn)單的實(shí)驗(yàn):在一個(gè)數(shù)碼管上輪流顯示0-9這10個(gè)數(shù)字。還楞著干什么,快動(dòng)手寫程序呀!好象有點(diǎn)難哦, 要不先不要往下看了,嘿嘿,關(guān)機(jī)
29、吧,自己先去想想,怎么樣? #include unsignedcharcodeSEG_TAB=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/0-9數(shù)字 voidDelay(unsignedinta)/unsignedint定義為無(wú)符整形,取值范圍為0-32768 unsignedchari; while(-a!=0) for(i=0;i125;i+); voidmain(void) unsignedchari; while(1) for(i=0;i10;i+) P0=SEG_TABi;/取SEG_TAB數(shù)組中的值 P2=0X01; Del
30、ay(1000); 是不是顯示從0-9,跳動(dòng)顯示,你的心是不是也跟著一起跳呀,離我們的目標(biāo)又邁進(jìn)了一步!不錯(cuò),繼續(xù)努力! 上面只顯示了一個(gè)數(shù)碼管的數(shù)字0-9,但是怎么樣要讓他顯示6個(gè)數(shù)字呢?這樣我們就可以做個(gè)時(shí)鐘出來(lái)玩玩了!還記不記得我們前面 講過(guò)的P2口的位選作用!嘿嘿,沒(méi)忘記就好! #include unsignedcharhour=12,min=0,sec=0; unsignedcharcodeSEG_TAB=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/0-9數(shù)字 voidDelay(unsignedchara) unsigned
31、chari; while(-a!=0) for(i=0;i125;i+); voiddisp(void) P0=SEG_TABsec%10;/顯示秒的個(gè)位 P2=0X01; Delay(15); P2=0; P0=SEG_TABsec/10;/顯示秒的十位 P2=0X02; Delay(15); P2=0; P0=SEG_TABmin%10;/顯示分的個(gè)位 P2=0X04; Delay(15); P2=0; P0=SEG_TABmin/10;/顯示分的十位 P2=0X08; Delay(15); P2=0; P0=SEG_TABhour%10;/顯示時(shí)的個(gè)位 P2=0X10; Delay(15
32、); P2=0; P0=SEG_TABhour/10;/顯示時(shí)的十位 P2=0X20; Delay(15); P2=0; voidmain(void) while(1) disp(); 編譯燒錄芯片后,觀察運(yùn)行現(xiàn)象。矣.怎么一直顯示12:00:00,難道是時(shí)鐘沒(méi)有啟動(dòng)?還是,另外的原因呢?哦,原來(lái)是3個(gè)變量 sec,min,hour初始化后,其值一直沒(méi)有改變!那我們?cè)趺礃硬拍茏屗淖償?shù)值呢?有的朋友一定會(huì)這么認(rèn)為:讓秒個(gè)位延時(shí)1秒,后加1, 而秒十位延時(shí)10秒后,再加1,一直加到6,分個(gè)位加1,依次類推.這樣的想法是不錯(cuò),但是朋友你有沒(méi)有想過(guò)C語(yǔ)言的一般延時(shí)(除非你 把他放到中斷里)極不精確!
33、這樣累計(jì)下來(lái),一天24小時(shí)的誤差,肯定很大很大,我曾經(jīng)也用延時(shí)的方法寫過(guò)時(shí)鐘,1個(gè)小時(shí)誤差8秒,那是 個(gè)什么概念!一天24小時(shí)就要24*8=192,約為3分鐘,一個(gè)月就是10分鐘.有沒(méi)有其他的方法可以改進(jìn)些呢?有!這里就要涉及到單片機(jī)中 另一個(gè)比較重要的核心部分:?jiǎn)纹瑱C(jī)的中斷和定時(shí)器的運(yùn)用!想寫出比較精確(這里說(shuō)的只的相對(duì)前面的做法而言比較精確而已,如果要做 更加精確的時(shí)鐘,用時(shí)鐘芯片比較好點(diǎn),常用的有DS12887和DS1302等)的時(shí)鐘程序,就一定要調(diào)用中斷和定時(shí)器。還是大家先看看教材和書 吧,畢竟人家出的書,肯定比我要寫的系統(tǒng)多了,下面我們?cè)賮?lái)簡(jiǎn)單的講講! (六) 什么是中斷呢?講個(gè)比較
34、通俗的例子:比如你正在家中看電視,突然電話響了,你的第一反應(yīng)是什么?是不是先跑過(guò)去接電話!接完電話 后,繼續(xù)看電視。這就是個(gè)中斷的例子,中斷是由電話引起了,你跑過(guò)去就是響應(yīng)中斷,接電話就是中斷的處理!接完電話后,接續(xù)看電視, 即恢復(fù)中斷,等待下個(gè)中斷的到來(lái)! 但是這個(gè)好象和單片機(jī)沒(méi)什么聯(lián)系呀?有的朋友或許會(huì)這樣疑問(wèn)。是的。單片機(jī)當(dāng)然不會(huì)看電視了,也不會(huì)接電話了!_但是,類 比一下:比如單片機(jī)正在執(zhí)行某個(gè)任務(wù),突然要有更重要的事件,要求單片機(jī)響應(yīng),單片機(jī)就會(huì)應(yīng)答響應(yīng),去執(zhí)行更為重要的任務(wù)(中斷處理 ),原來(lái)的任務(wù)就繼續(xù)等待(現(xiàn)場(chǎng)的保護(hù))。執(zhí)行完更重要的任務(wù)后,回到中斷的入口處,繼續(xù)執(zhí)行原來(lái)的任務(wù)
35、(現(xiàn)場(chǎng)中斷的恢復(fù))。51系列 的單片機(jī)共有5個(gè)中斷源,分別為:外中斷0、定時(shí)器T0中斷、外中斷1、定時(shí)器T1中斷、串口中斷。 或許,有些朋友已經(jīng)大概領(lǐng)會(huì)了其中的意思,有些朋友還迷迷糊糊。不過(guò)不要緊,我們繼續(xù)往下看,下面我們來(lái)講講單片機(jī)的定時(shí)器是什 么?如何工作的?定時(shí)器,大家從字面上就可以看出其大概的意思吧?簡(jiǎn)單的說(shuō):就是起定時(shí)作用!也就是讓單片機(jī)計(jì)數(shù)。定時(shí)器分為:方式 0方式1、方式2和方式3等4種工作方式。有些朋友一定會(huì)問(wèn):定時(shí)器如何啟動(dòng)?風(fēng)扇的定時(shí)器,相信大家一定都用過(guò)吧!但是單片機(jī)的定時(shí)器, 該如何啟動(dòng)呢?總不該也用手一擰定時(shí)器吧!_當(dāng)然不是,我們只要給單片機(jī)一些指令,就可以啟動(dòng)定時(shí)器
36、了!下面我們就定時(shí)器0,來(lái)說(shuō) 說(shuō)怎么啟動(dòng)定時(shí)器0。 TMOD=0X01;/設(shè)置定時(shí)器0工作方式0 TH0=(65536-5000)/256;/載入高8位初值 TL0=(65536-5000)%256;/載入低8位初值 TR0=1;/啟動(dòng)定時(shí)器 _,簡(jiǎn)單吧,這樣我們就可以把定時(shí)器啟動(dòng)了。其中TMOD為T/C方式控制寄存器: D7D6D5D4D3D2D1D0 _ GATEC/TM1M0GATEC/TM1M0 |_|_| |T/C1|T/C0| C/T就是counter(記數(shù)器)和timer(定時(shí)器)的選擇位,若值為1,則作計(jì)數(shù)器用。為0,則為定時(shí)期用!GATE為門控位。M1和M0工作方 式的選擇:
37、若M1=0;M0=0則為方式0:13位定時(shí)/記數(shù)器。若M1=0;M0=1則為方式1,16定時(shí)/記數(shù)器。若M1=1;M0=0則為方式2,自動(dòng)裝載8位 定時(shí)/記數(shù)器。若M1=1;M0=1則為方式3,只適用于T/C0,2個(gè)8位定時(shí)/記數(shù)器。 說(shuō)了一大堆,感到有點(diǎn)困惑了吧。那我們還是來(lái)說(shuō)說(shuō)上面的。TMOD=0X01;/至于為什么是0X01,大家看:我們選擇的是定時(shí)器0方式0, 所以T/C1全為0,而T/C0的M1為0。M0為1,所以D0-D7為0X01;0X01表示的是16進(jìn)制數(shù),這個(gè)大家應(yīng)該都知道吧!還有D0-D7表示的是2進(jìn)制數(shù)。 還需要轉(zhuǎn)換一下! TH0=(65536-5000)/256;/載入
38、高8位初值。若在12M晶體下,定時(shí)5000微秒,即為5毫秒;但是如果不是在12M下,那又該怎么計(jì)算 了呢?如果是11.0592M呢?還記不記得,我們前面講過(guò)的機(jī)器周期和時(shí)鐘周期的概念?_忘了,還是看看前面吧!呵呵!沒(méi)事,學(xué)習(xí)嘛,忘 了再翻翻書,看看就可以了!其實(shí)上訴的5000=1*C很顯然C=5000,但是如果是11.0592M那么就不是1了,應(yīng)該是1.085了,那么5000= 1.085*C,則C就為5000/1.085=?具體多少,大家自己去算算吧?同理TL0也是一樣的!但是,細(xì)心的朋友會(huì)發(fā)現(xiàn)網(wǎng)上或者是資料上的 TH0,TL0并不是和上面一樣的,而是直接TH0=0XEC;TL0=0X78是
39、不是和上面的一樣的,別忘了單片機(jī)也是計(jì)算機(jī)的一種哦。用C的話,直 接寫上計(jì)算公式就行,計(jì)算就交給單片機(jī)完成。 TR0=1;這句就是啟動(dòng)定時(shí)器0,開始記數(shù)!哦,還有一點(diǎn),有些朋友會(huì)問(wèn),你是65536是哪里來(lái)的呢?呵呵你可別忘了:設(shè)置定時(shí)器0 工作方式0是16位的(2的16次方是多少,自己算算就知道了)簡(jiǎn)單吧?但是如何和中斷一起使用呢?請(qǐng)繼續(xù)看下面的講解! TMOD=0X01;/設(shè)置定時(shí)器0工作方式0 TH0=(65536-5000)/256;/載入高8位初值 TL0=(65536-5000)%256;/載入低8位初值 TR0=1;/啟動(dòng)定時(shí)器 EA=1;/開總中斷 ET0=1;/開定時(shí)器中斷。若
40、為0則表示關(guān)閉! 這樣我們,就初始化定時(shí)器T0和中斷了,也就是定時(shí)器滿5毫秒后,產(chǎn)生一次中斷。產(chǎn)生中斷后,我們?cè)趺刺幚砟??嘿嘿!仔?xì)想想? _ 每次中斷后,我們可以讓一個(gè)變量自加1,那么200次中斷后,不就是1秒的時(shí)間了嗎?比起上面我們說(shuō)的延時(shí)來(lái)出來(lái)是不是更加精確多了呢? 那是肯定的!但是想想1秒種的時(shí)間就讓單片機(jī)產(chǎn)生那么多次的中斷,單片機(jī)會(huì)不會(huì)累著呢?恩,那么不好。如果在12M的晶體下,T0每次中 斷不是可以產(chǎn)生最多65.336毫秒的時(shí)間嗎?那么我們讓他每50毫秒中斷一次好了!這樣我們就20次搞定一秒的時(shí)間了!爽 好了,講了那么多,現(xiàn)在我們來(lái)寫個(gè)時(shí)間的程序吧!_ #include #defi
41、neHI(65536-50000)/256) #defineLO(65536-50000)%256) #define_TH0_TL0_(65536-50000) #defineM20/(1000/25) /*/ unsignedhou=12,min=0,sec=0; unsignedcharSEG_TAB_B=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/0-9數(shù)字 unsignedcharSEG_TAB_A=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/0.-9.數(shù)字 /*/ vo
42、idDelay(unsignedchara)/延時(shí)程序a*1MS unsignedcharj; while(a-!=0) for(j=0;j125;j+); /*/ voidDisp(void)/數(shù)碼管顯示 P2_0=1; P1=SEG_TAB_Bhou/10; Delay(5); P2_0=0; P2_1=1; P1=SEG_TAB_Ahou%10; Delay(5); P2_1=0; P2_2=1; P1=SEG_TAB_Bmin/10; Delay(5); P2_2=0; P2_3=1; P1=SEG_TAB_Amin%10; Delay(5); P2_3=0; P2_4=1; P1=S
43、EG_TAB_Bsec/10; Delay(5); P2_4=0; P2_5=1; P1=SEG_TAB_Bsec%10; Delay(5); P2_5=0; /*/ voidIsrTimer0(void)interrupt1using1/定時(shí)50ms staticunsignedcharcount=0;/定義靜態(tài)變量count count+; if(count=M) count=0; sec+; if(sec=60) min+; sec=0; if(min=60) hou+; min=0; if(hou=24) hou=0; /if /if /if /*/ voidTimer0Init(vo
44、id)/定時(shí)器0 TMOD=0x01; TH0=HI; TL0=LO; TR0=1; ET0=1; EA=1; /*/ voidmain(void)/主函數(shù) Timer0Init(); while(1) Disp(); 簡(jiǎn)單吧,還是有點(diǎn)看不懂哦,那你自己慢慢體會(huì)吧,如果你自己能寫個(gè)時(shí)鐘程序來(lái),那么你的51單片機(jī)也就學(xué)了80%了。中斷和 定時(shí)/記數(shù)器器,是個(gè)很重要的東西,幾乎用到單片機(jī)的地方都會(huì)涉及到中斷和定時(shí)!所以大家要好好掌握哦!_ 哈哈,趕緊編譯HEX文件,搭好硬件,燒入單片機(jī),上電看看效果先!呵呵,現(xiàn)在你應(yīng)該有成就感了吧,想不到一個(gè)時(shí)鐘居然那么 簡(jiǎn)單,嘿嘿!但是問(wèn)題來(lái)了!時(shí)鐘雖然做出來(lái)了,但是他的精度怎么樣呢?一兩個(gè)小時(shí),或許看不出什么誤差,但是一天或者一年呢? 暈,我的天呀,要是按年來(lái)算的話,那這個(gè)時(shí)鐘根本沒(méi)有實(shí)用價(jià)值!人家都說(shuō)用C寫不出,精度高的時(shí)鐘程序來(lái)的!是不是有點(diǎn)后悔 了,去學(xué)匯編吧!但是既然選擇了C,那么就不要后悔!嘿嘿,想想C的高級(jí)語(yǔ)言,怎么會(huì)輸給匯編呢_呵呵!看下面這段代碼: staticunsignedcharcount=0; TR0=0; TL0+=(_TH0_TL0_+9)%256; TH0+=(_T
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025 小學(xué)六年級(jí)數(shù)學(xué)上冊(cè)比的規(guī)劃區(qū)域比例課件
- 2020晉升述職報(bào)告
- 量學(xué)基礎(chǔ)知識(shí)
- 量化風(fēng)控培訓(xùn)課件模板
- 里約介紹教學(xué)課件
- 高中歷史第四單元亞洲覺(jué)醒的先驅(qū)第1課中國(guó)民主革命的先行者孫中山講義
- 拼色實(shí)景研究生復(fù)試簡(jiǎn)歷
- 2026年口腔醫(yī)療管理公司員工工傷處理管理制度
- 鄭州安全生產(chǎn)培訓(xùn)基地課件
- 鄭州培訓(xùn)建筑安全員課件
- 清華大學(xué)教師教學(xué)檔案袋制度
- 公租房完整租賃合同范本
- 東南大學(xué)附屬中大醫(yī)院2026年招聘?jìng)淇碱}庫(kù)及答案詳解參考
- 2025新疆阿瓦提縣招聘警務(wù)輔助人員120人參考筆試題庫(kù)及答案解析
- 貴州國(guó)企招聘:2025貴州鹽業(yè)(集團(tuán))有限責(zé)任公司貴陽(yáng)分公司招聘考試題庫(kù)附答案
- 2025-2026學(xué)年秋季學(xué)期教學(xué)副校長(zhǎng)工作述職報(bào)告
- GB/T 3098.5-2025緊固件機(jī)械性能第5部分:自攻螺釘
- 2026年服裝電商直播轉(zhuǎn)化技巧
- 2025-2026學(xué)年小學(xué)美術(shù)浙美版(2024)二年級(jí)上冊(cè)期末練習(xí)卷及答案
- 會(huì)所軟裝合同范本
- 沖刺2026中考-科學(xué)備考班會(huì)課件
評(píng)論
0/150
提交評(píng)論