欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機超聲波1602顯示程序,調速出了問題,求大佬解決 [打印本頁]

作者: 1024153202    時間: 2020-7-2 22:15
標題: 單片機超聲波1602顯示程序,調速出了問題,求大佬解決


這段程序是超聲波1602顯示+按鍵調速的,但一起執行下面的調速就沒有用。如果把超聲波顯示給取消,調速就有用了。小白看了半天沒調出來,希望有大佬可以幫下忙。
作者: 1024153202    時間: 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;
}


}
作者: lovezjf234    時間: 2020-7-3 09:13
哪就是超聲波顯示進入死循環了,可以聯調的話加入聯調機制,查看一下哪一步走不下去了




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1