自动避障寻迹小车软件设计软件程序.docx
- 文档编号:9477147
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:19
- 大小:18.83KB
自动避障寻迹小车软件设计软件程序.docx
《自动避障寻迹小车软件设计软件程序.docx》由会员分享,可在线阅读,更多相关《自动避障寻迹小车软件设计软件程序.docx(19页珍藏版)》请在冰点文库上搜索。
自动避障寻迹小车软件设计软件程序
系统总程序
#include
#include
#defineuintunsignedint//宏定义
#defineucharunsignedchar
/*------------------寻迹避障模块功能声明---------------------*/
sbitAE=P3^0;//主驱A电机使能端
sbitAP=P1^6;//IN1
sbitAD=P3^4;//IN2
sbitBE=P3^5;//转向B电机使能端
sbitBP=P3^6;//IN3
sbitBD=P3^7;//IN4
//用来改变PWM占空比的几个变量
ucharcount1,count2,A_num,B_num,temp1,temp2;
//占空比分配表
ucharSpeed[]={1,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
voidcontrolA(void);
voidcontrolB(void);
voidPWMA(ucharsd1);
voidPWMB(ucharsd2);
voidDJA(ucharx);
voidDJB(uchary);
voidTracing(void);
voidXdelay(uintms);
/*-----------------------超声波测距模块-----------------------*/
sbitTrig=P3^1;//发射40KHZ波
sbitEcho=P3^2;//中断入口
bitsucceed_flag;//测量成功标志位
bitzhang_flag;
uinttimeH,timeL,Btime,distance;
voidBdelay(uintdec);
voiddelay_20us();//延时20us
voidChaoshengboceju();//超声波测距函数声明
/*-----------------------测速模块声明------------------------*/
uchargewei,shiwei,baiwei;
ucharge,shi,bai;
voidsudu_count(void);//函数声明
voidlicheng_count(void);
voidupdate_clock(void);
uinti,z,count,zhuan,msec,route;//定义参数
uchart1,t2,t3,t4;
/*-----------------------显示模块功能声明------------------------*/
sbitrs=P1^2;//LCD的数据/命令选择端
sbitrw=P1^3;//LCD的读写选择端
sbitep=P1^4;//LCD的使能信号端
unsignedcharcodedis1[]={"V="};
unsignedcharcodedis2[]={"0123456789:
"};
unsignedcharcodedis3[]={"cm/s"};//定义显示参数
unsignedcharcodedis4[]={"L=m"};
unsignedcharcodedis5[]={"T="};
unsignedcharcodedis6[]={"CJ=mm"};
set_time[2]={0x00,0x00};//初始时间
/*************************电机驱动模块程序****************/
/*-----------------------驱动初始化------------------------*/
voidXinit_all()//定时器0初始化
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*--------------------定时器0中断---------------------*/
voidtimer0(void)interrupt1using1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%265;
count1++;
controlA();
count2++;
controlB();
}
/*--------------------PWM产生程序-----------------------*/
voidcontrolA()//舵机控制
{
A_num=20;
if(count1==temp1)
{AE=0;}
elseif(count1==A_num)
{count1=0;
AE=1;
}
}
voidcontrolB()//驱动电机控制
{
B_num=20;
if(count2==temp2)
{BE=0;}
elseif(count2==B_num)
{
count2=0;
BE=1;
}
}
voidPWMA(ucharsd1)
{temp1=sd1;}
voidPWMB(ucharsd2)
{temp2=sd2;}
/************************寻迹避障部分************************/
/*-----------------循迹----------------------------*/
voidDJB(uchary)//舵机控制
{
switch(y)
{
case0:
BP=0;BD=0;break;//B电机制动,方向归中
case1:
PWMB(Speed[16]);BP=0;BD=1;break;//右大转
case2:
PWMB(Speed[14]);BP=0;BD=1;break;
case3:
PWMB(Speed[11]);BP=0;BD=1;break;//右小转弯
case4:
PWMB(Speed[16]);BP=1;BD=0;break;//左大转
case5:
PWMB(Speed[15]);BP=1;BD=0;break;
case6:
PWMB(Speed[11]);BP=1;BD=0;break;//左小转
}
}
voidDJA(ucharx)//驱动电机控制
{
switch(x)
{
case0:
AP=0;AD=0;break;//停车制动
case1:
PWMA(Speed[9]);AP=1;AD=0;break;//快前进
case2:
PWMA(Speed[7]);AP=1;AD=0;break;//前进
case3:
PWMA(Speed[7]);AP=1;AD=0;break;//慢前进
}
}
voidTracing()//循迹
{ucharstate1;
state1=P2&0x3f;//循迹判断
switch(state1)
{
case0x00:
DJB(0);DJA
(2);break;//小车前进
case0x01:
DJB
(1);DJA(3);Xdelay(200);break;//右转弯
case0x02:
DJB
(2);DJA(3);break;
case0x03:
DJB
(1);DJA(3);Xdelay(120);break;//右转弯
case0x06:
DJB
(2);DJA(3);break;//右转弯
case0x04:
DJB(3);DJA(3);break;//右小转弯
case0x08:
DJB(6);DJA(3);break;//左小转
case0x10:
DJB(5);DJA(3);break;//左转
case0x18:
DJB(5);DJA(3);break;//左转
case0x30:
DJB(4);DJA(3);Xdelay(100);break;//左转
case0x20:
DJB(4);DJA(3);Xdelay(160);break;
case0x3f:
DJB(0);DJA(0);break;//停止
default:
break;
}
}
/*---------------------避障模块----------------------------*/
avoidance()
{
AP=1;
AD=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
PWMA(Speed[8]);//前进
AP=1;
AD=0;
PWMB(Speed[14]);
BP=1;
BD=0;
Xdelay(50);//左大转
while((P2&0x3f)!
=0x00)
{
Tracing();
zhang_flag=0;
}
PWMA(Speed[8]);//前进
AP=1;
AD=0;
PWMB(Speed[14]);
BP=0;
BD=1;
Xdelay(50);
}
voidXdelay(unsignedintms)
{
unsignedchari;
while(ms--)
{
for(i=0;i<255;i++);
}
}
/***************************超声波测距*********************/
voiddelay_20us()//延时20us
{
ucharbt;
for(bt=0;bt<100;bt++);
}
/*--------------------测距初始化------------------------------*/
voidBinit_all()
{
Trig=0;//首先拉低脉冲输入引脚
EA=1;
TMOD=0x10;
TH1=0;//定时器1清零
TL1=0;//定时器1清零
}
chaoshengboceju()
{
Trig=1;//超声波输入端
delay_20us();//延时20us
Trig=0;//产生一个20us的脉冲
while(Echo==0);//等待Echo回波引脚变高电平
EX0=1;
IT0=1;
ET1=1;
TR1=1;//启动定时器1
//delay(20);//等待测
while(succeed_flag==0)
{
uinti,j;
for(i=500;i>0;i--)
for(j=0;j<1000;j++){;}
break;
}
succeed_flag=0;//清测量成功标志
Btime=timeH*256+timeL;
distance=Btime*0.172;//0.344/2=0.172mm
if(distance>=500)
{
zhang_flag=0;
}
else
zhang_flag=1;
}
/***************************中断程序设计************************/
voidexter()interrupt0//外部中断0是0号
{
EX0=0;
timeH=TH1;//取出定时器的值
timeL=TL1;//取出定时器的值
succeed_flag=1;//至成功测量的标志
TR1=0;//关闭定时器1
EX0=1;
}
voidtimer1()interrupt3//定时器1中断,用做超声波测距计时
{
TH1=0;
TL1=0;
}
/*************************测速及显示************************/
/*-----------------------毫秒延时------------------------*/
voiddelay(ucharms)//LCD延时子程序
{
uchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写命令--------------------*/
bitlcd_bz()//测试LCD忙碌状态
{
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
ep=0;
returnresult;
}
voidlcd_wcmd(unsignedcharcmd)//写指令数据到LCD子程序
{
while(lcd_bz());//判断LCD是否忙碌
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_pos(ucharpos)//设定显示位置子程序
{
lcd_wcmd(pos|0x80);
}
voidlcd_wdat(unsignedchardat)//写入显示数据到LCD子程序
{
while(lcd_bz());//判断LCD是否忙碌
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_init()//LCD初始化子程序
{
lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
delay
(1);
lcd_wcmd(0x06);
delay
(1);
lcd_wcmd(0x01);
delay
(1);
}
/********************初始化********************/
voidinit_all()
{lcd_init();
delay(10);
z=0;//初始化z的值
count=0;//初始化count的值
zhuan=0;//初始化转的值
RCAP2H=0x3c;//定时10ms常数
RCAP2L=0xb0;
TH2=RCAP2H;//定时器2赋初值
TL2=RCAP2L;
EA=1;//开总中断
ET2=1;//开外定时器2中断
TR2=1;//启动定时器2
IT1=1;//外部中断0为下降沿触发
EX1=1;//开外部中断0
}
/*-------------------外部中断0计数程序-------------------*/
voidcounter(void)interrupt2
{
EX1=0;//关外部中断0
count++;
if(count==4)//4次循环为电机转一圈
{
z++;
count=0;//转圈计数加1
}//计数+1
EX1=1;//开外部中断0
}
/*-----------------内部中断2计时计数程序-----------------*/
voidTimer_0(void)interrupt5
{TF2=0;
msec++;
if(msec==20)//50*20=1s
{zhuan=z;
msec=0;
z=0;
update_clock();
sudu_count();//套用数据更新
licheng_count();
}
}
/*------------------时间数据更新-----------------------*/
voidupdate_clock()
{
set_time[1]++;
if(set_time[1]==0x3c)//秒加1
{
set_time[1]=0;
set_time[0]++;
}
if(set_time[0]==0x3c)//分加1
{
set_time[0]=0;
}
t4=set_time[1]/10;
t3=set_time[1]%10;
t2=set_time[0]/10;
t1=set_time[0]%10;
}
/*-----------------------速度数据处理------------------------*/
voidsudu_count()
{
route=zhuan*22;//计算速度转换为厘米
baiwei=route/100;//百位
shiwei=(route%100)/10;//十位
gewei=route%10;//个位
}
/*----------------里程数据处理--------------------*/
voidlicheng_count()
{ucharS,time;
time=set_time[0]*60+set_time[1];
S=(route*time)/100+S;//计算里程
bai=S/100;//百位
shi=(S%100)/10;//十位
ge=S%10;//个位
}
/*------------------------LCD显示------------------------*/
voiddisplaytolcd()
{
lcd_pos(0x00);//设置显示位置
lcd_wdat(dis1[0]);
delay(20);
lcd_wdat(dis1[1]);
lcd_wdat(dis2[baiwei]);//百位
lcd_wdat(dis2[shiwei]);//十位
lcd_wdat(dis2[gewei]);//个位
lcd_wdat(dis3[0]);
delay(20);
lcd_wdat(dis3[1]);
delay(20);
lcd_wdat(dis3[2]);
delay(20);
lcd_wdat(dis3[3]);
lcd_pos(0x0A);
lcd_wdat(dis4[0]);
delay(20);
lcd_wdat(dis4[1]);
lcd_wdat(dis2[bai]);//百位
lcd_wdat(dis2[shi]);//十位
lcd_wdat(dis2[ge]);//个位
lcd_wdat(dis4[2]);
lcd_pos(0x40);//设置显示位置
lcd_wdat(dis5[0]);
delay(20);
lcd_wdat(dis5[1]);
lcd_wdat(dis2[t2]);
lcd_wdat(dis2[t1]);
lcd_wdat(dis2[10]);
delay(20);
lcd_wdat(dis2[t4]);
lcd_wdat(dis2[t3]);
lcd_pos(0x48);//设置显示位置
lcd_wdat(dis6[0]);
delay(20);
lcd_wdat(dis6[1]);
delay(20);
lcd_wdat(dis6[2]);
lcd_wdat(dis2[distance/100]);//百位
lcd_wdat(dis2[(distance%100)/10]);//十位
lcd_wdat(dis2[distance%10]);//个位
lcd_wdat(dis6[3]);
delay(20);
lcd_wdat(dis6[4]);
}
/****************************主函数**************************/
voidmain()
{
Xinit_all();//循迹初始化
Binit_all();
init_all();//显示速度初始化
while
(1)
{
chaoshengboceju();
displaytolcd();
if(zhang_flag==0)//障碍标志位为0
Tracing();
else
avoidance();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 避障寻迹 小车 软件设计 软件 程序