找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3498|回复: 7
收起左侧

菜鸟的超声波避障程序调不对,请大神们给点建议

[复制链接]
ID:130125 发表于 2016-7-12 10:04 | 显示全部楼层 |阅读模式
#include<reg52.h>                                      超声波和驱动代码单独运行的话都没问题,加在一起就不行了。麻烦大神给我指点指点

#include <intrins.h>
sbit RX=P2^1;
sbit TX=P2^0;

sbit K0=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3;

unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;
bit      flag =0;

#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]       ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能           : 使用数码管显示
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位   
        }
        GPIO_DIG=disbuff;//发送段码
        j=10;                         //扫描间隔时间设定
        while(j--);   
        GPIO_DIG=0x00;//消隐
    }
}
/********************************************************/
    void Conut(void)                               这是超声波计算
    {
     time=TH0*256+TL0;
     TH0=0;
     TL0=0;
   
     S= (long)(time*0.17);     //算出来是CM
     if((S>=4000)||flag==1) //超出测量范围显示“ERR0”
     {     
      flag=0;
      disbuff[0]=0x3f;       //“-”
      disbuff[1]=0x50;       //“-”
      disbuff[2]=0x50;       //“-”
      disbuff[3]=0x79;       //“-”
     }
     else
     {
      disbuff[3]=DIG_CODE[S%10000/1000];
      disbuff[2]=DIG_CODE[S%1000/100];
      disbuff[1]=DIG_CODE[S%100/10];
      disbuff[0]=DIG_CODE[S%10/1];
     }
    }

    /*驱动程序  */                   这是驱动
    void qudong()
{
   while(1)
    {
      K0=0;
      K1=1;

      K2=1;
      K3=0;
   
    }

}
/********************************************************/
     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                             //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3          //T1中断用来扫描数码管和计800MS启动模块
  {
     TH1=0xf8;
     TL1=0x30;
     DigDisplay();
     timer++;
     if(timer>=100)
     {
      timer=0;
      TX=1;                            //800MS  启动一次模块
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      TX=0;
     }
  }

  void zdqd() interrupt 5
  {
   TMOD=0x05;
   TH2=0xf8;
   TL2=0x30;
   ET2=1;
   TR2=1;
   EA=1;
   qudong();
  }
/*********************************************************/

    void  main(  void  )

  {  
    TMOD=0x11;           //设T0为方式1,GATE=1;
    TH0=0;
    TL0=0;         
    TH1=0xf8;           //2MS定时
    TL1=0x30;
    ET0=1;             //允许T0中断
    ET1=1;               //允许T1中断
    TR1=1;               //开启定时器
    EA=1;               //开启总中断

    qudong();
    while(1)
    {
     while(!RX);        //当RX为零时等待
     TR0=1;                //开启计数
     while(RX);            //当RX为1计数并等待            
     TR0=0;                //关闭计数
     Conut();   
      qudong();                                                    在这里我发现如果qudong()在Count()前面,小车只是往前走但是超声波不测距。。。
                                                                         反之,超声波只测距不驱动小车

                 //计算
    }

  }


回复

使用道具 举报

ID:130180 发表于 2016-7-12 15:42 | 显示全部楼层
void qudong()
{
   while(1)
    {
      K0=0;
      K1=1;

      K2=1;
      K3=0;
   
    }

}

驱动程序里面为什么有个while(1)?

去了这个试试
回复

使用道具 举报

ID:130125 发表于 2016-7-12 19:11 | 显示全部楼层
3154 发表于 2016-7-12 15:42
void qudong()
{
   while(1)

谢谢!可以行的通了,这是什么原因啊?
回复

使用道具 举报

ID:130125 发表于 2016-7-12 20:41 | 显示全部楼层
3154 发表于 2016-7-12 15:42
void qudong()
{
   while(1)

可以了,谢谢
回复

使用道具 举报

ID:129530 发表于 2016-7-13 15:37 | 显示全部楼层
看看
回复

使用道具 举报

ID:130370 发表于 2016-7-13 22:10 | 显示全部楼层
用   while(1)
就进入死循环了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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