亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
51單片機超聲波測距避障小車 進入不了while循環
[打印本頁]
作者:
magenyin
時間:
2018-4-27 21:04
標題:
51單片機超聲波測距避障小車 進入不了while循環
代碼如上,我是小白~
請問下各位大佬 , 為什么進入不了while循環呢 輪子一直轉但是超聲波模塊不能正常運轉 幫忙改一下代碼并給我一下理由和建議 謝謝啦
#include <AT89x51.H>
#include <intrins.h>
#define ECHO P2_4 //超聲波接口定義
#define TRIG P2_5 //超聲波接口定義
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左邊兩個電機向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個電機后轉
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左邊停止
#define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊的兩個前進
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊的后轉
#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊停止
typedef unsigned int u16;
typedef unsigned char u8;
unsigned long S=0;
unsigned int time=0; //時間變量
unsigned int timer=0; //延時基準變量
unsigned char timer1=0; //掃描時間變?
bit flag =0;
/**********************測距**************************************************/
void zd0() interrupt 1 //T0中斷
{
flag=1; //中斷溢出標志
}
void delay(unsigned int k) //延時函數
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
//前進
void run(void)
{
Left_moto_go ; //左
Right_moto_go ; //右
}
/************************************************************************/
//后退
void backrun(void)
{
Left_moto_back ; //左
Right_moto_back ; //右
}
/************************************************************************/
//左轉
void leftrun(void)
{
Left_moto_back ;
Right_moto_go ;
}
/************************************************************************/
//右轉
void rightrun(void)
{
Left_moto_go ;
Right_moto_back ;
}
/************************************************************************/
//停止
void stoprun(void)
{
Left_moto_Stop ;
Right_moto_Stop ;
}
/************************************************************************/
void StartModule() //啟動模塊
{
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 Conut(void) //啟動測距
{
while(!ECHO);
TR0=1;
while(ECHO);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
}
/************************************************************************/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US??
TL1=(65536-100)%256;
timer++; //???100US???????????
}
void main(void)
{ TMOD=0x21;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1;
TR1=1;
TI=1;
EA=1;
run();
while(1)
{
if(timer>=1000) //100MS檢查一次
{
timer=0;
StartModule(); //啟動檢測
Conut(); //計算距離
if(S<50)
{
stoprun(); //小車停止
delay(500);
backrun();
delay(500);
leftrun();
if(S<30)
{
stoprun();
delay(500);
rightrun();
delay(500);
run();
}
else
run();
timer=0;
StartModule(); //啟動測超聲模塊
Conut();
//計算
}
else
run();
}
}
}
復制代碼
作者:
HC6800-ES-V2.0
時間:
2018-4-28 09:20
看了你的程序,我認為,程序肯定是進入了主循環的!
只是沒有反應,原因是你的所有if語句都沒起作用!!!
先搞清楚距離計算:聲波空氣中速度約340m/s,來回雙程,定時器計次數的時間單位是us,好了,正確的計算公式為:S=(t*0.17)mm,看清楚沒?算清楚沒?以毫米為單位的距離結果。
而你的計算為:S=(time*1.7)/100,結果是十分一毫米。
你的if判斷有這樣幾個:S<50,小于5毫米,S<30,小于3毫米,都是不會出現的條件,所以沒有反應。
你改改看是不是我說的原因。
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1