[论文精品]超声波LCD12864显示测距程序

合集下载

超声波测距系统(论文设计)正文、结论、参考文献等

超声波测距系统(论文设计)正文、结论、参考文献等

1 绪论1.1 超声波技术的广泛应用超声的研究和发展,与媒质中超声的产生和接收的研究密切相关。

1883年Galton 首次制成超声气哨,其原理是将压缩气体经过狭缝喷嘴形成气流,吹动圆形刀口振动形成共振腔,从而产生超声。

此后又出现了各种形式的汽笛和液哨等机械型超声换能器。

由于这类换能器成本低,所以经过不断改进,至今仍广泛地用于超声处理技术中。

20世纪初,电子学的发展使人们能利用某些材料的压电效应和磁致伸缩效应制成各种机电换能器。

1917年,法国物理学家Paul Langevin用天然压电石英制成了夹心式超声换能器,并成功地应用于水下探测潜艇。

随着军事和国民经济各部门中超声应用的不断发展,又出现更大超声功率的磁致伸缩换能器,以及各种不同用途的电动型、电磁力型、静电型等多种超声换能器。

材料科学的发展,使得应用广泛的压电换能器也由天然压电晶体发展到机电耦合系数高、价格低廉、性能良好的压电瓷、人工压电单晶、压电半导体以及塑料压电薄膜(PVDF)[1]等。

产生和检测超声波的频率,也由几十千赫提高到上千兆赫。

产生和接收的波型也由单纯的纵波扩大为横波、扭转波、弯曲波、表面波等。

如频率为几十兆赫到上千兆赫的微型表面波都己成功地用于雷达、电子通信和成像技术等方面。

利用超声波作为定位技术是蝙蝠等一些无目视能力的生物作为防御及捕捉猎物生存的手段,也就是由生物体发射不被人们听到的超声波(20kHz以上的机械波),借助空气媒质传播由被待捕捉的猎物或障碍物反射回来的时间间隔长短与被反射的超声波的强弱判断猎物性质或障碍位置的方法。

由于超声波的速度相对于光速要小的多,其传播时间就比较容易检测,并且易于定向发射,方向性好,强度好控制,因而人类采用仿真技能利用超声波测距。

超声波测距是一种利用声波特性、电子计数、光电开关相结合来实现非接触式距离测量的方法。

它在很多距离探测应用中有很重要的用途,包括非损害测量、过程检测、机器人检测和定位、以及流体液面高度测量[2]等。

超声波测距设计毕业设计

超声波测距设计毕业设计

超声波测距设计毕业设计一、引言距离测量在许多领域都具有重要的应用,如工业自动化、机器人导航、汽车防撞等。

超声波测距作为一种非接触式的测量方法,具有测量精度高、响应速度快、成本低等优点,因此在实际工程中得到了广泛的应用。

本次毕业设计旨在设计一种基于超声波的测距系统,实现对目标物体距离的准确测量。

二、超声波测距原理超声波是一种频率高于 20kHz 的机械波,其在空气中的传播速度约为 340m/s。

超声波测距的原理是通过发射超声波脉冲,并测量其从发射到接收的时间间隔,然后根据声速和时间间隔计算出目标物体与传感器之间的距离。

假设发射超声波脉冲的时刻为 t1,接收到回波的时刻为 t2,声速为c,距离为 d,则距离 d 可以通过以下公式计算:d = c ×(t2 t1) / 2三、系统硬件设计(一)超声波发射模块超声波发射模块主要由超声波换能器和驱动电路组成。

超声波换能器将电信号转换为超声波信号发射出去,驱动电路则提供足够的功率和电压来驱动换能器工作。

(二)超声波接收模块超声波接收模块主要由超声波换能器、前置放大器、带通滤波器和比较器组成。

换能器将接收到的超声波信号转换为电信号,前置放大器对信号进行放大,带通滤波器去除噪声和干扰,比较器将信号整形为方波信号。

(三)控制与处理模块控制与处理模块采用单片机作为核心,负责控制超声波的发射和接收,测量时间间隔,并计算距离。

同时,单片机还可以将测量结果通过显示模块进行显示,或者通过通信模块与上位机进行通信。

(四)显示模块显示模块用于显示测量结果,可以采用液晶显示屏(LCD)或数码管。

(五)电源模块电源模块为整个系统提供稳定的电源,包括 5V 和 33V 等不同的电压等级。

四、系统软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机的初始化、定时器的初始化、端口的初始化等。

