寻迹避障 小车 ,经典物件 !
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:- #include <oled.h>
- #include <reg51.h> //51通用头文件
- #include <intrins.h>
- void delay(unsigned char sss)
- {
- while(sss--);
- }
-
- sbit PWM=P1^2;// P1.0输出pwm
- sbit sd=P1^3;// P1.0输出pwm
- char time,ct; // 定义占空比的变量
- int d,a,dw,ks=0;
- int y=2,z=2;
- int xs=220;
- sbit AIN2 =P2^4;
- sbit AIN1 =P2^3;
- sbit BIN2 =P2^5;
- sbit BIN1 =P2^6;
- sbit zuo =P1^0;
- sbit you =P1^1;
- sbit hw =P2^0;
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay180ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 8;
- j = 145;
- k = 99;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay300ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 13;
- j = 156;
- k = 83;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay250ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 11;
- j = 130;
- k = 111;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void initExtInt0()
- {
- IT0 = 1; // 电平下降沿触发
- EX0 = 1; // 开启INT0中断
- EA = 1; // 开总中断
- }
- void Timer01Init() {
- TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。
- TH0=0XFC; //给定时器赋初值,定时 1ms
- TL0=0X18;
- ET0=1;//打开定时器 0 中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
-
- }
- void xj()
- {
- if(zuo==1&&you==0) {y=1;z=5;}
- if(zuo==0&&you==1) {y=5;z=1;}
- if(zuo==0&&you==0) {y=2;z=2;}
- }
- void fw()
- {
- if(zuo==1||you==1){z=5,y=1;Delay250ms();dw=0;a=0;}
- }
-
- void bz() //判断小车前面是否存在障碍物
- {
- if(hw==0){a=1;dw=1;}
- while(a)
- {
- switch (dw) //循迹避障
- {
- case 1:z=5;y=1;Delay300ms();dw=2;break;//小车左转
- case 2:z=2,y=2;Delay100ms();dw=3;break;//小车直行
- case 3:z=1,y=5;Delay180ms();dw=4;break;//小车右转
- case 4:z=2,y=2;Delay100ms();dw=5;break;//小车直行
- case 5:z=1,y=5;Delay250ms();dw=6;break;//小车右转
- case 6:z=2,y=2;fw();break; //判断是否接触黑线
- }
- }
- }
- void main()
- {
- Timer01Init(); //定时器初始化
- AIN2=1; //tb6612正反设定
- AIN1=0;
- BIN2=1;
- BIN1=0;
- OLED_Init();
- OLED_Clear();
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(16,0,1);
- OLED_ShowNum(0,2,2023400,7,16);
- OLED_ShowNum(56,2,20365,5,16);
- while(1)
- {
-
- xj(); //调用循迹
- bz(); //调用避障
- }
- }
- void IntT0() interrupt 1
- {
- TH0=0xFC;
- TL0=0x18;
- time++;
- ct++;
-
- if(time>=y ) {time=0;} //右边转速
- if(time<=d*ks) {PWM=1;}
- else {PWM=0;}
-
- if(ct>=z ) {ct=0;} //左边转速
- if(ct<=d*ks) {sd=1;}
- else {sd=0;}
- }
复制代码
原理图: 无
仿真: 无
代码:
程序.7z
(39.83 KB, 下载次数: 0)
|