找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1828|回复: 3
打印 上一主题 下一主题
收起左侧

求大神帮助,超声波避障和四路寻迹程序不能用

[复制链接]
跳转到指定楼层
楼主
ID:236930 发表于 2017-10-1 20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
#include<intrins.h>                               
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0;
unsigned char zkb2=0;
unsigned char t=0;
unsigned int  time=0;
unsigned long S=0;
bit      flag=0;
sbit Trig=P2^4;
sbit Echo=P2^5;
sbit ENA=P1^0;
sbit ENB=P1^5;
sbit P22=P1^1;            //左电机
sbit P23=P1^2;                   //左电机
sbit P24=P1^3;                   //右电机
sbit P25=P1^4;            //右电机
sbit P10=P0^0;                 //左1
sbit P11=P0^1;                 //左2
sbit P12=P0^2;                 //右2
sbit P13=P0^3;                //右1

void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

void init()
{
        TMOD=0X11;
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        EA=1;
        ET0=1;
        ET0=1;
        TR0=1;
        TH1=0;
        TL1=0;       
}
void TiaoSu()interrupt 1
{
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        if(t<zkb1)
        ENA=1;
        else
        ENA=0;
        if(t<zkb2)
        ENB=1;
        else
        ENB=0;
        t++;
        if(t>=100)
        {t=0;}
}
void qianjin()                                 //直走
{
        zkb1=100;                                                       
        zkb2=100;
        P23=0;                                                       
        P25=0;
}
void turnleft1()                        //左边走大弯
{
        zkb1=80;
        zkb2=80;
        P23=0;                                                                        
        P24=0;
}
void turnleft2()                   //左边走小弯
{
        zkb1=80;
        zkb2=80;
        P22=0;
        P25=0;
}
void turnright1()                  //右边走大弯
{
        zkb1=80;
        zkb2=80;
        P22=0;
        P25=0;
}
void turnright2()                 //右边走小弯
{
        zkb1=80;
        zkb2=80;
        P23=0;                                                                        
        P24=0;
}
void stop()                                 //停车
{
        P22=0;                                                         
        P23=0;
        P24=0;
        P25=0;
}
void xunji()
{
        uchar flag;                                                                                          
        if(P10==0&&P11==0&&P12==0&&P13==0)                    //全速前进
        {flag=0;}
        else if(P10==1&&P11==0&&P12==0&&P13==0)                   //右边走大弯
        {flag=1;}
        else if(P10==0&&P11==0&&P12==0&&P13==1)                  //左边走大弯
        {flag=2;}
        else if(P10==0&&P11==1&&P12==0&&P13==0)                //左边走小弯
        {flag=3;}
        else if(P10==0&&P11==0&&P12==1&&P13==0)                   //右边走小弯
        {flag=4;}
        else if(P10==1&&P11==1&&P12==1&&P13==1)                //停车
        {flag=5;}
        switch (flag)
        {
                case 0:qianjin();break;
                case 1:turnright1();break;
                case 2:turnleft1();break;
            case 3:turnleft2();break;
                case 4:turnright2();break;
                case 5:stop();break;
                default:break;
        }
}
void Conut(void)
{
        time=TH1*256+TL1;       
        S=(time*1.7)/100;     //算出来是CM
        if((S>=20)||flag==1) //超出测量范围
        {         
                flag=0;
                xunji();
        }
        if(S<=20)
        {
                zkb1=50;                                                       
                zkb2=50;
                P22=0;                                                       
                P24=0;
                delayms(1);

                zkb1=100;
                zkb2=100;
                P23=0;                                                                        
                P24=0;
                delayms(1);
                xunji();
        }
}