然后进入主循环,不断地发射超声波脉冲,并等待接收回波。

当接收到回波后,计算距离,并进行显示或通信。

超声波测距报告含程序

超声波测距报告含程序

《单片机原理及应用》单片机课程设计报告超声波测距报告目录第1 章课程设计概述 (2)1.1 课程设计选题及原理 (2)1.2课程设计选题调研 (2)1.2.1 选题目的与意义 (2)1.2.2 国内外研究综述 (3)第2 章方案设计 (4)2.1 主要任务 (4)2.2 设计框图 (4)2.3 设计所需元器件及简介 (4)2.4 设计程序流程简图 (5)2.5 编程语言的选择第3 章电路及部分代码设计 (6)3.1 Stc12c5a60s2最小系统 (6)3.2 超声波测距模块 (7)3.3 数码管显示模块 (8)3.4 蜂鸣器报警模块 (9)3.5 总仿真结果及实物测量结果 (10)第4 章课程设计心得体会和总结 (11)4.1 心得体会 (11)4.2 总结 (11)附1 课程设计仿真图…………………………………………………………附2 课程设计实物图…………………………………………………………附3 课程设计程序设计代码……………………………………………………………第1 章课程设计概述1.1 课程设计选题及原理课程设计题目超声波测距仪设计原理通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。

这与雷达测距原理相似。

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

最常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。

超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物面的距离s,即:s=340t/2。

由于超声波也是一种声波,其声速V与温度有关。

在使用时,如果传播介质温度变化不大,则可近似认为超声波速度在传播的过程中是基本不变的。

超声波测距用数码管显示

超声波测距用数码管显示

#include<reg52.h> //库文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //申明U1锁存器的锁存端sbit wela=P2^7; //申明U2锁存器的锁存端sbit RX=P1^0;sbit TX=P1^1;uchar bai,shi,ge;unsigned int time=0;unsigned int timer=0;unsigned char posit=0;unsigned long S=0;bit flag =0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********************************************************/ void display(){dula=1;P0=table[bai]; //送段选数据dula=0;P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来段选数据通过位选锁存器造成混乱P0=0x7e; //送位选数据wela=0;delayms(1); //延时dula=1;P0=table[shi];dula=0;P0=0xff;wela=1;P0=0x7d;wela=0;delayms(1);dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delayms(1);}/********************************************************/ void Conut(){time=TH0;time=((time<<8)|TL0);TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;bai=0;shi=0;ge=0;}else{bai=S%1000/100; //分出百,十,和个位shi=S%1000%100/10;ge=S%1000%10 %10;}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{TH1=0xf8;//TL1=0x30;//display();timer++;if(timer>=10){timer=0;TX=1; //800MS 启动一次模块//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();// _nop_();//_nop_();// _nop_();// _nop_();//_nop_();//_nop_();//_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}}/*********************************************************/void main( void ){TMOD=0x11; //设T0为方式1,GA TE=1;TH0=0;TL0=0;TH1=0xf8; //2MS定时TL1=0x30;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断while(1){while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut();//计算}}/********************************************************************结束*********************************************************************/。

超声波测距电路图及程序

超声波测距电路图及程序

