求一个cc2530 超声波模块测距的程序

求一个cc2530 超声波模块测距的程序,第1张

#ifndef ULTRASOUND_H

#define ULTRASOUND_H

#define uchar unsigned char

#define uint unsigned int

#define TRIG P1_3 //P1_2

#define ECHO P0_7 //P0_1

extern uchar RG;

extern uchar H1;

extern uchar L1;

extern uchar H2;

extern uchar L2;

extern uchar H3;

extern uchar L3;

extern uint data;

extern float distance;

extern uchar LoadRegBuf[4];

//void Delay(uint n);

void Delay_1us(uint microSecs);

void Delay_10us(uint n);

void Delay_1s(uint n);

void SysClkSet32M();

void Init_UltrasoundRanging();

void UltrasoundRanging(uchar ulLoadBufPtr);

__interrupt void P0_ISR(void);

#endif

×××××××××××××××××××××××××××××××××××××××××××

//×××××××××××Ultrasoundc

#include <ioCC2530h>

#include "Ultrasoundh"

uchar RG;

uchar H1;

uchar L1;

uchar H2;

uchar L2;

uchar H3;

uchar L3;

uint data;

float distance;

uchar LoadRegBuf[4];//全局数据,用以存储定时计数器的值。

void Delay_1us(uint microSecs)

{ while(microSecs--)

{ / 32 NOPs == 1 usecs 因为延时还有计算的缘故,用了31个nop/

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop");

}

}

void Delay_10us(uint n)

{ / 320NOPs == 10usecs 因为延时还有计算的缘故,用了310个nop/

uint tt,yy;

for(tt = 0;tt<n;tt++);

for(yy = 310;yy>0;yy--);

{asm("NOP");}

}

void Delay_1s(uint n)

{ uint ulloop=1000;

uint tt;

for(tt =n ;tt>0;tt--);

for( ulloop=1000;ulloop>0;ulloop--)

{

Delay_10us(100);

}

}

void SysClkSet32M()

{

CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振

while(CLKCONSTA & 0x40); //等待晶振稳定

CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ

//此时的CLKCONSTA为0x88。即普通时钟和定时器时钟都是32M。

}

void Init_UltrasoundRanging()

{

P1DIR = 0x08; //0为输入1为输出 00001000 设置TRIG P1_3为输出模式

TRIG=0; //将TRIG 设置为低电平

P0INP &= ~0x80; //有上拉、下拉 有初始化的左右

P0IEN |= 0x80; //P0_7 中断使能

PICTL |= 0x01; //设置P0_7引脚,下降沿触发中断

IEN1 |= 0x20; // P0IE = 1;

P0IFG = 0;

}

void UltrasoundRanging(uchar ulLoadBufPtr)

{

SysClkSet32M();

Init_UltrasoundRanging();

EA = 0;

TRIG =1;

Delay_1us(10); //需要延时10us以上的高电平

TRIG =0;

T1CNTL=0;

T1CNTH=0;

while(!ECHO);

T1CTL = 0x09; //通道0,中断有效,32分频;自动重装模式(0x0000->0xffff);

L1=T1CNTL;

H1=T1CNTH;

ulLoadBufPtr++=T1CNTL;

ulLoadBufPtr++=T1CNTH;

EA = 1;

Delay_10us(60000);

Delay_10us(60000);

}

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

EA=0;

T1CTL = 0x00;

LoadRegBuf[2]=T1CNTL;

LoadRegBuf[3]=T1CNTH;

L2=T1CNTL;

H2=T1CNTH;

if(P0IFG&0x080) //外部ECHO反馈信号

{

P0IFG = 0;

}

T1CTL = 0x09;

T1CNTL=0;

T1CNTH=0;

P0IF = 0; //清中断标志

EA=1;

}

××××××××××××××××××××××××××××××××××××××

#include <ioCC2530h>

#include "Ultrasoundh"

void main(void)

{

while(1)

{

UltrasoundRanging(LoadRegBuf);

Delay_1s(1);

data=256H2+L2-L1-256H1;

distance=(float)data340/10000;

Delay_1s(2);

};

}

目前国内超声波测距器的设计大多采用汇编语言设计。由于单片机应用系统的日趋复杂,要求所写

的代码规范化,模块化,并便于多人以软件工程的形式进行协同开发,汇编语言作为传统的单片机应用系

统的编程语言,已经不能满足这样的实际需要了,而C语言以其结构化和能产生高效代码满足了这样的需

求,成为电子工程师进行单片机系统编程时的首先编程语言。在本设计中,由于C语言程序有利于实现较

复杂的算法,汇编语言程序具有较高的效率并且容易精确计算程序运行的时间,而超声波测距器的程序既

有较复杂的距离计算又要求精确计算超声波测距时程序运行的时间,所以本设计采用C语言和汇编语言

混合编程来实现。本文论述的是一种基于AT89C52单片机的超声波测距器,可用于汽车倒车等场合⋯。

1设计要求

设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用

于如液位、井深、管道长度的测量等场合。要求测量范围在0.10—5.00 m,测量精度lem,测量时与被测物

体无直接接触,能够清晰稳定地显示测量结果。

2设计思路

2.1超声波及其测距原理

超声波是指频率高于20KHz的机械波。为了以超声波作为检测手段,必须产生超声波和接收超声波。

完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送

器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应

的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换为超声波,发射超声波;而在收到回

波的时候,则将超声振动转换成电信号。

超声波测距的原理一般采用渡越时间法TOt(time of fliight)。首先测出超声波从发射到遇到障碍物返

回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。测量距离的方法有很多

种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。因为超声波

收稿日期:2008-04-08

作者简介:周功明(1963一),男,副教授,主要研究方向:电子信息科学技术。

·50· 绵阳师范学院学报(自然科学版) 第27卷

在标准空气中的传播速度为331.45粑秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测

量精度理论上可以达到毫米级。由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波

可以用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也

能达到要求。

超声波发生器可以分为两类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。本课题

属于近距离测量,可以采用常用的压电式超声波换能器来实现7。

2.2超声波测距器的系统框图

根据设计要求并综合各方面因素,可以采用AT89C52单片机作为主控制器,用动态扫描法实现LED

数字显示,超声波驱动信号用单片机的定时器完成,超声波测距器的系统框图如下图l所示¨2|:

3系统组成

3.1硬件部分

主要由单片机系统及显示电路、超声波发射电路

和超声波检测接收电路三部分组成。采用AT89C52来

实现对CX20106A红外接收芯片和TCT40—10系列超

声波转换模块的控制。单片机通过P1.0引脚经反相

超声波接收E :, LED显示单片机r

/\

Z ∑

超声波发送高控制器

:> 扫描驱动

图1 超声波测距器系统设计框图

Fig.1 Ultrasonic eLangi.g system design diagram

器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INTO引脚的电平由高电平变为低电平时就

认为超声波已经返回。计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍

物之间的距离¨≈J。

3.2软件部分

主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序等部分。

4系统硬件电路设计

4.1单片机系统及显示电路

单片机采用AT89C52或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测

量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接收

电路输出的返回信号。显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP

三极管驱动。单片机系统及显示电路如下图2所示‘1。31。

图2单片机及显示电路原理图

Fig.2 MCU and display circuit schematics

第8期周功明等:基于AT89C52单片机的超声波测距器设计·51.

4.2超声波发射电路原理图

压电超声波转换器的功能:利用压电晶体谐振工作。内部结构如图3‘3Ⅲ1所示,它有两个压电晶片和

一个共振板。当它的两极外加脉冲信号,其频

率等于压电晶片的固有振荡频率时,压电晶片PI.O

将会发生共振,并带动共振板振动产生超声波,

这时它就是一超声波发生器;如没加电压,当共

振板接收到超声波时,将压迫压电振荡器作振

动,将机械能转换为电信号,这时它就成为超声

波接收转换器。超声波发射转换器与接收转换

器其结构稍有不同。

4.3超声波检测接收电路图3发射电路原理图

参考红外转化接收电路,本设计采用集成

F‘g·3 U1‘ms。nie劬啪mi‘妇c‘咖1‘∞hem蚯c

电路CX20106A,这是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控

常用的载波频率38KHz与测距超声波频率

40KHz较为接近,可以利用它作为超声波检测

电路。如图43 J[71超声波检测接收电路原理图

所示,适当改变C4的大小,可改变接收电路的

灵敏度和抗干扰能力。⋯. J。j-二

5系统程序设计

超声波测距软件设计主要由主程序,超声

波发射子程序,超声波接收中断程序及显示子

程序组成。下面对超声波测距器的算法,主程

序,超声波发射子程序和超声波接收中断程序

逐一介绍。

5.1超声波测距器的算法设计

GND

图4超声波检测接收电路原理图

Fig.4 Ultrasonic receiver and detection circuit schematic

图5_列示意了超声波测距的原理,即超声

波发生器T在某一时刻发出的一个超声波信号,当超声波遇到被测物

体后反射回来,就被超声波接收器R所接受。这样只要计算出发生信

号到接收返回信号所用的时问,就可算出超声波发生器与反射物体的

距离。

距离计算公式:d=s/2=(c木t)/2,其中d为被测物与测距器的距

离,s为声波的来回路程,c为声速,t为声波来回所用的时间。

图5超声波测距原理图

Fig.5 Ultrasonic Ranging schematic

声速c与温度有关(见表1),如温度变化不大,则可认为声速是基

本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往

返时间,即可求得距离。在系统加入温度传感器来监测环境温度,可进行温度补偿。这里可以用DSl8820

测量环境温度,根据不同的环境温度确定一声速提高测距的稳定性。为了增强系统的可靠性,可在软硬件

上采用抗干扰措施。

表1不同温度下的超声波速表

Table I Under different temperatures ultrasonic velocity Table

·52· 绵阳师范学院学报(自然科学版) 第27卷

5.2主程序

主程序首先对系统环境初始化,设置定时器1D工作模式为16位的定时计数器模式,置位总中断允许

位EA并给显示端Po和P2清0。然后调用超声波发生子程序送出一个超声波脉冲,为避免超声波从发射

器直接传送到接收器引起的直接波触发,需延迟0.1ms(这也就是测距器会有一个最小可测距离的原因)

后,才打开外中断0接收返回的超声波信号。由于采用12MHz的晶振,机器周期为lus,当主程序检测到接

收成功的标志位后,将计数器哟中的数(即超声波来回所用的时

间)按下式计算即可测得被测物体与测距仪之间的距离,设计时取

20℃时的声速为344 m/s则有:d=(C木TO)/2=172T0/10000cm

(其中,ID为计数器,ID的计数值)。

测出距离后结果将以十进制BCD码方式LED,然后再发超声

波脉冲重复测量过程。主程序框图如图6所示。

5.3超声波发生子程序和超声波接收中断程序

超声波发生子程序的作用是通过PI.0端口发送2个左右的

超声波信号频率约40KHz的方波,脉冲宽度为12 US左右,同时把

计数器,ID打开进行计时。超声波测距器主程序利用外中断0检

测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现

低电平),立即进入中断程序。进入该中断后就立即关闭计时器

,ID停止计时,并将测距成功标志字赋值l。如果当计时器溢出时

还未检测到超声波返回信号,则定时器rID溢出中断将外中断0关

闭,并将测距成功标志字赋值2以表示此次测距不成功H旬J。

5.4超声波测距器的部分程序清单

/宰超声波测距器d片机c程序使用Keil C51 ver 7.09

木/

#include<re951.h>

#define uchar unsigned int

#define uint unsigned int

#define ulong unsigned long

Extem void ca_t(void);

Extem void delay(uint);

Extem void display(unchar);

Data unehar testtok;

/木超声波测距器主程序术/

Void main(void)

{data unchar dispram[5];

data uint i;

data ulong time;

p0=0xff;

pl=0xff;

TMOD=0X11:

IE=0x80;

While(1)

{.“}

开始

系统初始化

发送超声波脉冲

等待发射超声波

计算距离

显示结果0.5s

图6主程序框图

diagram of the main program

第8期周功明等:基于AT89C52单片机的超声波测距器设计·53·

6软硬件调试

超声波测距仪的制作和调试,其中超声波发射和接收采用中15的超声波换能器TCT40一IOFl(T发

射)和TCT40—10S1(R接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4—8 cm,

其余元件无特殊要求。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。根据测量范围

要求不同,可适当调整与接收换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。

硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超

声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要∞71。

7 结束语

本文设计的是基于AT89C52单片机的超声波测距器,可应用于汽车倒车等场合,提醒驾驶员倒车时有

效的避开可能对倒车造成危害的障碍物和行人,从而有效避免由于倒车造成的汽车碰撞或擦伤经济损失

和人身安全问题。具有较强的实用性。

参考文献:

[1] 周功明.基于AT89C2051d片机的防盗自动报警电子密码锁系统设计[J].绵阳师范学院学报,2007,26(5):112—

116.

[14]

张齐.单片机应用系统设计技术一基于c语言编程[M].北京:电子工业出版社,2006.

李光飞.单片机c程序设计实例指导[M].北京:航空航天大学业出版社,2005.

楼燃苗,李光飞.51系列单片机设计实例[M].北京:航空航天大学业出版社,2003.

Zhongbo Li.Electronic Technique[M].Beijing:Mechannic Industrical Prees,2003.

赖麒文.8051单片机c语言彻底应用[M].北京:科学业出版社,2002.

何希才.传感器及其应用电路[M].北京:电子工业出版社,2001.

丁元杰.单片微机原理及应用[M].北京:机械工业出版社,2001.

孙串友,孙晓斌.感测技术基础[M].北京:电子工业出版社,2001.

马忠梅.单片机的c语言应用程序设计[M].北京:航空航天大学业出版社,1999.

刘喜昂,周志宇.基予多超声传感器的机器人安全避障技术[J].测控技术,2003,23(2):71—73.

翟国富,刘茂恺.一种实时高精度的机器人用超声波测距处理方法[J].应用声学,1990,15(1):17—24.

Cray C,Swinhoe C F,Myinl.Target controlled infusion of ketamine曲analgessia for TIV A with propof01.Can.J Anesth,1999,

40:957.

R J Higgens.Electronics and Analog Integrated Circuits[M].N.J:Prentice—Hall Inc,2001.

超声波的话我用的是X宝上的潮汕波模块,这里我写了一个超声波的头文件 我传给你好了,还有头文件上说明,应该能看懂的

传不来 文件 直接发给你好了。

/

头文件说明:

本头文件有三个可以调用的函数

1串口的初始化函数 UESC_UART_Init(uint band)

1)参数是设定的波特率,晶振是12MHz,建议设置为2400

2)注意初始化后要简短延时。