void CSB() interrupt 3                  //T0中断用来计数器溢出,超过测距范围
{
    flag=1;                                                         //中断溢出标志
}
void  chaoshengbo()                          //启动模块
{
          Trig=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          Trig=0;
}
void main()
{
        init();       
        P22=1;
        P23=0;
        P24=1;
        P25=0;
        ENA=1;
        ENB=1;
        while(1)
        {
                chaoshengbo();
                xunji();
                while(!Echo);                //当RX为零时等待
                TR1=1;                            //开启计数
                  while(Echo);                //当RX为1计数并等待
                  TR1=0;                                //关闭计数
              Conut();                        //计算
        }
}





//#include <reg52.h>
//#include <math.h>
//#define uchar unsigned char
//#define uint  unsigned in
//sbit TRIG = P1^0 ;
//sbit ECHO = P1^1 ;
//sbit pwm  = P1^7;        //PWM信号输出口
//sbit in1  = P1^3;
//sbit in2  = P1^4;
//sbit in3  = P1^5;
//sbit in4  = P1^6;
//uchar n,count,angle,left,right;         //距离标志位,0.5ms次数,角度标识
//float S;       //距离变量
//
//void DelayUs2x(uchar t)
//{   
//while(--t);
//}
//
//void DelayMs(uchar t)
//{
//while(t--)                   //大致延时1mS
//{
//     DelayUs2x(245);
//     DelayUs2x(245);
//}
//}
///*------------------------------------------------
//                    定时器0初始化
//------------------------------------------------*/
//void TIM0init(void)
//{
//
//  TMOD|= 0x11;//定时器1工作方式1 (超声波)          定时器0舵机
//  TH1=0x00;   
//  TL1=0x00;
//  TH0=0xff;
//  TL0=0xa3;          //11.0592MHz晶振,0.5ms
//  ET1=1;
//  ET0=1;
//  EA=1;
//  TR0=1;           //定时器开始
//  IE=0x82;
//}
//
//  void chaoshengbo ()
//  {
//        TRIG=1;       //触发信号是高电平脉冲,宽度大于10us
//   DelayUs2x(10);
//   TRIG=0;
//   while(!ECHO); //等待高电平
//   TR1=1;
//   while(ECHO);  //等待低电平
//   TR1=0;
//   S=TH1*256+TL1;//取出定时器值高8位和低8位合并
//   S=S/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
//                             // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
//        if(S>=25)
//        {n=1;}
//
//        if(S<25)
//        {n=0;}
//
//
//   TH1=0;
//   TL1=0;        //清除定时器0寄存器中的值
//
//        
//
//  }
///*------------------------------------------------
//                    主函数
//------------------------------------------------*/
//main()
//{
//          angle=12;
//        count=0;
//  TIM0init();    //初始化定时器
//  while(1)
//  {         
//         chaoshengbo();
//         DelayMs(20);
//         if(n==1)
//         {go();}
//         if        (n==0)
//         {
//                stop();
//                n=1;
//                angle=5;
//                count=0;
//                DelayMs(400);
//                chaoshengbo();
//                DelayMs(20);
//                right=n;
//                n=1;
//            angle=12;
//                count=0;
//                DelayMs(400);
//                angle=19;
//                count=0;
//                DelayMs(400);
//            chaoshengbo();
//                DelayMs(20);
//                left=n;
//                angle=12;
//                count=0;
//                DelayMs(400);
//                n=1;
//
//           if(right==1)
//        {
//            turnright();
//            DelayMs(450);
//        }
//           else if(right==0&&left==1)
//        {
//            turnleft();
//            DelayMs(450);
//        }
//       else
//   {
//        back();
//        DelayMs(500);
//        turnleft();
//        DelayMs(1000);
//   }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:236930 发表于 2017-10-1 20:07 | 只看该作者
求大佬帮我看看
回复

使用道具 举报

板凳
ID:82765 发表于 2017-10-1 21:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:236930 发表于 2017-10-2 07:58 | 只看该作者
cjjcjj1 发表于 2017-10-1 21:09
具体实验的现象,总要说一下吧,只发了代码,让大家怎么去想象

超声波能用,可是调速不能用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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