久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6796|回復: 2
收起左側

DIY機器人---一篇不錯的機器人制作教材.機器人核心部分開發1

[復制鏈接]
ID:107189 發表于 2016-3-6 14:50 | 顯示全部樓層 |閱讀模式
本帖最后由 51黑tt 于 2016-3-6 14:52 編輯

第一課 制作機器人的基礎

在論壇上經常可以看到有人說:“我是菜鳥,制作機器人需要什么基礎?”。其
實我可以回答大家:“基礎就是你首先要學好數理化”,怎么樣很意外吧!現在
我來給大家講講為什么這么說。機器人制作綜合性很強,它涉及機械制造、計
算機、電子技術等很多領域,每一個領域都是以我們的數理化為基礎的,還有就
是要充分利用互聯網的資源自我學習。

以下是我在論壇發過的一篇貼子,希望大家用心體會。

高手的秘訣

1.不要看到別人的回復第一句話就說:給個代碼吧!你應該想想為什么。當你自己想 出來
再參考別人的提示,你就知道自己和別人思路的差異。

2.別小家子氣,買本書幾十塊都舍不得,你還學個P。為了省錢看電子書,浪費的時間絕對
超過書的價值。當然如果查資料,只能看PDF。

3.學習新的開發軟件時,一定要看幫助手冊。買的書不夠全面。剛接觸一個軟件,什么都不
懂,就盲目的問東問西,讓人看起來很幼稚。

4.不要蜻蜓點水,得過且過,細微之處往往體現實力。

5.把時髦的技術掛在嘴邊,還不如把過時的技術記在心里。

6.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看。
.別指望看第一遍書就能記住和掌握什么——請看第二遍、第三遍。

7.多實踐,去焊板子、調試,去寫去調,只用軟件模擬,是永遠成不了高手的。

8.保存好你做過的所有的源程序、PCB、原理圖等----那是你最好的積累之一。

9.對于網絡,還是希望大家能多利用一下,很多問題不是非要到論壇來問的,首先你要學會
自己找答案,比如google、百度都是很好的搜索引擎,你只要輸入關鍵字就 能找到很多相
關資料,別老是等待別人給你希望,看的出你平時一定也很懶!

10 到一個論壇,你學會去看以前的帖子,不要什么都不看就發帖子問,也許你的問題早就
有人問過了,你再問,別人已經不想再重復了,做為初學者,誰也不希望自己的帖子沒人回
的。

11,雖然不是打擊初學者,但是這句話還是要說:論壇論壇,就是大家討論的地方,如果你
總期望有高手總無償指點你,除非他是你親戚!!討論者,起碼是水平相當的才有討論的說
法,如果水平真差距太遠了,連基本操作都需要別人給解答,誰還跟你討論呢。

什么樣的人是浮躁的人?

浮躁的人容易問:我到底該學什么;
----踏踏實實的學點基本的吧?單片機不知道是什么就想去學ARM?
c語言不會想搞LINUX?別老是好高騖遠。
浮躁的人容易問:誰有xxx源碼?--(你給人家多少錢啊?自己的勞動白送你?)
浮躁的人容易說:跪求xxx ---(就算網絡也要點尊嚴吧?)
浮躁的人容易說:緊急求救---(其實只是個簡單的課程設計)
浮躁的人容易說:有沒有xxx中文資料?---一個字:懶。別說別的。E文不行?誰不是從
ABC學起的啊?
浮躁的人容易說:求xxx,我的email是xxx@xxx.com,然后消失 ---- 你以為你是大爺啊,人
家請你吃飯,還要喂到你口里不成?
浮躁的人容易問:做單片機有錢途嗎----只是為了錢,搞不好技術的,你去搶銀行好了。
浮躁的人容易說:哪里有xxx芯片資料?(其實大部分資料網絡上都有,但是偏偏來找人
問,懶!)
浮躁的人分兩種:只觀望而不學的人;只學而不堅持的人;
浮躁的人永遠不是一個高手。

lamp

看完后明白了吧,恭喜!你已經邁出了第一步。

第一課就到這里,下課接著講。

_________________

第二課 機器人的組成

機器人一般是由以下模塊組成:
1.語音模塊
用于語音對話、語音控制。
2.燈光表達模塊
用于機器人狀態顯示、感情表達(喜、怒、哀、樂)
3.控制模塊
I/O+決策,即機器人的大腦,其控制能力及AI由編程者的水平決定。
4.傳感器模塊
對外界環境的的感知。
5.電源模塊
為機器人提供能源,常用有3v、5v、6v、9v、12v。
6.減速電機
常用于機器人行走驅動,根據需要選擇變比。
7.驅動模塊
機器人的執行機構,常選用行模中的舵機。
8.視頻模塊
機器人的眼
9.機械模塊
10.無線通訊模塊
11.控制軟件

一個簡單的機器人是由單片機電路、紅外傳感器、減速電機+程序這是大多數人
認同的,但是我要向大家說這種認識是錯誤的,真正的機器人不是幾片單機和
幾臺電腦就可以解決,關鍵就是‘機器人’中這個‘人’字,還需要我們一代代
的努力。

以上講的有點簡單,先寫出。

-------------------------------
第三課 機器人的工作原理

機器人是機器有人的特點,我們可以從人自身出發就容易理解他的工作原理了.
簡單的講就是傳感器將得到的信息送到處理器決策執行驅動器的動作。

就講這么多,到后面有實例大家就明白了。
哈哈,這小子太^&%**

第四課 常用工具的使用

1.電源插座
電源插座買的時候要選插口多的那種,否則在以后的使用中你會發現插口不夠用,把電烙鐵和可調穩壓電源的插頭插上。

2.電烙鐵的使用
電烙鐵是進行無線電制作不可缺少的工具之一,電烙鐵是用來焊錫的,為方便使用,通常做成“焊錫絲”,焊錫絲內一般都含有助焊的松香。松香是一種助焊劑,可以幫助焊接,可到藥店購買。松香可以直接用,也可以配置成松香溶液,就是把松香碾碎,放入小瓶中,再加入酒精攪勻。注意酒精易揮發,用完后記得把瓶蓋擰緊。瓶里可以放一小塊棉花,用時就用鑷子夾出來涂在印刷板上或元器件上。注意市面上有一種焊錫膏(有稱焊油),這可是一種帶有腐蝕性的東西,是用在工業上的,不適合電子制作使用。還有市面上的松香水,并不是我們這里用的松香溶液。新的電烙鐵不能拿來就用,需要先給烙鐵頭鍍上一層焊錫。方法:給電烙鐵通電,待溫度升高以后,再用焊錫絲融化在烙鐵頭上,使烙鐵頭上鍍上一層焊錫,烙鐵頭鍍上焊錫,不但能保護烙鐵頭不被氧化,而且使烙鐵頭傳熱快,吃錫容易,焊接質量也容易得到保證。電烙鐵使用時間長了以后,烙鐵頭會變黑或變得不平,這時候可以用銼刀銼平,然后再鍍上焊錫。最好買一個烙鐵架,平時電烙鐵不用時可以將電烙鐵放在烙鐵架上。使用烙鐵時,烙鐵的溫度太低則熔化不了焊錫,或者使焊點未完全熔化而成不好看、不可靠的樣子。太高又會使烙鐵不能蘸上錫。 另外也要控制好焊接的時間,電烙鐵停留的時間太短,焊錫不易完全熔化、接觸好,形成“虛焊”,而焊接時間太長又容易損壞元器件,或使印刷電路板的銅箔翹起。一般一兩秒內要焊好一個焊點,若沒完成,寧愿等一會兒再焊一次。焊接時電烙鐵不能移動,應該先選好接觸焊點的位置,再用烙鐵頭的搪錫面去接觸焊點。

3.萬用表的使用
萬用表的使用的注意事項
a在使用萬用表之前,應先進行“機械調零”,即在沒有被測電量時 ,使萬用表指針指在零電壓或零電流的位置上。


  (2)在使用萬用表過程中,不能用手去接觸表筆的金屬部分 ,這樣一方面可以保證測量的準確,另一方面也可以保證人身安全。


  (3)在測量某一電量時,不能在測量的同時換檔,尤其是在測量高電壓或大電流時 ,更應注意。否則,會使萬用表毀壞。如需換擋,應先斷開表筆,換擋后再去測量。


  (4)萬用表在使用時,必須水平放置,以免造成誤差。同時, 還要注意到避免外界磁場對萬用表的影響。


  (5)萬用表使用完畢,應將轉換開關置于交流電壓的最大擋。如果長期不使用 ,還應將萬用表內部的電池取出來,以免電池腐蝕表內其它器件。

歐姆擋的使用


  一、選擇合適的倍率。在歐姆表測量電阻時,應選適當的倍率,使指針指示在中值附近。最好不使用刻度左邊三分之一的部分,這部分刻度密集很差。


  二、使用前要調零。


  三、不能帶電測量。


  四、被測電阻不能有并聯支路。


  五、測量晶體管、電解電容等有極性元件的等效電阻時,必須注意兩支筆的極性。


  六、用萬用表不同倍率的歐姆擋測量非線性元件的等效電阻時,測出電阻值是不相同的。這是由于各擋位的中值電阻和滿度電流各不相同所造成的,機械表中,一般倍率越小,測出的阻值越小。


  萬用表測直流時


  一、進行機械調零。


  二、選擇合適的量程檔位。


  三、使用萬用表電流擋測量電流時,應將萬用表串聯在被子測電路中,因為只有串連接才能使流過電流表的電流與被測支路電流相同 。測量時,應斷開被測支路 ,將萬用表紅、黑表筆串接在被斷開的兩點之間 。特別應注意電流表不能并聯接在被子測電路中 ,這樣做是很危險的,極易使萬表燒毀。


  四、注意被測電量極性。


  五、正確使用刻度和讀數。


  六、當選取用直流電流的2.5A擋時,萬用表紅表筆應插在2.5A測量插孔內 ,量程開關可以置于直流電流擋的任意量程上。


  七、如果被子測的直流電流大于2.5A,則可將2.5A擋擴展為5A擋 。方法很簡單,使用者可以在“2.5A”插孔和黑表筆插孔之間接入一支0.24歐姆的電阻 ,這樣該擋位就變成了5A電流擋了。接入的0.24A電阻應選取用2W以上的線繞電阻 ,如果功率太小會使之燒毀。

_________________

第五課 單片機
今天給大家講講單片機,跟上幾課一樣比較枯燥但打基礎就是這樣,偷不的懶。
對一個初學單片機的人來說,學習的方法和途徑非常重要。如果按教科書式的學

法,上來就是指令,名詞,學了半天也搞不懂,用不了幾天就半途而廢,本講座

學習與實驗結合實際,邊學,邊練,讓你輕松進入單片機世界。本講座以80C51為

主,主要以練為主,采用跟我學,學習單片機的基礎知識,結構,指令,及開發

的一般方發。跟我練,學習I/O口應用,中斷,定時,串行口,數/模轉換,的練

習。跟我用講實用的單片機設計。

初學單片機必備設備,初學者不可不備的工具及軟件

一.學單片機需要的設備

這是一個很多想學單片機的人都比較關心的問題,我不希望花很多錢的代價學單片



1,要有一臺電腦,最好在486或者586以上

2,要有一個編程器,最好Windows界面,用來把編譯好的程序寫入單片機的

ROM里面,把寫好后的芯片插到試驗板上面進行試驗。

本站可提供:AT51串口編程器, AT51pro編程器能夠對ATMEL公司的

AT89c52/51/2051/1051單片機進行全面的編程操作,包括寫入、擦除、等。編程

器采用串口與PC聯接,安裝簡便。只要你將編程器用串口電纜聯到PC的COM1或

COM2端口,無需什么設置。操作軟件為Windows中文,可以工作在

Windows95/97/98/98se/98me/xp/2k操作系統;適合單片機開發、學習、產品生產

使用。

3,要有一個硬件單片機試驗板,作為單片機的試驗
4,要有幾個用來試驗的單片機芯片,比如應用的比較廣泛的89C51,2051

5 由于AT89C單片機具有可反復燒寫的特點,在設計程序時可反復修改原程序、

編譯、并燒寫到單片機,若程序稍復雜點再配合軟件仿真排錯,直至完成設計,

完全沒必要再使用昂貴的仿真器。

二、軟件準備:一些常用軟件是必須具備的。

51單片機集成開發系統MedWin 見軟件講座

c51eva c51eva是keil的c51開發環境,我們經常會在網上見到這個軟件。其實

他同樣可以用匯編以及PL/M等語言進行開發。見軟件講座

軟件仿真8051debug適應于與8051完全兼容的單片機,如AT89C51系列。

51 Hex--bin轉換工具

51 bin--Hex轉化工具

51波特率初值設定軟件

LED--encode數碼管編碼器

繪圖用的protel99

目前開發單片機的應用軟件比較雜亂,使初學者無所適從;這里我們推薦萬利公

司的Medwin或Keil公司的c51eval,這兩個均為集成系統,所謂集成,是指將原程

序編寫、匯編/編譯/連接、調試等開發單片機所要用到的程序集合到一個軟件中

。目前Medwin有免費中文版,很適合初學者使用。

單片機的組成

單片機要自動完成計算,它應該具有哪些最重要的部分呢?
我們以打算盤為例計算一道算術題。例:36+163×156-166÷34。現在要

進行運算,首先需要一把算盤,其次是紙和筆。我們把要計算的問題記錄下來,

然后第一步先算163×156,把它與36相加的結果記在紙上,然后計算166÷34,再

把它從上一次結果中減去,就得到最后的結果。

  現在,我們用單片機來完成上述過程,顯然,它首先要有代替算盤進行運算

的部件,這就是“運算器”;其次,要有能起到紙和筆作用的器件,即能記憶原

始題目、原始數據和中間結果,還要記住使單片機能自動進行運算而編制的各種

命令。這類器件就稱為“存貯器”。此外,還需要有能代替人作用的控制器,它

能根據事先給定的命令發出各種控制信號,使整個計算過程能一步步地進行。但

是光有這三部分還不夠,原始的數據與命令要輸入,計算的結果要輸出,都需要

按先后順序進行,有時還需等待。如上例中,當在計算163×156時,數字36就不

能同時進入運算器。因此就需要在單片機上設置按控制器的命令進行動作的“門

”,當運算器需要時,就讓新數據進入。或者,當運算器得到最后結果時,再將

此結果輸出,而中間結果不能隨便“溜出”單片機。這種對輸入、輸出數據進行

一定管理的“門”電路在單片機中稱為“口”(Port)。在單片機中,基本上有

三類信息在流動,一類是數據,即各種原始數據(如上例中的36、163等)、中間

結果(如166÷34所得的商4、余數30等)、程序(命令的集合)等。這樣要由外

部設備通過“口”進入單片機,再存放在存貯器中,在運算處理過程中,數據從

存貯器讀入運算器進行運算,運算的中間結果要存入存貯器中,或最后由運算器

經“出入口”輸出。用戶要單片機執行的各種命令(程序)也以數據的形式由存

貯器送入控制器,由控制器解讀(譯碼)后變為各種控制信號,以便執行如加、

減、乘、除等功能的各種命令。所以,這一類信息就稱為控制命令,即由控制器

去控制運算器一步步地進行運算和處理,又控制存貯器的讀(取出數據)和寫(

存入數據)等。第三類信息是地址信息,其作用是告訴運算器和控制器在何處去

取命令取數據,將結果存放到什么地方,通過哪個口輸入和輸出信息等。

  存貯器又分為只讀存貯器和讀寫存貯器兩種,前者存放調試好的固定程序和

常數,后者存放一些隨時有可能變動的數據。顧名思義,只讀存貯器一旦將數據

存入,就只能讀出,不能更改(EPROM、E2PROM等類型的ROM可通過一定的方法來

更改、寫入數據——編者注)。而讀寫存貯器可隨時存入或讀出數據。

  實際上,人們往往把運算器和控制器合并稱為中央處理單元——CPU。單片機

除了進行運算外,還要完成控制功能。所以離不開計數和定時。因此,在單片機

中就設置有定時器兼計數器,其基本結構與本連載之(二)中的舉例類似。到這

里為止,我們已經知道了單片機的基本組成,即單片機是由中央處理器(即CPU中

的運算器和控制器)、只讀存貯器(通常表示為ROM)、讀寫存貯器(又稱隨機存

貯器通常表示為RAM)、輸入/輸出口(又分為并行口和串行口,表示為I/O口)等

等組成。實際上單片機里面還有一個時鐘電路,使單片機在進行運算和控制時,

都能有節奏地進行。另外,還有所謂的“中斷系統”,這個系統有“傳達室”的

作用,當單片機控制對象的參數到達某個需要加以干預的狀態時,就可經此“傳

達室”通報給CPU,使CPU根據外部事態的輕重緩急來采取適當的應付措施。

  現在,我們已經知道了單片機的組成,余下的問題是如何將它們的各部分連

