|
智能車的原理圖如下:
主控.png (112.15 KB, 下載次數(shù): 84)
下載附件
2017-11-17 00:32 上傳
7805.png (104.2 KB, 下載次數(shù): 76)
下載附件
2017-11-17 00:32 上傳
紅外.png (251.37 KB, 下載次數(shù): 81)
下載附件
2017-11-17 00:32 上傳
驅(qū)動(dòng) 負(fù)極1厘米 12V 6毫米 其他2mm.png (72.14 KB, 下載次數(shù): 74)
下載附件
2017-11-17 00:32 上傳
信號(hào)處理.png (333.9 KB, 下載次數(shù): 76)
下載附件
2017-11-17 00:32 上傳
單片機(jī)源程序:
- include "reg52.h"
- # include<intrins.h>
- //定義全局變量
- char count=0,cheer=0; // 調(diào)節(jié)占空比
- char left=0,right=0; // 左右輪速度 可在主函數(shù)中修改
- char duojizhongzhi=0; // 舵機(jī)中值
- // 定義I/O口
- // 定義 紅外檢測(cè) 電機(jī)引腳 舵機(jī) 以上IO口可修改
- // 定義 紅外檢測(cè)
- sbit hw1=P2^0;
- sbit hw2=P2^1;
- sbit hw3=P2^2;
- sbit hw4=P2^3;
- sbit hw5=P2^4;
- sbit hw6=P2^5;
- sbit hw7=P2^6;
- sbit hw8=P2^7;
- //定義電機(jī)I/O口 可修改
- sbit dianji1=P1^0;
- sbit dianji2=P1^1;
- sbit dianji3=P1^2;
- sbit dianji4=P1^3;
- // 定義舵機(jī) I/O口 可修改
- sbit duoji=P1^7;
- // 申明 自定義函數(shù) // 不懂勿動(dòng)
- void time1init();
- void time0init();
- // 紅外檢測(cè)情況 如果用少于8個(gè)紅外 可自行刪減
- int hongwaijiance () //8個(gè)紅外檢測(cè)黑線情況 返回值為 整形
- { //紅外信號(hào)為1檢測(cè)白,為0檢測(cè)黑(不一定,根據(jù)情況自行調(diào)整0和1)
- if((hw1==0)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //左邊第一個(gè)檢測(cè)到黑線并且其余
- return 1; //7個(gè)檢測(cè)白,此時(shí)返回1
-
- if((hw1==1)&&(hw2==0)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) // 左邊第二個(gè)檢測(cè)黑線并且其余7個(gè)
- return 2; //檢測(cè)白,此時(shí)返回2
-
- if((hw1==1)&&(hw2==1)&&(hw3==0)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 3;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==0)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 4;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==0)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 5;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==0)&&(hw7==1)&&(hw8==1) ) //
- return 6;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==0)&&(hw8==1) ) //
- return 7;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==0) ) //
- return 8;
-
- return 0; // 以上情況都沒(méi)有 什么都不執(zhí)行
- }
- // 延時(shí)函數(shù) 延時(shí)2S 用于延時(shí)啟動(dòng)
- void delay2s() //誤差 0us
- {
- unsigned char a,b,c,n;
- for(c=167;c>0;c--)
- for(b=39;b>0;b--)
- for(a=152;a>0;a--);
- for(n=1;n>0;n--);
- }
- // 主函數(shù)
- void main()
- {
- char Data,Data_1;
- time0init(); // 定時(shí)器函數(shù)
- time1init(); // 定時(shí)器函數(shù)
- left=50; // 左輪速度
- right=50; // 右輪速度
- duojizhongzhi=15; // 舵機(jī)中值
- delay2s(); // 延時(shí)啟動(dòng)
- while(1)
- {
- Data=hongwaijiance(); //對(duì)變量 Data 賦值
- if(Data == 0) //
- Data=Data_1; //
- Data_1=Data; //這4句使車沖出去后能自己回來(lái)
- // 停車程序
- if((hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0) )
- {
- _nop_();
- _nop_();
- if ( (hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0) )
- {
- left=0;
- right=0;
- duojizhongzhi=16; // 此時(shí)該值為舵機(jī)在最中央位置的值 也就是中值
- }
- }
- switch(Data) //switch語(yǔ)句對(duì)之前紅外檢測(cè)情況進(jìn)行處理(由實(shí)際情況調(diào)整里面各變量數(shù)值)
- {
- case 1: duojizhongzhi = 16;left = 90;right =20; _nop_(); _nop_(); break; //Delay_Nms(8)給舵機(jī)轉(zhuǎn)動(dòng)留時(shí)間,數(shù)8可調(diào)整
- case 2: break;
- case 3: break;
- case 4: break;
- case 5: break;
- case 6: break;
- case 7: break;
- case 8: break;
-
- default:
- break;
- }
-
-
- }
- }
- // 定時(shí)器 0 中斷
- void time0init()
- {
- TMOD=0X11;
- TH0=0XFF;
- TL0=0XF6;
- ET0=1;
- TR0=1;
- EA=1;
- }
- // 定時(shí)器 1 中斷
- void time1init()
- {
- // TMOD=0X11;
- EA=1;
- ET1=1;
- TR1=1;
- TL1=0XF6;
- TH1=0XFF;
- }
- // 定時(shí)器0控制電機(jī)速度
- /***********************
- 占空比越大 速度越快
- ************************/
- void time0() interrupt 1 // 定時(shí)器0執(zhí)行函數(shù) 中斷號(hào)1
- {
- //重新裝載
- TL0=0XF6; // 初值
- TH0=0XFF; // 每隔10US 進(jìn)一次中斷
- count++; //占空比不斷增加
- if(count>100)
- count=0;
- if(count<left) // 占空比對(duì)應(yīng)的速度小于需要的速度 讓電機(jī)加速
- {
- dianji1=1;
- dianji2=0;
- }
- else
- {
- dianji1=0;
- dianji2=1;
- }
- if(count<right) // 占空比對(duì)應(yīng)的速度小于需要的速度 讓電機(jī)加速
- {
- dianji3=1;
- dianji4=0;
- }
- else
- {
- dianji4=0;
- dianji3=1;
- }
- }
- // 定時(shí)器1控制舵機(jī)轉(zhuǎn)向
- /***********************
- 占空比越大偏轉(zhuǎn)的角度越大
- ***********************/
- void time1() interrupt 3 //定時(shí)器1執(zhí)行函數(shù) 中斷號(hào)3
- {
- TL1=0XF6;
- TH1=0XFF;
- cheer++; // 占空比增加
- if(cheer>100)
- cheer=0;
- if(cheer<duojizhongzhi) // 如果占空比所對(duì)應(yīng)的角度沒(méi)達(dá)到所需要的值
- duoji=1; // 高電平
- else
- duoji=0;
- }
復(fù)制代碼- // 智能車程序
- # include "reg52.h" // 頭文件 包含一定定義
- # include "intrins.h"
- // 用uint uchar 代替無(wú)符號(hào)整型 字符型
- typedef unsigned int uint ;
- typedef unsigned char uchar;
- // 定義 電機(jī)引腳 可修改
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- // 定義紅外引腳 可修改
- sbit Infrared1=P0^0;
- sbit Infrared2=P0^1;
- sbit Infrared3=P0^2;
- sbit Infrared4=P0^3;
- sbit Infrared5=P0^4;
- sbit Infrared6=P0^5;
- sbit Infrared7=P0^6;
- sbit Infrared8=P0^7;
- // 定義舵機(jī)引腳 可修改
- sbit Servo=P2^0;
- // 定義變量 左右輪速度 及占空比 舵機(jī)中值
- uint speed_left=0, speed_right=0,count=0,add=0,djzz=0;
- uint receive; // 用于接受返回值
- // 定義自定義函數(shù)
- void time0init();
- void delay2s();
- void delay100us();
- uint HW() ;
- void Drive( uint left ,uint right,uint dj );
- void Stop();
- // 主函數(shù)
- void main()
- {
- uchar Data_1; //申明變量
- time0init(); // 不斷執(zhí)行定時(shí)器中斷
- delay2s(); // 延時(shí)啟動(dòng)
- // 以下需要修改
- while(1)
- {
- djzz=15; //改這個(gè)值 使舵機(jī)居中
- delay100us();
- break;
- }
- speed_left=1; // 調(diào)節(jié)電機(jī)速度
- speed_right=1; // 調(diào)節(jié)電機(jī)速度
- // 以上需要修改
- while(1)
- {
- receive=HW(); //receive接受HW函數(shù)返回值
- if(receive == 0) //使車自己回去
- receive=Data_1;
- Data_1=receive;
- HW(); //引用自定義函數(shù)
- Drive( speed_left,speed_right,djzz ); //引用自定義函數(shù)
- Stop(); //停止
- }
- }
- // 延時(shí)函數(shù) 延時(shí)2S
- void delay2s() //誤差 0us
- {
- unsigned char a,b,c;
- for(c=127;c>0;c--)
- for(b=235;b>0;b--)
- for(a=32;a>0;a--);
- _nop_();
- }
- void delay100us() //誤差 0us
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=47;a>0;a--);
- }
- //紅外檢測(cè)函數(shù) //需要自己添加情況
- uint HW()
- {
- //如果紅外一檢測(cè)到 執(zhí)行情況
- if( Infrared1==1&&Infrared2==0&&Infrared3==0&&Infrared4==0&&Infrared5==0&&Infrared6==0&&Infrared7==0&&Infrared8==0 )
- return 1;
- /*
- 以下情況復(fù)制上面自己改
- */
- else
- {
- return 0;
- }
- }
- // 電機(jī)驅(qū)動(dòng)函數(shù) //需要自己添加情況
- void Drive( uint left ,uint right,uint dj )
- {
- if( receive==1 )
- {
- left =10;
- right=10;
- dj=10;
- }
- /*
- 根據(jù)所需要自己添加
- */
- }
- /*******************************************************************************
- 以下函數(shù)不能修改
- *******************************************************************************/
- // 停止函數(shù) 當(dāng)紅外八個(gè)燈同時(shí)檢測(cè)到 之后停止
- void Stop()
- {
- if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
- {
- delay100us();
- if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
- speed_left=0;
- speed_right=0;
- }
- }
- void time0init()
- {
- TMOD|=0X11;
- TH0=(65536-50)/256;
- TL0=(65536-50)%256;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=1;
- TR1=1;
- }
- // 定時(shí)器0 用于控制電機(jī)速度
- void Motor0 () interrupt 1
- {
- TR0=0;
- TH0=(65536-50)/256;
- TL0=(65536-50)%256;
- count++;
- if(count>100)
- {
- count=0;
- }
- if( count>speed_left ) //
- {
- IN1=0;
- IN2=0;
- }
- else
- {
- IN1=1;
- IN2=0;
- }
- if( count>speed_right ) //
- {
- IN3=0;
- IN4=0;
- }
- else
- {
- IN3=1;
- IN4=0;
- }
- TR0=1;
- }
- void ServoTemper() interrupt 3
- {
- add++;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- if( add>=200 )
- {
- add=0;
- }
- if( djzz>=add )
- {
- Servo=1;
- }
- else
- {
- Servo=0;
- }
- }<div class="quote"><blockquote>
復(fù)制代碼
|
-
-
原理圖.7z
2017-11-16 20:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
826.6 KB, 下載次數(shù): 56, 下載積分: 黑幣 -5
-
-
最新庫(kù).7z
2017-11-16 20:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
79.76 KB, 下載次數(shù): 39, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|