智能小車的自動尋跡實驗
【實驗?zāi)康摹?br>熟悉光敏電阻的性質(zhì)
熟悉ICCAVR 編譯環(huán)境
進(jìn)一步熟悉單片機各端口的特性和作用
能夠編寫程序,利用光敏電阻的性質(zhì)對小車進(jìn)行控制
【實驗器材】
小車一輛 導(dǎo)線五根 下載線一根
【實驗原理】
(一)光敏電阻
當(dāng)光照射在物體上,物體內(nèi)部的原子釋放出電子并不逸出物體表面,而仍留在內(nèi)部,使
物體的電阻率1/R 發(fā)生變化的效應(yīng)稱為光電導(dǎo)效應(yīng)。光敏電阻是一種光電導(dǎo)效應(yīng)半導(dǎo)體器
件。由于光敏電阻沒有極性,工作是可加直流偏壓或交流電壓。當(dāng)無光照時,光敏電阻的阻
值(暗電阻)很大,電路中電流很小。當(dāng)它受到一定波長范圍的光照射時,其阻值(亮電阻)
急劇減小,電路中電流迅速增加,用電流表可以測量出電流。
本實驗所采用的光敏電阻是硫化鎘光敏電阻,下圖是硫化鎘光敏電阻的光照特
光敏電阻的檢測
1. 用黑紙片將光敏電阻的透光窗口遮住,此時萬用表的指針基本保持不動,阻值接近無窮
大。此值越大說明光敏電阻性能越好。若此值很小或接近為零,說明光敏電阻已燒穿損
壞,不能再繼續(xù)使用。
2. 用一光源對準(zhǔn)光敏電阻的透光窗口,此時萬用表的指針應(yīng)有較大幅度的擺動,阻值明顯
減小。此值越小說明光敏電阻性能越好。若此值很大甚至無窮大,表明光敏電阻內(nèi)部開
路損壞,也不能再繼續(xù)使用。
3. 將光敏電阻透光窗口對準(zhǔn)入射光線,用小黑紙片在光敏電阻的遮光窗上部晃動,使其間
斷受光,此時萬用表指針應(yīng)隨黑紙片的晃動而左右擺動。如果萬用表指針始終停在某一
位置不隨紙片晃動而擺動,說明光敏電阻的光敏材料已經(jīng)損壞。
(二)Atmega8515的端口特性
由于本實驗主要用到I/O輸入輸出的PA端口,因此主要介紹PA端口的特性。端口
A(PA7..PA0)端口A為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱
的驅(qū)動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外
部電路拉低時將輸出電流。在復(fù)位過程中,即使系統(tǒng)時鐘還未起振,端口A處于高阻狀態(tài)。
作為通用數(shù)字I/O使用時,所有AVRI/O端口都具有真正的讀-修改-寫功能。這意味著用
SBI或CBI指令改變某些管腳的方向(或者是端口電平、禁止/使能上拉電阻)時不會無意地改
變其他管腳的方向(或者是端口電平、禁止/使能上拉電阻)。輸出緩沖器具有對稱的驅(qū)動能
力,可以輸出或吸收大電流,直接驅(qū)動LED。所有的端口引腳都具有與電壓無關(guān)的上拉電阻。
并有保護(hù)二極管與VCC和地相連。
每個端口都有三個I/O存儲器地址:數(shù)據(jù)寄存器–PORTx、數(shù)據(jù)方向寄存器–DDRx和端
口輸入引腳–PINx。數(shù)據(jù)寄存器和數(shù)據(jù)方向寄存器為讀/寫寄存器,而端口輸入引腳為只讀
寄存器。當(dāng)寄存器SFIOR 的上拉禁止位PUD置位時所有端口的全部引腳的上拉電阻都被禁
止。不論如何配置DDxn,都可以通過讀取PINxn寄存器來獲得引腳電平。PINxn寄存器的各
個位與其前面的鎖存器組成了一個同步器。這樣就可以避免在內(nèi)部時鐘狀態(tài)發(fā)生改變的短
時間范圍內(nèi)由于引腳電平變化而造成的信號不穩(wěn)定。
本實驗主要應(yīng)用PA端口的輸入引腳PINA。因此當(dāng)我們把與光敏電阻的輸出電壓相連的
五個數(shù)據(jù)線連接到PA端口時可以通過讀取寄存器PINAx來獲得光探測裝置輸出的電平,在
AVR中PA端口的反轉(zhuǎn)電壓是2.1V為高電平。即當(dāng)外部輸入電壓高于2.1V時,PINAx讀取的輸
入邏輯電平值為“1” ,當(dāng)外部輸入電壓低于2.1V時,PINAx讀取的輸入邏輯電平值為“0”。
根據(jù)PINA寄存器放置的五個數(shù)據(jù)來判斷小車的走向。
(三)本實驗實現(xiàn)原理
當(dāng)電路接通電源時,由小車主板的穩(wěn)壓電源電路穩(wěn)定輸出5 伏電壓為小車下部的光探測
電路提供電源使二極管發(fā)光,當(dāng)路面是白色時,二極管發(fā)出的光大部分被反射,光敏電阻就
接收到比較強的光照射,阻值變小,流過光敏電阻的電流變大。由于電阻的分壓作用,使得
光敏電阻的輸出電壓較小,約為1.5V 左右。當(dāng)路面是黑色時,由于黑色對光有吸收作用,
使得二極管發(fā)出的光大部分被吸收,只有小部分被反射,光敏電阻接收到的光照就比較小,
阻值變大,流過光敏電阻的電流變小,光敏電阻的輸出電壓變大,約為2.5V 左右。共有五個
光敏電阻也就是有五個數(shù)據(jù)輸出。這五個信號通過數(shù)據(jù)線與單片機的PA 口相連,最左邊的
電阻連接PA 口的最低位PA0,依次類推,一直連到PA4 口。
【實驗步驟】
(1) 連接好電路,把導(dǎo)線,下載線連接好,打開電源
(2) 進(jìn)入ICCAVR 編譯環(huán)境,編寫并調(diào)試程序直至沒有錯誤,編譯環(huán)境簡介請參見
附錄一
(3) 下載,燒錄進(jìn)單片機,看實驗結(jié)果
(4) 反復(fù)修改調(diào)試程序,逐漸增強其功能
(5) 寫好實驗報告,實驗心得體會
【實驗電路】
小車的硬件連接圖
小車輪子的驅(qū)動詳見實驗一
【程序示例】
由于在實驗中黑線的寬度不同,尋跡中所用到的光敏電阻的部位也不同。下面程序的
例子是黑線的寬度只能覆蓋一個光敏電阻時對小車的驅(qū)動程序
#include
#include
unsigned char t;
//******************系統(tǒng)自動生成的初始化程序**********************
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x00;
DDRE = 0x04;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
EMCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//****************小車前進(jìn)的子程序*********************
void runforth(void)
{
PORTE=0x04;
PORTD=0x70;
}
//*****************小車左轉(zhuǎn)的子程序*********************
void zuozhuan(void)
{
PORTE=0x00;
PORTD=0X70;
}
//****************小車右轉(zhuǎn)的子程序*********************
void youzhuan(void)
{
PORTE=0x04;
PORTD=0x50;
}
//***************小車停止不動的子程序****************
void stop(void)
{
PORTE=0x00;
PORTD=0x00;
}
//****************主程序***************************
void main(void)
{
while(1)//設(shè)置一個死循環(huán),不斷讀取PA口的輸入邏輯電平
{
init_devices();//調(diào)用初始化函數(shù)
t=PINA&0x1f; //屏蔽掉PA口的高三位數(shù)據(jù)位
if(t==0x00)
{stop();}
else
{
switch(t)
{ case 0x01:zuozhuan();break;
case 0x07:zuozhuan();break;
case 0x02:zuozhuan();break;
case 0x03:zuozhuan();break;
case 0x04:runforth();break;
case 0x0e:runforth();break;
case 0x06:zuozhuan();break;
case 0x08:youzhuan();break;
case 0x10:youzhuan();break;
case 0x0c:youzhuan();break;
case 0x18:youzhuan();break;
case 0x1c:youzhuan();break;
}
}
}
}
評論
查看更多