#define uchar unsigned char
#define uint unsigned int
sbit inl1=P2^0; //左电机输出1
sbit inl2=P2^1; //左电机输出2
sbit inr1=P2^2; //右电机输出1
sbit inr2=P2^3; //右电机输出2
sbit s_left=P2^4; //左传感器
sbit s_right=P2^5; //右传感器
sbit s_mid=P2^6; // 中间传感器
sbit barrier=P2^7;//障碍物扫描传感器
sbit beep=P1^0;//探到铁报警接蜂鸣器
uint b_count=0;// 障碍物扫描位置基数
uchar alter_time=0;//报警计数值
uchar go_go=1;//小车前进中断标志
sbit left_light=P1^2;
sbit right_light=P1^1;
uchar second=0;
sbit P32=P3^2;
uchar b_left,b_right;
/****红外遥控程勋数据****/
uchar irtime;
uchar startflag;
uchar irdata[33];
uchar irreceok;
uchar irproseok;
uchar dis[8];
uchar bitnum;
uchar cd,flag,yaokong;
uchar ircode[4];
uchar right=0,left=0,stop_stop=0,model=0;
uchar kuai;
void stop(void);
void delay(uint a);
void ir_key() //遥控键盘识别
{
if(ircode[2]==0x51&&ircode[3]==0xAE&&flag==1)
{
yaokong=~yaokong; //打开遥控模式
flag=0;
}
if(ircode[2]==0x55&&ircode[3]==0xAA&&flag==1) //前进后退模式选择
{
model=~model;
right=0;
left=0;
flag=0;
}
if(ircode[2]==0x56&&ircode[3]==0xA9&&flag==1)
{ //遥控前进标志位
stop_stop=~stop_stop;
left=0;
right=0;
flag=0;
}
if(ircode[2]==0x17&&ircode[3]==0xE8&&flag==1) //遥控左拐标志位
{
left=1;
right=0;
stop_stop=0;
flag=0;
}
if(ircode[2]==0x16&&ircode[3]==0xE9&&flag==1) //遥控右转标志位
{
right=1;
stop_stop=0;
left=0;
flag=0;
}
if(ircode[2]==0x11&&ircode[3]==0xEE&&flag==1) //遥控右转标志位
{
kuai=~kuai;
flag=0;
}
}
void timer1init() //定时器1初始化
{
TMOD=0x21;
TH1=0x00;
TL1=0x00;
ET1=1;
TR1=1;
}
void int1init() //外部中断1初始化
{
IT1=1;
EX1=1;
EA=1;
}
void irpros(void) //红外处理函数
{
uchar k,j,i;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6)
{
value=value|0x80;
}
k++;
}
ircode[j]=value;
}
irproseok=1;
}
void irwork() //红外解码函数
{
uchar i;
dis[0]=ircode[0]/16;
dis[1]=ircode[0]%16;
dis[2]=ircode[1]/16;
dis[3]=ircode[1]%16;
dis[4]=ircode[2]/16;
dis[5]=ircode[2]%16;
dis[6]=ircode[3]/16;
dis[7]=ircode[3]%16;
for(i=0;i<8;i++)
{
if(dis[i]>9)
{
cd=dis[i]-9;
dis[i]=0x10+cd;
}
}
flag=1;
}
void inti() //初始化定时器0,中断0
{ P2=0xff;
P0=0xff;
P1=0xff;
P3=0xff;
EX0=1;
IT0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=0;
}
void delay(uint a) ////延时 1ms
{
int i;
for (; a>0; a--)
for(i=0; i<110; i++);
}
void go_along(void) //直走
{
inl1=1;
inl2=0;
inr1=1;
inr2=0;
}
void go_left(void) // 向左转
{ left_light=0;
inl1=0;
inl2=0;
inr1=1;
inr2=0;
}
void go_right(void) //向右转
{ right_light=0;
inl1=1;
inl2=0;
inr1=0;
inr2=0;
}
void go_back(void) //后退
{
inl1=0;
inl2=1;
inr1=0;
inr2=1;
}
void left_back(void) //左转弯后退
{ left_light=0;
inl1=0;
inl2=0;
inr1=0;
inr2=1;
}
void right_back(void) //右转弯后退
{ right_light=0;
inl1=0;
inl2=1;
inr1=0;
inr2=0;
}
void stop(void) //停止
{
inl1=0;
inl2=0;
inr1=0;
inr2=0;
}
void kill_stop(void) //杀停
{
inl1=1;
inl2=1;
inr1=1;
inr2=1;
}
/***************先扫描中间传感器如不再黑线上刹停,扫描
左右两个传感器,如果左边在黑线上,向右转,如果右边在黑
向上向左转知道都在黑向上前进*******************/
void scan_sensor(void) //扫描前面传感器 并前行
{
if(s_mid==1)
{
kill_stop();
delay(3);
stop();
delay(3);
if (s_right==0)
{
go_right();
delay(7);
}
else
if (s_left==0)
{
go_left();
delay(7);
}
else {
stop();
delay(4);
go_along();
delay(5);
}
}
else{
kill_stop();
delay(3);
stop();
delay(3);
if(s_right==0)
{
go_right();
delay(6);
}
else
if(s_left==0)
{
go_left();
delay(6);
}
else {
go_along();
delay(6);
}
}
}
/**********如果遇见障碍物先向左转到180度还有障碍物,
之后向右转到没有障碍物为止之后前进***************/
void bizhang() //避开障碍物函数
{
if(barrier==0)
{ if(b_count<=100)
{
go_left();
delay(5);
b_count++;
}
else{
left_back();
delay(10);
}
}
else{ if(b_left==1)
{
go_left();
delay(50);
b_left=0;
}
if(b_right==1)
{
left_back();
delay(50);
b_right=0;
}
go_along();
delay(5);
b_count=0;
}
}
/****发现铁片则停止三秒钟****/
void fironalter() //发现铁报警清楚函数
{
if(second==3)
{
second=0;
beep=1;
go_along();
delay(300);
EX0=1;
go_go=1;
}
}
main()
{
int1init();
timer1init();
inti();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irproseok)
{
irwork();
irproseok=0;
}
ir_key();
if(yaokong==0xff) //遥控模式
{ if(kuai==0)
{ stop();
delay(5);
}
if(model==0) //前行模式
{ if(go_go==1)
{
if(left==0xff)
{ stop();
delay(2);
go_left();
delay(5);
}
else
if(right==0xff)
{ stop();
delay(2);
go_right();
delay(5);
}
else
if(stop_stop==0xff)
{ stop();
delay(5);
}
else
{
go_along();
delay(5);
}
}
else
{
stop();
delay(5);
}
}
else //后退模式
{ if(go_go==1)
{
if(left==0xff)
{ stop();
delay(2);
left_back();
delay(5);
}
else
if(right==0xff)
{ stop();
delay(2);
right_back();
delay(5);
}
else
if(stop_stop==0xff)
{ stop();
delay(5);
}
else
{
go_back();
delay(5);
}
}
else
{
stop();
delay(5);
}
}
left=0;
right=0;
}
else //循迹模式
{
if(go_go==1)
{ stop();
delay(5);
if(s_right==0&&s_left==0&&s_mid==0)
bizhang();
else
scan_sensor();
}
else
{
stop();
}
}
fironalter();
left_light=1;
right_light=1;
}
}
void int0() interrupt 0
{
beep=0;
kill_stop();
delay(10);
alter_time=0;
TR0=1;
go_go=0;
EX0=0;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
alter_time++;
if(alter_time==20)
{
alter_time=0;
second++;
}
}
void timer1() interrupt 3
{
irtime++;
}
void int1() interrupt 2
{
if(startflag)
{
if(irtime>32)
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
上一篇:AT24C02开机记忆
下一篇:单片机汇编延时程序的理解
推荐阅读最新更新时间:2024-03-16 13:06