智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計_第1頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計_第2頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計_第3頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計_第4頁
智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一章 智能尋跡避障小車電機(jī)控制系統(tǒng)設(shè)計1任務(wù) 任務(wù)一:產(chǎn)生智能尋跡避障小車電機(jī)的基本控制信號;任務(wù)二:編制智能尋跡避障小車基本巡航動作的控制函數(shù);2要求(1)能控制智能尋跡避障小車電機(jī)的旋轉(zhuǎn)方向和速度;(2)能控制智能尋跡避障小車實現(xiàn)基本巡航動作;1.1 項目描述本項目的主要內(nèi)容是:對C51單片機(jī)編程,使之產(chǎn)生控制電機(jī)旋轉(zhuǎn)方向和轉(zhuǎn)速的各種基本控制信號,然后在此基礎(chǔ)上編制出能夠控制智能尋跡避障小車實現(xiàn)前進(jìn)、后退、左轉(zhuǎn)彎、右轉(zhuǎn)彎等基本巡航動作的控制函數(shù)??刂齐姍C(jī)旋轉(zhuǎn)是智能尋跡避障小車實現(xiàn)各種導(dǎo)航控制的重要基礎(chǔ),在本書后續(xù)項目模塊中都要用到對電機(jī)的控制,因此本章所設(shè)計出的電機(jī)控制函數(shù)將作為功能模塊

2、被后續(xù)設(shè)計案例直接調(diào)用;通過該項目的學(xué)習(xí)與實踐,可以讓讀者獲得如下知識和技能: 掌握單片機(jī)I/O端口的基本應(yīng)用方法; 學(xué)會單片機(jī)C語言的基本編程方法; 掌握直流伺服電機(jī)的基本工作原理和控制方法; 掌握直流減速電機(jī)的基本工作原理和控制方法; 掌握H電橋驅(qū)動直流電機(jī)的工作原理與控制方法,即直流電機(jī)驅(qū)動芯片L293工作原理; 能夠編制控制輪式教育機(jī)器人實現(xiàn)基本巡航動作的控制函數(shù);1.2 必備知識 1.2.1伺服電機(jī)伺服:一詞源于希臘語“奴隸”的意思。人們想把“伺服機(jī)構(gòu)”當(dāng)個得心應(yīng)手的馴服工具,服從控制信號的要求而動作。在信號來到之前,轉(zhuǎn)子靜止不動;信號來到之后,轉(zhuǎn)子立即轉(zhuǎn)動;當(dāng)信號消失,轉(zhuǎn)子能即時自

3、行停轉(zhuǎn)。由于它的“伺服”性能,因此而得名。標(biāo)準(zhǔn)的伺服電機(jī)有三條控制線,分別為:電源、地線及控制線。電源線與地線用于提供內(nèi)部的電機(jī)及控制線路所需的能源,控制信號要求是一個周期性的正向脈沖信號,這個周期性脈沖信號的高電平時間通常在1ms2ms之間,而低電平時間應(yīng)在5ms到20ms之間。本書向讀者介紹的伺服電機(jī)是PARALLAX公司生產(chǎn)的連續(xù)旋轉(zhuǎn)伺服電機(jī),它的控制信號時序是:低電平時間固定為20ms,高電平為1.3ms1.7ms之間。圖1.1為PARALLAX公司生產(chǎn)的直流伺服電機(jī)外形圖。 圖1.1 直流伺服電機(jī)外形圖1.2.2 直流電機(jī) 方案二中采用的是直流減速電機(jī),在此只介紹該電機(jī)的控制方法,對

4、于其內(nèi)部結(jié)構(gòu)不作介紹。該電機(jī)外形示意圖如圖1.2所示,它有紅、黑兩根控制線,電機(jī)狀態(tài)控制電平如表1-1所示。 表1-1 電機(jī)控制電平與狀態(tài)對應(yīng)表紅線控制端黑線控制端電機(jī)狀態(tài) 0 1 順轉(zhuǎn) 1 0 逆轉(zhuǎn) 1 1 停轉(zhuǎn)直流電機(jī)的控制信號由單片機(jī)輸出送至電機(jī)驅(qū)動芯片L293后,經(jīng)L293內(nèi)部H電橋電路驅(qū)動電機(jī)運(yùn)轉(zhuǎn)。 圖1.2 直流電機(jī)外形圖1.2.3 直流電機(jī)H橋驅(qū)動電路工作原理 本設(shè)計中直流電機(jī)H橋驅(qū)動電路由驅(qū)動芯片L293D完成,在L293D內(nèi)部形成一個H橋型的驅(qū)動驅(qū)動電路,類似如圖1.3所示。圖中用開關(guān)模擬電機(jī)信號通斷,在實際的控制中是采用晶體三極管來完成此功能,可參見圖1.4所示的電機(jī)控制示

5、意圖。此處只是為簡述控制原理,所以用開關(guān)模擬電機(jī)工作過程。 圖1.3 H橋驅(qū)動直流電機(jī)電路 從圖中可以看出,其形狀類似于字母“H”,而作為負(fù)載的直流電機(jī)是像“橋”一樣架在上面的,所以稱之為“ H 橋驅(qū)動”。4個開關(guān)所在位置就稱為“橋臂”。從電路中不難看出,假設(shè)開關(guān)A、D接通,電機(jī)為正向轉(zhuǎn)動,則開關(guān)B、C接通時,直流電機(jī)將反向轉(zhuǎn)動。從而實現(xiàn)了電機(jī)的正反向驅(qū)動。借助這4個開關(guān)還可以產(chǎn)生電機(jī)的另外2個工作狀態(tài):(1) 剎車 將B 、D開關(guān)(或A、C)接通,則電機(jī)慣性轉(zhuǎn)動產(chǎn)生的電勢將被短路,形成阻礙運(yùn)動的反電勢,形成“剎車”作用。(2) 惰行 4個開關(guān)全部斷開,則電機(jī)慣性所產(chǎn)生的電勢將無法形成電路,從

6、而也就不會產(chǎn)生阻礙運(yùn)動的反電勢,電機(jī)將慣性轉(zhuǎn)動較長時間。 圖1.4 電機(jī)控制示意圖電路 1.2.4 延時函數(shù)在實際的單片機(jī)應(yīng)用系統(tǒng)開發(fā)過程中,由于程序功能的需要,經(jīng)常編寫各種延時程序,延時時間從數(shù)微秒到數(shù)秒不等。實現(xiàn)延時通常有兩種方法:一種是硬件延時,要用到單片機(jī)的定時器/計數(shù)器,這種方法可以提高CPU的工作效率,同時也能做到精確延時;另一種是軟件延時,這種方法主要采用循環(huán)體進(jìn)行,本項目開發(fā)過程中采用的是軟件延時的方法,在后續(xù)各項目模塊中經(jīng)常作為延時功能調(diào)用的幾個延時函數(shù)原形如下:void delay_nµs(uint i) /延時微秒級函數(shù) i=i/10; while(-i); v

7、oid delay_nms(uint n) /延時毫秒級函數(shù) n=n+1; while(-n) delay_nµs(900); void delayms(uint x)/延時函數(shù) 12兆晶振 1000為一秒; 11.0592兆晶振 922為一秒 (會有一定誤差)uchar i;while(x-)for(i=0;i<123;i+);上述函數(shù)設(shè)計的基本原理是通過執(zhí)行循環(huán)體來消耗時間從而達(dá)到延時的目的,其中delay_nms( )是毫秒級的延時,而delay_nµs( )是微秒級的延時。例如:如果你想延時1毫秒,可以使用語句delay_nms(1); 延時100微秒則可使用

8、語句delay_nµs(100) ;來完成。注意:上述延時函數(shù)是在外部晶振為12MHZ的情況下設(shè)計的,如果外部晶振頻率不是12MHz,調(diào)用這兩個函數(shù)所產(chǎn)生的真正延時就會發(fā)生變化。對于許多C51開發(fā)者特別是初學(xué)者編制非常精確的延時函數(shù)有一定難度,關(guān)于延時函數(shù)的編程經(jīng)驗和技巧此處不作詳細(xì)介紹,讀者目前只要會將這兩個函數(shù)作為功能模塊調(diào)用就行了1.3 案例設(shè)計 1.3.1 系統(tǒng)設(shè)計方案本項目向讀者詳細(xì)介紹了兩種實現(xiàn)方案,其中學(xué)員實操采用方案二進(jìn)行。同時該項目設(shè)計為本書后續(xù)設(shè)計案例的基礎(chǔ)控制模塊,后續(xù)的尋跡、避障等功能模塊實在該項目上擴(kuò)展實現(xiàn)的。方案一:該設(shè)計方案采用CPU對執(zhí)行機(jī)構(gòu)輸出控制,

9、不涉及到對外部數(shù)據(jù)信息的采集,因此,系統(tǒng)采用“CPU+執(zhí)行機(jī)構(gòu)”的總體設(shè)計方案,其中CPU采用目前性價比較高的STC89C52單片機(jī),并以此為核心構(gòu)建最小控制系統(tǒng),執(zhí)行機(jī)構(gòu)的動力裝置采用PARALLAX公司生產(chǎn)的連續(xù)旋轉(zhuǎn)伺服電機(jī),其優(yōu)點(diǎn)是編程控制方便且不需額外增加驅(qū)動電路,系統(tǒng)總體框圖如圖1.5所示。 圖1.5 方案一系統(tǒng)框圖方案二:采用“單片機(jī)最小系統(tǒng)+電機(jī)驅(qū)動芯片+直流電機(jī)”的設(shè)計方案,設(shè)計方案中的電機(jī)采用直流減速電機(jī),該電機(jī)具有控制原理簡單、性價比高,易于控制等特點(diǎn),被廣泛應(yīng)用于各種智能玩具小車設(shè)計之中;電機(jī)驅(qū)動采用集成芯片L293完成,該芯片運(yùn)用H電橋驅(qū)動直流電機(jī)的控制原理實現(xiàn)對直流電

