自动避障寻迹小车软件设计软件程序.docx

上传人:b****0 文档编号:9477147 上传时间:2023-05-19 格式:DOCX 页数:19 大小:18.83KB
下载 相关 举报
自动避障寻迹小车软件设计软件程序.docx_第1页
第1页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第2页
第2页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第3页
第3页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第4页
第4页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第5页
第5页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第6页
第6页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第7页
第7页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第8页
第8页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第9页
第9页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第10页
第10页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第11页
第11页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第12页
第12页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第13页
第13页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第14页
第14页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第15页
第15页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第16页
第16页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第17页
第17页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第18页
第18页 / 共19页
自动避障寻迹小车软件设计软件程序.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

自动避障寻迹小车软件设计软件程序.docx

《自动避障寻迹小车软件设计软件程序.docx》由会员分享,可在线阅读,更多相关《自动避障寻迹小车软件设计软件程序.docx(19页珍藏版)》请在冰点文库上搜索。

自动避障寻迹小车软件设计软件程序.docx

自动避障寻迹小车软件设计软件程序

系统总程序

#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();

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2