亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
超聲波測距顯示并避障的單片機(jī)程序
[打印本頁]
作者:
偶也
時(shí)間:
2017-11-30 22:17
標(biāo)題:
超聲波測距顯示并避障的單片機(jī)程序
超聲波測距顯示和避障
單片機(jī)源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0; //P1.0到P1.4為尋線檢測端
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit KIN1=P1^5; //P1.5 P1.6是避障檢測端
sbit KIN2=P1^6;
sbit out1 = P2^0 ; //P2.0到P2.3是電機(jī)驅(qū)動(dòng)輸出控制端
sbit out2 = P2^1 ;
sbit out3 = P2^2 ;
sbit out4 = P2^3 ;
sbit Trig = P3^3; //產(chǎn)生脈沖引腳
sbit Echo = P3^2; //回波引腳
sbit beem= P3^7; //蜂鳴器控制引腳
sbit PWM=P1^7; //舵機(jī)pwm//
sbit SET1=P2^4 ;
sbit SET2 =P2^5;
sbit SET3 =P2^6;
sbit SET4 =P2^7;
uchar code seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint distance[4]; //測距接收緩沖區(qū)
uint distance1;
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,PDATA; //自定義寄存器
bit succeed_flag; //測量成功標(biāo)志
unsigned long xdata rec_code;
unsigned long xdata time_us;
unsigned char xdata rec_cnt;
unsigned char xdata kbuf;
uchar sdata,flag; //sdata是紅外遙控接收鍵值變量 flag是啟動(dòng)小車 或停止小車變量
uint j,a;
uchar pro;
bit rec_b;
bit key_save;
bit keyp;
void chaoshengbo();
void conversion(uint temp_data);
void delay_20us();
void delay_ms(uint x);
void display ();
void Init() //初始化
{
flag=0;
Trig=0;
TMOD = 0x11; //T/C1采用16位定時(shí)器/計(jì)數(shù)器
ET1 = 1; //定時(shí)器1開中斷
ET0 = 1;
TH0 = 0x00;
TL0 = 0x00;
TH1 = 0xff;
TL1 = 0xce;
TR1=0;
TR0 = 0;
//定時(shí)計(jì)數(shù)器啟動(dòng)計(jì)數(shù)
EX0 = 1; //外部中斷0關(guān)中斷
PX0 = 1;
PT1 = 1;
EA = 1; //CPU開中斷
}
//--------------------------------------------------
//-------超聲波測距----------------------------
void chaoshengbo()
{
uint distance_data;
display ();
EA=0;
Trig=1;
delay_20us();
Trig=0; //產(chǎn)生一個(gè)20us的脈沖,在Trig引腳
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測量成功標(biāo)志
TH0=0; //定時(shí)器1清零
TL0=0; //定時(shí)器1清零
EX0=1; //打開外部中斷
TR0=1; //啟動(dòng)定時(shí)器1
EA=1;
display ();
display ();
display ();
display ();
display ();
EX0=0; //打開外部中斷
TR0=0;
if(succeed_flag==1)
{
distance_data=outcomeH; //測量結(jié)果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合并成為16位結(jié)果數(shù)據(jù)
distance_data=(distance_data/25)*43/100+1;
}
a=distance_data; //超聲波測距 距離
distance1=a;
display ();
display (); display ();
}
void delay_us(uint x) //演示程序
{
do {
x--;
}
while(x>1);
}
void delay_ms(uint x)
{
while(x!=0)
{
delay_us(500);
x--;
}
}
void baidong() //舵機(jī)轉(zhuǎn)動(dòng)
{
TR1=1;
pro=30; //90°
delay_ms(100);
pro=10; //小于10°
delay_ms(100);
pro=50; //大于160°
delay_ms(100);
pro=25; //90°
delay_ms(100);
TR1=0;
}
void timer0() interrupt 3//定時(shí)0.1ms
{
EX0=0;
TH1=0xff;
TL1=0xce;
j++;
if(j<=pro)
{
PWM=1;
}
else
{
PWM=0;
}
if(j==400) //周期20ms
{
j=0;
PWM=~PWM;
}
}
//左轉(zhuǎn)
void comeleft()
{
out1=0;
out2=1;
out3=1;
out4=0;
delay_ms(40);
}
//右轉(zhuǎn)
void comeright ()
{
out1=1;
out2=0;
out3=0;
out4=1;
delay_ms(40);
}
//前進(jìn)加速;
void comeon()
{ out2=1;
delay_us(440);
out2=0;
out4=0;
out1=1;
out3=1;
}
//后退;
void back()
{ out2=1;
out4=1;
out1=0;
out3=0;
delay_ms(200);
}
void stop() //停止
{
out1=0;
out2=0;
out3=0;
out4=0;
}
//避障
void shunback()
{ uint DATA1,DATA2,i;
chaoshengbo();
display ();
if(distance1<12) //當(dāng)超聲波測距距離小于8則
{
stop(); //小車停止運(yùn)動(dòng)
beem=0;
for(i=0;i<200;i++){display ();}
beem=1;
for(i=0;i<200;i++){display ();}
beem=0 ;
for(i=0;i<200;i++){display ();}
beem=1;
EX0=0; //關(guān)閉外部中斷
TR0=0;
TR1=1;
pro=10; //舵機(jī)轉(zhuǎn)動(dòng)到0°
delay_ms(50);
TR1=0;
PWM=1;
delay_ms(10);
chaoshengbo(); //檢測0°方向 障礙物距離
DATA1= distance1;
for(i=0;i<200;i++){display ();}
distance1=0;
EX0=0; //關(guān)閉外部中斷
TR0=0;
TR1=1;
pro=50; //舵機(jī)轉(zhuǎn)動(dòng)到180°
delay_ms(50);
TR1=0;
PWM=1;
delay_ms(10);
chaoshengbo(); //檢測180°方向障礙物距離
DATA2= distance1;
for(i=0;i<200;i++){display ();}
distance1=0;
EX0=0; //關(guān)閉外部中斷
TR0=0;
TR1=1;
pro=25; //舵機(jī)返回90°方向
delay_ms(50);
TR1=0;
delay_ms(10);
if(DATA1>=12 && DATA1>DATA2){comeright ();comeon(); }//當(dāng)0度方向大于 8cm 并大于180度方向 則右轉(zhuǎn) 前進(jìn)
else if (DATA2>=12 && DATA2>=DATA1){comeleft(); comeon(); } //當(dāng)180度方向大于 8cm 并大于0度方向 則左轉(zhuǎn) 前進(jìn)
else if (DATA2<12 && DATA1<8) {back(); comeleft();comeon(); }//當(dāng)180度方向和0度方向都小于8cm 則小車后退一定距離 左轉(zhuǎn) 前進(jìn)
}
else{ comeon(); }//否則小車直走
}
void display ()
{
P2=P2|0XF0;
P0=~seg7code[0];
SET1=0;
delay_us(20);
P2=P2|0XF0;
P0=~seg7code[distance1/100];
SET2=0;
delay_us(20);
P2=P2|0XF0;
P0=~seg7code[(distance1%100)/10];
SET3=0;
delay_us(20);
P2=P2|0XF0;
P0=~seg7code[distance1%10];
SET4=0;
delay_us(20);
P2=P2|0XF0;
}
void main(void)
{
P1=0XFF;
P2=0XFF;
P3=0XFF;
P0=0XFF;
Init(); //初始化
baidong();
while(1)
{
shunback();
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
超聲波測距顯示并避障.rar
(33.77 KB, 下載次數(shù): 10)
2017-11-30 22:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1