//#include <AT892051.H>#include <AT89X51.H>#define k1 P2_0#define csbout P2_7 //超声波发送#define csbint P3_2 //超声波接收#define csbc 0.034#define DQ P3_0unsigned char opto,digit;unsigned xm1,xm2,xm0,xm3,xm4,key,jpjs;unsigned sx1,mqs,buffer[5];unsigned convert[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9bit cl; //段码unsigned int s,t,i, xx,j,sj1,sj2,sj3,sx1;typedef unsigned char byte;typedef unsigned int word;void js();void delay(int i); //延时函数void scanLED(); //显示函数void allToBuffer(); //显示转换函数void keyscan();void offmsd();void delay1(word useconds);byte ow_reset(void);byte read_byte(void);void write_byte(char val);char Read_Temperature(void);void main() //主函数{EA=1; //中断允许TMOD=0x11; //设定时器0为计数,设定时器1定时ET0=1; //定时器0中断允许ET1=1; //定时器1中断允许TH0=0x00;TL0=0x00;TH1=0x9E; ///定时器T1置为25msTL1=0x57;csbint=1; //p3.2置位csbout=1; //p2.7置位cl=0;opto=0xff;jpjs=0;sj1=20;sj3=600;TR1=1;while(1){keyscan();if(jpjs<1){js();if(s>sj3){buffer[2]=0x00;buffer[1]=0x00;buffer[0]=0x00;}else if(s<sj1){buffer[2]=0x00;buffer[1]=0x00;buffer[0]=0x00;}else allToBuffer();}else allToBuffer(); //将值转换成LED段码offmsd();scanLED(); //显示函数}}void scanLED() //显示功能模块{digit=0x01;for( i=0; i<5; i++) //5位数显示{P0=~digit&opto; //依次显示各位数P1=buffer[i]; //显示数据送P1口delay(20); //延时处理if(!(P0&0xEF)) //判断5位是否显示完key=0;digit<<1; //循环左移1位}}void allToBuffer() //转换距离数码管功能模块{int temperature;xm0=s/100;xm1=(s-100*xm0)/10;xm2=s-100*xm0-10*xm1;buffer[2]=convert[xm2];buffer[1]=convert[xm1];buffer[0]=convert[xm0];temperature=Read_Temperature();xm3=temperature/10;xm4=temperature-10*xm3;buffer[4]=convert[xm4];buffer[3]=convert[xm3];}void delay(int i){while(--i);}void js(){int temprature;temprature=Read_Temperature();if(cl==1){TR1=0; //定时器1关闭TH0=0x00;TL0=0x00;//定时器0清零i=10;while(i--){csbout=!csbout;} //连续取反10次发射5个周期超声波TR0=1; //开启计数器t0i=mqs; //盲区while(i--){}i=0;while(csbint){i++;if(i>=2450) //上限值{csbint=0;}}TR0=0;TH1=0x9E;TL1=0x57;t=TH0;t=t*256+TL0;s=t*(csbc+0.61*temprature)/2;TR1=1;cl=0;}}void keyscan() //健盘处理函数{xx=0;if(k1!=1) // 判断开关是否按下{delay(400); //延时去抖动延时3.6msif(k1!=1) // 判断开关是否按下{while(!k1){delay(30);xx++;}if(xx>2000){jpjs++;if(jpjs>4)jpjs=0;}xx=0;mqs=65; //while循环一周期9us ,20cm需要等待65*9us }}}void offmsd(){if (buffer[0] == 0x3f)buffer[0] = 0x00;}//ds18b20的完整程序(c51)(sparkstar)//DS1820 C51 子程序//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间//sbit DQ =P2^1;//根据实际情况定义端口//延时void delay1(word useconds){for(;useconds>0;useconds--);}//复位byte ow_reset(void){byte presence;DQ = 0; //pull DQ line lowdelay1(29); // leave it low for 480usDQ = 1; // allow line to return highdelay1(3); // wait for presencepresence = DQ; // get presence signaldelay1(25); // wait for end of timeslotreturn(presence); // presence signal returned} // 0=presence, 1 = no part//从1-wire 总线上读取一个字节byte read_byte(void){byte i;byte value = 0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start timeslotDQ = 1; // then return highdelay1(1); //for (i=0; i<3; i++);if(DQ)value|=0x80;delay1(6); // wait for rest of timeslot}return(value);}//向1-WIRE 总线上写一个字节void write_byte(char val){byte i;for (i=8; i>0; i--) // writes byte, one bit at a time {DQ = 0; // pull DQ low to start timeslotDQ = val&0x01;delay1(5); // hold value for remainder of timeslot DQ = 1;val=val/2;}delay1(5);}//读取温度char Read_Temperature(void){union{byte c[2];int x;}temp;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Padtemp.c[1]=read_byte();temp.c[0]=read_byte();ow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversionreturn temp.x/2;}。

基于单片机LCD显示的超声波测距系统

基于单片机LCD显示的超声波测距系统

基于单片机LCD显示的超声波测距系统基于单片机LCD显示的超声波测距系统摘要:超声波具有指向性强,能量消耗缓慢,传播距离较远等优点,所以,在利用传感器技术和自动控制技术相结合的测距方案中,超声波测距是目前应用最普遍的一种,它广泛应用于防盗、倒车雷达、水位测量、建筑施工工地以及一些工业现场。

本课题详细介绍了超声波传感器的原理和特性,以及主要单片机的性能和特点,并在分析了超声波测距的原理的基础上,指出了设计测距系统的思路和所需考虑的问题,给出了以单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。

该系统电路设计合理、工作稳定、性能良好、检测速度快、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求。