接成相互關聯的整體呢?實際上,單片機內部有一條將它們連接起來的“紐帶”

,即所謂的“內部總線”。此總線有如大城市的“干道”,而CPU、ROM、RAM、

I/O口、中斷系統等就分布在此“總線”的兩旁,并和它連通。從而,一切指令、

數據都可經內部總線傳送,有如大城市內各種物品的傳送都經過干道進行。 

 

單片機指令系統與匯編語言程序

前面已經講述了單片機的幾個主要組成部分,這些部分構成了單片機的硬件。所

謂硬件(Hardware),就是看得到,摸得到的實體。但是,光有這樣的硬件,還

只是有了實現計算和控制功能的可能性。單片機要真正地能進行計算和控制,還

必須有軟件(Software)的配合。軟件主要指的是各種程序。只有將各種正確的

程序“灌入”(存入)單片機,它才能有效地工作。單片機所以能自動地進行運

算和控制,正是由于人把實現計算和控制的步驟一步步地用命令的形式,即一條

條指令(Instruction)預先存入到存貯器中,單片機在CPU的控制下,將指令一

條條地取出來,并加以翻譯和執行。就以兩個數相加這一簡單的運算來說,當需

要運算的數已存入存貯器后,還需要進行以下幾步:
第一步:把第一個數從它的存貯單元(Location)中取出來,送至運算器。

   第二步:把第二個數從它所在的存貯單元中取出來,送至運算器;
第三步:相加;
第四步:把相加完的結果,送至存貯器中指定的單元。
所有這些取數、送數、相加、存數等等都是一種操作(Operation),我們把

要求計算機執行的各種操作用命令的形式寫下來,這就是指令。但是怎樣才能辨

別和執行這些操作呢?這是在設計單片機時由設計人員賦予它的指令系統所決定

的。一條指令,對應著一種基本操作;單片機所能執行的全部指令,就是該單片

機的指令系統(Iustruction Set),不同種類的單片機,其指令系統亦不同。
使用單片機時,事先應當把要解決的問題編成一系列指令。這些指令必須是

選定的單片機能識別和執行的指令。單片機用戶為解決自己的問題所編的指令程

序,稱為源程序(Source Program)。指令通常分為操作碼(Opcode)和操作數

(Operand)兩大部分。操作碼表示計算機執行什么操作,即指令的功能;操作數

表示參加操作的數或操作數所在的地址(即操作數所存放的地方編號)。因為單

片機是一種可編程器件,只“認得”二進碼(0、1)。要單片機運作,單片機系

統中的所有指令,都必須以二進制編碼的形式來表示。例如,在Intel公司的MCS

-51系列單片機中,從存貯器中取出一數到CPU中的累加器(在運算器中,參與運

算、存放運算結果的專用寄存器)的指令代碼為74H,累加器內容加立即數的代碼

為24H,再加上立即數代碼,累加器送數到內部RAM存貯器的代碼為F6H~F7H等。

這些指令是用十六進制表示二進制的機器碼。MCS-51單片機的字長為8位,有時

,要完成某些操作用一個字節尚不能充分表達。所以,在指令系統中有單字節指

令,也有多字節指令。機器碼是由一連串的0和1組成,沒有明顯的特征,不好記

憶,不易理解,易出錯。所以,直接用它來編寫程序十分困難。因而,人們就用

一些助記符(Mue monic)——通常是指令功能的英文縮寫來代替操作碼,如MCS

-51中數的傳送常用MOV(Move的縮寫)、加法用Add(Addition的縮寫)來作為助

記符。這樣,每條指令有明顯的動作特征,易于記憶和理解,也不容易出錯。用

助記符來編寫的程序稱為匯編語言程序。但是,助記符編寫的程序便于人理解,

可單片機卻只認識二進制機器代碼,因此,為了讓單片機能“讀懂”匯編語言程

序必須再轉換成由二進制機器碼構成的程序,這種轉換過程,就稱為“匯編”。

匯編可借助于人工查表法來實現,也可借助PC機通過所謂“交叉匯編程序”來完

成。由機器碼構成的用戶程序一旦“進入”了單片機,再“啟動”單片機,就可

讓它執行輸入程序所規定的任務。

MCU--51 CPU和存儲器

單片機8051的CPU由運算器和控制器組成。

  一、運算器
運算器以完成二進制的算術/邏輯運算部件ALU為核心,再加上暫存器TMP、累加器

ACC、寄存器B、程序狀態標志寄存器PSW及布爾處理器。累加器ACC是一個八位寄

存器,它是CPU中工作最頻繁的寄存器。在進行算術、邏輯運算時,累加器ACC往

往在運算前暫存一個操作數(如被加數),而運算后又保存其結果(如代數和)

。寄存器B主要用于乘法和除法操作。標志寄存器PSW也是一個八位寄存器,用來

存放運算結果的一些特征,如有無進位、借位等。其每位的具體含意如下所示。

PSW CY AC FO RS1 RS0 OV - P對用戶來講,最關心的是以下四位。
1進位標志CY(PSW7)。它表示了運算是否有進位(或借位)。如果操作

結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
2輔助進位標志AC。又稱半進位標志,它反映了兩個八位數運算低四位是否

有半進位,即低四位相加(或減)有否進位(或借位),如有則AC為1狀態,否則

為0。
3溢出標志位OV。MCS-51反映帶符號數的運算結果是否有溢出,有溢出時

,此位為1,否則為0。
4奇偶標志P。反映累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數

個1(如11001100B,其中有4個1),則P為0,否則,P=1。
PSW的其它位,將在以后再介紹。由于PSW存放程序執行中的狀態,故又叫程

序狀態字?運算器中還有一個按位(bit)進行邏輯運算的邏輯處理機(又稱布爾

處理機)。其功能在介紹位指令時再說明。

  二、控制器

  控制器是CPU的神經中樞,它包括定時控制邏輯電路、指令寄存器、譯碼器、

地址指針DPTR及程序計數器PC、堆棧指針SP等。這里程序計數器PC是由16位寄存

器構成的計數器。要單片機執行一個程序,就必須把該程序按順序預先裝入存儲

器ROM的某個區域。單片機動作時應按順序一條條取出指令來加以執行。因此,必

須有一個電路能找出指令所在的單元地址,該電路就是程序計數器PC。當單片機

開始執行程序時,給PC裝入第一條指令所在地址,它每取出一條指令(如為多字

節指令,則每取出一個指令字節),PC的內容就自動加1,以指向下一條指令的地

址,使指令能順序執行。只有當程序遇到轉移指令、子程序調用指令,或遇到中

斷時(后面將介紹),PC才轉到所需要的地方去。8051 CPU碢C指定的地址,從

ROM相應單元中取出指令字節放在指令寄存器中寄存,然后,指令寄存器中的指令

代碼被譯碼器譯成各種形式的控制信號,這些信號與單片機時鐘振蕩器產生的時

鐘脈沖在定時與控制電路中相結合,形成按一定時間節拍變化的電平和時鐘,即

所謂控制信息,在CPU內部協調寄存器之間的數據傳輸、運算等操作。

三、存儲器

存儲器是單片機的又一個重要組成部分,圖6給出了一種存儲容量為256個單

元的存儲器結構示意圖。其中每個存儲單元對應一個地址,256個單元共有256個

地址,用兩位16進制數表示,即存儲器的地址(00H~FFH)。存儲器中每個存儲

單元可存放一個八位二進制信息,通常用兩位16進制數來表示,這就是存儲器的

內容。存儲器的存儲單元地址和存儲單元的內容是不同的兩個概念,不能混淆。
一、程序存儲器
程序是控制計算機動作的一系列命令,單片機只認識由“0”和“1”代碼構

成的機器指令。如前述用助記符編寫的命令MOV A,#20H,換成機器認識的代碼

74H、20H:(寫成二進制就是01110100B和00100000B)。在單片機處理問題之前

必須事先將編好的程序、表格、常數匯編成機器代碼后存入單片機的存儲器中,

該存儲器稱為程序存儲器。程序存儲器可以放在片內或片外,亦可片內片外同時

設置。由于PC程序計數器為16位,使得程序存儲器可用16位二進制地址,因此,

內外存儲器的地址最大可從0000H到FFFFH。8051內部有4k字節的ROM,就占用了由

0000H~0FFFH的最低4k個字節,這時片外擴充的程序存儲器地址編號應由1000H開

始,如果將8051當做8031使用,不想利用片內4kROM,全用片外存儲器,則地址編