10、機(jī)旋轉(zhuǎn)方向和速度的控制。系統(tǒng)總體框圖如圖1.6所示。 圖1.6 方案二統(tǒng)框圖1.3.2 硬件電路設(shè)計方案一:該設(shè)計方案的硬件電路如圖1.7所示:它是在單片機(jī)最小系統(tǒng)的基礎(chǔ)上直接?礎(chǔ)_0ol_1連接伺服電機(jī)構(gòu)成的,其中左電機(jī)的控制信號由P1_0提供,右電機(jī)的控制信號由P1_1提供,直接對該兩個端口編程,便可實現(xiàn)對伺服電機(jī)旋轉(zhuǎn)方向和速度控制。圖1.7 方案一系統(tǒng)原理圖方案二:該設(shè)計方案的硬件電路如圖1.8所示:電機(jī)控制信號由單片機(jī)的P0.0P0.3輸出送到電機(jī)驅(qū)動芯片的2腳與7腳以及10腳與15腳,再從芯片的3腳與6腳(左電機(jī)控制)以及11腳與14腳(右電機(jī)控制)輸出驅(qū)動電機(jī)工作。圖1.8 方案二

11、系統(tǒng)原理圖1.3.3 系統(tǒng)軟件設(shè)計任務(wù)一:產(chǎn)生智能尋跡避障小車電機(jī)的基本控制信號 方案一:本任務(wù)是對單片機(jī)編程,在指定的單片機(jī)引腳P1_0輸出伺服電機(jī)的各種控制信號。1、源程序sfr P1 = 0x90; /P1口C51定義;sbit P1_0 = P10; /特殊功能位定義#define uint unsigned intvoid delay_nµs(uint i) /延時nµs函數(shù) i=i/10; while(-i); void delay_nms(uint n) /延時nms函數(shù) n=n+1; while(-n) delay_nµs(900); int ma

12、in(void) /主函數(shù)while(1)P1_0=1; /P1_0輸出高電平delay_nµs(1500); /延時1。5msP1_0=0; /P1_0輸出低電平 delay_nms(20); /延時20ms2、程序運(yùn)行及調(diào)試在智能尋跡避障小車控制板上按圖1.7連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒寫到控制板上的單片機(jī)程序存儲器,具體操作步驟如下:步驟1:啟動Keil uVision4 IDE,完成對上面程序的編輯,編譯和調(diào)試,產(chǎn)生可執(zhí)行的HEX文件。步驟2:將ISP下載線一端連接到PC機(jī)的并行接口上,另一端(小端)連接到智能尋跡避障小車的程序下載口上。打開ISP

13、下載軟件將步驟1獲得的HEX文件下載到智能尋跡避障小車的單片機(jī)內(nèi)部程序存儲器,開啟電源,運(yùn)行程序,用示波器測量P1_0引腳,可測出使伺服電機(jī)轉(zhuǎn)速為零的控制信號,其波形如圖1.9所示。圖1.9 使伺服電機(jī)轉(zhuǎn)速為零的控制信號4理信號sf,而時序圖將程序中的delay_nµs(1500)改成delay_nµs(1300),即延時1.3ms,再重復(fù)以上步驟,可用示波器測得使伺服電機(jī)使電機(jī)順時針全速旋轉(zhuǎn)的控制信號,其波形如圖1.10所示。圖1.10 使電機(jī)順時針全速旋轉(zhuǎn)的控制脈沖序列將程序中的delay_nµs(1500)改成delay_nµs(1700),即延時

14、1.7ms,再重復(fù)以上步驟,可用示波器測得使伺服電機(jī)逆時針全速旋轉(zhuǎn)的控制信號,其波形如圖1.11所示。圖1.11 使伺服電機(jī)逆時針全速旋轉(zhuǎn)的脈沖序列在1.3ms1.5ms1.7ms時間范圍內(nèi)改變延時函數(shù)的延時量,可獲得控制伺服電機(jī)不同旋轉(zhuǎn)方向和轉(zhuǎn)速的各種波形。步驟3:對伺服電機(jī)進(jìn)行零點(diǎn)標(biāo)定所謂伺服電機(jī)零點(diǎn)標(biāo)定是指當(dāng)發(fā)送一個使伺服電機(jī)轉(zhuǎn)速為零的控制信號給伺服電機(jī)時,讓電機(jī)保持靜止不動的過程,伺服電機(jī)在出廠時沒有預(yù)先標(biāo)定,因此需要調(diào)整。具體做法是:將步驟2產(chǎn)生的使電機(jī)轉(zhuǎn)速為零的控制程序加載到單片機(jī)程序存儲器,開機(jī)運(yùn)行,若電機(jī)有旋轉(zhuǎn),說明未標(biāo)定,用螺絲刀調(diào)整伺服電機(jī)上的電位器,同時觀察電機(jī)的旋轉(zhuǎn)情況

