|
四個紅外傳感器的小車循跡源碼修改版,更穩定,感興趣的同學可以拿去參考一下,每輛車都不一樣,速度可能要調一下。
四輪四個傳感器循跡小車
單片機源程序如下:
- /*從小車后面觀察,從左向右的紅外檢測分別為DD1,DD2,DD3,DD4
- DD1---P0^3
- DD2---P0^2
- DD3---P0^1
- DD4---P0^0
- */
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- extern void Motor_Left(bit ReverOrCoro, uchar DutyCycle); //左邊電機控制函數
- extern void Motor_Right(bit ReverOrCoro, uchar DutyCycle); //右邊電機控制函數
- void Timer0Config(); // 配置定時器0
- void zhizou();
- void dazhuan1();
- void dazhuan2();
- void weitiao1();
- void weitiao2();
- sbit ENA = P1^5; //定義電機使能端
- sbit ENB = P1^0;
- uchar a;
- uchar Infrared; //檢測P0低四位的值
- void main()
- {
- Timer0Config();
- ENA = 1; ENB = 1;
- Infrared = P0 & 0x0F; //取出P0口低四位
- while(1)
- {
- switch(Infrared)
- {
- case 0x00:
- zhizou(); break; //未檢測到黑線,直行
- case 0x08:
- dazhuan1(); break; //左邊第一個檢測到黑線,左大轉
- case 0x04:
- weitiao1(); break; //左邊第二個檢測到黑線,左微調
- case 0x02:
- weitiao2(); break; //右邊第一個檢測到黑線,右微調
- case 0x01:
- dazhuan2(); break; //右邊第二個檢測到黑線,右大轉
- case 0x0C:
- zhizou(); break; //左邊兩個同時檢測到黑線,直行
- case 0x0E:
- zhizou(); break; //左邊三個同時檢測到黑線,直行
- case 0x03:
- zhizou(); break; //右邊兩個同時檢測到黑線,直行
- case 0x07:
- zhizou(); break; //右邊三個同時檢測到黑線,直行
- case 0x0f:
- zhizou(); break; //全部檢測到,直行
- case 0x06:
- zhizou(); break; //中間兩個檢測到,直行
- case 0x09:
- zhizou(); break; //旁邊兩個檢測到,直行
- case 0x0A:
- weitiao1(); break; //左一右一檢測到,左微調
- case 0x05:
- weitiao2(); break; //左二右二檢測到,右微調
- case 0x0b:
- zhizou(); break; //左二未檢測到,直行
- case 0x0d:
- zhizou(); break; //右一未檢測到,直行
- default: break;
- }
- }
- }
- void Timer0Config()
- {
- TMOD &= 0xF0;
- TMOD |= 0x01;
- TH0 = 0xFF;
- TL0 = 0x7E;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void zhizou()
- {
- Motor_Left(1, 100), Motor_Right(1, 100);
- Infrared = P0 & 0x0F;
- }
- void dazhuan1()
- {
- a=1;
-
- while(a)
- {
- Motor_Left(0, 80); Motor_Right(1, 80);
- Infrared = P0 & 0x0F;
- if(Infrared==0x04)
- {
- Motor_Left(1, 100); Motor_Right(0, 100); break;
- }
- else if(Infrared==0x02)
- {
- Motor_Left(1, 100); Motor_Right(0, 100); break;
- }
- }
- Infrared = P0 & 0x0F;
- }
- void dazhuan2()
- {
- a=1;
-
- while(a)
- {
- Motor_Left(1, 80); Motor_Right(0, 80);
- Infrared = P0 & 0x0F;
- if(Infrared==0x02)
- {
- Motor_Left(0, 100); Motor_Right(1, 100); break;
- }
- else if(Infrared==0x04)
- {
- Motor_Left(0, 100); Motor_Right(1, 100); break;
- }
- }
- Infrared = P0 & 0x0F;
- }
- void weitiao1()
- {
- a=1;
- while(a)
- {
- Motor_Left(0, 60); Motor_Right(1, 100);
- Infrared = P0 & 0x0F;
- switch(Infrared)
- {
- case 0x04:
- a=1; break;
- default:
- a=0; break;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
循跡決賽程序1.zip
(45.32 KB, 下載次數: 685)
2017-5-20 11:48 上傳
點擊文件名下載附件
決賽用的程序
|
評分
-
查看全部評分
|