循迹小车程序.docx
《循迹小车程序.docx》由会员分享,可在线阅读,更多相关《循迹小车程序.docx(16页珍藏版)》请在冰豆网上搜索。
循迹小车程序
/***********循迹小车程序****************************dragon******************/
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcount0=0;//低电平的占空比
ucharcount1=0;//高电平的占空比
ucharcount;//0.5ms次数标识
ucharjd;//角度标识
ucharjia;
ucharjian;
ucharjl;
bitFlag=1;//电机正反转标志位,1正转,0反转
sbitb=P0^4;//闪灯
sbitpwm=P1^1;//舵机控制信号
sbitKey_add=P3^5;//电机减速
sbitKey_dec=P3^6;//电机加速
sbitKey_turn=P3^4;//电机换向
sbitKey_stop=P3^7;//停车
sbitKey_been=P1^7;//喇叭按键
sbitbeen=P1^2;//蜂鸣器引脚
sbitrclf=P3^6;//循迹红外
sbitrcrt=P3^7;
sbitjz=P3^5;
sbitPWM1=P1^4;//PWM通道1,反转脉冲
sbitPWM2=P1^3;//PWM通道2,正转脉冲
sbitPWM3=P1^6;//PWM通道3,反转脉冲
sbitPWM4=P1^5;//PWM通道4,正转脉冲
/************函数声明**************/
voidDelay(ucharx);
voidMotor_speed_high(void);
voidMotor_speed_low(void);
voidMotor_turn(void);
/****************延时处理**********************/
voidDelay(ucharx)
{
uchary;
for(;x>0;x--)
for(y=110;y>0;y--);
}
/*******按键处理加pwm占空比,电机加速**********/
voidMotor_speed_high(void)//
{
if(Key_add==0)
{
Key_add=1;
count0+=5;
if(count0>=100)
{
count0=100;
}
}
}
/******按键处理减pwm占空比,电机减速*****/
voidMotor_speed_low(void)
{
if(Key_dec==0)
{
Key_dec=1;
count0-=5;
if(count0<=0)
{
count0=0;
}
}
}
/************电机正反向控制**************/
voidMotor_turn(void)
{
if(Key_turn==0)
{
Key_turn=1;
Flag=~Flag;
}
}
/************电机运行**************/
voidMotor_run(void)
{
if(Flag==1)//电机正转
{
PWM1=1;
PWM3=1;
if(++count1{
PWM2=0;
PWM4=0;
}
else
{
PWM2=1;
PWM4=1;
}
if(count1>=100)
{
count1=0;
}
}
else//电机反转
{
PWM2=1;
PWM4=1;
if(++count1{
PWM1=0;
PWM3=0;
}
else
{
PWM1=1;
PWM3=1;
}
if(count1>=100)
{
count1=0;
}
}
}
/************舵机控制**************/
voidMotor_duoji(void)
{
if(jia==1)
{
jia=0;
jd+=1;
count=0;//20秒周期从新开始
if(jd>=16)
jd=16;
}
if(jian==1)
{
jian=0;
jd-=1;
count=0;
if(jd<=12)
jd=12;
}
}
/************停车**************/
voidMotor_stop(void)
{
if(Key_stop==0)
{
Key_stop=1;
count0=0;
}
}
/************喇叭**************/
voidbeen_scan(void)
{
ucharm=500;
if(Key_been==0)
{
Key_been=1;
while(m--)
{
been=1;
Delay
(1);
been=0;
Delay
(1);
}
}
}
/**********************红外部分*************************************/
ucharirtime;//红外时间
ucharstartflag;//启动接收
ucharirdata[33];
ucharbitnum;
ucharirreceiveok;//红外接收完毕
ucharircode[4];
ucharirprosok;
voidirpros(void)//1.125ms/0.2777=4.39=4.05个irtime(数据零)
{
uchark,i,j;
ucharvalue;
k=1;//跳过引导码
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;//7次
if(irdata[k]>6)//8次
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
voidir_scan(void)
{
if(irreceiveok)
{
irpros();
irreceiveok=0;
}
if(irprosok)
{
irprosok=0;
}
if(ircode[3]==0xf7)
{
Key_turn=0;
ircode[3]=0;
}
if(ircode[3]==0xe6)
{
Key_dec=0;
ircode[3]=0;
}
if(ircode[3]==0xe5)
{
Key_add=0;
ircode[3]=0;
}
if(ircode[3]==0xff)
{
Key_stop=0;
ircode[3]=0;
}
if(ircode[3]==0xfb)
{
Key_been=0;
ircode[3]=0;
}
if(ircode[3]==0xf6)
{
jia=1;
ircode[3]=0;
}
if(ircode[3]==0xf5)
{
jian=1;
ircode[3]=0;
}
}
voidir_ch(void)
{
//if(rclf==1&&rcrt==0&&jd==13&&jl==0)
//{
//jl=1;
//count0=30;
//jia=1;
//}
//if(rcrt==1&&rclf==0&&jd==14&&jl==1)
//{
//count0=30;
//jian=1;
//}
//if(rcrt==1&&rclf==0&&jd==13&&jl==0)
//{
//jl=2;
//count0=30;
//jian=1;
//}
//if(rclf==1&&rcrt==0&&jd==12&&jl==2)
//{
//count0=30;
//jia=1;
//}
//
//if(rclf==0&&rcrt==0&&jd==13)
//
//{
//jl=0;
//jd=13;
//count0=100;
//}
//if(rclf==1&&rcrt==1&&jd==13)
//
//{
//jl=0;
//jd=13;
//count0=100;
//}
if(jz==1)
jd=14;
if(rclf==1&&rcrt==0&&jd==14)
{
count0=100;
jd=13;
}
if(rcrt==1&&rclf==0&&jd==13)
{
count0=100;
jd=15;
}
if(rcrt==1&&rclf==0&&jd==14)
{
count0=100;
jd=15;
}
if(rclf==1&&rcrt==0&&jd==15)
{
count0=100;
jd=13;
}
if(rclf==0&&rcrt==0&&jd==14)
{
count0=70;
}
//if(rclf==1&&rcrt==1&&jd==14)
//
//{
//
//count0=70;
//}
}
/***********定时器***********/
voidtimer0init(void)//定时器0初始化
{
TMOD=0X21;//定时器0工作1定时器1工作2
TH0=0Xff;//高第八位清零
TH1=0X00;//高第八位清零
TL0=0Xa4;
TL1=0X00;
EA=1;//打开全局中断允许位(中断允许寄存器IE)
TR0=1;//寄存器TCON,置一启动定时器0
TR1=1;//启动定时器1
ET0=1;//允许定时器0中断
ET1=1;//允许定时器1中断
}
voidint0init(void)//外部中断0初始化
{
IT0=1;//置一,跳变沿触犯方式,引脚INT0上,下降沿的负跳变有效
EX0=1;//外部中断0中断允许位
EA=1;//全局中断允许位
}
voidTime0_Int()interrupt1
{
TH0=0xff;
TL0=0xa4;
if(countpwm=1;
else
pwm=0;
count+=1;
count=count%100;
}
voidtimer0()interrupt3//定时器0,初值自动重装的8位定时器
{//最大计数值256,2的8次方
irtime++;//256//每加一,计数256次,计数一次时间为0.001085069ms
}//每加一,计数256次,共需0.2777ms
voidint0()interrupt0//外部中断0(INT0)
{
if(startflag)
{
b=~b;
if(irtime>32)//说明收到的是引导码13.5ms(引导码)/0.2777=48.7个irtime
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceiveok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
/*********主函数********************/
voidmain(void)
{
timer0init();//定时器0初始化
int0init();//外部中断0初始化
jd=14;
count=0;
Delay(5);
while
(1)
{
ir_scan();
ir_ch();
Motor_duoji();
Motor_turn();
Motor_speed_high();
Motor_speed_low();
Motor_run();
Motor_stop();
been_scan();
}
}