关键词:超声波测距单片机Ultrasonic ranging system based on single-chip LCD display Abstract:There are some advantages of ultrasonic. They are the strong directivity, the slow energy consumption, the long propagation length and so on. So in the use of Location scheme, which is combined with the sensor technology and automatic control technology. The ultrasonic ranging is the most commonly used than other Location schemes. What’s more, the ultrason ic ranging is also widely used in anti-theft, reversing radar, level measurement, building construction site and some industrial fields.This subject detailedly introduces that the principles and characteristics of ultrasonic sensor, the performances and characteristics of the main SCM. Besides, this subject is also based on the analysis of the principle of ultrasonic distance measurement, points out the ideas of the ranging system, the considering questions, and gives the microcontroller, which asthe core of the low cost, the high precision, miniaturization digital display hardware circuit and software design method of ultrasonic range finder.The circuit of this system has reasonable design, stable operation, good performance, fast detection speed, simple calculation. In addition, this system is also easy to achieve real-time control, and meets the practical requirements of industry measurement .Keywords: ultrasonic distance measurement SC目录第一章绪论 (1)1.1,超声波测距系统的背景目的及重要意义 (1)1.2超声波测距的国内研究现状 (2)1.3超声波测距的测距方案和研究内容 (2)1.3.1基于单片机的超声波测距系统 (2)1.3.2本设计的超声波测距原理 (3)1.3.3本设计的超声波测距方法 (3)第二章系统的硬件结构设计 (5)2.1单片机的选择 (5)2.1.1 STC12C5A60S2单片机的主要性能 (6)2.1.2 STC12C5A60S2单片机的管脚说明 (7)2.1.3 STC12C5A60S2单片机IO口工作模式设定 (9)2.2 超声波测距模块HC-SR04 (9)2.2.1超声波测距模块HC-SR04 的特点 (9)2.2.2超声波测距模块HC-SR04的电气参数 (10)2.2.3 采用超声波测距模块HC-SR04的原因 (10)2.3系统显示模块LCD1602 (10)2.3.1显示模块LCD1602的控制命令 (10)2.3.2 选择显示模块1602的原因 (11)2.4 本章小结 (12)第三章系统总体电路图 (13)3.1 STC12C5A60S2单片机的最小系统组成 (13)3.1.1时钟电路 (13)3.1.2 STC12C5A60S2单片机的最小系统 (14)3.2电源电路 (15)3.3超声波测距模块HC-SR04的电路图如下: (16)3.3.1超声波测距模块HC-SR04的电路图 (16)3.3.2超声波测距模块HC-SR04的引脚说明 (17)3.4显示模块LCD1602: (17)3.4.1 显示模块LCD1602的电路图 (17)3.4.2 1602LCD的引脚说明 (18)第四章系统程序的设计 (20)4.1超声波测距系统流程图 (20)4.2超声波测距系统的各组成程序 (20)4.2.1超声波模块启动程序 (21)4.2.2 T0定时器距离计算程序 (21)4.2.3 T0中断用来计数器溢出程序 (21)4.2.4 系统主程序 (21)设计总结 (23)致谢 (24)参考文献 (25)附录1 (26)本设计总电路图 (26)附录2 (27)本设计总程序 (27)第一章绪论1.1,超声波测距系统的背景目的及重要意义在历次人类文明的产业革命中,传感技术一直扮演着先行官的重要角色,它是贯穿着各个应用技术领域的关键技术,它几乎都能涉及到我们可以想象的所有技术领域中,它是影响着人类在应用技术发展革命的方向标。

超声波测距仪课程设计说明书 精品

长沙学院《单片机原理及应用》课程设计说明书题目超声波测距仪系(部) 电信系专业(班级) 电气一班姓名周鹏学号2010042113指导教师刘辉、王新辉起止日期2013.6.10—6.21《单片机原理及应用》课程设计任务书21系(部):电信系专业:2010级电气工程指导教师:王新辉、刘辉课题名称超声波测距仪设计设计内容及要求(1)课题内容:设计一个以 STC89C52单片机为核心控制的超声波测距仪。

功能要求:1.测量距离范围要求为0.10~5.00m;2.测量精度为1cm;3.用12864液晶屏显示相关信息,液晶屏的第一行显示“超声波测距仪”,第二行显示设计者姓名和学号,第三行显示测量的距离值。

(2)要求:完成该系统的硬件和软件的设计,用单片机开发板进行验证。

最后就课程设计本身提交一篇课程设计说明书。

设计工作量1、汇编或C51语言程序设计;2、程序调试;3、在单片机开发板上进行下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、调试过程,参考文献、设计总结等。

进度安排起止日期(或时间量)设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天~第六天程序设计第六天~第八天程序调试、仿真第九天~第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日长沙学院课程设计鉴定表姓名学号专业班级设计题目指导教师指导教师意见:评定等级:教师签名:日期:答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名:日期:系(部)意见:系主任签名:日期:说明课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;目录摘要 (2)1、基本原理 (3)2、方案论证 (3)3、系统硬件设计 (3)3.1 STC89C52外围电路设计 (4)3.2 超声波测距模块电路设计 (5)3.3 显示电路设计 (7)4、系统软件设计 (7)4.1 系统软件设计说明 (7)4.2编程语言的选择 (8)4.3超声波测距仪的算法设计 (8)4.4 超声波发生子程序和超声波接收中断程序设计 (8)4.5 显示子程序设计 (9)4.6主程序流程图 (9)5、设计结果及分析 (9)6、使用说明 (11)7、课程设计体会 (11)参考文献 (12)附录:程序清单 (13)摘要由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。

超声波测距C程序

#include<AT89X51.H>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断,接CX20106的脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位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 delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数: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=0;delay_nms(2);dp=1;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;//清定时TR0=1;//开定时for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;delay_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 0{uint tmp;TR0=0;//关定时器ET0=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;}}。

超声波测距正确程序

内容:通过标准程序静态显示字符引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^0; //定义端口sbit RW = P2^1;sbit EN = P2^2;sbit echo=P1^1; //接收端sbit trig=P1^0; //发射端sbit Beap=P2^3; //蜂鸣器sbit Key_Data=P2^4; //按键发射#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};unsigned char disbuff[4] ={ 0,0,0,0,};unsigned long S=0;unsigned char Flag;unsigned int time;unsigned int t=500;/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/ void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------- 初始化超声波测距仪,定时器,中断---------------------------------------------------*/ void init(){echo=0;trig=0;Flag=1;LCD_Write_Char(7,0,'o');LCD_Write_Char(8,0,'k');TMOD=0x01; //设T0为方式1 TH0=0;TL0=0;ET0=1; //允许T0中断 TR0=0;EA=1; //开启总中断}/*------------------------------------------------定时器0中断函数--------------------------------------------------*/void timer0() interrupt 1{TH0=0;TL0=0;Flag=0; //标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要}/*------------------------------------------------超声波测距仪触发模块-------------------------------------------------*/void startmodule(){trig=1; //15us 启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();trig=0;}/*------------------------------------------------键盘扫描函数--------------------------------------------------*/unsigned char KeyScan(void){if(!Key_Data) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!Key_Data) //再次确认按键是否按下,没有按下则退出 {while(!Key_Data);//如果确认按下按键等待按键释放,没有则退出 {return 1;}}}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){LCD_Init();LCD_Clear();//清屏init();while (1){if(KeyScan()){ t=500;startmodule();while(!echo); //起始为0,当为1时,开始计时TR0=1; //开启计数while(echo&&Flag); //当echo为1计数并等待//flag标志位,当检测超过65ms退出等待回波,继续下一次检测TR0=0; //停止计时time=(TH0*256+TL0)*(12/11.0592);TH0=0;TL0=0; //关闭计数S=(time*1.7)/100;if((S<1)||(S>400)||(Flag==0)) //小于1cm大于4m超出测量范围显示'----'{Flag=1;LCD_Write_Char(0, 1, ASCII[11]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[11]);LCD_Write_Char(3, 1, ASCII[11]);LCD_Write_Char(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100; //把s的1-3位数存在disbuffdisbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;LCD_Write_Char(0, 1, ASCII[disbuff[0]]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[disbuff[1]]);LCD_Write_Char(3, 1, ASCII[disbuff[2]]);LCD_Write_Char(4, 1, ASCII[12]); //显示MDelayMs(500);}while(t){t--;DelayMs(1); //发出大约500Hz的方波频率越大声音越尖Beap=!Beap;}}}}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。

超声波测距程序1602显示(已修改)

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
{
flag=0;
DisplayOneChar(0, 1, ASCII[11]);
DisplayOneChar(1, 1, ASCII[10]);显示点
DisplayOneChar(2, 1, ASCII[11]);
DisplayOneChar(3, 1, ASCII[11]);
DisplayOneChar(4, 1, ASCII[12]);显示M
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
WriteCommandLCM(X, 1);发命令字
WriteDataLCM(DData);发数据
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code DData)
{
unsigned char ListLength;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档