⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chaoshengbo.c

📁 本设计是关于超声波测距的资料 附带源码和原理图 同时还介绍了各种超声波测距方法
💻 C
📖 第 1 页 / 共 3 页
字号:
原理图中并接在超声波接收头两端的瓷片电容不用的话可以增强信号,但是抗干扰性不强。我的做法是牺牲抗干扰性,提高距离,呵呵,没办法只能这样了。另外还有要说明的是发送与接收探头的距离是8个cm!!这样才能保证测量距离,我做好的测距距离是接近6米。发送与接收探头的距离可能还可以小一点,但不能小于4cm(网上说的),我做过间距为2cm的时候测距距离为3米左右。 

主程序: 

#include<reg51.h> 
#include"12864.h" 
#include<INTRINS.H> 
#define        uc                         unsigned char 
#define        ui                         unsigned int 
#define        nop                        _nop_() 
/********************************* 
变量定义 
**********************************/ 
uc                ID1=0,ID2=0; 
float        distance; 
ui                count=0,dis1; 
uc                 high_time,low_time,flag=0; 
//uc                i=0; 
/********************************** 
常量定义 
************************************/ 
#define        circle                0xf2//循环播放 
#define        stop_play        0xfe//停止播放 
#define        vo_0                0xe0//音量1 
#define        vo_1                0xe1//音量2 
#define        vo_2                0xe2//音量3 
#define        vo_3                0xe3//音量4 
#define        vo_4                0xe4//音量5 
#define        vo_5                0xe5//音量6 
#define        vo_6                0xe6//音量7 
#define        vo_7                0xe7//音量8 
#define        ID1_count        22//k1计数值 
#define        ID2_count        100//k2计数值 
/************************************* 
语音单片机WT588D位定义 
*************************************/ 
sbit        RST=P0^3;//复位端 
sbit        CS1=P0^1;//片选端 
sbit        CLK=P0^0;//时钟 
sbit        DAT=P0^2;//数据位 
sbit        busy=P0^4;//忙信号 
sbit         csb=P3^6; 
/********************************* 
函数声明 
*********************************/ 
void         delay_nms(ui ms);//延时nms 
void         delay100us();//延时100us 
void         send_com(uc add);//发送语音地址,指定播放某段语音 
void         init();//语音单片机WT588D 
float         Distance_count();//距离计算转换 
void         sound(uc soud);//播放 
void         tran();//送超声波信号进行测距 
/************************************ 
主函数 
************************************/ 
void main() 
{ 
        uc i,j,k; 
        ui tp=0; 
        init(); 
        LcmInit();//lcd初始化         
        LcmClearTXT();//lcd清除显示 
        PutStr(1,0,DIS2);//显示距离 
        while(1) 
        { 
                for(i=0;i<10;i++)//测量10次 
                { 
                        tran();//发送超声波信号测距 
                        tp=tp+dis1;//10次相加,下面求平均值 
                } 
                dis1=tp/10;//取平均值 
                tp=0;//清零,为下次测量做准备 
                sound(dis1);//语音播报 
                i=dis1/100;//数据转换给lcd显示 
                j=dis1%100/10; 
                k=dis1%100%10; 
                LCDXY(1,3);//设定显示位置 
                Write_number(i);//显示数字 
                LCDXY(1,5); 
                Write_number(j); 
                Write_number(k); 
        } 
} 
/************************************************************** 
初始化 
**************************************************************/ 
void init() 
{ 
           TMOD=0x01;//定时器0方式1用于计时,定时器1用于产生38K方波 
        TH0=0; 
        TL0=0;                /* 设定T0的工作模式为2*/ 
        EA=1; 
        IT1=1;//下降沿有效,左传感器 
} 
/********************************************** 
左发送超声波函数,实测为38KHz信号,8个这样的方波 
***********************************************/ 
void         tran() 
{ 
        uc i; 
        TH0=0; 
        TL0=0;//清定时0 
        TR0=1;//开定时0 
        for(i=8;i>0;i--) 
        { 
                csb=!csb; 
                //nop; 
                nop; 
                nop; 
                nop; 
                nop; 
                nop; 
                nop; 
                nop; 
                nop; 
                nop; 
        } 
        csb=1; 
        delay_nms(1);//延时1ms左右后再开中断,避免直接回来的回波 
        EX1=1; 
        delay_nms(50); 
        if(flag==1) 
                { 
                        distance=Distance_count(); 
                        dis1=(unsigned int)distance; 
                        flag=0; 
                } 
                else dis1=0; 
} 
/************************************************ 
延时n个ms函数 
***********************************************/ 
void delay_nms(ui ms)   //delay ms function                               
{                         
  uc i;  
      while(ms--) 
      { 
          for(i = 0; i < 123; i++); 
       } 
} 
/************************************************ 
延时100us函数 
***********************************************/ 
void delay100us() 
{ 
        uc j; 
        for(j=50;j>0;j--); 
} 
/**************************************** 
发码播放函数;add为语音地址 
*****************************************/ 
void send_com(uc add) 
{ 
         uc i; 
        RST=1; 
        RST=0; 
        delay_nms(3); 
        RST=1; 
        delay_nms(20); 
        CS1=0; 
        delay_nms(5); 
        for(i=0;i<8;i++) 
        { 
                 CLK=0; 
                if(add&1)        DAT=1; 
                        else        DAT=0; 
                        delay100us(); 
                        CLK=1; 
                        delay100us(); 
                        add=add>>1; 
        } 
        CS1=1; 
} 
/****************************************** 

*****************************************/ 
void sound(ui soud) 
{ 
        ui i,j,k; 
        if(soud==0) 
        { 
                send_com(13);//播放"超出测量范围,请重新测量" 
                delay_nms(50); 
                while(!busy); 
        } 
        else 
        { 
        i=soud/100; 
        j=soud%100/10; 
        k=soud%100%10; 
        //send_com(10);//播放"障碍物距离" 
        //delay_nms(50); 
        //while(!busy); 
         send_com(i); 
        delay_nms(50); 
        while(!busy); 
        send_com(11);//播放点 
        delay_nms(50); 
        while(!busy); 
        send_com(j); 
        delay_nms(50); 
        while(!busy); 
        send_com(k); 
        delay_nms(50); 
        while(!busy); 
        send_com(12);//播放米 
        delay_nms(50); 
        while(!busy); 
        } 
} 
/**************************************** 
距离计算函数 
****************************************/ 
float Distance_count() 
{ 
        float temp; 
        temp=high_time*256+low_time; 
        //temp-2000; 
        temp=(temp/1000)/2; 
        temp*=344; 
        temp=temp/10; 
        return temp; 
} 
/************************************** 
外部中断服务函数 
**************************************/ 
void TT() interrupt 2 
{ 
        ui tmp; 
        TR0=0;//关定时器0 
        ET1=0;//关外部中断 
        flag=1;//外部中断标志位 
        tmp=TH0*256+TL0; 
        if((tmp>0)&&(tmp<60000))         
                { 
                         high_time=TH0; 
                        low_time=TL0;         
                } 
                else  
                        { 
                                 high_time=0; 
                                low_time=0;         
                        }  

} 




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -