找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1992|回复: 0
收起左侧

基于51壁障遥控寻迹小车源代码

[复制链接]
ID:151076 发表于 2016-11-29 19:39 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uint unsigned int;
#define uchar unsigned char
sbit Trig=P3^1;
sbit Echo=P3^2;
sbit zuo1=P2^2;
sbit you1=P2^1;
sbit zuo2=P2^3;
sbit you2=P2^0;
sbit A=P1^0;
sbit E=P1^1;
sbit C=P1^2;
sbit D=P1^3;
sbit ENA=P1^4;
sbit ENB=P1^5;
sbit a=P2^4;
sbit b=P2^5;
sbit c=P2^6;
sbit d=P2^7;
uchar PWML,PWMR,t;
uint x,y;
uint timeH,distance,timeL,time;
void delay1(int e)
{
        int i,j;
        for(i=e;i>0;i--)
        for(j=5;j>0;j--);
}
void delayms(int f)
{
        int i,j;
        for(i=f;i>0;i--)
        for(j=110;j>0;j--);
}
void delay(int g)
{
        int i,j;
        for(i=2;i>0;i--)
        for(j=g;j>0;j--);
}
void delay_20us()
{
        uchar s;
        for(s=0;s<100;s++);
}
void yaokong()
{
        if(a==1)
        x=1;
        if(b==1)
        x=2;
        if(c==1)
        x=3;
        if(d==1)
        x=4;
}
void qianjin1()
{
        while(x!=4)
        {
                 A=0;E=1;
                 C=0;D=1;
         PWML=30;
                 PWMR=30;
                 delayms(1000);
                 PWML=100;
                 PWMR=100;
                 delayms(1000);
                 PWML=0;
                 PWMR=0;
                 delayms(1000);
                 A=1;E=0;
                 C=1;D=0;
                 PWML=100;
                 PWMR=100;
                 delayms(1000);
                 PWML=30;
                 PWMR=30;
                 delayms(1000);
                 x=4;
        }
}
void qianjin()
{        P1=0xfa;  //前进//
        delay(15-8);
        P1=0xff;
        delay(8);
}
void qianjin2()
{        P1=0xfa;  //前进
    delay1(50);
        P1=0xf0;
        delay1(50);
}
void zuozhuan()
{        P1=0xf2;  //左转动
        delay(15-9);
        P1=0xff;
        delay(9);
}
void zuozhuan1()
{       
   P1=0xf2;
   delay1(10);
   P1=0xf0;
   delay1(1);//左转动//

}
void youzhuan()
{        P1=0xf8;  //右转动//
        delay(15-9);
        P1=0xff;
        delay(9);
}
void xunji()
{
        if((zuo1==1)&&(zuo2==1)&&(you2==1)&&(you1==0))
                {
                y=1;//youzhuan();       
                }
        if((zuo1==1)&&(zuo2==1)&&(you2==1)&&(you1==1))
                {
                y=0;//qianjin();
                }
        if((zuo1==0)&&(zuo2==1)&&(you2==1)&&(you1==1))
                {
                y=2;//zuozhuan();       
                }
        if((zuo1==1)&&(zuo2==1)&&(you2==0)&&(you1==0))
                {
                y=1;//youzhuan();       
                }
        if((zuo1==0)&&(zuo2==0)&&(you2==1)&&(you1==1))
                {
                        y=2;//        zuozhuan();
                }
        if((zuo1==1)&&(zuo2==0)&&(you2==0)&&(you1==0))
                {
                y=1;//youzhuan();       
                }
        if((zuo1==0)&&(zuo2==0)&&(you2==0)&&(you1==1))
                {
                        y=2;//        zuozhuan();
                }
        switch(y)
        {
                case 0:qianjin();break;
                case 1:youzhuan();break;
                case 2:zuozhuan();break;
        }
}
void chaoshengbo()
{
        Trig=0;//拉低脉冲输入引脚
        TH1=0;//定时器高位清零
    TL1=0;//定时器低位清零
        Trig=1;//超声波输入端
        delay_20us();//延时20us
        Trig=0;//产生一个20us的脉冲
        while(Echo==0);//等待Echo回波引脚变低电平
        EX0=1;//打开外部中断0
        TR1=1;//启动定时器1
        while(Echo==1);//等待测量结果
        TR1=0;//关闭定时器1
        EX0=0;//关闭外部中断
    time=timeH*256+timeL;
        distance=time*0.172;//毫米
        if(distance>300)
                {
                        qianjin2();
                }
                else
                {
                  zuozhuan1();


                 }
}
void panduan()
{
          if(x==1)
        {
         TR0=0;
         TR1=0;
         xunji();
        }
        if(x==2)
        {
         TR1=0;
         TR0=1;
         qianjin1();
        }
        if(x==3)
        {
         TR0=0;
         chaoshengbo();
    }
        if(x==4)
        {
         P1=0xf0;
        }
}
void init()
{
TMOD=0x11;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
EA=1;
ET0=1;
ET1=1;
P1=0xf0;
P2=0x0f;
}
void main()
{       
  init();
  while(1)
  {
        yaokong();
        panduan();
  }
}
void T0_time() interrupt 1
{
        TH0=(65536-50)/256;
        TL0=(65536-50)%256;
        if(t<PWML)
         {
                  ENA=1;
        }
          else
          ENA=0;
          if(t<PWMR)
          ENB=1;
          else
          ENB=0;
          t++;
          if(t>=100)
          t=0;
}
void exter() interrupt 0//外部中断,判断回波电平
{       
        timeH=TH1;//取出定时器的值
        timeL=TL1;//取出定时器的值
}
void timer1() interrupt 3// 定时器1中断,超声波测距计时
{       
        TH1=0;
        TL1=0;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表