语音播报超声波测距程序

发布者:荒火最新更新时间:2015-10-26 来源: eefocus关键字:语音播报  超声波测距 手机看文章 扫描二维码
随时随地手机看文章
语音播报超声波测距程序,语音集成电路用ISD4004 SS接P1.2 MOSI接P1.0 MISO接P1.1 SCLK接P1.3。超声波模块用市面上常用的模块。由于超声波属于声波范围,其速度与温度有关,不同温度下超声波在空气中传播速度随温度变化关系:V=331.4+0.61T。所以要是测量结果更加精确需另加温度补偿模块(本实验中采用开发板上的DS18B20温度传感器完成温度补偿)。外围可添加LCD显示(本实验采用开发板1602LCD)和语音播报模块(本实验采用ISD4004语音模块)。

[转载]语音播报超声波测距程序

 

// *********************单片机实验室******************************/
// *功能 : 语音播报超声波测距程序(测量范围:4~80cm)
// *引脚连接 : ISD4004 SS接P1.2 MOSI接P1.0 MISO接P1.1 SCLK接P1.3
// * 超声波模块 TX接P3.1 RX接P3.2 J7接上插冒
// *当前版本 :1.0
// *作者 : 刘松
// ****************************************************************/
#include
#include
#include"lcd.h" // 液晶显示
#include"ds18b20.h" //温度传感器
sbit P3_1=P3^1;
sbit key1=P2^1; //定义按键
sbit SS=P1^2; //以下四行定义ISD4004引脚
sbit MOSI=P1^0;
sbit MISO=P1^1;
sbit SCLK=P1^3;
uchar addr; //语音地址全局变量
uchar s; //语音所对应数字
int VD; //扩大十倍的声速
int D; //测量的距离
int temp; //超声波反射时间
void timer() //初始化计数器
{
TMOD=0x10;
TH1=0;
TL1=0;
EA=1;
EX0=1;
}

void delay25us_40KHz(unsigned char us) //产生方波用于超声波发射
{

TR1=1;
while(us--)
{
P3_1= 0;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();
P3_1= 1;
_nop_();_nop_();
_nop_();_nop_();
}
P3_1= 1;
}

rec() interrupt 0 //计算超声波反射时间
{
TR1=0;
EA=0;
temp=TH1*256+TL1;
}

void delayms(uchar ms) // 延时子程序用于语音播放上电等待
{
uchar j;
while(ms--)
{
for(j = 0; j < 120; j++);
}
}

void delay2(int m) //长延时用于语音播放http://www.jiaoqb.com/
{
int l,j;
for(l=0;l<30001;l++)
for(j=0;j }

////////////////////////////液晶显示子函数//////////////////////////////////
void display()
{
float V;//声速
V=331.4+0.61*T; VD=V*10;
D=temp*V/2000-29;
displaystring(0,0,"Dis=");
displaychar(4,0,(D/100)+0x30);
displaychar(5,0,(D0/10)+0x30);
displaychar(6,0,'.');
displaychar(7,0,(D)+0x30);
displaystring(8,0,"cm");
displaystring(0,1,"T=");
displaychar(5,1,(TD)+0x30);
displaychar(4,1,'.');
displaychar(3,1,(TD0/10)+0x30);
displaychar(2,1,(TD/100)+0x30);
displaychar(6,1,0xdf);
displaychar(7,1,'C');
displaystring(9,1,"V=");
displaychar(11,1,(VD/1000)+0X30);
displaychar(12,1,(VD00/100)+0X30);
displaychar(13,1,(VD0/10)+0X30);
displaychar(14,1,'.');
displaychar(15,1,(VD)+0X30);
}
///////////////////////////////////////////////////////////////

////////////////放音部分子程序,放音地址由ADDR决定http://www.jiaoqb.com/
void play(addr)
{
uchar y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1; //上电命令
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送地址结束
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xe0>>y)&0x01)MOSI=1; //指定地址放音命令电子小制作_我爱制作_电子DIY制作套件http://www.5imcu.net/
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xf0>>y)&0x01)MOSI=1; //忽略地址放音命令(连贯播放后续空间)
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
///////////////////////////////////////////////////////////////

///////////////////读数字子函数///////////////////////////////
void speaknum()
{
if(s==1) play(0x01);
if(s==2) play(0x0a);
if(s==3) play(0x14);
if(s==4) play(0x1e);
if(s==5) play(0x28);
if(s==6) play(0x32);
if(s==7) play(0x3c);
if(s==8) play(0x46);
if(s==9) play(0x50);
if(s==0) play(0x6e);
}
////////////////////////////////////////////////////////////////
[page]
///////////////////读出显示结果子函数////////////////////////////
void read()
{
play(0xdc); //播报“测量距离”这四个字,0xdc是之前记录下4004录这四个字的地址
delay2(50000);
delay2(50000); //延时等待播报完毕电子小制作_我爱制作_电子DIY制作套件
s=D/100; //D是测量得到的数据值,此语句是取数据的最高位
if(s==1) //判断最高位(十位)如果是“1”则不读yi而读shi
{
play(0x5a); //shi的地址
delay2(50000);
}
if(s>1) //如果大于1则读出相应数字后直接在后面加读shi
{
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
}
s=D0/10; //取次高位(个位)的值
if(s!=0) //次高位不为0则读出相应的值,为0跳过
{
speaknum();
delay2(50000);
}
play(0x64); //读小数点“dian”
delay2(50000);
s=D; //取小数点后一位的值
speaknum();
delay2(50000);
play(0xbe); //播报“cm”limi
delay2(50000);
///////////////////////////以下是播报温度和当前计算的声速,方法同上///////////////////
play(0xf0);
delay2(50000);
delay2(50000);
s=TD/100;
if(s==1)
{
play(0x5a);
delay2(50000);
}
if(s>1)
{
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
}
if(s!=0)
{
s=TD0/10;
speaknum();
delay2(50000);
}
play(0x64);
delay2(50000);
s=TD;
speaknum();
delay2(50000);
play(0xC8);
delay2(50000);
delay2(50000);
play(0xe6);
delay2(50000);
delay2(50000);
s=VD/1000;
speaknum();
delay2(50000);
play(0xfa);
delay2(50000);
s=VD00/100;
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
s=VD0/10;
speaknum();
delay2(50000);
play(0x64);
delay2(50000);
s=VD;
speaknum();
delay2(50000);
play(0xd2);
}
////////////////////////////////////////////////////////////

void main()
{
initlcd() ; //初始化LCD1602http://www.duankudp.com/
while(1)
{
timer();
readtemp(); //读温度
delay25us_40KHz(15);
display();
if(key1==0) read();
}
}
以下是温度传感器头文件ds18b20.h
sbit DQ=P2^2;
uchar tempdata[2];
uchar k=0;
int TD;
float T;
void delay1(uchar i)
{
while(i--);
}
void initDS18B20() //初始化DS18B20
{
DQ = 1; //DQ复位
delay1(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay1(80); //延时 大于 480us
DQ = 1; //拉高总线
delay1(30);
}
uchar readchar() //向DS18B20读取一字节http://www.duankudp.com/
{
uchar i = 0 ;
uchar dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
dat >>= 1 ;
DQ = 1 ;
if(DQ)
dat |= 0x80 ;
delay1(4) ;
}
return (dat) ;
}
void writecmd(uchar cmd) //向DS18B20写入一字节
{
uchar i ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = cmd&0x01 ;
delay1(5) ;
DQ = 1 ;
cmd>>=1 ;
}
}

void readtemp()
{
initDS18B20() ;
writecmd(0xCC) ; // 跳过读序号列号的操作
writecmd(0x44) ; // 启动温度转换
initDS18B20() ;
writecmd(0xCC) ; //跳过读序号列号的操作
writecmd(0xBE) ; //读取温度寄存器
tempdata[0] = readchar() ; //温度低8位
tempdata[1] = readchar() ; //温度高8位
TD=tempdata[1];
TD<<=8;
TD|=tempdata[0];
T=TD*0.0625; //DS18B20在出厂时以配置为12位,读取温度时共读取16位,最高5位为符号位,温度在0上,符号位为0,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度
TD=T*10+0.5; //将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二2进行4舍5入
}

一下是液晶显示头文件lcd.h
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
#define uchar unsigned char
#define DATA P0
#define busy 0x80

void chkbusy() //检测状态
{
DATA=0xff;
RS=0;
RW=1;
EN=1;
_nop_();
_nop_();
while(busy&DATA);
EN=0;
}
void WIR(uchar CMD,uchar i) //写命令
{
if(i) chkbusy();
RS=0;
RW=0;
EN=1;
_nop_();
_nop_();
DATA=CMD;
EN=0;
}
void WDR(char c) //写数据
{
chkbusy();
RS=1;
RW=0;
EN=1;
_nop_();
_nop_();
DATA=c;
EN=0;
}
void displaychar(uchar x,uchar y,char c) //指定行列显示字符
{
if(y==1) x|=0x40; //当要显示第二行时地址码+0x40;
x|=0x80;
WIR(x,0);
WDR(c);
}
void displaystring(uchar x,uchar y,char s[]) //指定行列显示字符串http://www.duankudp.com/
{
uchar p=0;
while(1)
{
displaychar(x,y,s[p]);
p++;
if(s[p]==0)
break;
x++;
if(x>=15) //每行最多显示16个字符
{
x=0;
y=!y; //如果一行显示不完,则转到下一行或上一行显示
}
}
}
void initlcd() //初始化lcd
{
WIR(0x38,0);
WIR(0x38,1); //显示模式设置
WIR(0x08,1); //关闭显示
WIR(0x01,1); //清屏
WIR(0x06,1); //光标移位设置
WIR(0x0c,1); //显示开及光标设置
}
关键字:语音播报  超声波测距 引用地址:语音播报超声波测距程序

上一篇:单片机C语言下LCD多级菜单的一种实现方法
下一篇:MSP430之Timer_A之典型应用——PWM

推荐阅读最新更新时间:2024-03-16 14:37

基于51单片机的超声波测距系统的研究与设计
在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好的折衷。   为此,文中尝试以单片机AT89S52为核心,利用一对40 kHz压电超声传感器设计一款体积较小、价格低廉、精度较高、具有温度补偿、实时LCD显示和报警的超声波测距仪。   1 超声波测距原理   超声波传感器分机械方式和电气方式两类,它实际上是一种换能器
[单片机]
基于51单片机的<font color='red'>超声波测距</font>系统的研究与设计
LCD1602液晶显示模版+超声波测距(C51)
LCD1602display.h #ifndef _LCD1602DISPLAY_H_ #define _LCD1602DISPLAY_H_ #include reg52.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; //************************LCD引脚定义 sbit LCM_RS=P2^5; sbit LCM_RW=P2^6; sbit LCM_E=P2^7; //**************************延时
[单片机]
LCD1602液晶显示模版+<font color='red'>超声波测距</font>(C51)
固定阈值在超声波测距车载应用中的使用
引言 在超声波测距车载应用中,例如:超声波泊车辅助 (UPA) 和盲点探测 (BSD) 等,系统发射的超声波被周围物体反射回来。系统接收反射波(回波),然后将物体的回波振幅与某个阈值比较,从而实现探测物体的目的。物体越靠近系统,其回波也越强。因此,阈值随时间而变化,是一种相对常见的情况。本文将向您论述,该阈值无需变化,可以保持固定不变。 超声波测距 小轿车中使用的高级驾驶员辅助系统 (ADAS) 便是一种超声波测距应用。安装在车载前后保险杠和后视镜上的超声波传感器发射出超声波,然后接收周围物体反射回来的超声波。超声波的传播时间(飞行时间)用于计算到物体的距离,从而帮助驾驶员泊车:寻找泊车点,或者探测驾驶员盲点区域内的物体。车载前
[测试测量]
固定阈值在<font color='red'>超声波测距</font>车载应用中的使用
基于语音芯片和AT89S52单片机的语音播报记事器设计
引 言 本文介绍一种以语音存储与自动播放系统为基础的语音播报记事器设计。该设计以ISD4004语音芯片和AT89S52单片机为中心,很好地实现了语音存储与自动播放。 1 硬件设计原理 语音播报记事器的主要功能是实现语音存储与定时播放。要实现语音存储与定时播放的方法很多,MTD2002可供选择的器件也很多。由于单片机等微控制器的出现和数字电路技术的发展,使得现在的语音存储与自动播放变得易于实现。本设计采用单片机作为微控制器。单片机的字长由4位、8位、16位发展到32位。目前这几种字长的单片机同时存在于市场,用户可以根据不同的需要进行选择。本系统选用字长为8位的AT89S52单片机作为控制器。 目前可以与单
[单片机]
基于<font color='red'>语音</font>芯片和AT89S52单片机的<font color='red'>语音</font><font color='red'>播报</font>记事器设计
智能汽车防撞报警器的设计开发
0 引 言     汽车防撞报警器的核心部件是汽车防撞雷达。汽车防撞雷达(俗称电子眼)之所以能实现防撞报警功能,主要有超声波这把无形尺子,它测量最近障碍物的距离,并告知车主。超声测距原理简单:它发射超声波并接收反射回波,通过单片机计数器获得两者时间差t,利用公式S=Ct/2计算距离(S为汽车与障碍物之间的距离;C为声波在介质中的传播速度,C=331.4(1+θ/273);θ为摄氏温度。本文介绍的超声测距系统共有4只超声波换能器(俗称探头),分别布置在汽车的前左、前右、后左、后右4个位置上。能检测前进和倒车方向障碍物的距离,通过后视镜内置的显示单元显示距离和方位,发出一定的声响,起报警防撞作用。 1 天车防撞报警仪的总体方案
[嵌入式]
汽车倒车雷达系统的设计与实现
0 引 言     中国经济的持续增长和汽车价格的持续下降,越来越多的家庭拥有了私家车。在享受汽车给人们带来便利的同时,由于倒车而产生的问题也日益突出。据初步调查统计,15%的汽车事故是由汽车倒车“后视”不良造成的。早期的倒车防撞仪可以测试车后一定距离范围的障碍物从而发出警报,后来发展到根据距离分段报警。随着人们对汽车驾驶辅助系统易用性要求的提高,对汽车倒车雷达的要求也越来越高。本文设计的基于单片机AT89C51的倒车雷达,采用美国DAL-LAS半导体公司生产的DS18B20单总线型数字温度传感器进行温度补偿提高了测距精度,采用OC-MJ12232C_3液晶显示模块对车距进行实时显示和ISD4004语音芯片实现了倒车雷达语音报
[嵌入式]
基于51单片机超声波测距防近视台灯程序
程序代码 仿真图 单片机源程序如下: #include reg52.h #include intrins.h /*********************宏定义************************/ #define uchar unsigned char #define uint unsigned int /************位定义*****************************/ sbit Trig=P3^7; //超声波模块触发位 sbit LEDRED=P1^0; sbit LEDGREEN=P1^2; sbit speaker=P1^7; sbit person=P1^6; sbi
[单片机]
基于51单片机<font color='red'>超声波测距</font>防近视台灯程序
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved