超聲波測距顯示和避障
單片機源程序如下:
- #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是電機驅動輸出控制端
- sbit out2 = P2^1 ;
- sbit out3 = P2^2 ;
- sbit out4 = P2^3 ;
- sbit Trig = P3^3; //產生脈沖引腳
- sbit Echo = P3^2; //回波引腳
- sbit beem= P3^7; //蜂鳴器控制引腳
- sbit PWM=P1^7; //舵機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]; //測距接收緩沖區
- uint distance1;
- uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,PDATA; //自定義寄存器
- bit succeed_flag; //測量成功標志
- unsigned long xdata rec_code;
- unsigned long xdata time_us;
- unsigned char xdata rec_cnt;
- unsigned char xdata kbuf;
- uchar sdata,flag; //sdata是紅外遙控接收鍵值變量 flag是啟動小車 或停止小車變量
- 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位定時器/計數器
- ET1 = 1; //定時器1開中斷
- ET0 = 1;
- TH0 = 0x00;
- TL0 = 0x00;
- TH1 = 0xff;
- TL1 = 0xce;
- TR1=0;
- TR0 = 0;
- //定時計數器啟動計數
- EX0 = 1; //外部中斷0關中斷
- PX0 = 1;
- PT1 = 1;
- EA = 1; //CPU開中斷
- }
- //--------------------------------------------------
- //-------超聲波測距----------------------------
- void chaoshengbo()
- {
- uint distance_data;
- display ();
- EA=0;
- Trig=1;
- delay_20us();
- Trig=0; //產生一個20us的脈沖,在Trig引腳
- while(Echo==0); //等待Echo回波引腳變高電平
- succeed_flag=0; //清測量成功標志
- TH0=0; //定時器1清零
- TL0=0; //定時器1清零
- EX0=1; //打開外部中斷
- TR0=1; //啟動定時器1
- EA=1;
- display ();
- display ();
- display ();
- display ();
- display ();
- EX0=0; //打開外部中斷
- TR0=0;
- if(succeed_flag==1)
- {
- distance_data=outcomeH; //測量結果的高8位
- distance_data<<=8; //放入16位的高8位
- distance_data=distance_data|outcomeL;//與低8位合并成為16位結果數據
- 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() //舵機轉動
- {
- 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//定時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;
- }
- }
- //左轉
- void comeleft()
- {
- out1=0;
- out2=1;
- out3=1;
- out4=0;
- delay_ms(40);
- }
- //右轉
- void comeright ()
- {
- out1=1;
- out2=0;
- out3=0;
- out4=1;
- delay_ms(40);
- }
- //前進加速;
- 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) //當超聲波測距距離小于8則
- {
- stop(); //小車停止運動
- 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; //關閉外部中斷
- TR0=0;
- TR1=1;
- pro=10; //舵機轉動到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; //關閉外部中斷
- TR0=0;
- TR1=1;
- pro=50; //舵機轉動到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; //關閉外部中斷
- TR0=0;
- TR1=1;
- pro=25; //舵機返回90°方向
- delay_ms(50);
- TR1=0;
- delay_ms(10);
- if(DATA1>=12 && DATA1>DATA2){comeright ();comeon(); }//當0度方向大于 8cm 并大于180度方向 則右轉 前進
- else if (DATA2>=12 && DATA2>=DATA1){comeleft(); comeon(); } //當180度方向大于 8cm 并大于0度方向 則左轉 前進
- else if (DATA2<12 && DATA1<8) {back(); comeleft();comeon(); }//當180度方向和0度方向都小于8cm 則小車后退一定距離 左轉 前進
- }
- 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黑下載附件…………
復制代碼
所有資料51hei提供下載:
超聲波測距顯示并避障.rar
(33.77 KB, 下載次數: 10)
2017-11-30 22:15 上傳
點擊文件名下載附件
|