15、,直到電機(jī)停止轉(zhuǎn)動,表明已經(jīng)標(biāo)定。電機(jī)標(biāo)定后,用步驟2產(chǎn)生的各種控制信號測試電機(jī)的旋轉(zhuǎn)方向和速度,觀察電機(jī)的運(yùn)行情況,可以實現(xiàn)對電機(jī)的不同旋轉(zhuǎn)方向和速度的控制。3、程序設(shè)計思路基本思路是:根據(jù)伺服電機(jī)的控制信號的時序要求,調(diào)用延時函數(shù)控制單片機(jī)引腳高低電平的持續(xù)時間,并用循環(huán)執(zhí)行的方式使單片機(jī)引腳不斷的輸出伺服電機(jī)控制信號。產(chǎn)生伺服電機(jī)基本控制信號的程序流程圖1.12所示:圖1.12 主函數(shù)流程圖即利用延時函數(shù)將指定的引腳的低電平持續(xù)時間固定為20ms,而高電平持續(xù)時間根據(jù)需要在“1.3ms1.5ms1.7ms”時間范圍內(nèi)改變,然后循環(huán)執(zhí)行,就可獲得能夠控制伺服電機(jī)不同旋轉(zhuǎn)方向和轉(zhuǎn)速的各種控制

16、脈沖信號。方案二:對單片機(jī)P0.0、P0.1(左電機(jī))和P0.2、P0.3(右電機(jī))編程,程序設(shè)計以左電機(jī)為例。1、源程序#include<at89x52.h>#define uint unsigned int#define uchar unsigned charsbit zuo1=P01; /左電機(jī)端口定義sbit zuo2=P00;sbit you1=P03; /右電機(jī)端口定義sbit you2=P02;void delay(uint x) uchar i;while(x-)for(i=0;i<123;i+);void qian()zuo1=0;zuo2=1;/左邊往前y

17、ou1=0;you2=1;/右邊往前main()while(1)qian();delay(922*5);2、程序運(yùn)行及調(diào)試在智能尋跡避障小車控制板上按圖1.8連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒寫到控制板上的單片機(jī)程序存儲器,具體操作步驟如下:步驟1:啟動Keil uVision4 IDE,完成對上面程序的編輯,編譯和調(diào)試,產(chǎn)生可執(zhí)行的HEX文件。步驟2:將STC下載線一端連接到PC機(jī)的并行接口上,另一端(小端)連接到智能尋跡避障小車的程序下載口上。打開STC下載軟件將步驟1獲得的HEX文件下載到智能尋跡避障小車的單片機(jī)內(nèi)部程序存儲器,開啟電源,運(yùn)行程序,此時左右電機(jī)順時針

18、旋轉(zhuǎn),小車前進(jìn)。將上述程序中的前進(jìn)函數(shù)中的左右端口控制電平按表1-1所示的修改,編輯、編譯后便可以得到電機(jī)逆轉(zhuǎn)(后退)、停轉(zhuǎn)(原地不動)的控制函數(shù)。任務(wù)二:編制智能尋跡避障小車基本巡航動作的控制函數(shù)方案一:本任務(wù)是在伺服電機(jī)基本控制信號的基礎(chǔ)上設(shè)計出智能尋跡避障小車的基本巡航動作的控制函數(shù),并按一定的算法調(diào)用這些控制函數(shù),使智能尋跡避障小車完成比較復(fù)雜的運(yùn)動。1、源程序 *=程序名:Control.c功 能:控制輪式教育機(jī)器人實現(xiàn)前后左右運(yùn)動的基本動作=*/#include <REGX52.H>#define uint unsigned int#define uchar unsig

19、ned charvoid delay_nµs(uint i); /函數(shù)聲明void delay_nms(uint n);void Forward(void);void Left_Turn(void);void Right_Turn(void) ;void Backward(void) ;uchar Navigation10='F','L','F','F','R','B','L','B','B','Q'main(void)/主函

20、數(shù)int addr=0;while(Navigationaddr!='Q') switch(Navigationaddr)case 'F':Forward();break;case 'L':Left_Turn();break;case 'R':Right_Turn();break;case 'B':Backward();break;addr+; void delay_nµs(uint i) /延時nµs i=i/10; while(-i); void delay_nms(uint n) /延時n

21、 ms n=n+1; while(-n) delay_nµs(900); void Forward(void)/前進(jìn)子函數(shù) uchar i; for(i=1;i<=65;i+)P1_1=1;delay_nµs(1700); P1_1=0;P1_0=1;delay_nµs(1300);P1_0=0;delay_nms(20);void Left_Turn(void)/左轉(zhuǎn)彎子函數(shù) uchar i; for(i=1;i<=26;i+)P1_1=1;delay_nµs(1300); P1_1=0;P1_0=1;delay_nµs(1300

22、);P1_0=0;delay_nms(20);void Right_Turn(void) /右轉(zhuǎn)彎子函數(shù) uchar i; for(i=1;i<=26;i+)P1_1=1;delay_nµs(1700); P1_1=0;P1_0=1;delay_nµs(1700);P1_0=0;delay_nms(20);void Backward(void) /后退子函數(shù) uchar i; for(i=1;i<=65;i+)P1_1=1;delay_nµs(1300); P1_1=0;P1_0=1;delay_nµs(1700);P1_0=0;delay_

