| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8859 人关注过本帖
标题:急需请帮助--修改程序---51智能小车超声波避障数码管显示距离PWM调速--谢谢
只看楼主 加入收藏
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
找到重复定义的行进行修改试试

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-06-29 21:06
BBOY愿愿
Rank: 3Rank: 3
来 自:四川
等 级:论坛游民
威 望:9
帖 子:60
专家分:67
注 册:2015-12-9
收藏
得分:0 
#include <reg52.h>        //器件配置文件
#include <intrins.h>
#include <math.h>
#define  uint  unsigned int
#define  uchar unsigned char
sbit RX = P3^1;      //ECHO
sbit TX = P3^2;         //
sbit in1  = P1^0;
sbit in2  = P1^1;
sbit in3  = P1^2;
sbit in4  = P1^3;
unsigned long S=0;     
uint  time =0;
uint  timer=0;
uchar posit=0;
uint  flag =0;
uchar code discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
uchar code positon[3]={ 0xfe,0xfd,0xfb};
uchar disbuff[4]={ 0,0,0,0,};

/***********************函数声明**************************/
void DelayMs(uchar t);
void DelayUs2x(uchar t);
void go();                 //前进
void turnleft();           //左转
void turnright();          //右转
void stop();               //停车
void back();               //后退
void delay(uint z);        //延时函数,调节电机转速
void chaoshengbo();
void Display();
void Conut();
/********************************************************/
    void Display()                 //扫描数码管
    {
     while(posit<2)
     {
      P0=discode[disbuff[posit]];
      P2=positon[posit];
      ++posit;
      DelayMs(3);
      }
      posit=0;
    }

void delay(uint z)  //延时函数,调节电机转速
{
    uint i,j;
    for(i=2;i>0;i--)
    for(j=z;j>0;j--);   
}
/********************************************************/
void Conut()
    {
     time=TH1*256+TL1;
     TH1=0;
     TL1=0;         //清除定时器1寄存器中的值
     S=time/58;     //算出来是CM
     if(S>=100)     //超出测量范围显示“-”
     {     
      //flag=0;
      disbuff[0]=10;       //“-”
      disbuff[1]=10;       //“-”
     }
     else
     {
      disbuff[0]=S%100/10;
      disbuff[1]=S%100%10;
     }
           
    if(S>=30)
    {   
       flag=0;             //前进
    }
    else if(S<30 && S>20)
    {     
         flag=3;          //左转
    }
    else if(S<=20)         
    {
         flag=1;          //后退
    }
}        

/*********************************************************/

void  main()  /////////////////////////////////////////////////////

{  
   
    TMOD=0x11;             //设T0为方式1,GATE=1//门控位;
    TH0=0;
    TL0=0;         
    TH1=0xf8;             //2MS定时
    TL1=0x30;
    EX0=1;               //允许INT0外部中断           ///////外部中断0///  
    IT0=0;               //外部中断INT0               电平触发方式

    ET1=1;                 //允许T1中断
    TR1=1;                 //T1控制位TR1置1时,T1定时器工作;TR1置0时,T1停止工作

    ET0=1;                 //允许T0中断
    TR0=1;                 //T0控制位TR0置1时,T0定时器工作;TR0置0时,T0停止工作

    EA=1;                 //启动总中断
    while(1)
    {
       switch(flag)
       {
    case 0:   
            //stop();
            while(1)
            {
                go();
                if(flag!=0)                 //前进
                break;
            }
            break;
    case 1:
            stop();
            while(1)
            {
                back();
                if(flag!=1)                 //后退
                break;
            }
            break;
    case 2:
            //stop();
            while(1)
            {
                turnleft();
                if(flag!=2)                 //左转
                break;
            }
            break;
    case 3:     
            //stop();
             while(1)
            {
                turnright();
                if(flag!=3)                  //右转
                break;
            }
            break;
    case 4:
            stop();
            while(1)
            {
                if(flag!=4)                  //停车
                break;
            }
    break;
    default:
    break;
       }

    }
                 
}

     
void DelayUs2x(uchar t)
{   
    while(--t);
}
void DelayMs(uchar t)
{
    while(t--)
    {
        //大致延时1mS   
        DelayUs2x(245);
        DelayUs2x(245);
    }
}

void go()                //前进        0
{
      in1=1;
      in2=0;
      in3=1;
      in4=0;
      delay(10-3);         //PWM软件延时
      in1=0;
      in2=0;
      in3=0;
      in4=0;
      delay(3);         //PWM软件延时
}

void back()              //后退        1
{
    in1=0;
    in2=1;
    in3=0;
    in4=1;
    delay(10-3);
    in1=0;
    in2=0;
    in3=0;
    in4=0;
    delay(3);
}

void turnleft()          //左转        2
{
    in1=0;
    in2=1;
    in3=1;
    in4=0;
    delay(10-3);
    in1=0;
    in2=0;
    in3=0;
    in4=0;
    delay(3);
}

void turnright()         //右转        3
{
    in1=1;
    in2=0;
    in3=0;
    in4=1;
    delay(10-3);
    in1=0;
    in2=0;
    in3=0;
    in4=0;
    delay(3);
}

void stop()              //停车        4
{
    in1=0;
    in2=0;
    in3=0;
    in4=0;

}

     //T0中断    计数器0    溢出,超过测距范围
void  time1()  interrupt 3          //T1中断   用来扫描数码管和计800MS启动超声波模块
  {
     TH1=0xf8;                  //1111 1000        //2MS定时
     TL1=0x30;                  // 0011 0000
     timer++;
     if(timer>=400)
     {
      timer=0;
       TX = 1;        //P1_2                    //800MS  启动超声波模块
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      TX = 0;             //P1_2
      while(!RX);            //当echoRX=P1_1  接收   为零时等待
      TR1=1;                //开启计数
      while(RX);            //当RX=P1_1  接收   为1计数并等待
      TR1=0;                //关闭计数
     }
  }
/********************************************************/
void int0() interrupt 0             //INT0外部中断
{
     Conut();                        //计算
     Display();                     //调用函数   数码管显示     
}


/*    void chaoshengbo()
    {
    TX=1;               //TRIG 控制  触发信号是高电平脉冲,宽度大于10us
    DelayUs2x(10);
    TX=0;
    while(!RX);            //当echoRX=P1_1  接收   为零时等待
    TR0=1;                //开启计数
    while(RX);            //当RX=P1_1  接收   为1计数并等待
    TR0=0;                //关闭计数
    }      */

其实你可以很优秀------对自己说-----即使遍体鳞伤也要活得漂亮-------
2016-06-30 16:52
BBOY愿愿
Rank: 3Rank: 3
来 自:四川
等 级:论坛游民
威 望:9
帖 子:60
专家分:67
注 册:2015-12-9
收藏
得分:0 
回复 12楼 BBOY愿愿
这次是改得差不多了    感觉还有点小问题     数码管显示不来 超声波所测的距离   


请教各路朋友

其实你可以很优秀------对自己说-----即使遍体鳞伤也要活得漂亮-------
2016-06-30 16:54
BBOY愿愿
Rank: 3Rank: 3
来 自:四川
等 级:论坛游民
威 望:9
帖 子:60
专家分:67
注 册:2015-12-9
收藏
得分:0 
回复 13楼 BBOY愿愿
还有就是 自己对这个定时器/计数器和中断   



有点晕    懂的前辈 能指点一下吗

其实你可以很优秀------对自己说-----即使遍体鳞伤也要活得漂亮-------
2016-06-30 16:57
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
大概是利用定时器/计数器对超声波测距的返回时间进行计数,然后根据返回时间计算出距离。但我没有看到计算距离和显示数值的程序哟。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-01 06:04
BBOY愿愿
Rank: 3Rank: 3
来 自:四川
等 级:论坛游民
威 望:9
帖 子:60
专家分:67
注 册:2015-12-9
收藏
得分:0 
回复 15楼 hu9jj
在Conut里面
void Conut()
    {
     time=TH1*256+TL1;
     TH1=0;
     TL1=0;         //清除定时器1寄存器中的值
     S=time/58;     //算出来是CM
     if(S>=100)     //超出测量范围显示“-”
     {     
      //flag=0;
      disbuff[0]=10;       //“-”
      disbuff[1]=10;       //“-”
     }
     else
     {
      disbuff[0]=S%100/10;
      disbuff[1]=S%100%10;
     }

其实你可以很优秀------对自己说-----即使遍体鳞伤也要活得漂亮-------
2016-07-02 12:20
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
这段计算距离和转换成显示数据的程序非常简洁,值得借鉴。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-04 06:34
BBOY愿愿
Rank: 3Rank: 3
来 自:四川
等 级:论坛游民
威 望:9
帖 子:60
专家分:67
注 册:2015-12-9
收藏
得分:0 
回复 17楼 hu9jj
谢谢   

但是不行的

其实你可以很优秀------对自己说-----即使遍体鳞伤也要活得漂亮-------
2016-07-05 14:44
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
检查一下数码管显示的代码看看。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2016-07-07 15:45
武汉Boy
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2018-2-9
收藏
得分:0 
一般来说用定时器产生一个占空比可变的方波就行了~

比如1秒输出高,一秒输出低~
2018-02-12 07:37
快速回复:急需请帮助--修改程序---51智能小车超声波避障数码管显示距离PWM调速- ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025374 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved