找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1328|回复: 2
收起左侧

单片机超声波1602显示程序,调速出了问题,求大佬解决

[复制链接]
ID:781863 发表于 2020-7-2 22:15 | 显示全部楼层 |阅读模式
IMG_0237(20200702-220305).PNG

这段程序是超声波1602显示+按键调速的,但一起执行下面的调速就没有用。如果把超声波显示给取消,调速就有用了。小白看了半天没调出来,希望有大佬可以帮下忙。
回复

使用道具 举报

ID:781863 发表于 2020-7-2 23:45 | 显示全部楼层
求解决:在显示距离同时可以按键调整小车速度
完整程序如下:
#include<reg52.h>
#include<1602.h>
#include<pwm.h>

sfr T2MOD=0XC9;


sbit Trig = P2^0;
sbit Echo = P2^1;


/*void UsartConfiguration();       
unsigned char i;                                 */

sbit IN1 = P3^7;                                                                                                                       
sbit IN2 = P3^6;
sbit IN3 = P3^5;
sbit IN4 = P3^4;
/************函数声明**************/


void forword();
void back();
void right();
void left();
void stop();

unsigned char BiaoTi[]=" distance:   ";
unsigned char code ShuZiBiao[15] = {'0','1','2','3','4','5','6','7','8','9','.','C','M'};
unsigned char XianShi[7]    ={ 0,0,0,0,0,0,0};
//2、设定发送时间
void Delay10us()
{
    T2MOD = 0;                //---- --00  初始化模式寄存器  默认向上计数
        T2CON = 0;                //0000 0000  初始化控制寄存器 一个中断源,16位自动重装模式
        TL2 = (65536 - 10) / 256;                //设置定时初值
        TH2 = (65536 - 10) % 256;                //设置定时初值
        RCAP2L = (65536 - 10) / 256;                //设置定时重载值
        RCAP2H = (65536 - 10) % 256;                //设置定时重载值
        TR2 = 1;                //定时器2开始计时
    IE = 0xA0;                //打开全局中断,定时器2中断
        while(!TF2);
        TF2 = 0;

/* TMOD |= 0x01;
  TH0 = 0xFF;
  TL0 = 0xF6;
  TR0 = 1;
  while(!TF0);
  TF0 = 0;          */
}

void Rstart()  //启动超声波模块,初始化
{
  Trig=0;
  Trig=1;
  Delay10us();
  Trig=0;
}
//3、获取时间和距离
int gettime()//获取时间
{
unsigned int time = 0;
time = TH2<<8 | TL2;  //TH0*256+TL0
return time;
}
int Getdis(unsigned int time)  //获取距离
{
unsigned int distance;//整型的原因是方便后续LCD1602屏显示
distance = (int)time * 0.085;
TH2=0;
TL2=0;//清空计时器·
return distance;
}
void star()
{
TH2 = 0;
TL2 = 0;
TR2 = 1;
}
void end()
{
TR2 = 0;
}
void GetOnce()  //获取一次超声波测距模块的距离
{
Rstart();
while(!Echo);//当Echo为零时等待
star();
while(Echo);//当Echo为1计数并等待
end();
}
void delay()
{
int i;
int j;
for(i=0;i<50;i++)
  for(j = 0;j<1000;j++);
}

void main()
{
   unsigned int time = 0;
   unsigned int i,j;
   unsigned int dis;

    timer0_init();
    delayxms(5);
/* UsartConfiguration();          //串口初始化           */

while(1)
{

  GetOnce();
  time = gettime();
  dis = Getdis(time);//单位毫米,后面会用厘米显示
  XianShi[0]=dis/1000;//厘米的百位
  XianShi[1]=(dis/100)%10;//厘米的十位
  XianShi[2]=(dis/10)%10;//厘米的个位
  XianShi[3]=10;//显示小数点
  XianShi[4]=dis%10;//厘米的小数点后一位
  XianShi[5]=11;//显示‘C’
  XianShi[6]=12;//显示'M'
  Lcd1602_init();   //初始化函数
  Lcd1602_WriteCom(0x80);  //0x80是第一行的第一个字符的地址
    for (i=0;i<11;i++)
    {
     Lcd1602_WriteData(BiaoTi[i]);
    }
     Lcd1602_WriteCom(0x80+0x40);   //0xc0是第二行的第一个字符的地址
    for (j=0;j<7;j++)
    {
     Lcd1602_WriteData(ShuZiBiao[XianShi[j]]);
    }
                   
  Motor_add_left();
  Motor_dec_left();
  Motor_add_right();
  Motor_dec_right();

  forword();

  /* if(dis < 150)
        {
        back();
        delay();
        right();
  
        }                                                                            
    else
    {forword();}                            */
              //           避障



  /* i = SBUF;
   RI = 0;
   if(i == 'q')
   {
   forword();
   }
   if(i == 'h')
   {
   back();
   }
    if(i == 'z')
   {
   left();
   }
   if(i == 'y')
   {
   right();
   }
   if(i == 't')
   {
   stop();
   }  */
    }                 


}
void forword()  //前进函数
{

    //第一路电机 正转
    IN1 = 0;
    IN2 = 1;

    //第二路电机 正转
    IN3 = 0;
    IN4 = 1;
}

void back() //后退
{


    //第一路电机  反转
    IN1 = 1;
    IN2 = 0;

    //第二路电机  反转
    IN3 = 1;
    IN4 = 0;
}

void right()  //右转
{


    // 第一路正转
    IN1 = 0;
    IN2 = 1;
    // 第二路反转
    IN3 = 0;
    IN4 = 0;

}

void left() //左拐函数
{
    IN1 = 1;
    IN2 = 0;
    IN3 = 0;
    IN4 = 1;

}

void stop()
{
    IN1 = 0;
    IN2 = 0;
    IN3 = 0;
    IN4 = 0;
}
  /***********定时器0初始化***********/

void timer0_init()

{

TMOD=0x01; //定时器0工作于方式1

TH0=(65536-10)/256;

TL0=(65536-10)%256;

EA = 1;

ET0=1;

TR0=1;




}


/**************定时0中断处理******************/

void timer0_int() interrupt 1

{
TH0=(65536-10)/256;
TL0=(65536-10)%256;
  
TIME++;
m1 = countA;
m2 = countB;

if(TIME < m1) //count为占空比
{
  ENA = 1; //输出高电平
}

else
{
  ENA = 0;       
  }

if(TIME < m2)
{
  ENB = 1;
}
else
{
ENB = 0;
}

if(TIME>=100)
{
TIME=0;
}


}
回复

使用道具 举报

ID:739545 发表于 2020-7-3 09:13 | 显示全部楼层
哪就是超声波显示进入死循环了,可以联调的话加入联调机制,查看一下哪一步走不下去了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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