23、nms(20);2、運(yùn)行程序這里仍然按圖1.7連接伺服電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒寫到智能尋跡避障小車控制板上的單片機(jī)程序存儲器,開機(jī)運(yùn)行,可以看到小車能按如下規(guī)律運(yùn)動,即:前進(jìn)左轉(zhuǎn)彎前進(jìn)前進(jìn)右轉(zhuǎn)彎后退左轉(zhuǎn)彎后退后退停止,仔細(xì)觀察可以發(fā)現(xiàn),它的運(yùn)動軌跡接近一個矩形。3、程序設(shè)計思路主函數(shù)按數(shù)組設(shè)定的次序依次調(diào)用前進(jìn),左轉(zhuǎn)彎、右轉(zhuǎn)彎和后退等四個基本控制函數(shù),這四個函數(shù)是在任務(wù)一介紹過的伺服電機(jī)基本控制信號的基礎(chǔ)上設(shè)計的,下面我們重點(diǎn)以“前進(jìn)子函數(shù)”為例介紹其基本設(shè)計思路,為了便于分析,這里再把程序中的“前進(jìn)子函數(shù)”單獨(dú)列出如下:void Forward(void)/前進(jìn)子函數(shù)

24、 uchar i; for(i=1;i<=65;i+)P1_1=1;delay_nµs(1700); P1_1=0;P1_0=1;delay_nµs(1300);P1_0=0;delay_nms(20);仔細(xì)分析以上程序,根據(jù)P1_0和P1_1引腳的高低電平持續(xù)時間,可以畫出讓輪式教育機(jī)器人前進(jìn)的左右電機(jī)控制脈沖時序圖,如下: 圖1.13 前進(jìn)控制信號時序圖對照任務(wù)一中介紹過的伺服電機(jī)正轉(zhuǎn)、反轉(zhuǎn)控制信號,我們發(fā)現(xiàn),以上控制小車前進(jìn)的脈沖信號有兩個問題需要進(jìn)一步解釋。第一:因為伺服電機(jī)安裝在車架上的朝向剛好相反,其中一個電機(jī)如果原來是正轉(zhuǎn),那么掉轉(zhuǎn)朝向之后就變成了反轉(zhuǎn),

25、所以要使兩個電機(jī)帶動兩個輪子朝一致的方向轉(zhuǎn)動,就必須讓兩個伺服電機(jī)的旋轉(zhuǎn)方向為一正一反。第二:因為受到單片機(jī)的編程限制,兩個電機(jī)的控制脈沖并沒有在時間上保持絕對的同步(如圖1.13所示),這樣看起來似乎一個電機(jī)要先動作,而另一個電機(jī)稍微有點(diǎn)滯后,并且由此引起的低電平持續(xù)時間也不再是前面介紹的20ms。不過這點(diǎn)小誤差在程序?qū)嶋H運(yùn)行中的影響可以被忽略。圖1.13只給出了控制小車前進(jìn)的一個控制脈沖,為驅(qū)使小車向前行進(jìn)一段距離,程序中用for循環(huán)語句產(chǎn)生65個這樣的脈沖序列,在具體應(yīng)用中,可以根據(jù)實際需要改變循環(huán)次數(shù),以達(dá)到改變小車行進(jìn)距離的目的。用同樣的思路,讀者不難分析本案例中的左轉(zhuǎn)彎、右轉(zhuǎn)彎和后

26、退等基本動作控制函數(shù)。方案二:本任務(wù)是在直流減速電機(jī)基本控制信號的基礎(chǔ)上設(shè)計出智能尋跡避障小車的基本巡航動作的控制函數(shù),主要完成智能尋跡避障小車前進(jìn)、后退、停止等基本巡航動作。 #include<at89x52.h>#define uint unsigned int#define uchar unsigned charsbit zuo1=P01;sbit zuo2=P00;sbit you1=P03;sbit you2=P02;void delay(uint x)uchar i;while(x-)for(i=0;i<123;i+);void qian()zuo1=0;zuo2

27、=1;/左邊往前you1=0;you2=1;/右邊往前void hou()zuo1=1;zuo2=0;/左邊往后you1=1;you2=0;/右邊往后void zuo()zuo1=1;zuo2=0;/左邊往后you1=0;you2=1;/右邊往前void you()zuo1=0;zuo2=1;/左邊往前you1=1;you2=0;/右邊往后void ting()zuo1=1;zuo2=1;you1=1;you2=1;main()while(1)qian();delay(922*5);hou();delay(922*4);ting();delay(922*3);2、運(yùn)行程序這里仍然按圖1.8連接

28、直流減速電機(jī)控制電路,編譯以上程序,將產(chǎn)生的可執(zhí)行文件燒寫到智能尋跡避障小車控制板上的單片機(jī)程序存儲器,開機(jī)運(yùn)行,可以看到小車能按如下規(guī)律運(yùn)動,即:前進(jìn)5秒后退4秒停止3秒;如此周而復(fù)始循環(huán)。3、程序設(shè)計思路主函數(shù)按事先設(shè)定的次序依次調(diào)用前進(jìn),延時、后退,延時、停止,延時函數(shù);讓智能尋跡避障小車完成規(guī)定動作。即主要測試電機(jī)的前進(jìn)、后退、停止功能是否控制正常,讀者可以將左轉(zhuǎn)彎、右轉(zhuǎn)彎函數(shù)加入主函數(shù)中加以調(diào)用,看功能是否實現(xiàn)。1.4 相關(guān)知識通過上述設(shè)計案例的學(xué)習(xí)和實踐,在對單片機(jī)輸出接口的應(yīng)用有了直觀認(rèn)識之后,我們下面再來詳細(xì)學(xué)習(xí)有關(guān)單片輸入/輸出口機(jī)(I/O口)的基本結(jié)構(gòu)及原理,以及特殊功能寄

29、存器(sfr)的Cx51定義方法。1.4.1 89C51并行IO 口的內(nèi)部結(jié)構(gòu)及原理89C51單片機(jī)總共有4個8位的并行IO接口,分別是P0,P1,P2和P3(本案例用到P1口),共32根I/O口線,實際上4個并行I/O口就是特殊功能寄存器SFR之中的4個,每個I/O口主要由4部分構(gòu)成:端口鎖存器、輸入緩沖器、輸出驅(qū)動器和端口引腳,下面分別介紹其內(nèi)部結(jié)構(gòu)及原理: (a)P0口的位結(jié)構(gòu) (b)P1口的位結(jié)構(gòu) (c)P2口的位結(jié)構(gòu) (d)P3口的位結(jié)構(gòu)圖1.14 89C51 各I/O口的位結(jié)構(gòu)1、P0口:圖1.14中的(a)是P0口中一位結(jié)構(gòu)圖。其中包含一個輸出鎖存器、兩個三態(tài)緩沖器、一

30、個輸出驅(qū)動電路和一個輸出控制電路。輸出驅(qū)動電路由兩個場效應(yīng)管T1和T2組成,其工作狀態(tài)受輸出控制電路的控制??刂齐娐钒ㄒ粋€與門、一個反相器和模擬轉(zhuǎn)換開關(guān)MUX。模擬開關(guān)的位置由來自CPU的控制信號決定,當(dāng)控制信號為低電平時,它把輸出級與鎖存器的Q端接通。同時,因為與門輸出為低電平,輸出級中的場效應(yīng)管T1處于截止?fàn)顟B(tài),因此是輸出級是漏級開路的開漏電路。這種情況P0口可用做一般的I/O線。其輸出和輸入操作如下:當(dāng)CPU向端口輸出數(shù)據(jù)時,寫脈沖加在觸發(fā)器的時鐘端CL上,此時與內(nèi)部總線相連的D端的數(shù)據(jù)經(jīng)反向后出現(xiàn)在Q端上,再經(jīng)T2管反相,于是在P0口這一位引腳上出現(xiàn)的數(shù)據(jù)正好是內(nèi)部總線上的數(shù)據(jù)(當(dāng)P

31、0口作輸出口使用時,輸出級屬開漏電路,在驅(qū)動NMOS電路時應(yīng)外接上拉電阻)。當(dāng)輸入操作時,端口中的兩個三態(tài)緩沖器用于讀操作。圖中下面一個緩沖器用于讀端口引腳數(shù)據(jù)。當(dāng)執(zhí)行一般的端口輸入指令時,讀引腳脈沖把三態(tài)緩沖器打開,于是端口上的數(shù)據(jù)將經(jīng)過緩沖器輸送到內(nèi)部總線;上面一個緩沖器讀取鎖存器中Q端的數(shù)據(jù)。Q端的數(shù)據(jù)實際上與引腳的數(shù)據(jù)是一致的,結(jié)構(gòu)上的這種安排是為了適應(yīng)所謂“讀修改寫”這類指令的需要。這類指令的特點(diǎn)是:先讀端口,隨之可以對讀入的數(shù)據(jù)進(jìn)行修改,然后再寫到端口上。例如,邏輯與指令(ANL P0,A),此指令的功能是先把P0口的數(shù)據(jù)讀入CPU,隨后同累加器A中的數(shù)據(jù)按位進(jìn)行邏輯與操作(即對讀

32、入的數(shù)據(jù)作修改)最后把結(jié)果寫回P0口。對于“讀修改寫”這類指令,不直接讀引腳上的數(shù)據(jù)而讀鎖存器Q端上的數(shù)據(jù)是為了避免可能錯讀引腳上的電平信號。例如,用一條口線去驅(qū)動一個晶體管的基極,當(dāng)向此口線寫1時,晶體管導(dǎo)通并把引腳上的電平拉低。這時,若從引腳上讀取數(shù)據(jù),就把該數(shù)據(jù)錯讀為0(實際上應(yīng)是1),而從鎖存器Q端讀入,則得到正確的結(jié)果。由圖1.14(a)可知,當(dāng)讀引腳操作(輸入)時,引腳上的外部信號既加在三態(tài)緩沖器2的輸入端上,又加在輸出級場效應(yīng)管(T2)的漏級上,若此時T2是導(dǎo)通的(例如曾輸出過數(shù)據(jù)0),則引腳上的電位被鉗在0電平上。為使引腳上輸入的邏輯電平能正確地讀入,在輸出數(shù)據(jù)時,要先向鎖存器

