具有实时语音播报功能的超声波测距仪(C程序)

合集下载

9超声波测距程序超声波发射程序.c]

9超声波测距程序超声波发射程序.c]

1.#include<REG52.H>2.#include<INTRINS.H>3.#define uchar unsigned char4.#define uint unsigned int5.#define ulong unsigned long6.7.uint c;8.ulong l,time;9.char i=1,j=1,k=80;10.char t,tp=10,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg;11.sbit RW=P2^1;12.sbit RS=P2^0;13.sbit E=P2^2;14.sbit rece=P3^3;15.sbit tup=P1^1;16.sbit tdown=P1^0;17.sbit aj=P1^2;18.sbit reset=P1^3;19.20.sbit sg=P3^7;21.sbit DQ=P3^5;22.sbit ctl=P3^5;23.24.25.void delay(uint i)26.{while(i--);27. }28.29.//************液晶显示***************//30.31.void writercom(uchar q)32.{E=1;33. RS=0;34. RW=0;35. P0=q;36. E=0;37. delay(20);38. }39.40.void writerdata(uchar o)41.{42. E=1;43. RS=1;44. RW=0;45. P0=o;46. E=0;47. delay(20);48. }49.50.void writer_d(uchar *u)51.{while(*u)52. writerdata(*u++);53. }54.55.void xsinit(void)56.{writercom(0x01);57. writercom(0x38);//使用8位数据,显示两行,使用5*7的字型//58. writercom(0x0c);//显示设置,不显示光标,字符不显闪琐//59. writercom(0x06);//光标从左往右移,内容不移//60.61. }62.63.pdisplay()64.{writercom(0x80);65. writer_d("Press any key ");66. writercom(0xba);67. writer_d(" to continue...");68. delay(2000);69.70.}71.72.bdisplay()73.{writercom(0x80);74. writer_d("Ultrasonic ");75. writercom(0xba);76. writer_d(" range finder");77. delay(60000);78. }79.80.ipdisplay()81.{writercom(0x80);82. writer_d(" Please input ");83. writercom(0xba);84. writer_d("T(");85. writerdata(0xdf);86. writer_d("C) with K1,K2.");87. delay(2000);88. }90.91.92.//*************超声波测距*************************//93.94.void csbinit() //初始化程序,计数/定时器状态 //95.{TMOD=0x12; //定时器1工作在定时方式1,定时器0工作在定时方式2//96. IE=0x84; //中断设置//97. TH0=244;98. TL0=244;99. }100.101.void sen() //超声波发射程序//102.{uchar times=0;103. TR0=1;104. TR1=1; //开定时器//105.while(1)106. {while(TF0==0);107. sg=~sg;108. times++; //翻转20次,发送10个脉冲信号的超声波//109. TF0=0;110.if(times==20)break;}111. times=0;112.}113.114.csbdata()115.{lb=l/1000000;116. ls=l%1000000/100000;117. lg=l%1000000%100000/10000;118. lsf=l%1000000%100000%10000/1000;119.if(lsf>=5)120. lg=lg+1;121.}122.123.rec()interrupt 2 using 2//接收中断程序//124.{TR1=0;//关计数器//125. ctl=0;126. time=TH1*256+TL1; //算出t的值,t的单位为us//127. l=time*c/2;128. TH1=0;129. TL1=0;130. }131.132.display1()134.while(k--)135. {ipdisplay();136.if(tup==0||tdown==0||reset==0||aj==0){i=0;break;} 137. }138. k=60;139.while(k--)140. {pdisplay();141.if(tup==0||tdown==0||reset==0||aj==0){i=0;break;} 142. }143. k=60;144. }145.measure()146.{csbdata();147.while(1)148. {if(aj==1)break;}149. ctl=0;150. sen();151. delay(200);152. ctl=1;153. }154.155.156.display2()157.{writercom(0x80);158. writer_d("T:");159. writerdata(fh);160. writerdata(ts+0x30);161. writerdata(tg+0x30);162. writerdata(0xdf);163. writer_d("C ");164. writer_d("c=");165. writerdata(cb+0x30);166. writerdata(cs+0x30);167. writerdata(cg+0x30);168. writer_d("m/s");169.while(i)170. {while(k--)171. {writercom(0xba);172. writer_d("Press K3 measure");173.if(aj==0){i=0;break;}174. delay(2000);}175. k=20;176.while(k--)178. writer_d(" ");179.if(aj==0){i=0;break;}180. delay(2000);}181. k=20;182. }183. i=1;184. measure();185. delay(2000);186. csbdata();187. writercom(0x80);188.if(l<=360000)writer_d("too near! "); 189.else if(TH1>=93)writer_d("too long! "); 190.else {csbdata();191. writer_d("L=");192. writerdata(lb+0x30);193. writerdata('.');194. writerdata(ls+0x30);195. writerdata(lg+0x30);196. writer_d("m ");197. writer_d("T:");198. writerdata(fh);199. writerdata(ts+0x30);200. writerdata(tg+0x30);201. writerdata(0xdf);202. writer_d("C ");203. }204.while(i)205.{writercom(0xba);206. writer_d("Press K4 again..");207.if(tup==0&&tdown==0){j=0;break;}208.if(reset==0){i=0;break;}209.210. }211.}212.//***************温度输入程序**************// 213.iptemp()214.{while(1)215. {if(t<0){fh=0x2d;t=~t+1;}216.else{fh=0x20;}217. ts=t/10;218. tg=t%10;219. writercom(0x80);220. writer_d(" T:");222. writerdata(ts+0x30);223. writerdata(tg+0x30);224. writerdata(0xdf);225. writer_d("C ");226.if(tup==0){tp++;if(tp>=99)tp=99;}227. delay(7000);228.if(tdown==0){tp--;if(tp<=(-30))tp=(-30);} 229. t=tp;230. delay(7000);231. writercom(0xba);232. writer_d("Press K4 finish ");233.if(reset==0)break;234. }235.}236.//********声速处理程序************************// 237.sscl()238.{c=340;239.240. cb=c/100;241. cs=c%100/10;242. cg=c%100%10;243. }244.245.//***************主程序***************//246.main()247.{while(1)248.{xsinit();249. csbinit();250. bdisplay();251. bdisplay();252. bdisplay();253. bdisplay();254. bdisplay();255. ipdisplay();256. ipdisplay();257.while(i)258. {display1();259. }260. i=1;261. delay(20000);262. iptemp(); //调温度输入函数//263. sscl();264. delay(20000);265.while(j) 266.{display2(); 267. i=1;268.269.}270.j=1;271.delay(60000); 272.}273.}。

