1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
二路超聲波測距的單片機源碼
[打印本頁]
作者:
51dasttwbd
時間:
2018-5-28 11:08
標題:
二路超聲波測距的單片機源碼
用2哥超聲波 進行 避障 功能
源程序 如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ENA_pwm = P2^6; //PWM信號端
sbit ENB_pwm = P2^7; //PWM信號端
sbit L298N_INA = P1^0;
sbit L298N_INB = P1^1;
sbit L298N_INC = P1^2;
sbit L298N_IND = P1^3;
sbit Trlg1 = P3^1;
sbit Echo1 = P3^2;
sbit Trlg2 = P2^0;
sbit Echo2 = P2^1;
unsigned char pwm_val_left =0; //變量定義
unsigned char pwm_val_right =0;
unsigned char push_val_left =0;// 左電機占空比N/10
unsigned char push_val_right=0;// 右電機占空比N/10
unsigned int time = 0; //測距時間
unsigned int timer = 0; //調速時間
unsigned long S1 = 0; //距離
unsigned long S2 = 0; //距離
void delay(uint z) //毫秒級延時
{
uint x,y;
for(x = z; x > 0; x--)
{
for(y = 114; y > 0 ; y--);
}
}
void Delay10us_CSB(uchar i) //10us延時函數 超聲波模塊使用
{
uchar j;
do
{
j = 10;
do
{
_nop_();
_nop_();
}
while(--j);
}
while(--i);
}
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
ENA_pwm=1;
else
ENA_pwm=0;
if(pwm_val_left==10) // 0~10 , 0最小,10最大
pwm_val_left=0;
}
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
ENB_pwm=1;
else
ENB_pwm=0;
if(pwm_val_right==10) // 0~10 , 0最小,10最大
pwm_val_right=0;
}
/*定時器1中斷輸出PWM信號*/
void time1() interrupt 3
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
timer++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void Go_forward()
{
push_val_left=6;
push_val_right=6;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 0;
}
void Go_back()
{
push_val_left=6;
push_val_right=6;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 1;
}
void Go_left()
{
push_val_left=5;
push_val_right=5;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 1;
}
void Go_right()
{
push_val_left=5;
push_val_right=5;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
void Stop()
{
L298N_INA = 0;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
void CSB1_module()
{
Trlg1=1;
Delay10us_CSB(10);
Trlg1=0;
}
void CSB2_module()
{
Trlg2=1;
Delay10us_CSB(10);
Trlg2=0;
}
/*計算超聲波所測距離并顯示*/
void Conut1()
{
while(!Echo1); //當(ECHO信號回響)為零時等待
TR0=1; //開啟計數
while(Echo1);
TR0=0; //關閉計數
time=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(float)(time*1.085)*0.17; //算出來是MM
}
void Conut2()
{
while(!Echo2); //當(ECHO信號回響)為零時等待
TR0=1; //開啟計數
while(Echo2);
TR0=0; //關閉計數
time=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(float)(time*1.085)*0.17; //算出來是MM
}
void bizhang()
{
CSB1_module();
Conut1();
CSB2_module();
Conut2();
if(S1<150 )//設置避障距離(單位毫米)
{
Stop();
delay(30);
Go_back();
delay(50);
if(S2<150)
{
Stop();
delay(30);
Go_right();
}
else
{
Go_back();
delay(50);
Go_left();
}
}
else if(S1>150)
{
if(S2>150)
{
Go_forward();
}
else
{
Stop();
delay(30);
Go_right();
}
}
}
void main()
{
Stop();
delay(1000);//延時1秒
TMOD |= 0x11;//定時器1工作模式2,8位自動重裝。用于產生PWM
TMOD |= 0x01;//定時器0
TH1=(65536-10)/256; //100US定時
TL1=(65536-10)%256;
TH0 = 0;
TL0 = 0;//T0,16位定時計數用于記錄ECHO高電平時間
ET1 = 1;
ET0 = 1;//允許T0中斷
TR1 = 1;//啟動定時器1
EA = 1;//啟動總中斷
while(1)
{
bizhang(); //避障
delay(30);
}
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1