|
在實驗7裏,我們把紅外線LED及接收器組合成偵測地面黑色軌道的模組,我就有學生在家裏用黑膠帶,從房間到客廳、廚房,貼了很長的軌道,跟家人玩起郵差送信的遊戲,真的很好玩哦!
接下來的實驗我修改了一些電路的結構,如:取消原來使用兩組電源的架構,改由一顆7.4V可充電的鋰電池透過穩壓IC-7805供應電路5V電源,而馬達驅動則採用之前在"不是玩具-單晶片科學魔法車"一文中提到的IC-TA7291P來控制,因此現在魔法車除了前進、後退之外,也能透過程式下達停止的指令了。
實驗八:高架軌道車
實驗內容:如何在寬度峽長的軌道上順利過彎。
先看程式囉:
這次程式加一樣新菜色,就是利用89C2051計時器來產生中斷,讓程式可以規劃出PWM的信號,目的是輸出到TA7291P來控制馬達的速度,非常好用喔!
- /*實驗八:高架軌道車*/
- #include <AT89x051.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar t=0; //中斷計數器
- uchar m1=0; //左馬達速度值
- uchar m2=0; //右馬達速度值
- uchar tmp1,tmp2; //左右馬達當前速度值
- /* 馬達控制函數 index-左右馬達(1,2); speed-馬達速度(-100 ~ 100) */
- void motor(uchar index, char speed)
- {
- if(speed>=-100 && speed<=100){
- if(index==1){ //左馬達的處理
- m1=abs(speed); //取速度的絕對值
- if(speed<0){ //速度值為負則反轉
- P1_2=0;
- P1_3=1;
- }
- else{ //不為負數則正轉
- P1_2=1;
- P1_3=0;
- }
- }
- if(index==2){ //右馬達的處理
- m2=abs(speed); //速度控制
- if(speed<0){ //方向控制
- P1_4=0;
- P1_5=1;
- }
- else{
- P1_4=1;
- P1_5=0;
- }
- }
- }
- }
- /* 延時函數 */
- void delay(unsigned int j)
- { //改變參數J大小,可調整時間
- for(j;j>0;j--);
- }
- /* 主程式開始 */
- void main(void)
- {
- P3_2=1; //啟始左側紅外線輸入功能
- P3_3=1; //啟始右側紅外線輸入功能
- TMOD=0x02; //設定T0的工作模式為2
- TH0=0x3C; //設定定時器的初值
- TL0=0x3C; //設定定時器的重載值
- EA=1; //中斷開啟
- ET0=1; //定時器0允許中斷
- TR0=1; //啟動定時器0
- while(1){
- while(P3_3==1 && P3_2==1){ //當車體在軌道中時
- motor(1,50); //左右馬達加速前進
- motor(2,50);
- }
- while(P3_2==0 && P3_3==1){ //當左側紅外線偵測到軌道邊緣時
- motor(2,-50); //右馬達反轉
- motor(1,30); //左馬達減速..直到避開軌道邊緣
- }
- while(P3_2==1 && P3_3==0){ //當右側紅外線偵測到軌道邊緣時
- motor(1,-50); //左馬達反轉
- motor(2,30); //右馬達減速..直到避開軌道邊緣
- }
- while(P3_3==0 && P3_2==0){ //無任何反射信號時
- delay(10); //作用為何呢?
- }
- }
- }
- /* T0中斷服務程序 */
- void timer0() interrupt 1
- {
- if(t==0){ //1個PWM週期完成後才會接受新數值
- tmp1=m1;
- tmp2=m2;
- }
- if(t<tmp1) P1_0=1; else P1_0=0; //產生左馬達的PWM信號
- if(t<tmp2) P1_1=1; else P1_1=0; //產生右馬達的PWM信號
- t++;
- if(t>=100) t=0; //1個PWM週期由100次中斷產生
- }
複製代碼 編譯完成的檔案:
IR_01.hex
(1.28 KB, 下載次數: 49)
|
|