C语言超声波测距程序 亲测可运行! 附代码数据

C语言超声波测距程序 亲测可运行!  附代码数据

#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^0; //1602的数据/指令选择控制线sbit rw=P2^1; //1602的读写控制线sbit en=P2^2; //1602的使能控制线sbit trig=P2^5; //超声波测距模块Trigsbit echo=P3^2; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字/*------------------------------------------------延时函数------------------------------------------------*/void delay(uint n){uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}/*------------------------------------------------延时函数------------------------------------------------*/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/*------------------------------------------------1602写命令函数------------------------------------------------*/void lcd_wcom(uchar com){rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要en=0;}/*------------------------------------------------1602写数据函数------------------------------------------------*/void lcd_wdat(uchar dat){rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。

超声波测距仪C语言程序.txt

超声波测距仪C语言程序.txt
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
}
}
}
void k1cl()
{
sj1=sj1+5;
if(sj1>100)
sj1=30;
s=sj1;
}
void k2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
void k3cl()
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j); //延时函数
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
}
void delay(i)
{
while(--i);
}
void timer1int (void) interrupt 3 using 2
{
TH1=0x9E;

具有实时语音播报的超声波测距测速仪

具有实时语音播报的超声波测距测速仪

具有实时语音播报的超声波测距测速仪(C题)摘要:本文研究内容为实时语音播报的测距测速仪,利用超声波进行距离测量,测量精度在厘米级别,适用于近距离测距。

本系统以STC12C5A60S为微处理芯片,其产生40kHz频率,再利用超声波换能器TCT40-16T产生超声波信号并发射出去,由TCT40-16R接收超声波信号,并利用超声波专用芯片CX20106A检波、处理超声波信号,最后发送给微处理器。

微处理器通过计算得到与障碍物的距离,并通过所得距离计算出物体的移动速度。

微处理器通过串口控制JQ6500语音模块。

当微处理器计算得到障碍物的距离和物体移动速度时,微处理器发送指定的命令,驱动语音模块播放保存在FLASH中的语音,实现实时语音播报。

关键词:STC12C5A60S2;JQ6500;超声波。

1 系统方案设计设计任务根据命题要求,设计并制作一台具有实时语音播报的超声波测距测速仪。

A. 具有超声波测距功能,测量距离~,测距精度±1cm;B. 自动语音实时播报测量距离数值;实时播报时间间隔t≤10s;实时语音播报清晰明亮、无明显失真,在1米距离处人耳能准确分辨。

C. 实时显示测量的距离和速度,并且显示内容要与语音播报内容同步。

总体设计方案具有实时语音播报的超声波测距测速仪由6部分组成:超声波发射模块、超声波接收模块、51单片机最小系统、LCD1602显示模块、JQ6500语音播报模块、按键模块组成。

图1-1 超声波测距测速仪组成图声波测速测距原理声波测距原理超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到发射波就立即停止计时。

假设超声波在空气中的传播速度为V,根据计时器记录的时间T,发射点距障碍物的距离S,如图1-2所示。

MS T Ra图1-2 声波测距示意图两探头中心距离的一半用M 表示,超声波单程所走过的距离用L 表示,可得:(公式1-1)(公式1-2)在整个传播过程中,超声波所走过的距离为:(公式1-3)由公式(公式1-1)、(公式1-2)、(公式1-3))可得: (公式1-4)当被测距离S 远远大于M 时,上式变为: (公式1-5)因为本设计测距精度为厘米级别,对误差要求不是很高,所以将声速取值为在20℃的时的传播速度,即V=344米/秒。

具有实时语音播报的超声波测距测速仪设计

具有实时语音播报的超声波测距测速仪设计
me t h o d o f t h e v e l o c i t y a n d d i s t a n c e me a s u r e me n t b y t h e u l t r a s o n i c . Ta k i n g S T C8 9 C 5 2 RC a s t h e p r i ma r y c o n t r o l l e r ,t h e u h r a s o n i c d i r v e s i g n a l i s l a u n c h e d b y t h e t i me r a n d 1 2 8 6 4 LC D d i s p l a y a n d I S D4 0 0 4 v o i c e b r o a d c a s t o f t h e me a s u r i n g r e s u l t s a r e r e a l i z e d b y t h e d y n a mi c
液 晶显 示和 I S D 4 0 0 4语 音 播 报 。
Ab s t r a c t :B y t h e a d v a n t a g e s o f h i s h d i r e c t i v i t y , s l o w e n e r g y c o n s u mp t i o n a n d l o n g p r o p a g a t i o n d i s t a n c e i n t h e me d i u m, he t u l t r a s o n i c
曹永红 C AO Yo n g - h o n g ; 刘小 亮 L I U X i a o - l i a n g
( 石 家庄 铁 道 大 学 四 方学 院 , 石 家庄 0 5 1 1 3 2)

具有实时语音播报的超声波测距测速仪设计

具有实时语音播报的超声波测距测速仪设计

具有实时语音播报的超声波测距测速仪设计作者:曹永红等来源:《价值工程》2014年第32期摘要:超声波凭借自身指向性强、能量消耗缓慢,以及在介质中传播距离远等优势,进而广泛应用于距离测量。

与其它检测方式相比,超声波作为一种非接触式的检测方式,在检测过程中不受光线、被测对象颜色等因素的影响和制约。

本文介绍了超声波测距测速的原理和方法。

以STC89C52RC单片机作为主控制器,用定时器实现超声波驱动信号的发射,用动态扫描法实现测量结果的12864液晶显示和ISD4004语音播报。

Abstract: By the advantages of high directivity, slow energy consumption and long propagation distance in the medium, the ultrasonic is widely used in the distance measurement. Compared with other detection methods, as a contactless detection method, the ultrasonic is not affected and controlled by the light and the color of the measured object in the detection process. This paper introduces the principle and method of the velocity and distance measurement by the ultrasonic. Taking STC89C52RC as the primary controller, the ultrasonic drive signal is launched by the timer and 12864 LCD display and ISD4004 voice broadcast of the measuring results are realized by the dynamic scanning method.关键词:超声波;测距测速;单片机;液晶显示;语音播报Key words: ultrasonic;distance and velocity measurement;singlechip;LCD;voice broadcast中图分类号:TH761 文献标识码:A 文章编号:1006-4311(2014)32-0065-020 引言对于蝙蝠等一些无目视能力的生物来说,借助超声波定位技术进行防御、捕捉猎物等维持自身的生存,也就是生物体发射超声波(超过20kHz的机械波),一般不能被人们所听到,这种超声波是借助空气等媒质进行传播,借助被捕捉的猎物或障碍物反射回来的回波的强弱和时间间隔的长短判断猎物或障碍物位置的方法,根据这一原理,人们提出了超声波测距。

