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