33、寫1,使其Q端為0,使輸出級T1和T2兩個管子均被截止,引腳處于懸浮狀態(tài),作高阻抗輸入。因此,作為一般的I/O口使用時,P0口也是一個準(zhǔn)雙向口。當(dāng)P0口作為地址/數(shù)據(jù)總線分時使用時,這時控制信號為高電平,轉(zhuǎn)換開關(guān)MUX把反相器輸出端與T2接通,同時把與門開鎖。輸出的地址或數(shù)據(jù)信號通過與門驅(qū)動T1管,同時通過反相器驅(qū)動T2管,完成信息傳送。2、P1口:P1口是一個準(zhǔn)雙向口,作通用的I/O口使用。其結(jié)構(gòu)如圖1.14(b)所示,在輸出驅(qū)動部分接有內(nèi)部提升電阻。當(dāng)用做輸出線時,將1寫入鎖存器,使輸出驅(qū)動器T管截止,輸出線由內(nèi)部提升電阻拉成高電平(輸出1);將0寫入鎖存器時,T導(dǎo)通,輸出0。P1口作為輸

34、入線時,必須先將1寫入鎖存器,使T截止,把該口線由內(nèi)部提升電路拉成高電平。于是,當(dāng)外部輸入為高電平信號時,該口線為1;輸入為低電平信號時,該口線為0,從而使輸入端的電瓶隨輸入信號改變,讀入正確的數(shù)據(jù)信息。P1口作為是輸入時,可被任何TTL電路和MOS電路所驅(qū)動。由于具有內(nèi)部提升電阻,也可以直接被集電極開路或漏極開路的電路驅(qū)動而不必外加提升電路。CPU讀P1口有兩種情況:讀引腳和讀鎖存器狀態(tài)。讀引腳時,打開三態(tài)門2,讀入引腳上的輸入狀態(tài)(如MOV A,P1指令);讀鎖存器狀態(tài)時,打開三態(tài)門1,與p0口的I/O功能一樣,P1口可以進(jìn)行“讀修改寫”操作。3、P2口:P2口為準(zhǔn)雙向口。每一位的結(jié)構(gòu)如圖

35、1.14中(c)所示。P2口可以作為通用的I/O口使用,外接I/O設(shè)備,也可以作為擴(kuò)展系統(tǒng)時的地址總線口(輸出高8位地址),由控制信號控制轉(zhuǎn)換開關(guān)來實現(xiàn)。當(dāng)轉(zhuǎn)換開關(guān)(MUX)倒向左邊時,P2口作通用I/O口使用,作用和P1口相同。當(dāng)作為地址總線口使用時,MUX在CPU的控制下倒向右邊,從而在P2口的引腳上輸出地址(A15A8)。P2口的地址信息來源于PCH,DPH。對于8031單片機(jī)來說,P2口通常只作為地址總線口使用,而不作I/O口線直接與外部設(shè)備連接。4、P3口:P3口為雙功能口,其每一位的結(jié)構(gòu)如圖1.14中(d)所示。當(dāng)它作為第一功能口(通用的I/O口)使用時,工作原理與P1口和P2口類

36、似,但第二輸出功能線保持為高電平,使與非門3對鎖存器輸出端(Q端)是暢通的(與非門3的輸出只取決于Q的狀態(tài))。當(dāng)P3口作為第二功能使用時,相應(yīng)位的鎖存器必須為“1”狀態(tài),使與非門3的輸出電路由第二輸出功能線的狀態(tài)來確定,或使此口線允許輸入第二功能信號。對P3口不管是作通用輸入口或作第二功能輸入口,相應(yīng)位的鎖存器和第二輸出功能端都必須為1。在P3口的引腳信號輸入通道中有兩個緩沖器2和4 ,第二輸入功能信號取自緩沖器4的輸出端,通用輸入信號取自緩沖器2的輸出端。P3口的第二功能定義見表8-1表1-2 P3口的第二功能通道位第二功能注釋P3.0RXD串行輸入口P3.1TXD串行輸出口P3.2外部中斷

37、0輸入P3.3外部中斷1輸入P3.4T0計數(shù)器0計數(shù)輸入P3.5T1計數(shù)器1計數(shù)輸入P3.6外部數(shù)據(jù)RAM寫選通信號P3.7外部數(shù)據(jù)RAM寫選通信號1.4.2 89C51特殊功能寄存器(SFR)的C51定義方法1、89C51 特殊功能寄存器(SFR)及其Cx51定義方法89C51單片機(jī)片內(nèi)有21個特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址為80H0FFH,對SFR的操作,只能用直接尋址方式。 89C51單片機(jī)中,除了程序計數(shù)器PC和4組通用存器組之外,其他所有的寄存器,均稱為SFR,并位于片內(nèi)特殊寄存器區(qū),每個SFR和其他地址見表1-3。SFR中有11個寄存器具有位尋地

38、址能力。這些寄存器的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。89C51單片機(jī)的SFR如表1-3所列:表1-3 89C51特殊功能寄存器一覽表SFRMSB 位地址/位定義 LSB字節(jié)地址BF0HACCE0HPSWD7D6D5D4D3D2D1D0D0HCYACF0RS1RS0OVF1PIPBFBEBDDCBBDAA9B8B8H一一一PSPT1PX1PT0PX0P3B7B6B5B4B3B2B1B0B0HP3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0IEAFAEADACABAAA9A8A8HEA一一ESET1EX1ET0EX0P2A0HSBUF99HSCON9F9E9D9

39、C9B9A999898HSM0SM1SM2RENTB8RB8TIRIP190HTH18DHTH08CHTL18BHTL08AHTMODGATEC/M1M0GATEC/M1M089HTCON8F8E8D8C8B8A898888HTF1TR1F0R0IE1IT1IE0IT0PCONSMOD一一一GF1GF0FDIDL87HDPH83HDPL82HSP81HP080H為了能直接訪問這些特殊功能寄存器,KFIL CX51提供了一種自主的定義形式方法。這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對89C51系列單片機(jī)進(jìn)行C編程。 這種定義的方法是引入關(guān)鍵字“sfr”,語法為:sfr sfr-name=int

40、 constant;例如:sfr SCON=0X98; /串口控制寄存地址98Hsfr TMOD=0X89; /定時器/計數(shù)器方式控制寄存器地址89H注意:sfr必須跟一個特殊寄存器名,”=”后面的地址必須是常數(shù),不允許帶有運(yùn)算的表達(dá)式,這個常數(shù)值的范圍必須在特殊功能寄存器地址范圍內(nèi),位于0X800XFF之間。 對SFR的16數(shù)據(jù)的訪問,在新的89C51系列產(chǎn)品中,SFR在功能上經(jīng)常組合為16位值。當(dāng)SFR的高端地址直接位于其低端地址之后時,對SFR16值可以進(jìn)行直接訪問。例如8052的定時器2就是這種情況,為了有效地訪問這類SFR??墒褂藐P(guān)鍵字”sfr16”。16位SFR定義的語法與8位SF

41、R相同,16位SFR的低端地址必須作為”fr16”的定義地址。 例如:sfr16 T2=oxCC; /定義2:T2低8位地址=0CCH, T2高8位地址=OCDH定義中名字后面不是賦值語句,而是一個SFR地址,高字節(jié)必須位于低字之后。這種定義適用于所有新的SFR,但不能用于定時器/計數(shù)器0和1。在典型的89C51應(yīng)用問題中,經(jīng)常需要單獨(dú)訪問SFR中的位,CX51的擴(kuò)充功能之成為可能。特殊位(sbit)r 的定義像SFR一樣不與標(biāo)準(zhǔn)C兼容,使用關(guān)鍵字”sbit”可以訪問位尋址對象。與SFR定義一樣,用關(guān)鍵字”sbit”定義某些特殊位,并接受任何符號名,”=”號后將絕對地址賦給變量名。這種地址分配

42、有3種方法。方法一:sfr-nameint-constant當(dāng)特殊寄存器的地址這字節(jié)(8位)時,可使用這種方法。sfr-name必須是已定義的SFR的名字。后的語句定義了基地址上的特殊位置。該位置必須是07的數(shù)。例如:sfr PSW=0Xd0; /定義PSW寄存器地址為0XD0sbit OV=PSW2 /定義OV為位為PSW2,地址為0XD2sbit TCY=PSW7 /定義CY位為PSW.7,地址為0XD7方法二:int-constantint-constant 這種方法以一個整常數(shù)作為基地址,該值必須在0X80OXFF之間,并能被8整除,確定位置的方法同上。例如:sbit OV=0XDO2

43、 /OV位于地址為0XD2 sbit CY=0XDO7 /CY位地址為0XD7方法三:int-constant這種方法將位的絕對地址賦給變量,地址必須位于0X800XFF之間,例如:sbit OV=OXD2;sSbit CY=OXD7;特殊功能位代表了一個獨(dú)立的定義類,不能與其他位定義和位域互換。2、89C51并行接口及其CX51定義方法前面提到89C51單片機(jī)芯片內(nèi)帶有4個8位的并行口,共32根I/O線,對I/O口的操作實際上就是對P0,P1,P2和P3四個寄存器進(jìn)行操作,而P0,P1,P2和P3四個寄存器也屬于特殊功能寄存器(SFR),因此89C51并行接口的CX51定義方法與上面介紹的特殊功能寄存器(SFR)定義方法一樣,下面結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論