號仍可由0000H開始。不過,這時應使8051的第{31}腳(即EA腳)保持低電平。當

EA為高電平時,用戶在0000H至0FFFH范圍內使用內部ROM,大于0FFFH后,單片機

CPU自動訪問外部程序存儲器。

  二、數據存儲器

  單片機的數據存儲器由讀寫存儲器RAM組成。其最大容量可擴展到64k,用于

存儲實時輸入的數據。8051內部有256個單元的內部數據存儲器,其中00H~7FH為

內部隨機存儲器RAM,80H~FFH為專用寄存器區。實際使用時應首先充分利用內部

存儲器,從使用角度講,搞清內部數據存儲器的結構和地址分配是十分重要的。

因為將來在學習指令系統和程序設計時會經常用到它們。8051內部數據存儲器地

址由00H至FFH共有256個字節的地址空間,該空間被分為兩部分,其中內部數據

RAM的地址為00H~7FH(即0~127)。而用做特殊功能寄存器的地址為80H~FFH。

在此256個字節中,還開辟有一個所謂“位地址”區,該區域內不但可按字節尋址

,還可按“位(bit)”尋址。對于那些需要進行位操作的數據,可以存放到這個

區域。從00H到1FH安排了四組工作寄存器,每組占用8個RAM字節,記為R0~R7。

究竟選用那一組寄存器,由前述標志寄存器中的RS1和RS0來選用。在這兩位上放

入不同的二進制數,即可選用不同的寄存器組,如附表1所示。

  三、特殊功能寄存器

  特殊功能寄存器(SFR)的地址范圍為80H~FFH。在MCS-51中,除程序計數

器PC和四個工作寄存器區外,其余21個特殊功能寄存器都在這SFR塊中。其中5個

是雙字節寄存器,它們共占用了26個字節。各特殊功能寄存器的符號和地址見附

表2。其中帶*號的可位尋址。特殊功能寄存器反映了8051的狀態,實際上是8051

的狀態字及控制字寄存器。用于CPU PSW便是典型一例。這些特殊功能寄存器大體

上分為兩類,一類與芯片的引腳有關,另一類作片內功能的控制用。與芯片引腳

有關的特殊功能寄存器是P0~P3,它們實際上是4個八位鎖存器(每個I/O口一個

),每個鎖存器附加有相應的輸出驅動器和輸入緩沖器就構成了一個并行口。MCS

-51共有P0~P3四個這樣的并行口,可提供32根I/O線,每根線都是雙向的,并且

大都有第二功能。其余用于芯片控制的寄存器中,累加器A、標志寄存器PSW、數

據指針DPTR等的功能前已提及,而另一些寄存器的功能在后面有關部分再作進一

步介紹

單片機的指令系統和尋址方式

單片機要正常運作,事先需編制程序,再把程序放入存貯器中,然后由CPU執行該

程序。程序是由指令組成的,指令的基本組成是操作碼和操作數。單片機的品種

很多,設計時怎樣表示操作碼和操作數,都有各自的規定,再有指令代碼也各不

相同,因此,必須對所選單片機的全部指令,也就是所謂“指令系統”,有足夠

的了解。各個系列的單片機雖然有不同的指令系統,但也有其共同性。掌握一種

單片機的指令系統,對其它系列單片機可以起到觸類旁通的作用。MCS-51單片機

應用廣泛,派生品種多,具有代表性,所以,這里以MCS-51系列的指令系統為例

說明“指令”的組成和應用。

  1、MOV A,#20H
這條指令表示把20H這個數送入累加器A中(一個特殊功能寄存器)。
2、ADD A,70H
這條指令表示把累加器A中的內容(在上例中送入的#20H)和存貯器中地

址為70H單元中的內容(也是一個數字),通過算術邏輯單元(英文縮寫為ALU)

相加,并將結果保留在A中。這里MOV、ADD等稱為操作碼,而A、#20H、70H等均

稱為操作數。在匯編語言程序中,操作碼通常由英文單詞縮寫而成,這樣有助于

記憶,所以又稱助記符。如MOV就是英文單詞MOVE的縮寫,含有搬移的意思;而

ADD即為英文單詞,其意為相加。因此,對于略懂英語的用戶,掌握單片機指令的

含意是較為方便的。操作數有多種表示法,如以上的#20H稱為立即數,即20H就

是真正的操作數。而70H是存貯器中某個單元的地址,在該單元中,放著操作數(

比如說是3AH),ADD A,70H不是將70H和A中的內容相加,而是從存貯器70H單元

中將3AH取出和A中的內容相加。由上可知,要找到實際操作數,有時就要轉個彎

,甚至轉幾個彎,這個過程稱為尋址,MCS-51共有7種尋址方式,現介紹如下:
一、立即尋址:操作數就寫在指令中,和操作碼一起放在程序存貯器中。把

“#”號放在立即數前面,以表示該尋址方式為立即尋址,如#20H。
二、寄存器尋址:操作數放在寄存器中,在指令中直接以寄存器的名字來表

示操作數的地址。例如MOV A,R0就屬于寄存器尋址,即將R0寄存器的內容送到累

加器A中。
三、直接尋址:操作數放在單片機的內部RAM某單元中,在指令中直接寫出該

單元的地址。如前例的ADD A,70H中的70H。
四、寄存器間接尋址:操作數放在RAM某個單元中,該單元的地址又放在寄存

器R0或R1中。
如果RAM的地址大于256,則該地址存放在16位寄存器DPTR(數據指針)中,

此時在寄存器名前加@符號來表示這種間接尋址。如MOV A,@ R0。其它還有變址

尋址、相對尋址、位尋址等,待以后再詳細介紹。可能有人會問,在指令中直接

給出實際操作數,不是簡單、明了嗎?為什么還要用其它幾種尋址方式呢?這是

因為在編制程序時很難一下子就給出操作數。如用單片機控制溫度時,時時需要

將給定的控制溫度(如20℃)減去環境溫度,而環境溫度時時有變化,顯然無法

在程序指令中給出,只有通過一定方式,將其送入某個輸入/輸出口,再存放在某

個寄存器中,這就必須用到寄存器尋址。又如要進行算術運算,要計算每班學員

各科成績的平均值,如果把每個學員的各科都編一個程序,在程序中直接給出該

學員各科成績,再求平均值,顯然太麻煩。這里可以編一個求平均成績的通用程

序,把每位學員的成績送入存貯器的各個單元中,這時可采取直接尋址,一個程

序可供每個學員用,不是更方便嗎?所以,尋址方式越多,編制程序就越方便、

靈活,適用范圍就越廣。尋址有如找人,如被找的人有手機、BP機、座機電話等

多種聯系方式則就容易找到他,單片機也是如此,尋址方式越多,找操作數越方

便,單片機的功能就越強。前面介紹51系列單片機的尋址方式時,常遇到單片機

內部的一些寄存器、累加器A、通用寄存器R0~R7、數據指針DPTR和存貯器等。在

以后介紹指令時,數據就要在這些寄存器、存貯器之間傳送,或者進行運算。因

此,編制程序就需熟悉單片機的內部結構。
8051單片機的內部總體結構其基本特性如下:
8位CPU、片內振蕩器
4k字節ROM、128字節RAM
21個特殊功能寄存器
32根I/O線
可尋址的64k字節外部數據、程序存貯空間
2個16位定時器、計數器
中斷結構:具有二個優先級、五個中斷源
一個全雙口串行口
位尋址(即可尋找某位的內容)功能,適于按位進行邏輯運算的位處理器。

除128字節RAM、4k字節ROM和中斷、串行口及定時器模塊外,還有4組I/O口P0~P3

,余下的就是CPU的全部組成。把4kROM換為EPROM就是8751的結構,如去掉

ROM/EPROM部分即為8031的框圖,如果將ROM置換為Flash存貯器或EEPROM,或再省

去某些I/O,即可得到51系列的派生品種,如89C51、AT89C2051等單片機的框圖。

  單片機各部分是通過內部的總線有機地連接起來的
單片機MCS-51系列指令快速記憶法

隨著微電子技術和超大規模集成電路技術的發展,單片微型計算機以其體積小、


價比高、功能強、可靠性高等獨有的特點,在各個領域(如工業控制、家電產品

、汽車
電子、通信、智能儀器儀表)得到了廣泛的應用。學習、使用單片機的人越來越

多,而
生產單片機的廠家很多,單片機種類繁雜,不知如何選擇。據統計,八位單片機

占全球
單片機銷量的65%。在八位單片機中,Intel公司的8051單片機內核已成為8位單

片機事
實上的標準。因此,對初學者而言,選擇8051單片機來學習不失為明智的選擇。
  學習單片機,除了搞清單片機內部功能、存儲空間分配及I/O接口外,還應掌

握其指
令系統。MCS-51共有111條指令,現介紹我們總結出的快速記憶MCS-51指令的方

法,供
大家參考。
  大家都知道,匯編語言指令由操作碼、操作數兩部分組成。MCS-51使用匯編

語言指
令,它共有44個操作碼助記符,33種功能,其操作數有#data、direct、Rn、@Ri

等。這
里先介紹指令助記符及其相關符號的記憶方法。
  一、助記符號的記憶方法
  1表格列舉法
  把44個指令助記符按功能分為五類,每類列表記憶。此處從略,請讀者自己

總結。

  2英文還原法
  單片機的操作碼助記符是該指令功能的英文縮寫,將縮寫還原成英語原文,

再對照
漢語有助于理解其助記符含義,從而加強記憶。例如:
增量 INC-Incremect  減量 DNC-Decrement
短轉移 SJMP-Short jump  長轉移 LJMP-Long jump
比較轉移 CJNE-Compare jump not equality 
絕對轉移 AJMP-Absolute jump 空操作 NOP-No operation
交換 XCH-Exchange    加法 ADD-Addition
乘法 MUL-Multiplication  除法 DIV-Division
左環移 RL-Rotate left  進位左環移 RLC-Rotate
                    left carry
右環移 RR-Rotate right  進位右環移RRC-Rotate
                    right carry
  3功能模塊記憶法
  單片機的44個指令助記符,按所屬指令功能可分為五大類,每類又可以按功

能相似
原則為2~3組。這樣,化整為零,各個擊破,實現快速記憶。
  1)數據傳送組。      2)加減運算組
   MOV 內部數據傳送    ADD 加法
   MOVC 程序存儲器傳送   ADDC 帶進位加法
   MOVX 外部數據傳送    SUBB 帶進位減法
  3)邏輯運算組。      4)子程序調用組。
   ANL 邏輯與         LCALL 長調用
   ORL 邏輯或       ALALL 絕對調用
   XRL 邏輯異或       RET 子程序返回

  二、指令的記憶方法
  1指令操作數的有關符號
  MCS-51的尋址方式共有六種:立即數尋址、直接尋址、寄存器尋址、寄存器