2 UESC_UART_Putchar(char kkk)

该函数可以向上位机发送一个字节的数据,参数就是要发送的数据。

本函数是用到了中断,这样程序在接收数据的时候可以运行其他程序。

单片机通过串口接收到数据之后将8位的数据放在 date 的外部变量中,所以在主函数里可以直接 *** 作接收来的变量;

接收到数据后同时会将外部变量flag置位,以适应不同的应用场合。

注意: 使用到串口是 定时器1不能使用。

发送单个字符的时候记得加 ‘’ 将字符括起来。

记得将flag置一;

第二次修改的内容:

给初始化函数加了晶振的选择,传递的参数就是晶振的频率 12M的晶振就传递12

注意:该函数在12M 24M 24576M测试搜通过。 但是110592死活不成功,不要问为什么,搞得好像我知道似的!

建议在调用之前建议先测试一下该晶振频率能否通过。

第二次修改的内容:

解决了部分晶振频率串口通信失败的问题,现在所有的晶振均测试通过。

同时加了字符串输出函数:UART_PutString(char s) 参数就是要显示的字符串,记得用“”。

作者@Jack_kk

完成日期:2014_4_14

第一次修改时间:2014_5_13

第二次修改时间:2014_5_18

第三次修改时间:2014_5_19

/

#include<reg51h>

#include<stdioh>

#include"UARTh"

char get_char;

bit flag;

unsigned char date;

void UESC_UART_Init(uint band,double MHz)

{

TMOD|=0x20;

TH1=256-(double)(MHz2604)/band;

TL1=TH1;

SM0=0; //和下面的一条语句同时设定串口工作方式

SM1=1;

REN=1; //允许串口接收

EA=1; //总中断

TR1=1; //定时器开始

ES=1; //开串口中断

}

void UESC_UART_Putchar(char kkk)

{

ES=0;

SBUF=kkk;

while(!TI);

TI=0;

ES=1;

}

void UART_PutString(char s)

{

while(s)

{

UESC_UART_Putchar(s++);

}

}

/

void UESC_UART_Getchar(void) //这个部分注释掉是因为 没有用到中断。

{

ES=0; //发送数据之前把串口关闭

// TI=1; //这里是发送一个字符串printf的用法,先关闭窗口中断,然后TI 好就是这样、

// puts(" Please input a letter");

// TI=0;

while(!RI);

RI=0;

get_char=SBUF;

// TI=1;

// printf("The letter you just input is ");

// TI=0;

SBUF=get_char;

while(!TI);

TI=0;

ES=1;

}

/

错了,那是串口头文件 sorry

/

头文件说明

本头文件适用于HC-HR04超声波模块

经封装本头文件可以直接调用的函数是:

1Ultrasound_Init();

初始化定时器0;

2Get_time();

取得距离函数,返回值是距离,单位厘米,声速是240m/s时的测量结果。

示例:

Ultrasound_Init();

while(1)

{

dis=Get_time();

display(dis);

}

注意:

1本头文件占用了定时器0,在主函数里面就不要在使用定时器0了;

2调用本头文件之前记得修改IO口;

3测量周期建议在60ms以上。

作者@Jack_kk

时间:2014_5_14

/

#include"Ultrasoundh"

#include<intrinsh>

#include<reg51h>

sbit Echo=P3^2;

sbit Trig=P1^0;

void Delay15us() //@12000MHz

{

unsigned char i;

i = 42;

while (--i);

}

void Ultrasound_Init()

{

TMOD|=0x09;

TH0=TL0=0;

ET0=1;

TR0=1;

EA=1;

}

unsigned int Get_dis()

{

int timeout=20000;

Trig=1;

Delay15us();

Trig=0;

while(!Echo&timeout)

timeout--;

timeout=20000;

while(Echo&timeout)

timeout--;

timeout=TH0256+TL0; //这里偷了一点懒,将变量防死机变量timeout作为了返回值

TH0=TL0=0;

return timeout0024;

}

以上就是关于求一个cc2530 超声波模块测距的程序全部的内容,包括:求一个cc2530 超声波模块测距的程序、求基于AT89C52超声波测距简易设计的源程序,要求用3个LED管显示其测距,精确到小数点后2位如,X.XX米。、跪求一个 用stc12c系列 pca发送40khz 单片机 定时捕捉回波 的超声波测距 c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9417344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存