这里是4针的排针,从左至右分别为GND OUT 40KHZ VCC接线方法:VCC接电源4.5-5.5V,GND接地OUT 接单片机中断引脚,如51单片机的P3.340KHZ 接单片机的某个引脚提供给本模块40KHZ的信号如P3.5模块使用方法 1.硬件连接方法 首先把模块的OUT脚(2脚)接入单片机的中断引脚,并且中断是下降沿有效的;40KHz脚(3脚)接入单片机的任意IO口(使用软件延时产生40KHz方波时)或者接入单片机的PWM输出口(使用单片机的PWM功能产生40KHz方波时) 2.程序编写流程 首先给超声波模块发送8个周期的40KHz方波,延时300us左右(或者大于这个时间,这个延时是为了避免超声波直接对射过来的干扰,这个时间就决定了盲区的大小,延时时间越长盲区越大,300us时大概是10cm的盲区),打开定时器(要16位的定时器)开始计时,等待OUT引脚输出一个下降沿脉冲,输出脉冲后,程序进入中断程序,此时关闭定时器,把定时器的值读取出来,这定时器的值的一半就是超声波经过路程所用的时间,具体的路程计算公式为(以51单片机为例):S=V*T=V*(TH0*256+TL0)/1000000(m)。
计算出来的结果单位为米,V在25摄氏度下为340m/s 以下是51单片机(编译环境为keil uVision3)的例程一:#include#include/***************************数码管为共阴数码管***************************/sbit s0=P3^0;//个位选通sbit s1=P3^1;//十位选通sbit s2=P3^2;//百位选通sbit s3=P3^4;//千位选通sbit dp=P1^7;//小数点sbit in=P3^3;//外部中断1,接CX20106的7脚sbit csb=P3^5;//40KHz方波输出脚#define seg P1 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时100usvoid display(uint dat);//4位数码管显示函数,只用了3位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄灭 0x00 //自定义 };/**********************************函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/void main(void){ init(); while(1) //循环测量并显示 { tran();//发送超声波信号测距 display(dis);//显示距离 }}/**********************************函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/void init(void){ TMOD=0x01;//定时器0方式1用于计时 TH0=0; TL0=0; /* 设定T0的工作模式为2*/ EA=1; IT1=1;//下降沿有效,左传感器}/**********************************函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/void delay_nms(uint n){ uchar i; while(n--) { for(i = 0; i < 123; i++); } ;}/************************************************延时100us函数***********************************************/void delay100us(){ uchar j; for(j=50;j>0;j--);}/**********************************函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/void display(uint dat){ uchar i,j,k;//分别为百十个位的缓存 i=dat/100;//百位 j=dat%100/10;//十位 k=dat%100%10;//个位 s3=1;s2=0;s1=1;s0=1; seg=leddata[i]; dp=1; delay_nms(2); dp=0; s2=1; s3=1;s2=1;s1=0;s0=1; seg=leddata[j]; delay_nms(2); s1=1; s3=1;s2=1;s1=1;s0=0; seg=leddata[k]; delay_nms(2); s0=1;}/**********************************函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/void tran(void){ uchar i; float temp; 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; } csb=1; delay100us(); delay100us(); delay100us(); delay100us(); delay100us(); delay100us();//延时600us左右后再开中断,避免直接回来的回波 EX1=1;//开中断 if(flag==1) //中断标志位置1,说明有回波 { //以下为路程计算 temp=high_time*256+low_time; temp=(temp/1000)/2; temp*=344; temp=temp/10; dis=(unsigned int)temp; flag=0; }}/**********************************函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 2{ uint tmp; TR0=0;//关定时器0 ET1=0;//关外部中断 tmp=TH0*256+TL0; //读取定时器的值 if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为0到10米,实际不能达到10米 { high_time=TH0;//把计时值放入缓冲 low_time=TL0; flag=1; //置位标志位 } else //超出范围则重新测量 { high_time=0; low_time=0; } }备注: 如有不明白的地方,请加留言。
谢谢您的指教! :89219054参考例程二:#include#include#define uint unsigned int#define uchar unsigned charuchar a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},b[3];sbit dp=P0^7;sbit in=P3^3;sbit csb=P3^5;uchar time_H,time_L,flag=0;uint distance;//测得距离void delayms(uint z) //延时zms{ uchar j; while(z--) { for(j=123;j>0;j--);}}void delay100us()//延时100us{ uchar j; for(j=50;j>0;j--);}void init(){ TMOD=0x01; TH0 =0x00; TL0 =0x00; EA=1; //打开总中断 //ET0=1; //T。