具有实时语音播报的超声波测距仪

具有实时语音播报的超声波测距仪

片机 。 “ 4 ” 2 B的 R 19 有 k AM, 0 B的 Fah 内部 自带温度 6k ls ,
路 。其特 点是无激励信 号时 , 个功放管 的静态 电流 为零 ; 两 有 信 号激励 时, 两管 交替 工作 , 输 出半 波信 号 , 起来成 各 合
传感器 , AD转 换器 。“ 4 ” 和 / 19 有两 个 l 6位 A、 B定时器和
Absr t T e p p ri a e n t e mi r o tolrMS 4 0 4 . h e tr ̄ q e c futa o i t ac : h a e sb s d o c c nr l P 3 F1 9 T e c n e e u n y o l s n c ̄n o 0 Hz h h o e r s ri 4 k . e s T
o tg o la e t n ’ o tg n o n i g ta s t t e we n u t s n c s n i g a d r c ii g L v l e a d c u t r mi i a n n me b t e l a o i e d n r n e ev n .
模 型进行 了 PD控制和 模糊 自整定 PD控制 仿真 运算 , I I 在
两种控制方 式下 的阶 跃响应仿真 曲线如 图 3所示 。 从图 3中可 以看 出, 由于 模糊控 制器 能够根 据系统误 差 E和误差 变化 率 E C对 PD 的三个 参数 K 、 IK I P K 、 D进行 在线修正 ,因此 得到 的系统动 态响应 曲线 较好 ,响应速度 快、 超调量 小 、 稳态 精度 高 , 在抗 干 扰 能力和 对象 参数 变化 时 的适应性好 。系统在设 定值 范 围 内振荡减 弱 , 比常规 PD I

“美亚光电”杯安徽省第三历真题

“美亚光电”杯安徽省第三历真题

集成电路芯片测试仪( A 题)一、任务设计制作一个集成电路芯片测试仪,能对常用的 74系列逻辑芯片进行逻辑功能测试,以确定芯片的好坏和型号。

二、要求 1.基本要求( 1)通过键盘输入型号,可以对74系列的 00/02/04 /08/10/11/20/21/27/30十种组合逻辑集成电路芯片测试仪(A题)一、任务设计制作一个集成电路芯片测试仪,能对常用的74系列逻辑芯片进行逻辑功能测试,以确定芯片的好坏和型号。

二、要求1.基本要求(1)通过键盘输入型号,可以对74系列的00/02/04/08/10/11/20/21/27/30十种组合逻辑芯片进行逻辑功能测试,确定其功能正确性;(2)通过键盘输入管腿特性,可以确定上述74系列的组合逻辑芯片的型号;(3)显示上述芯片的逻辑符号和逻辑表达式。

2.发挥部分将上述三项基本要求扩展到74系列时序电路:74/109/160/245等。

(1)通过键盘输入型号,可以对74系列的74/109/160/245等芯片进行逻辑功能测试,确定其功能正确性;(2)通过键盘输入管腿特性,可以确定上述74系列时序逻辑芯片的型号;(3)显示上述芯片的逻辑符号和状态转换图;(4)其它特色与创新。

三、评分标准四、说明要求用单片机或DSP模块做成一个相对独立的整体,不能用PC机实现。

“美亚光电”杯安徽省第三届B题------分隔线----------------------------时间:2009-10-01 02:02来源:未知作者:admin 点击:497次LED 显示棒( B 题)一、任务设计制作一个依靠摇动能显示字符、图形的LED显示棒。

二、要求 1.基本要求( 1)设计一个基于LED的显示棒,LED 灯必须线状排列,至少使用16只。

( 2)摇动时形成的亮灯扇形区域能够让人分辨出A字符。

( 3)摇动时形成的亮灯LED显示棒(B题)一、任务设计制作一个依靠摇动能显示字符、图形的LED显示棒。

超声波测距仪代码(C)

超声波测距仪代码(C)
ulong TIME; uchar DISTANCE; uchar code discode[11]={'0','1','2','3','4','5','6','7','8','9',' '}; ulong data disnum[5]; bit data ReceiveOK=0; bit data TOut; bit data FLAG;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ (); _nop_();_nop_(); CSOut=1;//6
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_ (); _nop_(); CSOut=0;//7
Hale Waihona Puke if(FLAG==1) //启动测量一次 {
TH0=0x00; TL0=0x00; TIME=0x00;
ET0=1; CCOut(); ct=100; while(--ct); EX0=1; while(TOut==0) {
if(ReceiveOK==1) //接收成功 {
DataProcess(); //数据处理
/*-----------------------------------------------------------*/ //出错提示函数 /*-----------------------------------------------------------*/ void ErrorDisplay(void) { lcd_home(); lcd_writestr(0,0," 超声波测距仪 "); lcd_writestr(1,0,"********"); lcd_writestr(2,0,"未收到回波信号,"); lcd_writestr(3,0,"请缩短测量距离!"); }

超声波测距12864显示程序带语音播报

超声波测距12864显示程序带语音播报
#include <AT89X52.H>
#include <string.h>
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P2 //数据口
sbit RS=P3^7;
flag=0;
time=0;
P16=1;
}
if((flag==1)&&(time>=200)&&(time<=500)){
Dis_string(1,0,"距离");
Dis_string(1,7,"米");
display(time,4);
Dis_string(2,2,string2);
}
void main()
{
flag=0;
P0=0XFF;
P14=0;
P15=0;
P16=0;
LcdInit(); //液晶初始化
Clear_txt();//清除液晶上的的文本
Dis_string(0,2,"欢迎使用");
Dis_string(2,0,"超声波测距离系统");
void DelayMs(uint z)
{
uint x,y;
for(x=z;x!=0;x--)
for(y=255;y!=0;y--);
}
//延时函数
void delay(unsigned int MS)
{

超声波测距c语言程序

超声波测距c语言程序

//超声波模块显示程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚sbit fmq=P1^7;uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9 uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志void conversion(uint temp_data) //显示数据转换程序{uchar ge_data,shi_data,bai_data ;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data]&0x7f;ge_data =SEG7[ge_data];EA=0;bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//20us延时函数void delay_20us(){ uchar bt ;for(bt=0;bt<22;bt++);}//1ms基准延时程序void delay1ms(unsigned int i){unsigned char j;while(i--){for(j=0;j<115;j++){;}}}//产生1KHZ频率声音的函数void beep(){fmq=0;delay1ms(500);fmq=1;delay1ms(500);}// 主程序void main(void){ uint distance_data,a,b;uchar CONT_1;i=0;flag=0;Tx=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Tx=1;delay_20us();Tx=0; //产生一个20us的脉冲,在Tx引脚while(Rx==0); //等待Rx回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 50);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断if(succeed_flag==1){distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12; //因为定时器默认为12分频distance_data/=58; //微秒的单位除以58等于厘米} //为什么除以58等于厘米,Y米=(X秒*344)/2// X秒=(2*Y米)/344 ==》X 秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零}distance[i]=distance_data; //将测量结果的数据放入缓冲区i++;if(i==3){distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){ CONT_1=0;b=a;conversion(b);if(b>0&&b<200){fmq=0;delay1ms(100);fmq=1;}}i=0;}}}//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0x7f;flag++;break;case 0x01:P0=shi;P2=0xbf;flag++;break;case 0x02:P0=bai;P2=0xdf;flag=0;break;}}。

超声波测距C语言源程序代码

超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//****************************************************************************** *****///具有模式选择.#include<reg52.h>#define UC unsigned char#define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,sbit SX = P3^6;//K6 //P3^2(K3)为测量键.sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)void xiaxian(); //修改函数,用来修改下限void shangxian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值void MINxianshi(UI); //最小范围和最大范围的显示void MAXxianshi(UI);UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口)/********************************主函数*********************************************/void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MINxianshi(40); //1.50169000sMAXxianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MAX, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0x00; //防止最后显示的那个数码管一直亮MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进行测量{while(1) /*先进行模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //结束测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0x00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MAX){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示结束}}/****************************************************************************** *****/void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0x00;//定时器的初值,定时器的定时为65536us,TL0 = 0x00;}/****************************************************************************** *****/void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){xiaxian();while(QD==0);shangxian();}/****************************************************************************** ****/void MINxianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0x00;delay(55500);}void MAXxianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]];delay(500);}P2 =~ 0x00;delay(55500);}/****************************************************************************** *****/void delay(UI T) //延时程序{while(T--);}/****************************************************************************** *****/void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;PX1 = 0;PT0 = 1;PX0 = 0;IT1 = 1; //外部中断0为跳变沿触发EX1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发EX0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0x00;//定时器的初值,定时器的定时为50us.TL0 = 0x00;/*1号定时器不用,所以没有TH1,TL1*/}/****************************************************************************** *****/void xiaxian() //修改下限{while(1){if(BX==0)//百位{P2=~0x00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(SX==0)//十位{P2=~0x00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(GX==0)//个位{P2=~0x00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0xff;break;}}}void shangxian() //修改上限{while(1){if(BX==0)//百位{P2=~0x00;max[0]++;if(max[0]==10)max[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(100);if(SX==0)//十位{P2=~0x00;max[1]++;if(max[1]==10)max[1]=0;delay(60000);标准文档实用文案}a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]]; delay(100);if(GX==0)//个位{P2=~0x00;max[2]++;if(max[2]==10)max[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]]; delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0xff;while(QD == 0);break;}}}/****************************************************************************** ******/。

超声波测距程序

超声波测距程序

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*****************/ 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;

超声波测距并实时监控距离报警51C程序

超声波测距并实时监控距离报警51C程序
if(succeed_flag==1)
{
time=timeH * 256+timeL;
distance=time*0.0172; //厘米
if( distance < jiexian )
{
//uchar i;
// for( i = 5; i > 0;i --)//鸣五下蜂鸣器和闪五下LED
-------------------------------------*/
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}
{
timeH =TH1;//取出定时器的值
timeL =TL1;//取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
/*-------------------------------------
定时器1中断,用做超声波测距计时
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0;//定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0; //关闭外部中断0
{
warning = !warning;
LED = !LED;
}
/*------------延时函数---------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)

超声波测距仪(实时显示声光报警)_毕业设计论文报告

超声波测距仪(实时显示声光报警)_毕业设计论文报告

超声波测距仪(实时显示声光报警)毕业设计论文报告摘要机器人通过其感知系统觉察前方障碍物距离和周围环境来实现绕障、自动寻线、测距等功能。

超声波测距相对其他测距技术而言成本低廉,测量精度较高,不受环境的限制,应用方便,将它与红外传感器等结合共同实现机器人寻线和绕障功能。

本文介绍了基于STC89C51的超声波测距系统,阐述了超声波测距系统的硬件设计、软件设计及其工作原理。

该设计主要由单片机控制模块、数码管显示模块、DS18B20温度补偿模块以及声光报警模块等构成。

利用超声波的反射原理,计算超声波在空气中的传播时间的一半再乘以经过温度补偿修正后的速度就可以得出障碍物到传感器之间的距离,并在数码管显示出来。

同时,该系统在测量距离小于10cm时能进行声光报警。

该系统具有硬件电路简单、成本低、工作可靠、功耗低、体积小、误差小、有良好的测量精度等优点。

目前,超声波清洗技术、雷达技术等在医学、军事上占据着重要地位,因此研究超声波技术具有一定的研究意义。

本设计作品基本满足设计的要求,有一定的推广性,同时针对不足,如测量距离过小等,文章在最后提出了一些改进性能的可行性方案。

关键字:单片机;传感器;超声波测距;温度补偿Abstractrobot through its perception system to detect obstacles that in front of the road and the surrounding environment to achieve the distance around the barrier, auto hunt, range and other functions.Ultrasonic Ranging in terms to other ranging technology is low-cost, high accuracy, without environmental constraints, and convenient, it will be combined together with infrared sensors achieve robot hunt around the barrier function.This article describes the ultrasonic ranging system based on STC89C51,which e laborate ultrasonic Ranging System hardware design, software design and its working principle.The design is mainly controlled by the microcontroller module,LED display module, DS18B20 temperature compensation module, as well as sound and light alarm module ing the principle of reflection of the ultrasonic wave,Calculate the ultrasonic propagation time in the air in half and then multiplied by the speed after the correction of the temperature compensation that can be drawn between the obstacle to the sensor distance,And digital display.Secondly, the sound and light alarm when the system measuring distance less than 10cm .The system has an Advantage of Simple hardware circuit, low cost, reliable, low power consumption, small size, the error is small, h ave a good measurement accuracy, etc..At present, the ultrasonic cleaning technology, radar technology in medicine, the military occupies an important position,so the research ultrasound technology has a certain significance. This design works basically meet the design requirements, there are certain promotional, while for deficiencies, such as measuring the distance is too small, etc., the article concludes with a number of improvements in the performance of the feasibility of the program.KeyWords:MCU;Sensor;Ultrasonic Ranging;Temperature compensation目录摘要 0Abstract (1)第一章绪论 (4)1.1课题的研究背景 (4)1.2超声波在国内外的发展现状 (6)1.3研究目的和意义 (6)1.4研究内容 (6)1.5 论文结构 (7)第二章系统方案设计 (8)2.1设计要求 (8)2.2设计方案 (8)第三章硬件设计 (10)3.1 AT89C51单片机简介 (10)3.1.1 AT89C51各引脚的含义和功能 (11)3.2系统硬件设计组成部分 (13)3.2.1 AT89C51单片机最小系统 (13)3.2.2 数码管显示模块 (13)3.2.3超声波发射接收模块 (14)3.2.4声光报警模块 (20)3.2.5复位电路 (20)3.2.6 DS18B20温度补偿电路 (22)3.2.6.1 DS18B20内部结构及测温原理 (23)3.2.6.2 DS18B20的封装形式及引脚功能 (24)3.2.6.3 DS18B20的供电方式 (25)3.2.7 +5V电源模块 (26)第四章软件设计 (27)4.1软件整体设计 (28)4.2系统主要模块程序设计 (29)4.2.1超声波发射程序及接收中断子程序 (29)4.2.2 DS18B20访问程序 (29)第五章调试与检测 (31)5.1硬件测试 (31)5.2 软件测试 (32)5.3结果分析 (32)5.4误差来源 (32)5.5 解决方案 (33)5.6本设计所做工作 (33)总结与展望 (35)谢词 (36)参考文献 (36)附录1 电路原理图及PCB图 (38)附录2 程序清单 (40)第一章绪论超声波以其指向性好、穿透能力强、能量消耗缓慢、环境污染小等优点,因而超声波常用于距离测量。

超声波测距仪源程序

超声波测距仪源程序

以下是ZY1420语音模块的录音源程序清单:/******************************************************************* ZY1420语音模块的录音程序录音方法:开始工作后,按下K1键,根据设定的录音地址和时间开始录音。

放下K1键,本次录音结束。

再按下K1键,开始下次录音。

录音顺序按预先设定的,用P1来送地址******************************************************************** 地址:0x00 0x06 0x0c 0x12 0x18 ox24 ox2a 0x30 0x36 0x3c 0x42 ox48内容:1 2 3 4 5 6 7 8 9 十点米时间:0.5s******************************************************************** 地址:0x4e 0x66 0x7e 0x96内容:危险距离保持距离安全距离本次测量的距离为时间:2s 2s 2s 2s*******************************************************************/ #include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit REC=P2^4; //录音控制sbit PLAYE=P3^0; //控制触发录音sbit PLAYE=P3^1; //控制电平放音sbit Y=P2^3; //K1键extern unsigned long int distance;uchar addr;uint t;/**********************延时函数.延时为N*100ms**********************/ void delay(uint n) reentrant{uint t1,i,j;for(t1=1;t1<=n;t1++){for(i=1;i<=235;i++)for(j=1;j<=60;j++);}}/********************播放函数1*****************************/void paly(){delay(1);PLAYL=1;P1=addr; //播放起始地址为addr的内容。

具有实时语音播报的超声波测距仪

具有实时语音播报的超声波测距仪

具有实时语音播报的超声波测距仪
王亚君;刘赫;吕实诚
【期刊名称】《智能计算机与应用》
【年(卷),期】2008(000)004
【摘要】以MSP430F149作为微控制器,使用了中心频率为40kHz的超声波传感器,通过信号转换、放大、检测来计算超声波传播时间以确定物体距离.
【总页数】2页(P19-20)
【作者】王亚君;刘赫;吕实诚
【作者单位】哈尔滨理工大学副教授,哈尔滨150040;不详
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于51单片机的高精度超声波语音播报测距仪设计 [J], 李忠;许建明;申颖;粟成发;曹胜果
2.具有实时语音播报的超声波测距测速仪设计 [J], 曹永红;刘小亮
3.具有语音播报的测距仪的设计 [J], 邱宏超;刘教瑜;肖杰;方琳
4.基于AT89S51系列单片机实时语音播报的超声波测距仪设计 [J], 王景中;张朝杰
5.具有语音播报功能的超声波测距仪 [J], 樊奔;赵奇
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if((flag_time0 > 40000)) //当超声波超过测量范围时,显示3个888
{
TR0 = 0;
flag_csb_juli = 2;
distance = 888;
break ;
}
else
{
flag_csb_juli = 1;
}
}
if(flag_csb_juli == 1)
{
TR0=0;//关定时器0定时
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
sbit smg_we1 = P3^4;//数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send = P3^2;//超声波发射
}
}
}
/***********************处理距离函数****************************/
void smg_display()
{
dis_smg[0] = smg_du[distance % 10];//距离取出来放在缓冲区了
dis_smg[1] = smg_du[distance / 10 % 10];
/***************************
语音地址的安排
0 - 9:对应数字0到9
0b :点
0c :米
0d :已超出量程
**************************/
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************小延时函数**************************/
void delay_us (unsigned int us)
VSCL=1;
delay_us(150); Fra bibliotek* 150us */
}
VCS=1;
delay_1ms(200);
while(VBUSY == 0);//忙等待
}
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
while(us--)
{
_nop_();
}
}
/***********************三线发码子程序************************/
void Send_threelines(unsigned char addr)
{
unsigned char i;
VRST=0;
delay_1ms(5);
delay();
c_send = 0;
TH0 = 0;//给定时器0清零
TL0 = 0;
TR0 = 0;//关定时器0定时
while(!c_recive);//当c_recive为零时等待
TR0=1;
while(c_recive)//当c_recive为1计数并等待
{
flag_time0 = TH0 * 256 + TL0;
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
i++;
if(i >= smg_i)
i = 0;
smg_we_switch(i);//位选
P1 = dis_smg[i];//段选
}
/******************小延时函数*****************/
void delay()
{
_nop_();//执行一条_nop_()指令就是1us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************超声波测距程序*****************************/
void send_wave()
{
c_send = 1;//10us的高电平触发
VRST=1;
delay_1ms(20); /*复位拉高20ms*/
VCS=0;
delay_1ms(5); /*片选拉低5ms */
for(i=0;i<8;i++)
{
VSCL=0;
if(addr&0x01)
{
VSDA=1;
}
else
VSDA=0;
addr>>=1;
delay_us(150); /* 150us */
dis_smg[2] = smg_du[distance / 100 % 10] & 0x7f;
yujing[0] = distance % 10;//距离放到语音的变量里
yujing[1] = distance / 10 % 10;
yujing[2] = distance / 100 % 10;
}
/*********************定时器0、定时器1初始化******************/
void time_init()
{
EA = 1;//开总中断
TMOD = 0X11;//定时器0、定时器1工作方式1
ET0 = 0;//关定时器0中断
TR0 = 1;//允许定时器0定时
ET1 = 1;//开定时器1中断
smg_display();//处理距离显示函数
time_init();//定时器初始化程序
send_wave();//测距离函数
send_wave();//测距离函数
while(1)
{
if(flag_300ms == 1)
{
flag_300ms = 0;
send_wave();//测距离函数
smg_display();//处理距离显示函数
Send_threelines(yujing[1]);
Send_threelines(yujing[0]);
Send_threelines(0x0c);
}
}
}
}
}
/*********************定时器1中断服务程序************************/
void time1_int() interrupt 3
sbit c_recive = P3^3;//超声波接收
uchar smg_i = 3; //显示数码管的个位数
bit flag_300ms ;
long distance;//距离
uint set_d;//距离
uchar flag_csb_juli; //超声波超出量程
uint flag_time0; //用来保存定时器0的时候的
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/***********************数码显示函数*****************************/
void display()
{
static uchar i;
TR1 = 1;//允许定时器1定时
}
/***************主函数*****************/
void main()
{
static uchar value = 5;
P0 = P1 = P2 = P3 = 0xff;//初始化单片机IO口为高电平
send_wave();//测距离函数
/***********************语音模块控制IO口的定义************************/
sbit VRST = P2^3;
sbit VBUSY= P2^7;
sbit VSDA = P2^6;
sbit VCS = P2^5;
sbit VSCL = P2^4;
uchar yujing[3];
#include <reg52.h>//调用单片机头文件
#define uchar unsigned char //无符号字符型宏定义变量范围0~255
#define uint unsigned int//无符号整型宏定义变量范围0~65535
#include <intrins.h>
//数码管段选定义0 1 2 3 4 56789
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//断码
相关文档
最新文档