間址、
變址尋址、相對尋址。我們必須掌握其表示的方法。
  1)立即數與直接地址。
 。ata表示八位立即數,#data16表示是十六位立即數,data或direct表示直

接地
址。
  2)Rn(n=0-7)、A、B、CY、DPTR寄存器尋址變量。
  3)@R0、@R1、@DPTR、SP表示寄存器間址變量。
  4)DPTR+A、PC+A表示變址尋址的變量。
  5)PC+rel(相對量)表示相對尋址變量。
  記住指令的助記符,掌握不同尋址方式的指令操作數的表示方法,為我們記

憶匯編
指令打下了基礎。MCS-51指令雖多,但按功能可分為五類,其中數據傳送類28條

,算術
運算類24條,邏輯操作類25條,控制轉移類17條,布爾位操作類17條。在每類指

令里,
根據其功能,抓住其源、目的操作數的不同組合,再輔之以下方法,是完全能記

住的。
我們約定,可能的目的操作數按(#data/direct/A/Rn/@Ri)順序表示。
  對于MOV指令,其目的操作數按A、Rn、direct、@Ri的順序書寫,則可以記住

MOV的
15條指令。例如以累加器A為目的操作數,可寫出如下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指令圖示記憶法
  圖示記憶法是把操作功能相同或相似、但其操作數不同的指令,用圖形和箭

頭將目
的、源操作數的關系表示出來的一種記憶方法。例如:由助記符MOV、MOVX、MOVC

組成的
送數組指令,可以用圖1、2幫助記憶。
  由助記符CJNE形成的四條指令,也可以用圖示法表示,如圖3。
CJNE A,#data,rel   CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
  另外,對于由(ANL、ORL、ARL)形成的18條邏輯操作指令,有關A的四條環

移指令
,也可以用圖示法表示,請讀者自行畫出記憶。
  3相似功能歸類法
  在MCS-51指令中,我們發現部分指令其操作碼不同,但功能相似,而操作數

則完全
一樣。相似功能歸類法就是把具有這樣特點的指令放在一起記憶,只要記住其中

的一條
,其余的也就記住了。如加、減法的十二條指令,與、或、非的十八條指令,現

列舉如
下。
  ADD/ADDC/SUBB A,#data/direct/Rn/@Ri
  ANL/ORL/XRL A,#data/direct/Rn/@Ri
  ANL/ORL/XRL direct,#data/a
  上述每一排指令,功能相似,其操作數都相同。其它的如加1(INC)、減1

(DEC)指令
也可照此辦理。
  4口訣記憶法
  對于有些指令,我們可以把相關的功能用精練的語言編成一句話來記憶。如

PUSH d
irect和POP direct這兩條指令。初學者常常分不清堆棧SP的變化情況,為此編成

這樣一
句話:(SP的內容)加1(direct的內容)再入棧,(SP的內容)彈出(到direct單元)SP

才減1
。又如乘法指令中積的存放,除法指令中被除數和除數以及商的存放,都可以編

成口訣
記憶如下。
  MUL AB  高位積(存于)B,低位積(存于)A。
  DIV AB  A除以B,商(存于)A余(下)B。
  上面介紹了幾種快速記憶單片機指令的方法,希望能起到拋磚引玉的作用,

相信讀
者在學習單片機的過程中能找到適合自己的方法來記憶。但是,有了好的方法還

不夠,
還需要實踐,即多讀書上的例題和別人編寫的程序,自己再結合實際編寫一些程

序。只
有這樣,才能更好更快地掌握單片機指令系統。

單片機自學教材之用單片機做流水燈(一)

第一節

第一步:制作硬件電路

流水燈電原理圖如下圖,圖中用一片AT89C2051單片機及少量外圍元件組成。
圖中,R1~R8為LED1~8的限流電阻;R9、C3為單片機的簡易上電復位電路;C1

、C2、T1組成單片機的時鐘電路;

工作原理:在上電后由于C3、R9的作用,使單片機的RST復位腳電平先高后低,

從而達到復位;之后,在C1、C2、T1以及單片機內部時鐘電路的作用下,單片機

依程序將P1.0~P1.7引腳拉低或抬高;拉低的引腳對應的LED點亮,抬高的引腳對

應的LED熄滅。

電路制作時,AT89C2051的位置應安裝20腳的IC座,以便使單片機可以從電路板中

拿下去燒寫程序。電路中的元件無太苛刻的要求,若LED為高亮度的,R1~R8可加

大到1k;C3漏電不要太大;否則會造成單片機無法復位。

下一步的準備:

1、下載匯編編譯器 ASM51 ,這里先以DOS下的ASM51為例,因為它編譯匯編

程序時不產生輔助代碼,所以較適合初學理解其產生的代碼。

2、準備一片AT89C2051或AT89C1051;一般電子商場即可購到,當然,如果有

舊片只要是好的也行。

3、準備一臺可以燒寫AT89C2051和 1051的編程器;

4、電腦一臺;噢對啦!你現在正使用的這臺就行。

第二步:軟件的編寫

現在,我們假設單片機可以聽懂我們的漢語,那么想讓LED1點亮,就說

“P1.0變低”;(單片機在上電初始后,其各端口輸出為高電平)LED1就點亮啦

!想讓LED1滅,LED2亮,就說“P1.0升高,P1.1變低”;LED1就熄滅LED2隨后既

點亮!

若用漢語編寫的流水燈程序應該是:

程序部分 ;解釋部分用“;”分號與程序部分隔開
開始: ;“開始:”為標號
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高
返回到開始 ;返回到“開始:”處繼續循環
結束 ;說明程序到此結束

這樣,LED1~LED8便會不停的流動點亮熄滅,從而產生流水效果。

然而單片機聽不懂漢語,只能接受二進制的“10......”代碼,但要用二進

制代碼編寫流水燈程序,其意思與上述的“漢語程序”基本相同,只是“漢語”

改為二進制代碼罷啦。

為了讓單片機工作,只能將程序寫為二進制代碼交給其執行;早期單片機開

發人員就是使用人工編寫的二進制代碼交給單片機去工作的。

今天,我們不必用煩人的二進制去編寫程序,完全可以將我們容易理解的“

程序語言”通過“翻譯”軟件“翻譯”成單片機所需的二進制代碼,然后交給單

片機去執行。這里的“程序語言”目前主要有匯編和C兩種;“翻譯”軟件有好多

種,一般依所使用的“程序語言”不同而不同,匯編語言用“宏匯編”,如上面

讓你下載的ASM51,C語言用FC或KC(以后會學到,現在你不必關心)。在這里我

們所說的“翻譯”軟件,行話叫編譯器,將“程序語言”通過編譯器產生單片機

的二進制代碼的過程叫編譯。

現在讓我們將上面的“漢語”語言程序改寫為匯編語言程序:

“漢語”語言 匯編語言
開始: 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
結束 end

這里用到了四條匯編指令:clr、 setb、 ljmp 、end;
clr 是將其后面指定的位清為0;
setb 是將其后面指定的位置成1;
ljmp 是無條件跳轉指令,意思是:跳轉到指定的標號處繼續運行。
end 是一條告訴編譯器:程序到此結束的偽指令。偽指令只告訴編譯器此程序

到此有何要求或條件,它不參與和影響程序的執行。

這里需要說明的是,按匯編語法要求,所編制的程序(下稱源程序)之格式和

書寫要求必須依下列原則:
1、源程序必須為純文本格式文件,如用Windows“附件”中的“記事本”編

寫的文本文件;
2、源程序的擴展名應是 *.ASM;
3、一行只能寫一條語句,以回車作為本句的結束,每一語句行長度應少于80

個字符(即40個漢字)。
4、每行的格式應為:

標號: 命令 參數 ;注釋
即一行由四部份組成,各部份的順序不能搞錯,依實際要求可以缺省其中的

一部份或幾部份,甚至全部省去,即空白行。需要使用標號時標號后面必須有“

:”(冒號),而命令語句和參數之間必須用空格分開,如果命令有多個參數,

則參數與參數之間必須用“,”(逗號)分開,需要注釋時注釋前必須用“;”

(分號),“;”后面的語句可以寫任何字符,包括漢字用于解釋前面的匯編語

句,它將不參與匯編,不生成代碼。由于匯編程序對我們還不直觀,所以在編寫

源程序時,應當養成多寫注釋的習慣,這樣有助于今后源程序的閱讀和維護。
標號是標志程序中某一行的符號名,編譯后標號的數值就是標號所在行代碼

的地址。在宏匯編ASM51中標號的長度不受限制,但標號中不能包含‘:’或其它

的一些特殊符號,也不能用漢字,可以用數字作標號,但必須用字母開頭。當標

號作參數用(如標號作轉移地址),在命令后面出現時,必須舍去‘:’(如上

面程序中的 LJMP STAR中的 STAR 是不能再有:)。
每行只能有一個標號,一個標號只能用在一處,如果有兩行用了同一個標號

,則匯編時就會出錯。由于標號的長度沒有限制,可以用有意義的英文或漢語拼

音來說明行,使源程序讀起來更方便。
源程序中的字母不區分大小寫,也就是說 star 和 STAR 是一樣的,請不要

用大小寫方式去區分不同的標號。

好拉!現在來看看前面我們編寫的源程序該怎樣處理,

為便于以后敘述,也便于你對源程序的學習與管理,請在C盤下建立一個McuCai目

錄,將下載的MASM51和你編寫的程序均放到這里。下面均認為你已建立了這個目

錄。

編寫源程序:先將上面的匯編源程序在Windows的記事本中依原樣輸入,之后

保存為 Test.asm。

由于ASM51為漢化版,需要中文環境,在進入DOS模式后請在命令行鍵入 pdos95

回車 既進入中文環境;要退出中文環境,只要在命令行鍵入 quit 即可。

編譯:在命令行鍵入: asm51 test.asm 回車
如果你編寫的源程序有錯誤,編譯時編譯器會提示你那一句錯啦;若想詳細查看

編譯結果,可用“記事本”打開編譯后產生的test.lst列表文件。我們最后需要

的便是編譯后產生的 test.hex 文件

燒寫:回到Windows;將編程器與電腦連接好并接通電源(這里以本站介紹的

AT51編程器為例),啟動編程器程序,在“器件”菜單中選擇“AT89C2051”;從

“文件”菜單中“打開HEX文件”打開C:\McuCai\Test.hex文件;在編程器上裝入

AT89C2051芯片,先擦除,后寫入。好拉,到此我們已將第一個流水燈程序編寫、

編譯、燒寫進行完啦,再下來就是將燒寫好的AT89C2051從編程器上取下,安裝到

前面制作的電路板中通電讓LED1~LED8“流水”。

說明:由于單片機的時鐘高達12MHz,8個LED發光與熄滅的時間很短,實際實

驗結果憑我們的眼是看不到“流水”效果的!哪怎樣才能讓我們肉眼看到“流水

”效果呢?請繼續學習下節課

第二節



 

單片機自學教材之用單片機做流水燈(二)

第二節

上一節的實驗最后沒有得到“流水”效果,主要是單片機執行每條指令的時間

很短,我們肉眼無法看到LED的熄滅與點亮;

單片機內部能按部就班的自動工作,正是在系統時鐘的作用下,內部各邏輯硬

件產生各種所需脈沖信號而實現的。這個時鐘信號(既晶體振蕩信號)的周期稱

“振蕩周期”。我們這個實驗中晶體使用的是12MHZ.

在單片機中,要處理最短周期的一條指令需要由12個振蕩周期(既晶振振蕩周

期)組成的,這個叫“機器周期”。

8051核的單片機,大多數指令只用一個機器周期(既單周期),也有雙周期和

四周期的指令。本實驗中用到的SETB P.x和CLR P.x均屬于單周期指令,也就是說

,執行一句 SETB P.x 用時僅1uS(微秒),CLR P.x 也是1uS;難怪我們前面的程

序不能看到流水效果。

現在,將程序改動一下,在每點亮一個LED后,讓程序干點別的事,也就是讓

它等一會再將該LED熄滅,繼續執行下面的程序:

star: ;程序開始
clr p1.0 ;LED1亮
acall delay ;調用延時子程序
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 ;返回到開始循環
delay: ;延時子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時子程序結束,返回到調用處的下一句
end

請將上面的程序保存為 Test.asm,進行編譯,并燒寫到AT89C2051中,之后

將2051安裝到實驗板中實驗,這回肯定“流水”啦!

回過頭,讓我們看看延時子程序是怎樣工作的:

單片機內部有不少寄存器,這些寄存器在單片機通電時,你可以給他寫入數據

(是單片機按你程序要求寫的數據,而不是編程器寫的),當第二次給他寫入新

數據時,前次的數據就被新數據覆蓋;當然也可以從寄存器中讀取數據。當單片

機沒有電源供給時,寄存器內部的數據也隨即消失;這些寄存器人們叫他RAM,而

用編程器將我們編寫的程序燒寫到單片機中的存儲器叫ROM;現在,我們應該清楚

:RAM是讓程序去使用的,ROM是我們編寫的程序存放的地方!

前面說過,單片機內部有不少RAM,本實驗用的AT89C2051有多少寄存器?我們

現在不必關心,現在只須知道單片機內部有名叫R0~R7 的這8個寄存器。這8個寄

存器每個都由8個單獨的位寄存器組成,最大存放數據為二進制的 1111 1111,十

六進制 = FF,十進制 = 255。在使用時注意不要大于其有效范圍。

上面延時程序中,先用到 mov r1,#50 ,mov是移動的意思,該句是將50這個十

進制數放到r1中;50是立即數,按匯編語言要求前面要加“#”號,匯編語言還規

定,十六進制數后面要加“ H”,十六進制數的高位是字母時在字母前面還要加

“0”,例如:#0F8H;二進制數后面加“B”,例如:#11110000B。十進制不加,

例如:#100 。延時程序的第二、三句為 mve r2,#100 ;mov r3,#100 ;這兩

句意思同前。

第四句中 djnz r3,$ 的意思是將 r3 里面的數減 1 后如果 r3 不等于 0 則跳

到后面指定的程序位置,這里的“$”既要跳轉的程序位置,“$”代表當前語句

處,也就是說,r3不等于 0,程序返回再次執行本句。如果r3 減 1 后等于 0,

程序結束本句,繼續執行下面的語句。

延時程序的最后一句是 ret ,意思是退出本子程序,返回到調用本子程序處的

下一句。

根據上面的解釋,一進入延時子程序首先為 r1, r2, r3 寄存器裝入我們需要

的數據,然后先對 r3 進行減數,每次減 1 ,r3 減完后減 r2 ,減 r2 時就費

事啦,因為 r2 每減 1 后不為 0 需要跳轉到 del1 標號處執行下面的語句,此

時 r3 再次裝入數據100,并且還要再次對 r3 進行減數......,r2 減完后減 r1

,減 r1的過程你研究研究看看。

每執行 djnz rn,rel (rn 指 r0~r7,rel 指轉移地址)指令一次,需要2個機

器周期,單片機需耗時2uS(指本實驗),若忽略裝數等語句,延時子程序從開始

到結束,單片機共耗時100*100*50*2nS,既1000000uS=1秒!若加上裝數等語句的

耗時,延時時間大于1秒。

到此,我們做的流水燈已成功,原理大致也明白啦,若你自認為這一課你完全

明白了,那請你將“流水燈”的流向改變一下,也可以改為兩邊向內流,內部向

外流......,我想你一定能用前面學到的方法實現這些功能。可能有些高手說,

前面的編程方法是最最笨的!,不錯!但玩單片機初期不必講究語言的簡練,只

要能完成預先要求就好,這是初學者要知道的。那么還有更好的編程思路嗎:有

!請繼續學習


單片機自學教材之用單片機做流水燈(三)

第三節

在上節課中讓 LED 流水是去逐個控制P1端口的每個位來實現的,那么我們在

程序一開始就給P1口送一個數,這個數本身就讓P1.0先低,其他位為高,然后讓

這個數據向高位移動不就實現“流水”效果啦?的確如此!

可惜,8051沒有讓P1數據移動的指令,但有對累加器ACC中數據左移或右移的指

令,ACC是8051單片機內部算術邏輯單元中的一個“寄存器”(這里叫他寄存器是

不正確的,但你可以先這樣理解,ACC在指令中常寫為A),他在數據傳輸和數據

處理過程中作用十分重要,ACC為8位。他可與片內所有單字節寄存器交換數據,

實際上P1和其他端口在單片機中也是一個寄存器。這樣我們可以將需移動的數據

先放到ACC中,讓其移動,然后將ACC移動后的數據再轉送到P1口,這樣同樣可以

實現“流水”效果。

程序如下:

star: ;開始
mov acc,#0feh ;ACC中先裝入LED1熄滅的數據(即二進制的 1111 1110)
mov p1,acc ;將ACC的數據送P1口
mov r0,#7 ;因上句送到 p1口的數據就熄滅了一位,
;所以將數據再移動7次就完成一個8位流水過程
loop: ;數據移動循環
rl a ;將ACC中的數據左移一位
mov p1,a ;把ACC移動過的數據送p1口顯示
acall delay ;調用延時
djnz r0,loop ;沒有移動夠7次繼續移動
ljmp star ;移動完7次后跳到開始重來,以達到循環流動效果
delay: ;延時子程序,就是上節課中的延時子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時子程序結束,返回到調用處的下一句
end ;本匯編程序到此結束

接下來,將上述程序編譯,并燒寫到前面我們的實驗芯片中,流水效果與第二

節課的一樣。

其實8051單片機有111條指令,這111條指令好比以前我們使用數字傳呼機時的

“短語代碼”一樣,可以用幾個“短語代碼”去表示一句完整、通順的語句段落

。有的指令常用,有的指令不常用,只要遵守語法規則,你可以用這些指令“組

合”成你想象到的任何程序。當然,有時一條指令可以替代很多條指令,這樣會

使程序簡捷,費碼減少,在編寫較大程序時可以讓程序存儲器放得下你需要的代

碼。這也是單片機高手所追求的。當然,在程序存儲器空間不成問題時,你不這

樣做但也可以達到預期的功能,這也不算錯。

單片機內部還有很多“部件”我們只是用到什么說什么,很不系統。但是我也

不想系統的介紹這些,因系統介紹單片機結構和指令的書很多,何況寫的遠比我

好,因此,希望你在看本講座的過程中,還要結合正規的教材學習其更多的指令

和“部件”。

可惜,8051沒有讓P1數據移動的指令,但有對累加器ACC中數據左移或右移的指令

,ACC是8051單片機內部算術邏輯單元中的一個“寄存器”(這里叫他寄存器是不

正確的,但你可以先這樣理解,ACC在指令中常寫為A),他在數據傳輸和數據處

理過程中作用十分重要,ACC為8位。他可與片內所有單字節寄存器交換數據,實

際上P1和其他端口在單片機中也是一個寄存器。這樣我們可以將需移動的數據先

放到ACC中,讓其移動,然后將ACC移動后的數據再轉送到P1口,這樣同樣可以實

現“流水”效果。

程序如下:

star: ;開始
mov acc,#0feh ;ACC中先裝入LED1熄滅的數據(即二進制的 1111 1110)
mov p1,acc ;將ACC的數據送P1口
mov r0,#7 ;因上句送到 p1口的數據就熄滅了一位,
;所以將數據再移動7次就完成一個8位流水過程
loop: ;數據移動循環
rl a ;將ACC中的數據左移一位
mov p1,a ;把ACC移動過的數據送p1口顯示
acall delay ;調用延時
djnz r0,loop ;沒有移動夠7次繼續移動
ljmp star ;移動完7次后跳到開始重來,以達到循環流動效果
delay: ;延時子程序,就是上節課中的延時子程序
mov r1,#50
del0:
mov r2,#100
del1:
mov r3,#100
djnz r3,$
djnz r2,del1
djnz r1,del0
ret ;延時子程序結束,返回到調用處的下一句
end ;本匯編程序到此結束

第六課 傳感器
傳感器是用于機器人對環境的感知就象人的眼睛有視覺、皮膚有知覺一樣,然后

把得到的信息轉變成電信號供處理系統分析處理。
傳感器種類很多,你可以根據需要選擇傳感器比如用在方向就用方向傳感器;用

在視覺就用視覺傳感器。這里只是說說實際選擇起來就不這么簡單了,要根據要

求、參數進行選擇.

工作忙也就是懶的代名詞,我這人就是這樣,先寫下這么多,好了下節課見.








第七課 驅動器
驅動器的種類很多,我只講兩種比較常用的驅動器。
1。減速電機(我們常在電動玩具中拆下的帶齒輪箱的小馬達,就是減速電機)
由拖動電動機與齒輪減速裝置耦合而成, 減速裝置的作用用一句話概括,就叫做


變速變扭,即增速減扭或減速增扭。為什么減速可以增扭,而增速又要減扭呢?


設電機輸出的功率不變,功率可以表示為 N = wT,其中w是轉動的角速度,T是扭


距。當N固定的時候,w與T是成反比的。所以增速必減扭,減速必增扭。
減速電機一般用做機器人的動力驅動,也就是機器人的腿.
2.伺服電機
微型的伺服電機在無線電業余愛好者的航模活動中使用已有很長一段歷史,而且


應用最為廣泛,國內亦稱之為“舵機”,含義為:“掌舵人操縱的機器”。可見


,微型伺服電機主要用作運動方向的控制部件。伺服電機本質上是可定位的電機


。當伺服電機接受到一個位置指令,它就會運動到指定的位置。因此,個人機器


人模型中也常用到它作為可控的運動關節,這些活動關節我們也常稱它為自由度





2.伺服電機的優點:
大扭力、控制簡單、裝配靈活、相對經濟,但它亦有著先天的不足:首先它是一


個精細的機械部件,超出它承受范圍的外力會導致其損壞,其次它內藏電子控制


線路,不正確的電子連接也會對它造成損毀,因此,很有必要在使用前先了解伺


服電機的工作原理,以免造成不必要的損失。
3.伺服電機內部結構:
一個伺服電機內部包括了一個直流電機;一組變速齒輪組;一個反饋可調電位器


;及一塊電子控制板。其中,高速轉動的直流電機提供了原始動力,帶動變速(


減速)齒輪組,使之產生高扭力的輸出,齒輪組的變速比愈大,伺服電機的輸出


扭力也愈大,也就是說越能承受更大的重量,但轉動的速度也愈低。


4.伺服電機的工作原理:
一伺服電機是一個典型閉環反饋系統,其原理可由下圖表示:


減速齒輪組由電機驅動,其終端(輸出端)帶動一個線性的比例電位器作位置檢


測,該電位器把轉角坐標轉換為一比例電壓反饋給控制線路板,控制線路板將其


與輸入的控制脈沖信號比較,產生糾正脈沖,并驅動電機正向或反向地轉動,使


齒輪組的輸出位置與期望值相符,令糾正脈沖趨于為0,從而達到使伺服電機精確


定位的目的。
5.伺服電機的控制:
標準的伺服電機有三條控制線,分別為:電源、地及控制。電源線與地線用于提


供內部的直流電機及控制線路所需的能源,電壓通常介于4V—6V之間,該電源應


盡可能與處理系統的電源隔離(因為伺服電機會產生噪音)。甚至小伺服電機在


重負載時也會拉低放大器的電壓,所以整個系統的電源供應的比例必須合理。輸


入一個周期性的正向脈沖信號,這個周期性脈沖信號的高電平時間通常在1ms—


2ms之間,而低電平時間應在5ms到20ms之間,并不很嚴格.


簡單的說伺服電機用在控制精度要求比較高的地方(比如機器人的手)。
_________________


第八課 用什么語言編程


很多人問我你用什么語言編程,告訴大家DEBUG、BASIC、ASM、C、C++、DELPHI
我都用,其實用什么語言并不重要,關鍵是你的思路和算法最重要,語言不過是一種表達方式。
機器人硬件一旦完成,要想使機器人按我們的意愿進行工作及機器人智能水平的高低都是在軟件中得到體現,所以說軟件編程是機器人最重要的一個環節.


不過這里還是要說一下,如果你是個入門者我推薦你從basic學起循序漸進。


好了,基礎課到這就告一段落,大家可能會說我講的不夠具體沒有深入細節,是的
一是我時間不太多;二是給入門者介紹下方向讓他們知道以后該專攻那些方面;三是我想通過后面的實例讓大家自己體會。


以上八課你沒看懂,不要緊看了就行,從下節開始課跟我一起做實驗,慢慢的你就都懂了。
_________________


第九課 機器DIY1
很多人想學習制作機器人,可是苦于機器人配件價格太高或者買的起但有條條框


框限制,個人發揮的空間不大。我同樣也遇到了這樣的問題,但是只要肯動腦就沒
有解決不了的問題,是的我解決了,大家只要準備好一臺586以上的電腦和買早餐


的錢就可以跟我學習制作機器人了,這是真的。
好了,開始了!
制作前先告訴大家一個秘訣:無論是用單片機還是用電腦控制機器人都是靠IO的


輸入輸出控制的。
好先去把要用的準備好:
1.電腦一臺
2.萬用表
3.電烙鐵
3.打印機并口線一條(電腦城有賣8元)
4.發光二極管4個(電子商店有賣0.5元/個)


首先把打印機并口線按圖重新焊接。


然后將并口線插在電腦打印機并口上,硬件的工做我們就完成了。
啟動電腦進入WIN98后,進入DOS窗口輸入DEBUG回車。
輸入:
-O 387,FF
你會發現4個發光二極管都亮了。
再輸入:
-O 387,0
你會發現4個發光二極管都滅了。


怎么樣神奇嗎?是的你已學會了機器人輸出的控制,當然這比較簡單,但以后我們
會逐步深入,最后完成一功能復雜的機器人.
_________________


第十課 機器DIY2
上課講了IO的輸出控制,大家一定會問怎么分別控制4個發光二極管的亮和滅?別急
這節課我就給大家講講怎么來做。
1。啟動電腦進入WIN98后,進入DOS窗口輸入DEBUG回車。
輸入:
-O 387,1
你會發現D1亮了。
再輸入:
-O 387,2
你會發現D2亮了。
再輸入:
-O 387,3
你會發現D3亮了。
再輸入:
-O 387,4
你會發現D4亮了。
通過上述方法,你可以任意安排LED的顯示方式。
以上只能手動控制LED的顯示方式,現在我教大家怎么通過BASIC編程來控制LED的


顯示。
請先下載basic編程軟件(189k):
http://wwwxuan.nease.net/diy/QBASIC.EXE
下載后運行QBASIC.EXE,進入界面按一下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是行號,CLS是清屏命令
OUT &h378, 1 ‘點亮d1
for a=1 to 100000:next a '延遲語句
end ‘結束命令
好了大家自己試一下吧,下節課我來教大家IO的輸入控制.
_________________


第十一課 機器DIY3
上兩課講的是輸出控制,這節課當然是講輸入控制。
1。在上次焊好的并口上在如下圖焊接好


圖中P為電池或引出的機內5V電源,R為限流電阻470歐姆至1K。
至此你已經擁有了一個機器人控制器的最小開發系統,我們可以在這個系統上開發


出一個強大的機器人。(怎么樣沒花多少錢吧!)
2。運行QBASIC.EXE,進入界面按一下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你就可以在屏幕上看到結果。
_________________


第十二課 機器DIY4
上課前再向大家聲明一下,此講座是我隨想隨寫可能有語法、掉字、錯字,
內容也不夠詳盡,不足之處望大家見諒。


上兩課分別講了輸入、輸出的控制,這課就給大家講講一個簡單的控制實例。


1。運行QBASIC.EXE,進入界面按一下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的變化。
是的,這個程序用LED代替了屏幕的顯示,也就是說你能通過輸入的變化來控制LED的亮和滅,當然也就可以控制別的什么(例:控制電機、舵機等),具體怎么做請聽下回分解。
_________________


第十三課 控制電機正反轉
控制電機正反轉是機器人制作中不可缺少的一項,今天我來制作一個電機正反轉


電路.
以下是需要的材料:
1.玩具電機一只(電動玩具中都有)
2。5v繼電器2個(電子商店有賣2元/個)
3。4N25光隔2個(電子商店有賣5元/個)
4。四節1.5V電池(0.5元/個)
先來做個電機正反轉的實驗。
電機尾部有兩條引線分別把線接在電池正負極上,電機轉了注意一下它的旋轉方向


,然后再把電池極性換一下觀察電機的旋轉方向,電機反方向旋轉了。
控制電機正反轉的秘訣就是:電源互換極性.
明白了以上的道理,下面我們來按圖把電路焊好。


運行QBASIC.EXE,進入界面按一下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你就可以控制電機正反轉了。
下節課在此基礎上教大家做個自動避障小車.
_________________


第十四課 自動避障小車
課上到這,大家是不是覺得越來越有意思了,如果我講的好大家就頂一下,不然我


就沒有繼續寫的動力了。
上節課我們只講了控制一只電機還有D3、D4沒有用上,是的我是有意留給大家自


己去做,你再焊一塊同樣的板子接到D3、D4就可以了。
把K1、K2換成觸碰開關,一個自動避障小車就有了。
下面我們來看小車工作的程序.
運行QBASIC.EXE,進入界面按一下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鍵小車就跑起來了。
程序說明:
1。K1、K2同時打開左右電機一起旋轉。
2。K1打開左轉右停.
3.K2打開右轉左停.
我就教這么多剩下的就靠你自己去發揮了。
_________________
由簡單到復雜
由有線到無線
由分散到集中

共同努力 成就未來


回復

使用道具 舉報

ID:143570 發表于 2018-8-8 21:37 | 顯示全部樓層
學習了,謝謝
回復

使用道具 舉報

ID:510402 發表于 2019-5-15 15:11 | 顯示全部樓層
厲害了,我的哥
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看成人 | 欧美一区二区三区视频 | 欧美在线观看免费观看视频 | 成人性视频在线播放 | 91精品国产综合久久婷婷香蕉 | 久久夜色精品国产 | 日韩av成人在线 | 色综合久久久 | 久久久久久国产精品 | 久久精品亚洲精品国产欧美 | 日日操天天射 | 成人做爰69片免费观看 | 亚洲一区在线日韩在线深爱 | 国产乱肥老妇国产一区二 | av影音在线 | 一级免费a | 亚洲日本成人 | 黄色日本视频 | 91av免费版 | 在线中文字幕亚洲 | 日韩高清中文字幕 | 亚洲成人自拍网 | 亚洲麻豆 | 国产一区视频在线 | 免费黄色网址视频 | 精品一区二区三区在线观看国产 | 毛片黄片免费看 | 麻豆成人在线视频 | 国产免费人成xvideos视频 | 青青久草| 噜噜噜噜狠狠狠7777视频 | 精品国产一区一区二区三亚瑟 | 久久国产精品99久久久久久丝袜 | 欧美一级片免费看 | 伊人伊成久久人综合网站 | 欧美精品一区二区三区在线播放 | 中文字幕不卡视频在线观看 | 午夜免费观看体验区 | 小早川怜子xxxxaⅴ在线 | 国产精品日产欧美久久久久 | 日韩欧美国产电影 |