|
本帖最后由 51黑tt 于 2016-3-6 14:52 編輯
第一課 制作機(jī)器人的基礎(chǔ)
在論壇上經(jīng)?梢钥吹接腥苏f(shuō):“我是菜鳥,制作機(jī)器人需要什么基礎(chǔ)?”。其
實(shí)我可以回答大家:“基礎(chǔ)就是你首先要學(xué)好數(shù)理化”,怎么樣很意外吧!現(xiàn)在
我來(lái)給大家講講為什么這么說(shuō)。機(jī)器人制作綜合性很強(qiáng),它涉及機(jī)械制造、計(jì)
算機(jī)、電子技術(shù)等很多領(lǐng)域,每一個(gè)領(lǐng)域都是以我們的數(shù)理化為基礎(chǔ)的,還有就
是要充分利用互聯(lián)網(wǎng)的資源自我學(xué)習(xí)。
以下是我在論壇發(fā)過(guò)的一篇貼子,希望大家用心體會(huì)。
高手的秘訣
1.不要看到別人的回復(fù)第一句話就說(shuō):給個(gè)代碼吧!你應(yīng)該想想為什么。當(dāng)你自己想 出來(lái)
再參考別人的提示,你就知道自己和別人思路的差異。
2.別小家子氣,買本書幾十塊都舍不得,你還學(xué)個(gè)P。為了省錢看電子書,浪費(fèi)的時(shí)間絕對(duì)
超過(guò)書的價(jià)值。當(dāng)然如果查資料,只能看PDF。
3.學(xué)習(xí)新的開發(fā)軟件時(shí),一定要看幫助手冊(cè)。買的書不夠全面。剛接觸一個(gè)軟件,什么都不
懂,就盲目的問(wèn)東問(wèn)西,讓人看起來(lái)很幼稚。
4.不要蜻蜓點(diǎn)水,得過(guò)且過(guò),細(xì)微之處往往體現(xiàn)實(shí)力。
5.把時(shí)髦的技術(shù)掛在嘴邊,還不如把過(guò)時(shí)的技術(shù)記在心里。
6.看得懂的書,請(qǐng)仔細(xì)看;看不懂的書,請(qǐng)硬著頭皮看。
.別指望看第一遍書就能記住和掌握什么——請(qǐng)看第二遍、第三遍。
7.多實(shí)踐,去焊板子、調(diào)試,去寫去調(diào),只用軟件模擬,是永遠(yuǎn)成不了高手的。
8.保存好你做過(guò)的所有的源程序、PCB、原理圖等----那是你最好的積累之一。
9.對(duì)于網(wǎng)絡(luò),還是希望大家能多利用一下,很多問(wèn)題不是非要到論壇來(lái)問(wèn)的,首先你要學(xué)會(huì)
自己找答案,比如google、百度都是很好的搜索引擎,你只要輸入關(guān)鍵字就 能找到很多相
關(guān)資料,別老是等待別人給你希望,看的出你平時(shí)一定也很懶!
10 到一個(gè)論壇,你學(xué)會(huì)去看以前的帖子,不要什么都不看就發(fā)帖子問(wèn),也許你的問(wèn)題早就
有人問(wèn)過(guò)了,你再問(wèn),別人已經(jīng)不想再重復(fù)了,做為初學(xué)者,誰(shuí)也不希望自己的帖子沒(méi)人回
的。
11,雖然不是打擊初學(xué)者,但是這句話還是要說(shuō):論壇論壇,就是大家討論的地方,如果你
總期望有高手總無(wú)償指點(diǎn)你,除非他是你親戚!討論者,起碼是水平相當(dāng)?shù)牟庞杏懻摰恼f(shuō)
法,如果水平真差距太遠(yuǎn)了,連基本操作都需要?jiǎng)e人給解答,誰(shuí)還跟你討論呢。
什么樣的人是浮躁的人?
浮躁的人容易問(wèn):我到底該學(xué)什么;
----踏踏實(shí)實(shí)的學(xué)點(diǎn)基本的吧?單片機(jī)不知道是什么就想去學(xué)ARM?
c語(yǔ)言不會(huì)想搞LINUX?別老是好高騖遠(yuǎn)。
浮躁的人容易問(wèn):誰(shuí)有xxx源碼?--(你給人家多少錢。孔约旱膭趧(dòng)白送你?)
浮躁的人容易說(shuō):跪求xxx ---(就算網(wǎng)絡(luò)也要點(diǎn)尊嚴(yán)吧?)
浮躁的人容易說(shuō):緊急求救---(其實(shí)只是個(gè)簡(jiǎn)單的課程設(shè)計(jì))
浮躁的人容易說(shuō):有沒(méi)有xxx中文資料?---一個(gè)字:懶。別說(shuō)別的。E文不行?誰(shuí)不是從
ABC學(xué)起的?
浮躁的人容易說(shuō):求xxx,我的email是xxx@xxx.com,然后消失 ---- 你以為你是大爺啊,人
家請(qǐng)你吃飯,還要喂到你口里不成?
浮躁的人容易問(wèn):做單片機(jī)有錢途嗎----只是為了錢,搞不好技術(shù)的,你去搶銀行好了。
浮躁的人容易說(shuō):哪里有xxx芯片資料?(其實(shí)大部分資料網(wǎng)絡(luò)上都有,但是偏偏來(lái)找人
問(wèn),懶。
浮躁的人分兩種:只觀望而不學(xué)的人;只學(xué)而不堅(jiān)持的人;
浮躁的人永遠(yuǎn)不是一個(gè)高手。
lamp
看完后明白了吧,恭喜!你已經(jīng)邁出了第一步。
第一課就到這里,下課接著講。
_________________
第二課 機(jī)器人的組成
機(jī)器人一般是由以下模塊組成:
1.語(yǔ)音模塊
用于語(yǔ)音對(duì)話、語(yǔ)音控制。
2.燈光表達(dá)模塊
用于機(jī)器人狀態(tài)顯示、感情表達(dá)(喜、怒、哀、樂(lè))
3.控制模塊
I/O+決策,即機(jī)器人的大腦,其控制能力及AI由編程者的水平?jīng)Q定。
4.傳感器模塊
對(duì)外界環(huán)境的的感知。
5.電源模塊
為機(jī)器人提供能源,常用有3v、5v、6v、9v、12v。
6.減速電機(jī)
常用于機(jī)器人行走驅(qū)動(dòng),根據(jù)需要選擇變比。
7.驅(qū)動(dòng)模塊
機(jī)器人的執(zhí)行機(jī)構(gòu),常選用行模中的舵機(jī)。
8.視頻模塊
機(jī)器人的眼
9.機(jī)械模塊
10.無(wú)線通訊模塊
11.控制軟件
一個(gè)簡(jiǎn)單的機(jī)器人是由單片機(jī)電路、紅外傳感器、減速電機(jī)+程序這是大多數(shù)人
認(rèn)同的,但是我要向大家說(shuō)這種認(rèn)識(shí)是錯(cuò)誤的,真正的機(jī)器人不是幾片單機(jī)和
幾臺(tái)電腦就可以解決,關(guān)鍵就是‘機(jī)器人’中這個(gè)‘人’字,還需要我們一代代
的努力。
以上講的有點(diǎn)簡(jiǎn)單,先寫出。
-------------------------------
第三課 機(jī)器人的工作原理
機(jī)器人是機(jī)器有人的特點(diǎn),我們可以從人自身出發(fā)就容易理解他的工作原理了.
簡(jiǎn)單的講就是傳感器將得到的信息送到處理器決策執(zhí)行驅(qū)動(dòng)器的動(dòng)作。
就講這么多,到后面有實(shí)例大家就明白了。
哈哈,這小子太^&%**
第四課 常用工具的使用
1.電源插座
電源插座買的時(shí)候要選插口多的那種,否則在以后的使用中你會(huì)發(fā)現(xiàn)插口不夠用,把電烙鐵和可調(diào)穩(wěn)壓電源的插頭插上。
2.電烙鐵的使用
電烙鐵是進(jìn)行無(wú)線電制作不可缺少的工具之一,電烙鐵是用來(lái)焊錫的,為方便使用,通常做成“焊錫絲”,焊錫絲內(nèi)一般都含有助焊的松香。松香是一種助焊劑,可以幫助焊接,可到藥店購(gòu)買。松香可以直接用,也可以配置成松香溶液,就是把松香碾碎,放入小瓶中,再加入酒精攪勻。注意酒精易揮發(fā),用完后記得把瓶蓋擰緊。瓶里可以放一小塊棉花,用時(shí)就用鑷子夾出來(lái)涂在印刷板上或元器件上。注意市面上有一種焊錫膏(有稱焊油),這可是一種帶有腐蝕性的東西,是用在工業(yè)上的,不適合電子制作使用。還有市面上的松香水,并不是我們這里用的松香溶液。新的電烙鐵不能拿來(lái)就用,需要先給烙鐵頭鍍上一層焊錫。方法:給電烙鐵通電,待溫度升高以后,再用焊錫絲融化在烙鐵頭上,使烙鐵頭上鍍上一層焊錫,烙鐵頭鍍上焊錫,不但能保護(hù)烙鐵頭不被氧化,而且使烙鐵頭傳熱快,吃錫容易,焊接質(zhì)量也容易得到保證。電烙鐵使用時(shí)間長(zhǎng)了以后,烙鐵頭會(huì)變黑或變得不平,這時(shí)候可以用銼刀銼平,然后再鍍上焊錫。最好買一個(gè)烙鐵架,平時(shí)電烙鐵不用時(shí)可以將電烙鐵放在烙鐵架上。使用烙鐵時(shí),烙鐵的溫度太低則熔化不了焊錫,或者使焊點(diǎn)未完全熔化而成不好看、不可靠的樣子。太高又會(huì)使烙鐵不能蘸上錫。 另外也要控制好焊接的時(shí)間,電烙鐵停留的時(shí)間太短,焊錫不易完全熔化、接觸好,形成“虛焊”,而焊接時(shí)間太長(zhǎng)又容易損壞元器件,或使印刷電路板的銅箔翹起。一般一兩秒內(nèi)要焊好一個(gè)焊點(diǎn),若沒(méi)完成,寧愿等一會(huì)兒再焊一次。焊接時(shí)電烙鐵不能移動(dòng),應(yīng)該先選好接觸焊點(diǎn)的位置,再用烙鐵頭的搪錫面去接觸焊點(diǎn)。
3.萬(wàn)用表的使用
萬(wàn)用表的使用的注意事項(xiàng)
a在使用萬(wàn)用表之前,應(yīng)先進(jìn)行“機(jī)械調(diào)零”,即在沒(méi)有被測(cè)電量時(shí) ,使萬(wàn)用表指針指在零電壓或零電流的位置上。
。2)在使用萬(wàn)用表過(guò)程中,不能用手去接觸表筆的金屬部分 ,這樣一方面可以保證測(cè)量的準(zhǔn)確,另一方面也可以保證人身安全。
。3)在測(cè)量某一電量時(shí),不能在測(cè)量的同時(shí)換檔,尤其是在測(cè)量高電壓或大電流時(shí) ,更應(yīng)注意。否則,會(huì)使萬(wàn)用表毀壞。如需換擋,應(yīng)先斷開表筆,換擋后再去測(cè)量。
(4)萬(wàn)用表在使用時(shí),必須水平放置,以免造成誤差。同時(shí), 還要注意到避免外界磁場(chǎng)對(duì)萬(wàn)用表的影響。
。5)萬(wàn)用表使用完畢,應(yīng)將轉(zhuǎn)換開關(guān)置于交流電壓的最大擋。如果長(zhǎng)期不使用 ,還應(yīng)將萬(wàn)用表內(nèi)部的電池取出來(lái),以免電池腐蝕表內(nèi)其它器件。
歐姆擋的使用
一、選擇合適的倍率。在歐姆表測(cè)量電阻時(shí),應(yīng)選適當(dāng)?shù)谋堵,使指針指示在中值附近。最好不使用刻度左邊三分之一的部分,這部分刻度密集很差。
二、使用前要調(diào)零。
三、不能帶電測(cè)量。
四、被測(cè)電阻不能有并聯(lián)支路。
五、測(cè)量晶體管、電解電容等有極性元件的等效電阻時(shí),必須注意兩支筆的極性。
六、用萬(wàn)用表不同倍率的歐姆擋測(cè)量非線性元件的等效電阻時(shí),測(cè)出電阻值是不相同的。這是由于各擋位的中值電阻和滿度電流各不相同所造成的,機(jī)械表中,一般倍率越小,測(cè)出的阻值越小。
萬(wàn)用表測(cè)直流時(shí)
一、進(jìn)行機(jī)械調(diào)零。
二、選擇合適的量程檔位。
三、使用萬(wàn)用表電流擋測(cè)量電流時(shí),應(yīng)將萬(wàn)用表串聯(lián)在被子測(cè)電路中,因?yàn)橹挥写B接才能使流過(guò)電流表的電流與被測(cè)支路電流相同 。測(cè)量時(shí),應(yīng)斷開被測(cè)支路 ,將萬(wàn)用表紅、黑表筆串接在被斷開的兩點(diǎn)之間 。特別應(yīng)注意電流表不能并聯(lián)接在被子測(cè)電路中 ,這樣做是很危險(xiǎn)的,極易使萬(wàn)表燒毀。
四、注意被測(cè)電量極性。
五、正確使用刻度和讀數(shù)。
六、當(dāng)選取用直流電流的2.5A擋時(shí),萬(wàn)用表紅表筆應(yīng)插在2.5A測(cè)量插孔內(nèi) ,量程開關(guān)可以置于直流電流擋的任意量程上。
七、如果被子測(cè)的直流電流大于2.5A,則可將2.5A擋擴(kuò)展為5A擋 。方法很簡(jiǎn)單,使用者可以在“2.5A”插孔和黑表筆插孔之間接入一支0.24歐姆的電阻 ,這樣該擋位就變成了5A電流擋了。接入的0.24A電阻應(yīng)選取用2W以上的線繞電阻 ,如果功率太小會(huì)使之燒毀。
_________________
第五課 單片機(jī)
今天給大家講講單片機(jī),跟上幾課一樣比較枯燥但打基礎(chǔ)就是這樣,偷不的懶。
對(duì)一個(gè)初學(xué)單片機(jī)的人來(lái)說(shuō),學(xué)習(xí)的方法和途徑非常重要。如果按教科書式的學(xué)
法,上來(lái)就是指令,名詞,學(xué)了半天也搞不懂,用不了幾天就半途而廢,本講座
學(xué)習(xí)與實(shí)驗(yàn)結(jié)合實(shí)際,邊學(xué),邊練,讓你輕松進(jìn)入單片機(jī)世界。本講座以80C51為
主,主要以練為主,采用跟我學(xué),學(xué)習(xí)單片機(jī)的基礎(chǔ)知識(shí),結(jié)構(gòu),指令,及開發(fā)
的一般方發(fā)。跟我練,學(xué)習(xí)I/O口應(yīng)用,中斷,定時(shí),串行口,數(shù)/模轉(zhuǎn)換,的練
習(xí)。跟我用講實(shí)用的單片機(jī)設(shè)計(jì)。
初學(xué)單片機(jī)必備設(shè)備,初學(xué)者不可不備的工具及軟件
一.學(xué)單片機(jī)需要的設(shè)備
這是一個(gè)很多想學(xué)單片機(jī)的人都比較關(guān)心的問(wèn)題,我不希望花很多錢的代價(jià)學(xué)單片
機(jī)
1,要有一臺(tái)電腦,最好在486或者586以上
2,要有一個(gè)編程器,最好Windows界面,用來(lái)把編譯好的程序?qū)懭雴纹瑱C(jī)的
ROM里面,把寫好后的芯片插到試驗(yàn)板上面進(jìn)行試驗(yàn)。
本站可提供:AT51串口編程器, AT51pro編程器能夠?qū)TMEL公司的
AT89c52/51/2051/1051單片機(jī)進(jìn)行全面的編程操作,包括寫入、擦除、等。編程
器采用串口與PC聯(lián)接,安裝簡(jiǎn)便。只要你將編程器用串口電纜聯(lián)到PC的COM1或
COM2端口,無(wú)需什么設(shè)置。操作軟件為Windows中文,可以工作在
Windows95/97/98/98se/98me/xp/2k操作系統(tǒng);適合單片機(jī)開發(fā)、學(xué)習(xí)、產(chǎn)品生產(chǎn)
使用。
3,要有一個(gè)硬件單片機(jī)試驗(yàn)板,作為單片機(jī)的試驗(yàn)
4,要有幾個(gè)用來(lái)試驗(yàn)的單片機(jī)芯片,比如應(yīng)用的比較廣泛的89C51,2051
5 由于AT89C單片機(jī)具有可反復(fù)燒寫的特點(diǎn),在設(shè)計(jì)程序時(shí)可反復(fù)修改原程序、
編譯、并燒寫到單片機(jī),若程序稍復(fù)雜點(diǎn)再配合軟件仿真排錯(cuò),直至完成設(shè)計(jì),
完全沒(méi)必要再使用昂貴的仿真器。
二、軟件準(zhǔn)備:一些常用軟件是必須具備的。
51單片機(jī)集成開發(fā)系統(tǒng)MedWin 見軟件講座
c51eva c51eva是keil的c51開發(fā)環(huán)境,我們經(jīng)常會(huì)在網(wǎng)上見到這個(gè)軟件。其實(shí)
他同樣可以用匯編以及PL/M等語(yǔ)言進(jìn)行開發(fā)。見軟件講座
軟件仿真8051debug適應(yīng)于與8051完全兼容的單片機(jī),如AT89C51系列。
51 Hex--bin轉(zhuǎn)換工具
51 bin--Hex轉(zhuǎn)化工具
51波特率初值設(shè)定軟件
LED--encode數(shù)碼管編碼器
繪圖用的protel99
目前開發(fā)單片機(jī)的應(yīng)用軟件比較雜亂,使初學(xué)者無(wú)所適從;這里我們推薦萬(wàn)利公
司的Medwin或Keil公司的c51eval,這兩個(gè)均為集成系統(tǒng),所謂集成,是指將原程
序編寫、匯編/編譯/連接、調(diào)試等開發(fā)單片機(jī)所要用到的程序集合到一個(gè)軟件中
。目前Medwin有免費(fèi)中文版,很適合初學(xué)者使用。
單片機(jī)的組成
單片機(jī)要自動(dòng)完成計(jì)算,它應(yīng)該具有哪些最重要的部分呢?
我們以打算盤為例計(jì)算一道算術(shù)題。例:36+163×156-166÷34,F(xiàn)在要
進(jìn)行運(yùn)算,首先需要一把算盤,其次是紙和筆。我們把要計(jì)算的問(wèn)題記錄下來(lái),
然后第一步先算163×156,把它與36相加的結(jié)果記在紙上,然后計(jì)算166÷34,再
把它從上一次結(jié)果中減去,就得到最后的結(jié)果。
現(xiàn)在,我們用單片機(jī)來(lái)完成上述過(guò)程,顯然,它首先要有代替算盤進(jìn)行運(yùn)算
的部件,這就是“運(yùn)算器”;其次,要有能起到紙和筆作用的器件,即能記憶原
始題目、原始數(shù)據(jù)和中間結(jié)果,還要記住使單片機(jī)能自動(dòng)進(jìn)行運(yùn)算而編制的各種
命令。這類器件就稱為“存貯器”。此外,還需要有能代替人作用的控制器,它
能根據(jù)事先給定的命令發(fā)出各種控制信號(hào),使整個(gè)計(jì)算過(guò)程能一步步地進(jìn)行。但
是光有這三部分還不夠,原始的數(shù)據(jù)與命令要輸入,計(jì)算的結(jié)果要輸出,都需要
按先后順序進(jìn)行,有時(shí)還需等待。如上例中,當(dāng)在計(jì)算163×156時(shí),數(shù)字36就不
能同時(shí)進(jìn)入運(yùn)算器。因此就需要在單片機(jī)上設(shè)置按控制器的命令進(jìn)行動(dòng)作的“門
”,當(dāng)運(yùn)算器需要時(shí),就讓新數(shù)據(jù)進(jìn)入;蛘撸(dāng)運(yùn)算器得到最后結(jié)果時(shí),再將
此結(jié)果輸出,而中間結(jié)果不能隨便“溜出”單片機(jī)。這種對(duì)輸入、輸出數(shù)據(jù)進(jìn)行
一定管理的“門”電路在單片機(jī)中稱為“口”(Port)。在單片機(jī)中,基本上有
三類信息在流動(dòng),一類是數(shù)據(jù),即各種原始數(shù)據(jù)(如上例中的36、163等)、中間
結(jié)果(如166÷34所得的商4、余數(shù)30等)、程序(命令的集合)等。這樣要由外
部設(shè)備通過(guò)“口”進(jìn)入單片機(jī),再存放在存貯器中,在運(yùn)算處理過(guò)程中,數(shù)據(jù)從
存貯器讀入運(yùn)算器進(jìn)行運(yùn)算,運(yùn)算的中間結(jié)果要存入存貯器中,或最后由運(yùn)算器
經(jīng)“出入口”輸出。用戶要單片機(jī)執(zhí)行的各種命令(程序)也以數(shù)據(jù)的形式由存
貯器送入控制器,由控制器解讀(譯碼)后變?yōu)楦鞣N控制信號(hào),以便執(zhí)行如加、
減、乘、除等功能的各種命令。所以,這一類信息就稱為控制命令,即由控制器
去控制運(yùn)算器一步步地進(jìn)行運(yùn)算和處理,又控制存貯器的讀(取出數(shù)據(jù))和寫(
存入數(shù)據(jù))等。第三類信息是地址信息,其作用是告訴運(yùn)算器和控制器在何處去
取命令取數(shù)據(jù),將結(jié)果存放到什么地方,通過(guò)哪個(gè)口輸入和輸出信息等。
存貯器又分為只讀存貯器和讀寫存貯器兩種,前者存放調(diào)試好的固定程序和
常數(shù),后者存放一些隨時(shí)有可能變動(dòng)的數(shù)據(jù)。顧名思義,只讀存貯器一旦將數(shù)據(jù)
存入,就只能讀出,不能更改(EPROM、E2PROM等類型的ROM可通過(guò)一定的方法來(lái)
更改、寫入數(shù)據(jù)——編者注)。而讀寫存貯器可隨時(shí)存入或讀出數(shù)據(jù)。
實(shí)際上,人們往往把運(yùn)算器和控制器合并稱為中央處理單元——CPU。單片機(jī)
除了進(jìn)行運(yùn)算外,還要完成控制功能。所以離不開計(jì)數(shù)和定時(shí)。因此,在單片機(jī)
中就設(shè)置有定時(shí)器兼計(jì)數(shù)器,其基本結(jié)構(gòu)與本連載之(二)中的舉例類似。到這
里為止,我們已經(jīng)知道了單片機(jī)的基本組成,即單片機(jī)是由中央處理器(即CPU中
的運(yùn)算器和控制器)、只讀存貯器(通常表示為ROM)、讀寫存貯器(又稱隨機(jī)存
貯器通常表示為RAM)、輸入/輸出口(又分為并行口和串行口,表示為I/O口)等
等組成。實(shí)際上單片機(jī)里面還有一個(gè)時(shí)鐘電路,使單片機(jī)在進(jìn)行運(yùn)算和控制時(shí),
都能有節(jié)奏地進(jìn)行。另外,還有所謂的“中斷系統(tǒng)”,這個(gè)系統(tǒng)有“傳達(dá)室”的
作用,當(dāng)單片機(jī)控制對(duì)象的參數(shù)到達(dá)某個(gè)需要加以干預(yù)的狀態(tài)時(shí),就可經(jīng)此“傳
達(dá)室”通報(bào)給CPU,使CPU根據(jù)外部事態(tài)的輕重緩急來(lái)采取適當(dāng)?shù)膽?yīng)付措施。
現(xiàn)在,我們已經(jīng)知道了單片機(jī)的組成,余下的問(wèn)題是如何將它們的各部分連
接成相互關(guān)聯(lián)的整體呢?實(shí)際上,單片機(jī)內(nèi)部有一條將它們連接起來(lái)的“紐帶”
,即所謂的“內(nèi)部總線”。此總線有如大城市的“干道”,而CPU、ROM、RAM、
I/O口、中斷系統(tǒng)等就分布在此“總線”的兩旁,并和它連通。從而,一切指令、
數(shù)據(jù)都可經(jīng)內(nèi)部總線傳送,有如大城市內(nèi)各種物品的傳送都經(jīng)過(guò)干道進(jìn)行!
單片機(jī)指令系統(tǒng)與匯編語(yǔ)言程序
前面已經(jīng)講述了單片機(jī)的幾個(gè)主要組成部分,這些部分構(gòu)成了單片機(jī)的硬件。所
謂硬件(Hardware),就是看得到,摸得到的實(shí)體。但是,光有這樣的硬件,還
只是有了實(shí)現(xiàn)計(jì)算和控制功能的可能性。單片機(jī)要真正地能進(jìn)行計(jì)算和控制,還
必須有軟件(Software)的配合。軟件主要指的是各種程序。只有將各種正確的
程序“灌入”(存入)單片機(jī),它才能有效地工作。單片機(jī)所以能自動(dòng)地進(jìn)行運(yùn)
算和控制,正是由于人把實(shí)現(xiàn)計(jì)算和控制的步驟一步步地用命令的形式,即一條
條指令(Instruction)預(yù)先存入到存貯器中,單片機(jī)在CPU的控制下,將指令一
條條地取出來(lái),并加以翻譯和執(zhí)行。就以兩個(gè)數(shù)相加這一簡(jiǎn)單的運(yùn)算來(lái)說(shuō),當(dāng)需
要運(yùn)算的數(shù)已存入存貯器后,還需要進(jìn)行以下幾步:
第一步:把第一個(gè)數(shù)從它的存貯單元(Location)中取出來(lái),送至運(yùn)算器。
第二步:把第二個(gè)數(shù)從它所在的存貯單元中取出來(lái),送至運(yùn)算器;
第三步:相加;
第四步:把相加完的結(jié)果,送至存貯器中指定的單元。
所有這些取數(shù)、送數(shù)、相加、存數(shù)等等都是一種操作(Operation),我們把
要求計(jì)算機(jī)執(zhí)行的各種操作用命令的形式寫下來(lái),這就是指令。但是怎樣才能辨
別和執(zhí)行這些操作呢?這是在設(shè)計(jì)單片機(jī)時(shí)由設(shè)計(jì)人員賦予它的指令系統(tǒng)所決定
的。一條指令,對(duì)應(yīng)著一種基本操作;單片機(jī)所能執(zhí)行的全部指令,就是該單片
機(jī)的指令系統(tǒng)(Iustruction Set),不同種類的單片機(jī),其指令系統(tǒng)亦不同。
使用單片機(jī)時(shí),事先應(yīng)當(dāng)把要解決的問(wèn)題編成一系列指令。這些指令必須是
選定的單片機(jī)能識(shí)別和執(zhí)行的指令。單片機(jī)用戶為解決自己的問(wèn)題所編的指令程
序,稱為源程序(Source Program)。指令通常分為操作碼(Opcode)和操作數(shù)
(Operand)兩大部分。操作碼表示計(jì)算機(jī)執(zhí)行什么操作,即指令的功能;操作數(shù)
表示參加操作的數(shù)或操作數(shù)所在的地址(即操作數(shù)所存放的地方編號(hào))。因?yàn)閱?
片機(jī)是一種可編程器件,只“認(rèn)得”二進(jìn)碼(0、1)。要單片機(jī)運(yùn)作,單片機(jī)系
統(tǒng)中的所有指令,都必須以二進(jìn)制編碼的形式來(lái)表示。例如,在Intel公司的MCS
-51系列單片機(jī)中,從存貯器中取出一數(shù)到CPU中的累加器(在運(yùn)算器中,參與運(yùn)
算、存放運(yùn)算結(jié)果的專用寄存器)的指令代碼為74H,累加器內(nèi)容加立即數(shù)的代碼
為24H,再加上立即數(shù)代碼,累加器送數(shù)到內(nèi)部RAM存貯器的代碼為F6H~F7H等。
這些指令是用十六進(jìn)制表示二進(jìn)制的機(jī)器碼。MCS-51單片機(jī)的字長(zhǎng)為8位,有時(shí)
,要完成某些操作用一個(gè)字節(jié)尚不能充分表達(dá)。所以,在指令系統(tǒng)中有單字節(jié)指
令,也有多字節(jié)指令。機(jī)器碼是由一連串的0和1組成,沒(méi)有明顯的特征,不好記
憶,不易理解,易出錯(cuò)。所以,直接用它來(lái)編寫程序十分困難。因而,人們就用
一些助記符(Mue monic)——通常是指令功能的英文縮寫來(lái)代替操作碼,如MCS
-51中數(shù)的傳送常用MOV(Move的縮寫)、加法用Add(Addition的縮寫)來(lái)作為助
記符。這樣,每條指令有明顯的動(dòng)作特征,易于記憶和理解,也不容易出錯(cuò)。用
助記符來(lái)編寫的程序稱為匯編語(yǔ)言程序。但是,助記符編寫的程序便于人理解,
可單片機(jī)卻只認(rèn)識(shí)二進(jìn)制機(jī)器代碼,因此,為了讓單片機(jī)能“讀懂”匯編語(yǔ)言程
序必須再轉(zhuǎn)換成由二進(jìn)制機(jī)器碼構(gòu)成的程序,這種轉(zhuǎn)換過(guò)程,就稱為“匯編”。
匯編可借助于人工查表法來(lái)實(shí)現(xiàn),也可借助PC機(jī)通過(guò)所謂“交叉匯編程序”來(lái)完
成。由機(jī)器碼構(gòu)成的用戶程序一旦“進(jìn)入”了單片機(jī),再“啟動(dòng)”單片機(jī),就可
讓它執(zhí)行輸入程序所規(guī)定的任務(wù)。
MCU--51 CPU和存儲(chǔ)器
單片機(jī)8051的CPU由運(yùn)算器和控制器組成。
一、運(yùn)算器
運(yùn)算器以完成二進(jìn)制的算術(shù)/邏輯運(yùn)算部件ALU為核心,再加上暫存器TMP、累加器
ACC、寄存器B、程序狀態(tài)標(biāo)志寄存器PSW及布爾處理器。累加器ACC是一個(gè)八位寄
存器,它是CPU中工作最頻繁的寄存器。在進(jìn)行算術(shù)、邏輯運(yùn)算時(shí),累加器ACC往
往在運(yùn)算前暫存一個(gè)操作數(shù)(如被加數(shù)),而運(yùn)算后又保存其結(jié)果(如代數(shù)和)
。寄存器B主要用于乘法和除法操作。標(biāo)志寄存器PSW也是一個(gè)八位寄存器,用來(lái)
存放運(yùn)算結(jié)果的一些特征,如有無(wú)進(jìn)位、借位等。其每位的具體含意如下所示。
PSW CY AC FO RS1 RS0 OV - P對(duì)用戶來(lái)講,最關(guān)心的是以下四位。
1進(jìn)位標(biāo)志CY(PSW7)。它表示了運(yùn)算是否有進(jìn)位(或借位)。如果操作
結(jié)果在最高位有進(jìn)位(加法)或者借位(減法),則該位為1,否則為0。
2輔助進(jìn)位標(biāo)志AC。又稱半進(jìn)位標(biāo)志,它反映了兩個(gè)八位數(shù)運(yùn)算低四位是否
有半進(jìn)位,即低四位相加(或減)有否進(jìn)位(或借位),如有則AC為1狀態(tài),否則
為0。
3溢出標(biāo)志位OV。MCS-51反映帶符號(hào)數(shù)的運(yùn)算結(jié)果是否有溢出,有溢出時(shí)
,此位為1,否則為0。
4奇偶標(biāo)志P。反映累加器ACC內(nèi)容的奇偶性,如果ACC中的運(yùn)算結(jié)果有偶數(shù)
個(gè)1(如11001100B,其中有4個(gè)1),則P為0,否則,P=1。
PSW的其它位,將在以后再介紹。由于PSW存放程序執(zhí)行中的狀態(tài),故又叫程
序狀態(tài)字?運(yùn)算器中還有一個(gè)按位(bit)進(jìn)行邏輯運(yùn)算的邏輯處理機(jī)(又稱布爾
處理機(jī))。其功能在介紹位指令時(shí)再說(shuō)明。
二、控制器
控制器是CPU的神經(jīng)中樞,它包括定時(shí)控制邏輯電路、指令寄存器、譯碼器、
地址指針DPTR及程序計(jì)數(shù)器PC、堆棧指針SP等。這里程序計(jì)數(shù)器PC是由16位寄存
器構(gòu)成的計(jì)數(shù)器。要單片機(jī)執(zhí)行一個(gè)程序,就必須把該程序按順序預(yù)先裝入存儲(chǔ)
器ROM的某個(gè)區(qū)域。單片機(jī)動(dòng)作時(shí)應(yīng)按順序一條條取出指令來(lái)加以執(zhí)行。因此,必
須有一個(gè)電路能找出指令所在的單元地址,該電路就是程序計(jì)數(shù)器PC。當(dāng)單片機(jī)
開始執(zhí)行程序時(shí),給PC裝入第一條指令所在地址,它每取出一條指令(如為多字
節(jié)指令,則每取出一個(gè)指令字節(jié)),PC的內(nèi)容就自動(dòng)加1,以指向下一條指令的地
址,使指令能順序執(zhí)行。只有當(dāng)程序遇到轉(zhuǎn)移指令、子程序調(diào)用指令,或遇到中
斷時(shí)(后面將介紹),PC才轉(zhuǎn)到所需要的地方去。8051 CPU碢C指定的地址,從
ROM相應(yīng)單元中取出指令字節(jié)放在指令寄存器中寄存,然后,指令寄存器中的指令
代碼被譯碼器譯成各種形式的控制信號(hào),這些信號(hào)與單片機(jī)時(shí)鐘振蕩器產(chǎn)生的時(shí)
鐘脈沖在定時(shí)與控制電路中相結(jié)合,形成按一定時(shí)間節(jié)拍變化的電平和時(shí)鐘,即
所謂控制信息,在CPU內(nèi)部協(xié)調(diào)寄存器之間的數(shù)據(jù)傳輸、運(yùn)算等操作。
三、存儲(chǔ)器
存儲(chǔ)器是單片機(jī)的又一個(gè)重要組成部分,圖6給出了一種存儲(chǔ)容量為256個(gè)單
元的存儲(chǔ)器結(jié)構(gòu)示意圖。其中每個(gè)存儲(chǔ)單元對(duì)應(yīng)一個(gè)地址,256個(gè)單元共有256個(gè)
地址,用兩位16進(jìn)制數(shù)表示,即存儲(chǔ)器的地址(00H~FFH)。存儲(chǔ)器中每個(gè)存儲(chǔ)
單元可存放一個(gè)八位二進(jìn)制信息,通常用兩位16進(jìn)制數(shù)來(lái)表示,這就是存儲(chǔ)器的
內(nèi)容。存儲(chǔ)器的存儲(chǔ)單元地址和存儲(chǔ)單元的內(nèi)容是不同的兩個(gè)概念,不能混淆。
一、程序存儲(chǔ)器
程序是控制計(jì)算機(jī)動(dòng)作的一系列命令,單片機(jī)只認(rèn)識(shí)由“0”和“1”代碼構(gòu)
成的機(jī)器指令。如前述用助記符編寫的命令MOV A,#20H,換成機(jī)器認(rèn)識(shí)的代碼
74H、20H:(寫成二進(jìn)制就是01110100B和00100000B)。在單片機(jī)處理問(wèn)題之前
必須事先將編好的程序、表格、常數(shù)匯編成機(jī)器代碼后存入單片機(jī)的存儲(chǔ)器中,
該存儲(chǔ)器稱為程序存儲(chǔ)器。程序存儲(chǔ)器可以放在片內(nèi)或片外,亦可片內(nèi)片外同時(shí)
設(shè)置。由于PC程序計(jì)數(shù)器為16位,使得程序存儲(chǔ)器可用16位二進(jìn)制地址,因此,
內(nèi)外存儲(chǔ)器的地址最大可從0000H到FFFFH。8051內(nèi)部有4k字節(jié)的ROM,就占用了由
0000H~0FFFH的最低4k個(gè)字節(jié),這時(shí)片外擴(kuò)充的程序存儲(chǔ)器地址編號(hào)應(yīng)由1000H開
始,如果將8051當(dāng)做8031使用,不想利用片內(nèi)4kROM,全用片外存儲(chǔ)器,則地址編
號(hào)仍可由0000H開始。不過(guò),這時(shí)應(yīng)使8051的第{31}腳(即EA腳)保持低電平。當(dāng)
EA為高電平時(shí),用戶在0000H至0FFFH范圍內(nèi)使用內(nèi)部ROM,大于0FFFH后,單片機(jī)
CPU自動(dòng)訪問(wèn)外部程序存儲(chǔ)器。
二、數(shù)據(jù)存儲(chǔ)器
單片機(jī)的數(shù)據(jù)存儲(chǔ)器由讀寫存儲(chǔ)器RAM組成。其最大容量可擴(kuò)展到64k,用于
存儲(chǔ)實(shí)時(shí)輸入的數(shù)據(jù)。8051內(nèi)部有256個(gè)單元的內(nèi)部數(shù)據(jù)存儲(chǔ)器,其中00H~7FH為
內(nèi)部隨機(jī)存儲(chǔ)器RAM,80H~FFH為專用寄存器區(qū)。實(shí)際使用時(shí)應(yīng)首先充分利用內(nèi)部
存儲(chǔ)器,從使用角度講,搞清內(nèi)部數(shù)據(jù)存儲(chǔ)器的結(jié)構(gòu)和地址分配是十分重要的。
因?yàn)閷?lái)在學(xué)習(xí)指令系統(tǒng)和程序設(shè)計(jì)時(shí)會(huì)經(jīng)常用到它們。8051內(nèi)部數(shù)據(jù)存儲(chǔ)器地
址由00H至FFH共有256個(gè)字節(jié)的地址空間,該空間被分為兩部分,其中內(nèi)部數(shù)據(jù)
RAM的地址為00H~7FH(即0~127)。而用做特殊功能寄存器的地址為80H~FFH。
在此256個(gè)字節(jié)中,還開辟有一個(gè)所謂“位地址”區(qū),該區(qū)域內(nèi)不但可按字節(jié)尋址
,還可按“位(bit)”尋址。對(duì)于那些需要進(jìn)行位操作的數(shù)據(jù),可以存放到這個(gè)
區(qū)域。從00H到1FH安排了四組工作寄存器,每組占用8個(gè)RAM字節(jié),記為R0~R7。
究竟選用那一組寄存器,由前述標(biāo)志寄存器中的RS1和RS0來(lái)選用。在這兩位上放
入不同的二進(jìn)制數(shù),即可選用不同的寄存器組,如附表1所示。
三、特殊功能寄存器
特殊功能寄存器(SFR)的地址范圍為80H~FFH。在MCS-51中,除程序計(jì)數(shù)
器PC和四個(gè)工作寄存器區(qū)外,其余21個(gè)特殊功能寄存器都在這SFR塊中。其中5個(gè)
是雙字節(jié)寄存器,它們共占用了26個(gè)字節(jié)。各特殊功能寄存器的符號(hào)和地址見附
表2。其中帶*號(hào)的可位尋址。特殊功能寄存器反映了8051的狀態(tài),實(shí)際上是8051
的狀態(tài)字及控制字寄存器。用于CPU PSW便是典型一例。這些特殊功能寄存器大體
上分為兩類,一類與芯片的引腳有關(guān),另一類作片內(nèi)功能的控制用。與芯片引腳
有關(guān)的特殊功能寄存器是P0~P3,它們實(shí)際上是4個(gè)八位鎖存器(每個(gè)I/O口一個(gè)
),每個(gè)鎖存器附加有相應(yīng)的輸出驅(qū)動(dòng)器和輸入緩沖器就構(gòu)成了一個(gè)并行口。MCS
-51共有P0~P3四個(gè)這樣的并行口,可提供32根I/O線,每根線都是雙向的,并且
大都有第二功能。其余用于芯片控制的寄存器中,累加器A、標(biāo)志寄存器PSW、數(shù)
據(jù)指針DPTR等的功能前已提及,而另一些寄存器的功能在后面有關(guān)部分再作進(jìn)一
步介紹
單片機(jī)的指令系統(tǒng)和尋址方式
單片機(jī)要正常運(yùn)作,事先需編制程序,再把程序放入存貯器中,然后由CPU執(zhí)行該
程序。程序是由指令組成的,指令的基本組成是操作碼和操作數(shù)。單片機(jī)的品種
很多,設(shè)計(jì)時(shí)怎樣表示操作碼和操作數(shù),都有各自的規(guī)定,再有指令代碼也各不
相同,因此,必須對(duì)所選單片機(jī)的全部指令,也就是所謂“指令系統(tǒng)”,有足夠
的了解。各個(gè)系列的單片機(jī)雖然有不同的指令系統(tǒng),但也有其共同性。掌握一種
單片機(jī)的指令系統(tǒng),對(duì)其它系列單片機(jī)可以起到觸類旁通的作用。MCS-51單片機(jī)
應(yīng)用廣泛,派生品種多,具有代表性,所以,這里以MCS-51系列的指令系統(tǒng)為例
說(shuō)明“指令”的組成和應(yīng)用。
1、MOV A,#20H
這條指令表示把20H這個(gè)數(shù)送入累加器A中(一個(gè)特殊功能寄存器)。
2、ADD A,70H
這條指令表示把累加器A中的內(nèi)容(在上例中送入的#20H)和存貯器中地
址為70H單元中的內(nèi)容(也是一個(gè)數(shù)字),通過(guò)算術(shù)邏輯單元(英文縮寫為ALU)
相加,并將結(jié)果保留在A中。這里MOV、ADD等稱為操作碼,而A、#20H、70H等均
稱為操作數(shù)。在匯編語(yǔ)言程序中,操作碼通常由英文單詞縮寫而成,這樣有助于
記憶,所以又稱助記符。如MOV就是英文單詞MOVE的縮寫,含有搬移的意思;而
ADD即為英文單詞,其意為相加。因此,對(duì)于略懂英語(yǔ)的用戶,掌握單片機(jī)指令的
含意是較為方便的。操作數(shù)有多種表示法,如以上的#20H稱為立即數(shù),即20H就
是真正的操作數(shù)。而70H是存貯器中某個(gè)單元的地址,在該單元中,放著操作數(shù)(
比如說(shuō)是3AH),ADD A,70H不是將70H和A中的內(nèi)容相加,而是從存貯器70H單元
中將3AH取出和A中的內(nèi)容相加。由上可知,要找到實(shí)際操作數(shù),有時(shí)就要轉(zhuǎn)個(gè)彎
,甚至轉(zhuǎn)幾個(gè)彎,這個(gè)過(guò)程稱為尋址,MCS-51共有7種尋址方式,現(xiàn)介紹如下:
一、立即尋址:操作數(shù)就寫在指令中,和操作碼一起放在程序存貯器中。把
“!碧(hào)放在立即數(shù)前面,以表示該尋址方式為立即尋址,如#20H。
二、寄存器尋址:操作數(shù)放在寄存器中,在指令中直接以寄存器的名字來(lái)表
示操作數(shù)的地址。例如MOV A,R0就屬于寄存器尋址,即將R0寄存器的內(nèi)容送到累
加器A中。
三、直接尋址:操作數(shù)放在單片機(jī)的內(nèi)部RAM某單元中,在指令中直接寫出該
單元的地址。如前例的ADD A,70H中的70H。
四、寄存器間接尋址:操作數(shù)放在RAM某個(gè)單元中,該單元的地址又放在寄存
器R0或R1中。
如果RAM的地址大于256,則該地址存放在16位寄存器DPTR(數(shù)據(jù)指針)中,
此時(shí)在寄存器名前加@符號(hào)來(lái)表示這種間接尋址。如MOV A,@ R0。其它還有變址
尋址、相對(duì)尋址、位尋址等,待以后再詳細(xì)介紹?赡苡腥藭(huì)問(wèn),在指令中直接
給出實(shí)際操作數(shù),不是簡(jiǎn)單、明了嗎?為什么還要用其它幾種尋址方式呢?這是
因?yàn)樵诰幹瞥绦驎r(shí)很難一下子就給出操作數(shù)。如用單片機(jī)控制溫度時(shí),時(shí)時(shí)需要
將給定的控制溫度(如20℃)減去環(huán)境溫度,而環(huán)境溫度時(shí)時(shí)有變化,顯然無(wú)法
在程序指令中給出,只有通過(guò)一定方式,將其送入某個(gè)輸入/輸出口,再存放在某
個(gè)寄存器中,這就必須用到寄存器尋址。又如要進(jìn)行算術(shù)運(yùn)算,要計(jì)算每班學(xué)員
各科成績(jī)的平均值,如果把每個(gè)學(xué)員的各科都編一個(gè)程序,在程序中直接給出該
學(xué)員各科成績(jī),再求平均值,顯然太麻煩。這里可以編一個(gè)求平均成績(jī)的通用程
序,把每位學(xué)員的成績(jī)送入存貯器的各個(gè)單元中,這時(shí)可采取直接尋址,一個(gè)程
序可供每個(gè)學(xué)員用,不是更方便嗎?所以,尋址方式越多,編制程序就越方便、
靈活,適用范圍就越廣。尋址有如找人,如被找的人有手機(jī)、BP機(jī)、座機(jī)電話等
多種聯(lián)系方式則就容易找到他,單片機(jī)也是如此,尋址方式越多,找操作數(shù)越方
便,單片機(jī)的功能就越強(qiáng)。前面介紹51系列單片機(jī)的尋址方式時(shí),常遇到單片機(jī)
內(nèi)部的一些寄存器、累加器A、通用寄存器R0~R7、數(shù)據(jù)指針DPTR和存貯器等。在
以后介紹指令時(shí),數(shù)據(jù)就要在這些寄存器、存貯器之間傳送,或者進(jìn)行運(yùn)算。因
此,編制程序就需熟悉單片機(jī)的內(nèi)部結(jié)構(gòu)。
8051單片機(jī)的內(nèi)部總體結(jié)構(gòu)其基本特性如下:
8位CPU、片內(nèi)振蕩器
4k字節(jié)ROM、128字節(jié)RAM
21個(gè)特殊功能寄存器
32根I/O線
可尋址的64k字節(jié)外部數(shù)據(jù)、程序存貯空間
2個(gè)16位定時(shí)器、計(jì)數(shù)器
中斷結(jié)構(gòu):具有二個(gè)優(yōu)先級(jí)、五個(gè)中斷源
一個(gè)全雙口串行口
位尋址(即可尋找某位的內(nèi)容)功能,適于按位進(jìn)行邏輯運(yùn)算的位處理器。
除128字節(jié)RAM、4k字節(jié)ROM和中斷、串行口及定時(shí)器模塊外,還有4組I/O口P0~P3
,余下的就是CPU的全部組成。把4kROM換為EPROM就是8751的結(jié)構(gòu),如去掉
ROM/EPROM部分即為8031的框圖,如果將ROM置換為Flash存貯器或EEPROM,或再省
去某些I/O,即可得到51系列的派生品種,如89C51、AT89C2051等單片機(jī)的框圖。
單片機(jī)各部分是通過(guò)內(nèi)部的總線有機(jī)地連接起來(lái)的
單片機(jī)MCS-51系列指令快速記憶法
隨著微電子技術(shù)和超大規(guī)模集成電路技術(shù)的發(fā)展,單片微型計(jì)算機(jī)以其體積小、
性
價(jià)比高、功能強(qiáng)、可靠性高等獨(dú)有的特點(diǎn),在各個(gè)領(lǐng)域(如工業(yè)控制、家電產(chǎn)品
、汽車
電子、通信、智能儀器儀表)得到了廣泛的應(yīng)用。學(xué)習(xí)、使用單片機(jī)的人越來(lái)越
多,而
生產(chǎn)單片機(jī)的廠家很多,單片機(jī)種類繁雜,不知如何選擇。據(jù)統(tǒng)計(jì),八位單片機(jī)
占全球
單片機(jī)銷量的65%。在八位單片機(jī)中,Intel公司的8051單片機(jī)內(nèi)核已成為8位單
片機(jī)事
實(shí)上的標(biāo)準(zhǔn)。因此,對(duì)初學(xué)者而言,選擇8051單片機(jī)來(lái)學(xué)習(xí)不失為明智的選擇。
學(xué)習(xí)單片機(jī),除了搞清單片機(jī)內(nèi)部功能、存儲(chǔ)空間分配及I/O接口外,還應(yīng)掌
握其指
令系統(tǒng)。MCS-51共有111條指令,現(xiàn)介紹我們總結(jié)出的快速記憶MCS-51指令的方
法,供
大家參考。
大家都知道,匯編語(yǔ)言指令由操作碼、操作數(shù)兩部分組成。MCS-51使用匯編
語(yǔ)言指
令,它共有44個(gè)操作碼助記符,33種功能,其操作數(shù)有#data、direct、Rn、@Ri
等。這
里先介紹指令助記符及其相關(guān)符號(hào)的記憶方法。
一、助記符號(hào)的記憶方法
1表格列舉法
把44個(gè)指令助記符按功能分為五類,每類列表記憶。此處從略,請(qǐng)讀者自己
總結(jié)。
2英文還原法
單片機(jī)的操作碼助記符是該指令功能的英文縮寫,將縮寫還原成英語(yǔ)原文,
再對(duì)照
漢語(yǔ)有助于理解其助記符含義,從而加強(qiáng)記憶。例如:
增量 INC-Incremect 減量 DNC-Decrement
短轉(zhuǎn)移 SJMP-Short jump 長(zhǎng)轉(zhuǎn)移 LJMP-Long jump
比較轉(zhuǎn)移 CJNE-Compare jump not equality
絕對(duì)轉(zhuǎn)移 AJMP-Absolute jump 空操作 NOP-No operation
交換 XCH-Exchange 加法 ADD-Addition
乘法 MUL-Multiplication 除法 DIV-Division
左環(huán)移 RL-Rotate left 進(jìn)位左環(huán)移 RLC-Rotate
left carry
右環(huán)移 RR-Rotate right 進(jìn)位右環(huán)移RRC-Rotate
right carry
3功能模塊記憶法
單片機(jī)的44個(gè)指令助記符,按所屬指令功能可分為五大類,每類又可以按功
能相似
原則為2~3組。這樣,化整為零,各個(gè)擊破,實(shí)現(xiàn)快速記憶。
1)數(shù)據(jù)傳送組! 2)加減運(yùn)算組
MOV 內(nèi)部數(shù)據(jù)傳送 ADD 加法
MOVC 程序存儲(chǔ)器傳送 ADDC 帶進(jìn)位加法
MOVX 外部數(shù)據(jù)傳送 SUBB 帶進(jìn)位減法
3)邏輯運(yùn)算組。 4)子程序調(diào)用組。
ANL 邏輯與 LCALL 長(zhǎng)調(diào)用
ORL 邏輯或 ALALL 絕對(duì)調(diào)用
XRL 邏輯異或 RET 子程序返回
二、指令的記憶方法
1指令操作數(shù)的有關(guān)符號(hào)
MCS-51的尋址方式共有六種:立即數(shù)尋址、直接尋址、寄存器尋址、寄存器
間址、
變址尋址、相對(duì)尋址。我們必須掌握其表示的方法。
1)立即數(shù)與直接地址。
。ata表示八位立即數(shù),#data16表示是十六位立即數(shù),data或direct表示直
接地
址。
2)Rn(n=0-7)、A、B、CY、DPTR寄存器尋址變量。
3)@R0、@R1、@DPTR、SP表示寄存器間址變量。
4)DPTR+A、PC+A表示變址尋址的變量。
5)PC+rel(相對(duì)量)表示相對(duì)尋址變量。
記住指令的助記符,掌握不同尋址方式的指令操作數(shù)的表示方法,為我們記
憶匯編
指令打下了基礎(chǔ)。MCS-51指令雖多,但按功能可分為五類,其中數(shù)據(jù)傳送類28條
,算術(shù)
運(yùn)算類24條,邏輯操作類25條,控制轉(zhuǎn)移類17條,布爾位操作類17條。在每類指
令里,
根據(jù)其功能,抓住其源、目的操作數(shù)的不同組合,再輔之以下方法,是完全能記
住的。
我們約定,可能的目的操作數(shù)按(#data/direct/A/Rn/@Ri)順序表示。
對(duì)于MOV指令,其目的操作數(shù)按A、Rn、direct、@Ri的順序書寫,則可以記住
MOV的
15條指令。例如以累加器A為目的操作數(shù),可寫出如下4條指令。
MOV A,#data/direct/A/Rn/@Ri
以此類推,寫出其它指令。
MOV Rn,#data/direct/A
MOV direct,#data/direct/A/Rn/@Ri
MOV @Ri,#data/direct/A
2指令圖示記憶法
圖示記憶法是把操作功能相同或相似、但其操作數(shù)不同的指令,用圖形和箭
頭將目
的、源操作數(shù)的關(guān)系表示出來(lái)的一種記憶方法。例如:由助記符MOV、MOVX、MOVC
組成的
送數(shù)組指令,可以用圖1、2幫助記憶。
由助記符CJNE形成的四條指令,也可以用圖示法表示,如圖3。
CJNE A,#data,rel CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
另外,對(duì)于由(ANL、ORL、ARL)形成的18條邏輯操作指令,有關(guān)A的四條環(huán)
移指令
,也可以用圖示法表示,請(qǐng)讀者自行畫出記憶。
3相似功能歸類法
在MCS-51指令中,我們發(fā)現(xiàn)部分指令其操作碼不同,但功能相似,而操作數(shù)
則完全
一樣。相似功能歸類法就是把具有這樣特點(diǎn)的指令放在一起記憶,只要記住其中
的一條
,其余的也就記住了。如加、減法的十二條指令,與、或、非的十八條指令,現(xiàn)
列舉如
下。
ADD/ADDC/SUBB A,#data/direct/Rn/@Ri
ANL/ORL/XRL A,#data/direct/Rn/@Ri
ANL/ORL/XRL direct,#data/a
上述每一排指令,功能相似,其操作數(shù)都相同。其它的如加1(INC)、減1
(DEC)指令
也可照此辦理。
4口訣記憶法
對(duì)于有些指令,我們可以把相關(guān)的功能用精練的語(yǔ)言編成一句話來(lái)記憶。如
PUSH d
irect和POP direct這兩條指令。初學(xué)者常常分不清堆棧SP的變化情況,為此編成
這樣一
句話:(SP的內(nèi)容)加1(direct的內(nèi)容)再入棧,(SP的內(nèi)容)彈出(到direct單元)SP
才減1
。又如乘法指令中積的存放,除法指令中被除數(shù)和除數(shù)以及商的存放,都可以編
成口訣
記憶如下。
MUL AB 高位積(存于)B,低位積(存于)A。
DIV AB A除以B,商(存于)A余(下)B。
上面介紹了幾種快速記憶單片機(jī)指令的方法,希望能起到拋磚引玉的作用,
相信讀
者在學(xué)習(xí)單片機(jī)的過(guò)程中能找到適合自己的方法來(lái)記憶。但是,有了好的方法還
不夠,
還需要實(shí)踐,即多讀書上的例題和別人編寫的程序,自己再結(jié)合實(shí)際編寫一些程
序。只
有這樣,才能更好更快地掌握單片機(jī)指令系統(tǒng)。
單片機(jī)自學(xué)教材之用單片機(jī)做流水燈(一)
第一節(jié)
第一步:制作硬件電路
流水燈電原理圖如下圖,圖中用一片AT89C2051單片機(jī)及少量外圍元件組成。
圖中,R1~R8為L(zhǎng)ED1~8的限流電阻;R9、C3為單片機(jī)的簡(jiǎn)易上電復(fù)位電路;C1
、C2、T1組成單片機(jī)的時(shí)鐘電路;
工作原理:在上電后由于C3、R9的作用,使單片機(jī)的RST復(fù)位腳電平先高后低,
從而達(dá)到復(fù)位;之后,在C1、C2、T1以及單片機(jī)內(nèi)部時(shí)鐘電路的作用下,單片機(jī)
依程序?qū)1.0~P1.7引腳拉低或抬高;拉低的引腳對(duì)應(yīng)的LED點(diǎn)亮,抬高的引腳對(duì)
應(yīng)的LED熄滅。
電路制作時(shí),AT89C2051的位置應(yīng)安裝20腳的IC座,以便使單片機(jī)可以從電路板中
拿下去燒寫程序。電路中的元件無(wú)太苛刻的要求,若LED為高亮度的,R1~R8可加
大到1k;C3漏電不要太大;否則會(huì)造成單片機(jī)無(wú)法復(fù)位。
下一步的準(zhǔn)備:
1、下載匯編編譯器 ASM51 ,這里先以DOS下的ASM51為例,因?yàn)樗幾g匯編
程序時(shí)不產(chǎn)生輔助代碼,所以較適合初學(xué)理解其產(chǎn)生的代碼。
2、準(zhǔn)備一片AT89C2051或AT89C1051;一般電子商場(chǎng)即可購(gòu)到,當(dāng)然,如果有
舊片只要是好的也行。
3、準(zhǔn)備一臺(tái)可以燒寫AT89C2051和 1051的編程器;
4、電腦一臺(tái);噢對(duì)啦!你現(xiàn)在正使用的這臺(tái)就行。
第二步:軟件的編寫
現(xiàn)在,我們假設(shè)單片機(jī)可以聽懂我們的漢語(yǔ),那么想讓LED1點(diǎn)亮,就說(shuō)
“P1.0變低”;(單片機(jī)在上電初始后,其各端口輸出為高電平)LED1就點(diǎn)亮啦
!想讓LED1滅,LED2亮,就說(shuō)“P1.0升高,P1.1變低”;LED1就熄滅LED2隨后既
點(diǎn)亮!
若用漢語(yǔ)編寫的流水燈程序應(yīng)該是:
程序部分 ;解釋部分用“;”分號(hào)與程序部分隔開
開始: ;“開始:”為標(biāo)號(hào)
P1.0低
P1.0高
P1.1低
P1.1高
P1.2低
P1.2高
P1.3低
P1.3高
P1.4低
P1.4高
P1.5低
P1.5高
P1.6低
P1.6高
P1.7低
P1.7高
返回到開始 ;返回到“開始:”處繼續(xù)循環(huán)
結(jié)束 ;說(shuō)明程序到此結(jié)束
這樣,LED1~LED8便會(huì)不停的流動(dòng)點(diǎn)亮熄滅,從而產(chǎn)生流水效果。
然而單片機(jī)聽不懂漢語(yǔ),只能接受二進(jìn)制的“10......”代碼,但要用二進(jìn)
制代碼編寫流水燈程序,其意思與上述的“漢語(yǔ)程序”基本相同,只是“漢語(yǔ)”
改為二進(jìn)制代碼罷啦。
為了讓單片機(jī)工作,只能將程序?qū)憺槎M(jìn)制代碼交給其執(zhí)行;早期單片機(jī)開
發(fā)人員就是使用人工編寫的二進(jìn)制代碼交給單片機(jī)去工作的。
今天,我們不必用煩人的二進(jìn)制去編寫程序,完全可以將我們?nèi)菀桌斫獾摹?
程序語(yǔ)言”通過(guò)“翻譯”軟件“翻譯”成單片機(jī)所需的二進(jìn)制代碼,然后交給單
片機(jī)去執(zhí)行。這里的“程序語(yǔ)言”目前主要有匯編和C兩種;“翻譯”軟件有好多
種,一般依所使用的“程序語(yǔ)言”不同而不同,匯編語(yǔ)言用“宏匯編”,如上面
讓你下載的ASM51,C語(yǔ)言用FC或KC(以后會(huì)學(xué)到,現(xiàn)在你不必關(guān)心)。在這里我
們所說(shuō)的“翻譯”軟件,行話叫編譯器,將“程序語(yǔ)言”通過(guò)編譯器產(chǎn)生單片機(jī)
的二進(jìn)制代碼的過(guò)程叫編譯。
現(xiàn)在讓我們將上面的“漢語(yǔ)”語(yǔ)言程序改寫為匯編語(yǔ)言程序:
“漢語(yǔ)”語(yǔ)言 匯編語(yǔ)言
開始: star:
P1.0低 clr p1.0
P1.0高 setb p1.0
P1.1低 clr p1.1
P1.1高 setb p1.1
P1.2低 clr p1.2
P1.2高 setb p1.2
P1.3低 clr p1.3
P1.3高 setb p1.3
P1.4低 clr p1.4
P1.4高 setb p1.4
P1.5低 clr p1.5
P1.5高 setb p1.5
P1.6低 clr p1.6
P1.6高 setb p1.6
P1.7低 clr p1.7
P1.7高 setb p1.7
返回到開始 ljmp star
結(jié)束 end
這里用到了四條匯編指令:clr、 setb、 ljmp 、end;
clr 是將其后面指定的位清為0;
setb 是將其后面指定的位置成1;
ljmp 是無(wú)條件跳轉(zhuǎn)指令,意思是:跳轉(zhuǎn)到指定的標(biāo)號(hào)處繼續(xù)運(yùn)行。
end 是一條告訴編譯器:程序到此結(jié)束的偽指令。偽指令只告訴編譯器此程序
到此有何要求或條件,它不參與和影響程序的執(zhí)行。
這里需要說(shuō)明的是,按匯編語(yǔ)法要求,所編制的程序(下稱源程序)之格式和
書寫要求必須依下列原則:
1、源程序必須為純文本格式文件,如用Windows“附件”中的“記事本”編
寫的文本文件;
2、源程序的擴(kuò)展名應(yīng)是 *.ASM;
3、一行只能寫一條語(yǔ)句,以回車作為本句的結(jié)束,每一語(yǔ)句行長(zhǎng)度應(yīng)少于80
個(gè)字符(即40個(gè)漢字)。
4、每行的格式應(yīng)為:
標(biāo)號(hào): 命令 參數(shù) ;注釋
即一行由四部份組成,各部份的順序不能搞錯(cuò),依實(shí)際要求可以缺省其中的
一部份或幾部份,甚至全部省去,即空白行。需要使用標(biāo)號(hào)時(shí)標(biāo)號(hào)后面必須有“
:”(冒號(hào)),而命令語(yǔ)句和參數(shù)之間必須用空格分開,如果命令有多個(gè)參數(shù),
則參數(shù)與參數(shù)之間必須用“,”(逗號(hào))分開,需要注釋時(shí)注釋前必須用“;”
(分號(hào)),“;”后面的語(yǔ)句可以寫任何字符,包括漢字用于解釋前面的匯編語(yǔ)
句,它將不參與匯編,不生成代碼。由于匯編程序?qū)ξ覀冞不直觀,所以在編寫
源程序時(shí),應(yīng)當(dāng)養(yǎng)成多寫注釋的習(xí)慣,這樣有助于今后源程序的閱讀和維護(hù)。
標(biāo)號(hào)是標(biāo)志程序中某一行的符號(hào)名,編譯后標(biāo)號(hào)的數(shù)值就是標(biāo)號(hào)所在行代碼
的地址。在宏匯編ASM51中標(biāo)號(hào)的長(zhǎng)度不受限制,但標(biāo)號(hào)中不能包含‘:’或其它
的一些特殊符號(hào),也不能用漢字,可以用數(shù)字作標(biāo)號(hào),但必須用字母開頭。當(dāng)標(biāo)
號(hào)作參數(shù)用(如標(biāo)號(hào)作轉(zhuǎn)移地址),在命令后面出現(xiàn)時(shí),必須舍去‘:’(如上
面程序中的 LJMP STAR中的 STAR 是不能再有:)。
每行只能有一個(gè)標(biāo)號(hào),一個(gè)標(biāo)號(hào)只能用在一處,如果有兩行用了同一個(gè)標(biāo)號(hào)
,則匯編時(shí)就會(huì)出錯(cuò)。由于標(biāo)號(hào)的長(zhǎng)度沒(méi)有限制,可以用有意義的英文或漢語(yǔ)拼
音來(lái)說(shuō)明行,使源程序讀起來(lái)更方便。
源程序中的字母不區(qū)分大小寫,也就是說(shuō) star 和 STAR 是一樣的,請(qǐng)不要
用大小寫方式去區(qū)分不同的標(biāo)號(hào)。
好拉!現(xiàn)在來(lái)看看前面我們編寫的源程序該怎樣處理,
為便于以后敘述,也便于你對(duì)源程序的學(xué)習(xí)與管理,請(qǐng)?jiān)贑盤下建立一個(gè)McuCai目
錄,將下載的MASM51和你編寫的程序均放到這里。下面均認(rèn)為你已建立了這個(gè)目
錄。
編寫源程序:先將上面的匯編源程序在Windows的記事本中依原樣輸入,之后
保存為 Test.asm。
由于ASM51為漢化版,需要中文環(huán)境,在進(jìn)入DOS模式后請(qǐng)?jiān)诿钚墟I入 pdos95
回車 既進(jìn)入中文環(huán)境;要退出中文環(huán)境,只要在命令行鍵入 quit 即可。
編譯:在命令行鍵入: asm51 test.asm 回車
如果你編寫的源程序有錯(cuò)誤,編譯時(shí)編譯器會(huì)提示你那一句錯(cuò)啦;若想詳細(xì)查看
編譯結(jié)果,可用“記事本”打開編譯后產(chǎn)生的test.lst列表文件。我們最后需要
的便是編譯后產(chǎn)生的 test.hex 文件
燒寫:回到Windows;將編程器與電腦連接好并接通電源(這里以本站介紹的
AT51編程器為例),啟動(dòng)編程器程序,在“器件”菜單中選擇“AT89C2051”;從
“文件”菜單中“打開HEX文件”打開C:\McuCai\Test.hex文件;在編程器上裝入
AT89C2051芯片,先擦除,后寫入。好拉,到此我們已將第一個(gè)流水燈程序編寫、
編譯、燒寫進(jìn)行完啦,再下來(lái)就是將燒寫好的AT89C2051從編程器上取下,安裝到
前面制作的電路板中通電讓LED1~LED8“流水”。
說(shuō)明:由于單片機(jī)的時(shí)鐘高達(dá)12MHz,8個(gè)LED發(fā)光與熄滅的時(shí)間很短,實(shí)際實(shí)
驗(yàn)結(jié)果憑我們的眼是看不到“流水”效果的!哪怎樣才能讓我們?nèi)庋劭吹健傲魉?
”效果呢?請(qǐng)繼續(xù)學(xué)習(xí)下節(jié)課
第二節(jié)
單片機(jī)自學(xué)教材之用單片機(jī)做流水燈(二)
第二節(jié)
上一節(jié)的實(shí)驗(yàn)最后沒(méi)有得到“流水”效果,主要是單片機(jī)執(zhí)行每條指令的時(shí)間
很短,我們?nèi)庋蹮o(wú)法看到LED的熄滅與點(diǎn)亮;
單片機(jī)內(nèi)部能按部就班的自動(dòng)工作,正是在系統(tǒng)時(shí)鐘的作用下,內(nèi)部各邏輯硬
件產(chǎn)生各種所需脈沖信號(hào)而實(shí)現(xiàn)的。這個(gè)時(shí)鐘信號(hào)(既晶體振蕩信號(hào))的周期稱
“振蕩周期”。我們這個(gè)實(shí)驗(yàn)中晶體使用的是12MHZ.
在單片機(jī)中,要處理最短周期的一條指令需要由12個(gè)振蕩周期(既晶振振蕩周
期)組成的,這個(gè)叫“機(jī)器周期”。
8051核的單片機(jī),大多數(shù)指令只用一個(gè)機(jī)器周期(既單周期),也有雙周期和
四周期的指令。本實(shí)驗(yàn)中用到的SETB P.x和CLR P.x均屬于單周期指令,也就是說(shuō)
,執(zhí)行一句 SETB P.x 用時(shí)僅1uS(微秒),CLR P.x 也是1uS;難怪我們前面的程
序不能看到流水效果。
現(xiàn)在,將程序改動(dòng)一下,在每點(diǎn)亮一個(gè)LED后,讓程序干點(diǎn)別的事,也就是讓
它等一會(huì)再將該LED熄滅,繼續(xù)執(zhí)行下面的程序:
star: ;程序開始
clr p1.0 ;LED1亮
acall delay ;調(diào)用延時(shí)子程序
setb p1.0 ;LED1滅
clr p1.1 ;換燈,同上
acall delay
setb p1.1
clr p1.2
acall delay
setb p1.2
clr p1.3
acall delay
setb p1.3
clr p1.4
acall delay
setb p1.4
clr p1.5
acall delay
setb p1.5
clr p1.6
acall delay
setb p1.6
clr p1.7
acall delay
setb p1.7
ljmp star ;返回到開始循環(huán)
delay: ;延時(shí)子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時(shí)子程序結(jié)束,返回到調(diào)用處的下一句
end
請(qǐng)將上面的程序保存為 Test.asm,進(jìn)行編譯,并燒寫到AT89C2051中,之后
將2051安裝到實(shí)驗(yàn)板中實(shí)驗(yàn),這回肯定“流水”啦!
回過(guò)頭,讓我們看看延時(shí)子程序是怎樣工作的:
單片機(jī)內(nèi)部有不少寄存器,這些寄存器在單片機(jī)通電時(shí),你可以給他寫入數(shù)據(jù)
(是單片機(jī)按你程序要求寫的數(shù)據(jù),而不是編程器寫的),當(dāng)?shù)诙谓o他寫入新
數(shù)據(jù)時(shí),前次的數(shù)據(jù)就被新數(shù)據(jù)覆蓋;當(dāng)然也可以從寄存器中讀取數(shù)據(jù)。當(dāng)單片
機(jī)沒(méi)有電源供給時(shí),寄存器內(nèi)部的數(shù)據(jù)也隨即消失;這些寄存器人們叫他RAM,而
用編程器將我們編寫的程序燒寫到單片機(jī)中的存儲(chǔ)器叫ROM;現(xiàn)在,我們應(yīng)該清楚
:RAM是讓程序去使用的,ROM是我們編寫的程序存放的地方!
前面說(shuō)過(guò),單片機(jī)內(nèi)部有不少RAM,本實(shí)驗(yàn)用的AT89C2051有多少寄存器?我們
現(xiàn)在不必關(guān)心,現(xiàn)在只須知道單片機(jī)內(nèi)部有名叫R0~R7 的這8個(gè)寄存器。這8個(gè)寄
存器每個(gè)都由8個(gè)單獨(dú)的位寄存器組成,最大存放數(shù)據(jù)為二進(jìn)制的 1111 1111,十
六進(jìn)制 = FF,十進(jìn)制 = 255。在使用時(shí)注意不要大于其有效范圍。
上面延時(shí)程序中,先用到 mov r1,#50 ,mov是移動(dòng)的意思,該句是將50這個(gè)十
進(jìn)制數(shù)放到r1中;50是立即數(shù),按匯編語(yǔ)言要求前面要加“#”號(hào),匯編語(yǔ)言還規(guī)
定,十六進(jìn)制數(shù)后面要加“ H”,十六進(jìn)制數(shù)的高位是字母時(shí)在字母前面還要加
“0”,例如:#0F8H;二進(jìn)制數(shù)后面加“B”,例如:#11110000B。十進(jìn)制不加,
例如:#100 。延時(shí)程序的第二、三句為 mve r2,#100 ;mov r3,#100 ;這兩
句意思同前。
第四句中 djnz r3,$ 的意思是將 r3 里面的數(shù)減 1 后如果 r3 不等于 0 則跳
到后面指定的程序位置,這里的“$”既要跳轉(zhuǎn)的程序位置,“$”代表當(dāng)前語(yǔ)句
處,也就是說(shuō),r3不等于 0,程序返回再次執(zhí)行本句。如果r3 減 1 后等于 0,
程序結(jié)束本句,繼續(xù)執(zhí)行下面的語(yǔ)句。
延時(shí)程序的最后一句是 ret ,意思是退出本子程序,返回到調(diào)用本子程序處的
下一句。
根據(jù)上面的解釋,一進(jìn)入延時(shí)子程序首先為 r1, r2, r3 寄存器裝入我們需要
的數(shù)據(jù),然后先對(duì) r3 進(jìn)行減數(shù),每次減 1 ,r3 減完后減 r2 ,減 r2 時(shí)就費(fèi)
事啦,因?yàn)?r2 每減 1 后不為 0 需要跳轉(zhuǎn)到 del1 標(biāo)號(hào)處執(zhí)行下面的語(yǔ)句,此
時(shí) r3 再次裝入數(shù)據(jù)100,并且還要再次對(duì) r3 進(jìn)行減數(shù)......,r2 減完后減 r1
,減 r1的過(guò)程你研究研究看看。
每執(zhí)行 djnz rn,rel (rn 指 r0~r7,rel 指轉(zhuǎn)移地址)指令一次,需要2個(gè)機(jī)
器周期,單片機(jī)需耗時(shí)2uS(指本實(shí)驗(yàn)),若忽略裝數(shù)等語(yǔ)句,延時(shí)子程序從開始
到結(jié)束,單片機(jī)共耗時(shí)100*100*50*2nS,既1000000uS=1秒!若加上裝數(shù)等語(yǔ)句的
耗時(shí),延時(shí)時(shí)間大于1秒。
到此,我們做的流水燈已成功,原理大致也明白啦,若你自認(rèn)為這一課你完全
明白了,那請(qǐng)你將“流水燈”的流向改變一下,也可以改為兩邊向內(nèi)流,內(nèi)部向
外流......,我想你一定能用前面學(xué)到的方法實(shí)現(xiàn)這些功能。可能有些高手說(shuō),
前面的編程方法是最最笨的!,不錯(cuò)!但玩單片機(jī)初期不必講究語(yǔ)言的簡(jiǎn)練,只
要能完成預(yù)先要求就好,這是初學(xué)者要知道的。那么還有更好的編程思路嗎:有
!請(qǐng)繼續(xù)學(xué)習(xí)
單片機(jī)自學(xué)教材之用單片機(jī)做流水燈(三)
第三節(jié)
在上節(jié)課中讓 LED 流水是去逐個(gè)控制P1端口的每個(gè)位來(lái)實(shí)現(xiàn)的,那么我們?cè)?
程序一開始就給P1口送一個(gè)數(shù),這個(gè)數(shù)本身就讓P1.0先低,其他位為高,然后讓
這個(gè)數(shù)據(jù)向高位移動(dòng)不就實(shí)現(xiàn)“流水”效果啦?的確如此!
可惜,8051沒(méi)有讓P1數(shù)據(jù)移動(dòng)的指令,但有對(duì)累加器ACC中數(shù)據(jù)左移或右移的指
令,ACC是8051單片機(jī)內(nèi)部算術(shù)邏輯單元中的一個(gè)“寄存器”(這里叫他寄存器是
不正確的,但你可以先這樣理解,ACC在指令中常寫為A),他在數(shù)據(jù)傳輸和數(shù)據(jù)
處理過(guò)程中作用十分重要,ACC為8位。他可與片內(nèi)所有單字節(jié)寄存器交換數(shù)據(jù),
實(shí)際上P1和其他端口在單片機(jī)中也是一個(gè)寄存器。這樣我們可以將需移動(dòng)的數(shù)據(jù)
先放到ACC中,讓其移動(dòng),然后將ACC移動(dòng)后的數(shù)據(jù)再轉(zhuǎn)送到P1口,這樣同樣可以
實(shí)現(xiàn)“流水”效果。
程序如下:
star: ;開始
mov acc,#0feh ;ACC中先裝入LED1熄滅的數(shù)據(jù)(即二進(jìn)制的 1111 1110)
mov p1,acc ;將ACC的數(shù)據(jù)送P1口
mov r0,#7 ;因上句送到 p1口的數(shù)據(jù)就熄滅了一位,
;所以將數(shù)據(jù)再移動(dòng)7次就完成一個(gè)8位流水過(guò)程
loop: ;數(shù)據(jù)移動(dòng)循環(huán)
rl a ;將ACC中的數(shù)據(jù)左移一位
mov p1,a ;把ACC移動(dòng)過(guò)的數(shù)據(jù)送p1口顯示
acall delay ;調(diào)用延時(shí)
djnz r0,loop ;沒(méi)有移動(dòng)夠7次繼續(xù)移動(dòng)
ljmp star ;移動(dòng)完7次后跳到開始重來(lái),以達(dá)到循環(huán)流動(dòng)效果
delay: ;延時(shí)子程序,就是上節(jié)課中的延時(shí)子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時(shí)子程序結(jié)束,返回到調(diào)用處的下一句
end ;本匯編程序到此結(jié)束
接下來(lái),將上述程序編譯,并燒寫到前面我們的實(shí)驗(yàn)芯片中,流水效果與第二
節(jié)課的一樣。
其實(shí)8051單片機(jī)有111條指令,這111條指令好比以前我們使用數(shù)字傳呼機(jī)時(shí)的
“短語(yǔ)代碼”一樣,可以用幾個(gè)“短語(yǔ)代碼”去表示一句完整、通順的語(yǔ)句段落
。有的指令常用,有的指令不常用,只要遵守語(yǔ)法規(guī)則,你可以用這些指令“組
合”成你想象到的任何程序。當(dāng)然,有時(shí)一條指令可以替代很多條指令,這樣會(huì)
使程序簡(jiǎn)捷,費(fèi)碼減少,在編寫較大程序時(shí)可以讓程序存儲(chǔ)器放得下你需要的代
碼。這也是單片機(jī)高手所追求的。當(dāng)然,在程序存儲(chǔ)器空間不成問(wèn)題時(shí),你不這
樣做但也可以達(dá)到預(yù)期的功能,這也不算錯(cuò)。
單片機(jī)內(nèi)部還有很多“部件”我們只是用到什么說(shuō)什么,很不系統(tǒng)。但是我也
不想系統(tǒng)的介紹這些,因系統(tǒng)介紹單片機(jī)結(jié)構(gòu)和指令的書很多,何況寫的遠(yuǎn)比我
好,因此,希望你在看本講座的過(guò)程中,還要結(jié)合正規(guī)的教材學(xué)習(xí)其更多的指令
和“部件”。
可惜,8051沒(méi)有讓P1數(shù)據(jù)移動(dòng)的指令,但有對(duì)累加器ACC中數(shù)據(jù)左移或右移的指令
,ACC是8051單片機(jī)內(nèi)部算術(shù)邏輯單元中的一個(gè)“寄存器”(這里叫他寄存器是不
正確的,但你可以先這樣理解,ACC在指令中常寫為A),他在數(shù)據(jù)傳輸和數(shù)據(jù)處
理過(guò)程中作用十分重要,ACC為8位。他可與片內(nèi)所有單字節(jié)寄存器交換數(shù)據(jù),實(shí)
際上P1和其他端口在單片機(jī)中也是一個(gè)寄存器。這樣我們可以將需移動(dòng)的數(shù)據(jù)先
放到ACC中,讓其移動(dòng),然后將ACC移動(dòng)后的數(shù)據(jù)再轉(zhuǎn)送到P1口,這樣同樣可以實(shí)
現(xiàn)“流水”效果。
程序如下:
star: ;開始
mov acc,#0feh ;ACC中先裝入LED1熄滅的數(shù)據(jù)(即二進(jìn)制的 1111 1110)
mov p1,acc ;將ACC的數(shù)據(jù)送P1口
mov r0,#7 ;因上句送到 p1口的數(shù)據(jù)就熄滅了一位,
;所以將數(shù)據(jù)再移動(dòng)7次就完成一個(gè)8位流水過(guò)程
loop: ;數(shù)據(jù)移動(dòng)循環(huán)
rl a ;將ACC中的數(shù)據(jù)左移一位
mov p1,a ;把ACC移動(dòng)過(guò)的數(shù)據(jù)送p1口顯示
acall delay ;調(diào)用延時(shí)
djnz r0,loop ;沒(méi)有移動(dòng)夠7次繼續(xù)移動(dòng)
ljmp star ;移動(dòng)完7次后跳到開始重來(lái),以達(dá)到循環(huán)流動(dòng)效果
delay: ;延時(shí)子程序,就是上節(jié)課中的延時(shí)子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時(shí)子程序結(jié)束,返回到調(diào)用處的下一句
end ;本匯編程序到此結(jié)束
第六課 傳感器
傳感器是用于機(jī)器人對(duì)環(huán)境的感知就象人的眼睛有視覺(jué)、皮膚有知覺(jué)一樣,然后
把得到的信息轉(zhuǎn)變成電信號(hào)供處理系統(tǒng)分析處理。
傳感器種類很多,你可以根據(jù)需要選擇傳感器比如用在方向就用方向傳感器;用
在視覺(jué)就用視覺(jué)傳感器。這里只是說(shuō)說(shuō)實(shí)際選擇起來(lái)就不這么簡(jiǎn)單了,要根據(jù)要
求、參數(shù)進(jìn)行選擇.
工作忙也就是懶的代名詞,我這人就是這樣,先寫下這么多,好了下節(jié)課見.
第七課 驅(qū)動(dòng)器
驅(qū)動(dòng)器的種類很多,我只講兩種比較常用的驅(qū)動(dòng)器。
1。減速電機(jī)(我們常在電動(dòng)玩具中拆下的帶齒輪箱的小馬達(dá),就是減速電機(jī))
由拖動(dòng)電動(dòng)機(jī)與齒輪減速裝置耦合而成, 減速裝置的作用用一句話概括,就叫做
變速變扭,即增速減扭或減速增扭。為什么減速可以增扭,而增速又要減扭呢?
設(shè)電機(jī)輸出的功率不變,功率可以表示為 N = wT,其中w是轉(zhuǎn)動(dòng)的角速度,T是扭
距。當(dāng)N固定的時(shí)候,w與T是成反比的。所以增速必減扭,減速必增扭。
減速電機(jī)一般用做機(jī)器人的動(dòng)力驅(qū)動(dòng),也就是機(jī)器人的腿.
2.伺服電機(jī)
微型的伺服電機(jī)在無(wú)線電業(yè)余愛(ài)好者的航;顒(dòng)中使用已有很長(zhǎng)一段歷史,而且
應(yīng)用最為廣泛,國(guó)內(nèi)亦稱之為“舵機(jī)”,含義為:“掌舵人操縱的機(jī)器”?梢
,微型伺服電機(jī)主要用作運(yùn)動(dòng)方向的控制部件。伺服電機(jī)本質(zhì)上是可定位的電機(jī)
。當(dāng)伺服電機(jī)接受到一個(gè)位置指令,它就會(huì)運(yùn)動(dòng)到指定的位置。因此,個(gè)人機(jī)器
人模型中也常用到它作為可控的運(yùn)動(dòng)關(guān)節(jié),這些活動(dòng)關(guān)節(jié)我們也常稱它為自由度
。
2.伺服電機(jī)的優(yōu)點(diǎn):
大扭力、控制簡(jiǎn)單、裝配靈活、相對(duì)經(jīng)濟(jì),但它亦有著先天的不足:首先它是一
個(gè)精細(xì)的機(jī)械部件,超出它承受范圍的外力會(huì)導(dǎo)致其損壞,其次它內(nèi)藏電子控制
線路,不正確的電子連接也會(huì)對(duì)它造成損毀,因此,很有必要在使用前先了解伺
服電機(jī)的工作原理,以免造成不必要的損失。
3.伺服電機(jī)內(nèi)部結(jié)構(gòu):
一個(gè)伺服電機(jī)內(nèi)部包括了一個(gè)直流電機(jī);一組變速齒輪組;一個(gè)反饋可調(diào)電位器
;及一塊電子控制板。其中,高速轉(zhuǎn)動(dòng)的直流電機(jī)提供了原始動(dòng)力,帶動(dòng)變速(
減速)齒輪組,使之產(chǎn)生高扭力的輸出,齒輪組的變速比愈大,伺服電機(jī)的輸出
扭力也愈大,也就是說(shuō)越能承受更大的重量,但轉(zhuǎn)動(dòng)的速度也愈低。
4.伺服電機(jī)的工作原理:
一伺服電機(jī)是一個(gè)典型閉環(huán)反饋系統(tǒng),其原理可由下圖表示:
減速齒輪組由電機(jī)驅(qū)動(dòng),其終端(輸出端)帶動(dòng)一個(gè)線性的比例電位器作位置檢
測(cè),該電位器把轉(zhuǎn)角坐標(biāo)轉(zhuǎn)換為一比例電壓反饋給控制線路板,控制線路板將其
與輸入的控制脈沖信號(hào)比較,產(chǎn)生糾正脈沖,并驅(qū)動(dòng)電機(jī)正向或反向地轉(zhuǎn)動(dòng),使
齒輪組的輸出位置與期望值相符,令糾正脈沖趨于為0,從而達(dá)到使伺服電機(jī)精確
定位的目的。
5.伺服電機(jī)的控制:
標(biāo)準(zhǔn)的伺服電機(jī)有三條控制線,分別為:電源、地及控制。電源線與地線用于提
供內(nèi)部的直流電機(jī)及控制線路所需的能源,電壓通常介于4V—6V之間,該電源應(yīng)
盡可能與處理系統(tǒng)的電源隔離(因?yàn)樗欧姍C(jī)會(huì)產(chǎn)生噪音)。甚至小伺服電機(jī)在
重負(fù)載時(shí)也會(huì)拉低放大器的電壓,所以整個(gè)系統(tǒng)的電源供應(yīng)的比例必須合理。輸
入一個(gè)周期性的正向脈沖信號(hào),這個(gè)周期性脈沖信號(hào)的高電平時(shí)間通常在1ms—
2ms之間,而低電平時(shí)間應(yīng)在5ms到20ms之間,并不很嚴(yán)格.
簡(jiǎn)單的說(shuō)伺服電機(jī)用在控制精度要求比較高的地方(比如機(jī)器人的手)。
_________________
第八課 用什么語(yǔ)言編程
很多人問(wèn)我你用什么語(yǔ)言編程,告訴大家DEBUG、BASIC、ASM、C、C++、DELPHI
我都用,其實(shí)用什么語(yǔ)言并不重要,關(guān)鍵是你的思路和算法最重要,語(yǔ)言不過(guò)是一種表達(dá)方式。
機(jī)器人硬件一旦完成,要想使機(jī)器人按我們的意愿進(jìn)行工作及機(jī)器人智能水平的高低都是在軟件中得到體現(xiàn),所以說(shuō)軟件編程是機(jī)器人最重要的一個(gè)環(huán)節(jié).
不過(guò)這里還是要說(shuō)一下,如果你是個(gè)入門者我推薦你從basic學(xué)起循序漸進(jìn)。
好了,基礎(chǔ)課到這就告一段落,大家可能會(huì)說(shuō)我講的不夠具體沒(méi)有深入細(xì)節(jié),是的
一是我時(shí)間不太多;二是給入門者介紹下方向讓他們知道以后該專攻那些方面;三是我想通過(guò)后面的實(shí)例讓大家自己體會(huì)。
以上八課你沒(méi)看懂,不要緊看了就行,從下節(jié)開始課跟我一起做實(shí)驗(yàn),慢慢的你就都懂了。
_________________
第九課 機(jī)器DIY1
很多人想學(xué)習(xí)制作機(jī)器人,可是苦于機(jī)器人配件價(jià)格太高或者買的起但有條條框
框限制,個(gè)人發(fā)揮的空間不大。我同樣也遇到了這樣的問(wèn)題,但是只要肯動(dòng)腦就沒(méi)
有解決不了的問(wèn)題,是的我解決了,大家只要準(zhǔn)備好一臺(tái)586以上的電腦和買早餐
的錢就可以跟我學(xué)習(xí)制作機(jī)器人了,這是真的。
好了,開始了!
制作前先告訴大家一個(gè)秘訣:無(wú)論是用單片機(jī)還是用電腦控制機(jī)器人都是靠IO的
輸入輸出控制的。
好先去把要用的準(zhǔn)備好:
1.電腦一臺(tái)
2.萬(wàn)用表
3.電烙鐵
3.打印機(jī)并口線一條(電腦城有賣8元)
4.發(fā)光二極管4個(gè)(電子商店有賣0.5元/個(gè))
首先把打印機(jī)并口線按圖重新焊接。
然后將并口線插在電腦打印機(jī)并口上,硬件的工做我們就完成了。
啟動(dòng)電腦進(jìn)入WIN98后,進(jìn)入DOS窗口輸入DEBUG回車。
輸入:
-O 387,F(xiàn)F
你會(huì)發(fā)現(xiàn)4個(gè)發(fā)光二極管都亮了。
再輸入:
-O 387,0
你會(huì)發(fā)現(xiàn)4個(gè)發(fā)光二極管都滅了。
怎么樣神奇嗎?是的你已學(xué)會(huì)了機(jī)器人輸出的控制,當(dāng)然這比較簡(jiǎn)單,但以后我們
會(huì)逐步深入,最后完成一功能復(fù)雜的機(jī)器人.
_________________
第十課 機(jī)器DIY2
上課講了IO的輸出控制,大家一定會(huì)問(wèn)怎么分別控制4個(gè)發(fā)光二極管的亮和滅?別急
這節(jié)課我就給大家講講怎么來(lái)做。
1。啟動(dòng)電腦進(jìn)入WIN98后,進(jìn)入DOS窗口輸入DEBUG回車。
輸入:
-O 387,1
你會(huì)發(fā)現(xiàn)D1亮了。
再輸入:
-O 387,2
你會(huì)發(fā)現(xiàn)D2亮了。
再輸入:
-O 387,3
你會(huì)發(fā)現(xiàn)D3亮了。
再輸入:
-O 387,4
你會(huì)發(fā)現(xiàn)D4亮了。
通過(guò)上述方法,你可以任意安排LED的顯示方式。
以上只能手動(dòng)控制LED的顯示方式,現(xiàn)在我教大家怎么通過(guò)BASIC編程來(lái)控制LED的
顯示。
請(qǐng)先下載basic編程軟件(189k):
http://wwwxuan.nease.net/diy/QBASIC.EXE
下載后運(yùn)行QBASIC.EXE,進(jìn)入界面按一下ESC鍵后輸入:
10 cls
20 OUT &h378, 1
21 for a=1 to 100000:next a
30 OUT &h378, 2
31 for a=1 to 100000:next a
40 OUT &h378, 3
41 for a=1 to 100000:next a
50 OUT &h378, 4
51 for a=1 to 100000:next a
60 OUT &h378, 0
61 for a=1 to 100000:next a
70 end
輸完后按F5鍵你就可以看到DEL依此閃亮。
解釋一下:
10 cls ‘10是行號(hào),CLS是清屏命令
OUT &h378, 1 ‘點(diǎn)亮d1
for a=1 to 100000:next a '延遲語(yǔ)句
end ‘結(jié)束命令
好了大家自己試一下吧,下節(jié)課我來(lái)教大家IO的輸入控制.
_________________
第十一課 機(jī)器DIY3
上兩課講的是輸出控制,這節(jié)課當(dāng)然是講輸入控制。
1。在上次焊好的并口上在如下圖焊接好
圖中P為電池或引出的機(jī)內(nèi)5V電源,R為限流電阻470歐姆至1K。
至此你已經(jīng)擁有了一個(gè)機(jī)器人控制器的最小開發(fā)系統(tǒng),我們可以在這個(gè)系統(tǒng)上開發(fā)
出一個(gè)強(qiáng)大的機(jī)器人。(怎么樣沒(méi)花多少錢吧。
2。運(yùn)行QBASIC.EXE,進(jìn)入界面按一下ESC鍵后輸入:
10 cls
20 IF (INP(&h379) and 8 )/8=1 then print"K2是閉合的"
30 IF (INP(&h379) and 8 )/8=0 then print"K2是打開的"
40 IF (INP(&h379) and 16)/16=1 then print"K1是閉合的"
50 IF (INP(&h379) and 16)/16=0 then print"K2是打開的"
60 goto 20
輸完后按F5鍵后,按下K1或K2你就可以在屏幕上看到結(jié)果。
_________________
第十二課 機(jī)器DIY4
上課前再向大家聲明一下,此講座是我隨想隨寫可能有語(yǔ)法、掉字、錯(cuò)字,
內(nèi)容也不夠詳盡,不足之處望大家見諒。
上兩課分別講了輸入、輸出的控制,這課就給大家講講一個(gè)簡(jiǎn)單的控制實(shí)例。
1。運(yùn)行QBASIC.EXE,進(jìn)入界面按一下ESC鍵后輸入:
10 cls
20 IF (INP(&h379) and 8 ) / 8=1 then OUT &h378, 1
30 IF (INP(&h379) and 8 ) / 8=0 then OUT &h378, 2
40 IF (INP(&h379) and 16)/16=1 then OUT &h378, 3
50 IF (INP(&h379) and 16)/16=0 then OUT &h378, 4
60 goto 20
輸完后按F5鍵后,按下K1或K2你就可以看到LED的變化。
是的,這個(gè)程序用LED代替了屏幕的顯示,也就是說(shuō)你能通過(guò)輸入的變化來(lái)控制LED的亮和滅,當(dāng)然也就可以控制別的什么(例:控制電機(jī)、舵機(jī)等),具體怎么做請(qǐng)聽下回分解。
_________________
第十三課 控制電機(jī)正反轉(zhuǎn)
控制電機(jī)正反轉(zhuǎn)是機(jī)器人制作中不可缺少的一項(xiàng),今天我來(lái)制作一個(gè)電機(jī)正反轉(zhuǎn)
電路.
以下是需要的材料:
1.玩具電機(jī)一只(電動(dòng)玩具中都有)
2。5v繼電器2個(gè)(電子商店有賣2元/個(gè))
3。4N25光隔2個(gè)(電子商店有賣5元/個(gè))
4。四節(jié)1.5V電池(0.5元/個(gè))
先來(lái)做個(gè)電機(jī)正反轉(zhuǎn)的實(shí)驗(yàn)。
電機(jī)尾部有兩條引線分別把線接在電池正負(fù)極上,電機(jī)轉(zhuǎn)了注意一下它的旋轉(zhuǎn)方向
,然后再把電池極性換一下觀察電機(jī)的旋轉(zhuǎn)方向,電機(jī)反方向旋轉(zhuǎn)了。
控制電機(jī)正反轉(zhuǎn)的秘訣就是:電源互換極性.
明白了以上的道理,下面我們來(lái)按圖把電路焊好。
運(yùn)行QBASIC.EXE,進(jìn)入界面按一下ESC鍵后輸入:
10 cls
20 IF (INP(&h379) and 8 ) /8=0 then OUT &h378, 1
30 IF (INP(&h379) and 16 ) /16=0 then OUT &h378, 2
40 goto 20輸完后按F5鍵后,按下K1或K2你就可以控制電機(jī)正反轉(zhuǎn)了。
下節(jié)課在此基礎(chǔ)上教大家做個(gè)自動(dòng)避障小車.
_________________
第十四課 自動(dòng)避障小車
課上到這,大家是不是覺(jué)得越來(lái)越有意思了,如果我講的好大家就頂一下,不然我
就沒(méi)有繼續(xù)寫的動(dòng)力了。
上節(jié)課我們只講了控制一只電機(jī)還有D3、D4沒(méi)有用上,是的我是有意留給大家自
己去做,你再焊一塊同樣的板子接到D3、D4就可以了。
把K1、K2換成觸碰開關(guān),一個(gè)自動(dòng)避障小車就有了。
下面我們來(lái)看小車工作的程序.
運(yùn)行QBASIC.EXE,進(jìn)入界面按一下ESC鍵后輸入:
10 cls
20 IF (INP(&h379) and 8 ) /8=0 and IF (INP(&h379) and 16 ) /16=0 then OUT &h378, 5
30 IF (INP(&h379) and 8 ) /8=1 then OUT &h378, 1
40 IF (INP(&h379) and 16 ) /16=1 then OUT &h378, 8
60 goto 20
輸完后按F5鍵小車就跑起來(lái)了。
程序說(shuō)明:
1。K1、K2同時(shí)打開左右電機(jī)一起旋轉(zhuǎn)。
2。K1打開左轉(zhuǎn)右停.
3.K2打開右轉(zhuǎn)左停.
我就教這么多剩下的就靠你自己去發(fā)揮了。
_________________
由簡(jiǎn)單到復(fù)雜
由有線到無(wú)線
由分散到集中
共同努力 成就未來(lái)
|
|