stm32超声波测距程序
超声波测距程序

超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#include#include "1602.h"/************************************宏定义************************************/#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;/************************************位定义************************************/sbit INPUT = P3^2; //回声接收端口sbit OUTPUT = P1^0; //超声触发端口sbit Beep = P2^0 ; // 蜂鸣器/********************************定义变量和数组********************************/long int distance=0; //距离变量uchar table[]=" Welcome to ";uchar table0[]=" chaoshengbo ";uchar table1[]="There's no echo.";uchar table2[]=" csbcj ";uchar table3[]="Distance:";uchar count;/***********************************函数声明***********************************/extern void initLCD();extern void write_date(uchar date);extern void write_com(uchar com);extern void delay(uint x);/************************************************************** ****************//* 函数名称 : Delay_xMs *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void Delay_xMs(unsigned int x){unsigned int i,j;for(i = 0;i < x;i++ ){for(j = 0;j < 3;j++ ){;}}}/************************************************************** ****************//* 函数名称 : Alarm *//* 函数描述 : 蜂鸣器发声函数 *//* 输入参数 : t *//* 参数描述 : 发声的次数 *//* 返回值 : 无 *//************************************************************** ****************/void Alarm(uchar t){uchar i;for(i = 0;i < t;i++){Beep = 1;Delay_xMs(1000);Beep = 0;Delay_xMs(1000);}}/************************************************************** ****************//* 函数名称 : delayt *//* 函数描述 : 延时函数 *//* 输入参数 : x*//* 参数描述 : 延时时间数据 *//* 返回值 : 无 *//************************************************************** ****************/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/************************************************************** ****************//* 函数名称 : Init_MCU *//* 函数描述 : 初始化单片机函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Init_MCU(void){TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式TL0 = 0x66;TH0 = 0xfc; //1msET0 = 1; //开定时器2EA = 1; //总中断使能}/************************************************************** ****************//* 函数名称 : Init_Parameter *//* 函数描述 : 初始化参数和IO口函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//******************************************************************************/void Init_Parameter(void){OUTPUT =1;INPUT = 1;count = 0;distance = 0;}/************************************************************** ****************//* 函数名称 : display_char *//* 函数描述 : 显示字符串函数 *//* 输入参数 : point,address *//* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */ /* 返回值 : 无 *//************************************************************** ****************/void display_char(uchar *point,uchar address){uchar i;write_com(0x80 + address);for(i = 0;i < 16; i++){write_date(*point);point++;}}/************************************************************** ****************//* 函数名称 : display *//* 函数描述 : 显示数字*//* 输入参数 : number,address *//* 参数描述 : number写入的数据,address地址 *//* 返回值 : 无 *//************************************************************** ****************/void display(int number,uchar address){uchar b,c,d,e;b= (number / 1000);c= (number / 100) % 10;d = (number / 10) % 10;e = number % 10;write_com(0x80 + address);write_date(b + 48);write_date(c + 48);write_date(d + 48);write_date(46); //小数点的ASCIIwrite_date(e + 48);write_date(99); //"c"的ASCIIwrite_date(109); //"m"的ASCII}/************************************************************** ****************//* 函数名称 : Trig_SuperSonic *//* 函数描述 : 发出声波函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Trig_SuperSonic(void)//出发声波{OUTPUT = 1;delayt(1);OUTPUT = 0;}/************************************************************** ****************//* 函数名称 : Measure_Distance *//* 函数描述 : 计算距离函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Measure_Distance(void){uchar l;uint h,y;TR0 = 1;while(INPUT){;}TR0 = 0;l = TL0;h = TH0;y = (h << 8) + l;y = y - 0xfc66;//us部分distance = y + 1000 * count;//计算总时间TL0 = 0x66;TH0 = 0xfc;delayt(30);distance = VELOCITY_30C * distance / 20000;}/************************************************************** ****************//* 函数名称 : main *//* 函数描述 : 主函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void main(void){Beep = 0;rw = 0;initLCD();Init_MCU();Init_Parameter();Alarm(2);display_char(table,0x00);display_char(table0,0x40);Delay_xMs(30000);display_char(table2,0x00);display_char(table1,0x40);while(1){Trig_SuperSonic(); //触发超声波发射while(INPUT == 0) //等待回声{;}Measure_Distance(); //计算脉宽并转换为距离display_char(table3,0x40);display(distance,0x49); //显示距离Init_Parameter(); // 参数重新初始化delayt(100); //延时,两次发射之间要至少有10ms间隔}}/************************************************************** ****************//* 函数名称 : timer0 *//* 函数描述 : T0中断处理函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void timer0 (void) interrupt 1{TF0 = 0;TL0 = 0x66;TH0 = 0xfc;count++;if(count == 18)//超声波回声脉宽最多18ms{TR0 =0;TL0 = 0x66;TH0 = 0xfc;count = 0;}}/************************************************************** ****************/1602程序如下:/************************************宏定义************************************/#define uchar unsigned char#define uint unsigned int/************************************位定义************************************/sbit dula = P2^6;sbit wela = P2^7;sbit rs = P2^3;sbit rw = P2^4;sbit lcden = P2^5;/************************************************************** ****************//* 函数名称 : delay *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void delay(uint x){uint a,b;for(a = x;a > 0;a--){for(b = 10;b > 0;b--){;}}}/************************************************************** ****************//* 函数名称 : write_com *//* 函数描述 : 1602写命令函数 *//* 输入参数 : com*//* 参数描述 : 控制命令 *//* 返回值 : 无 *//************************************************************** ****************/void write_com(uchar com){P0 = com;rs = 0;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : write_date *//* 函数描述 : 1602写数据函数 *//* 输入参数 : date *//* 参数描述 : 要写入的数据 *//* 返回值 : 无 *//******************************************************************************/void write_date(uchar date){P0 = date;rs = 1;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : initLCD *//* 函数描述 : 1602初始化函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void initLCD(void){dula = 0;wela = 0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/************************************************************** ****************/51程序如下:#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */ sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。
基于stm32单片机的超声波测距仪设计报告

基于stm32单片机的超声波测距仪设计报告【文章标题】基于STM32单片机的超声波测距仪设计报告【引言】超声波测距是一种常见且有效的测量方法,被广泛应用于工业控制、自动化、智能家居等领域。
本文将深入讨论基于STM32单片机的超声波测距仪的设计原理、硬件搭建和软件编程,并分享对该设计的观点和理解。
【简介】1. 超声波测距原理简介(可使用子标题,如1.1)- 超声波的特性与应用- 超声波传感器原理及工作方式2. 设计方案(可使用子标题,如2.1)- 系统框图:硬件模块与连接方式- 所需材料清单及器件参数选择【正文】1. 超声波传感器的选型与特性比较(可使用子标题,如1.1)1.1 超声波传感器的种类与特点1.2 STM32单片机与超声波传感器的配合选择理由与原则2. 硬件电路设计与搭建(可使用子标题,如2.1)2.1 超声波发射电路设计与实现2.2 超声波接收电路设计与实现2.3 STM32单片机与超声波传感器的连接方法及引脚映射3. 软件编程实现(可使用子标题,如3.1)3.1 STM32单片机开发环境配置与准备3.2 程序框架和流程设计3.3 超声波信号处理与距离计算算法【总结】1. 设计成果总结与优缺点评价- 设计成果与功能实现总结- 设计过程中的挑战与解决方案- 设计的优点与改进空间2. 对基于STM32单片机的超声波测距仪设计的观点和理解- 本设计在硬件搭建和软件编程方面充分利用了STM32单片机的性能与功能- 超声波测距仪在工业自动化和智能家居等领域具有广阔应用前景 - 未来可以进一步提升设计的灵活性和可扩展性【参考资料】- 张三: 《超声波测距原理与应用技术》,出版社,2018年- 李四: 《STM32单片机与嵌入式系统设计》,出版社,2019年以上是本文基于STM32单片机的超声波测距仪设计报告,对这个主题的观点和理解。
希望这篇文章内容全面、深入,并能帮助您对超声波测距仪设计有更深刻的理解。
超声波测距并报警最终程序

//超声波模块显示程序#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longuchar a ;sbit Tx = P3^3; //产生脉冲引脚sbit Rx = P3^2; //回波引脚sbit bell = P3^6; //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);void delay_20us();void delay(uint z);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;a: while(TH1 < 30);//等待测量的结果,周期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<100){uchar c=0;for(c=200;c>0;c--){bell=~bell;delay(1);}i=0;goto a;}else if (b<200){uchar c=0;for(c=200;c>0;c--){bell=~bell;delay(2);}i=0;goto a;}}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;}}//显示数据转换程序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;}//******************************************************************void delay_20us(){ uchar bt ;for(bt=0;bt<60;bt++);}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
基于STM32单片机的高精度超声波测距系统的设计

基于STM32单片机的高精度超声波测距系统的设计一、本文概述超声波测距技术因其非接触、高精度、实时性强等特点,在机器人导航、车辆避障、工业测量等领域得到了广泛应用。
STM32单片机作为一种高性能、低功耗的嵌入式系统核心,为超声波测距系统的设计提供了强大的硬件支持。
本文旨在设计一种基于STM32单片机的高精度超声波测距系统,以满足不同应用场景的需求。
二、超声波测距原理本部分将介绍超声波测距的基本原理,包括超声波的产生、传播、接收以及距离的计算方法。
同时,分析影响超声波测距精度的主要因素,为后续系统设计提供理论基础。
三、系统硬件设计3、1在设计基于STM32单片机的高精度超声波测距系统时,我们遵循了“精确测量、稳定传输、易于扩展”的总体设计思路。
我们选用了STM32系列单片机作为系统的核心控制器,利用其强大的处理能力和丰富的外设接口,实现了对超声波发射和接收的精确控制。
在具体设计中,我们采用了回波测距法,即发射超声波并检测其回波,通过测量发射与接收之间的时间差来计算距离。
这种方法对硬件的精度和稳定性要求很高,因此我们选用了高精度的超声波传感器和计时器,以确保测量结果的准确性。
我们还考虑到了系统的可扩展性。
通过STM32的串口通信功能,我们可以将测量数据上传至计算机或其他设备进行分析和处理,为后续的应用开发提供了便利。
我们还预留了多个IO接口,以便在需要时添加更多的传感器或功能模块。
本系统的设计思路是在保证精度的前提下,实现稳定、可靠的超声波测距功能,并兼顾系统的可扩展性和易用性。
31、1.1随着物联网、机器人技术和自动化控制的快速发展,精确的距离测量技术在各个领域的应用越来越广泛。
超声波测距技术作为一种非接触式的距离测量方式,因其具有测量精度高、稳定性好、成本相对较低等优点,在工业自动化、智能家居、机器人导航、安防监控等领域得到了广泛应用。
STM32单片机作为一款高性价比、低功耗、高性能的嵌入式微控制器,在智能设备开发中占据重要地位。
超声测距模块实验报告

一、实验目的1. 理解超声波测距的基本原理。
2. 掌握超声波测距模块的硬件连接与软件编程。
3. 学习使用超声波测距模块进行距离测量。
4. 了解超声波测距在实际应用中的优势与局限性。
二、实验原理超声波测距是利用超声波在介质中传播的速度和距离之间的关系来测量距离的一种方法。
当超声波发射器发出超声波时,它会遇到障碍物并反射回来。
通过测量发射和接收超声波之间的时间差,可以计算出障碍物与发射器之间的距离。
超声波在空气中的传播速度大约为340m/s。
设超声波发射器与接收器之间的距离为d,超声波从发射器传播到障碍物并返回所需的时间为t,则有:\[ d = \frac{v \times t}{2} \]其中,v为超声波在空气中的传播速度,t为超声波往返所需的时间。
三、实验设备1. 超声波测距模块HC-SR042. STM32单片机开发板3. 调试工具4. 电源5. 导线四、实验步骤1. 硬件连接(1)将超声波测距模块的VCC、GND、TRIG和ECHO引脚分别连接到STM32单片机的3.3V、GND、GPIO和中断引脚。
(2)将STM32单片机的电源和地连接到实验平台的电源。
2. 软件编程(1)编写STM32单片机的程序,用于控制超声波测距模块。
(2)程序主要包含以下功能:- 初始化GPIO和中断引脚;- 发送触发信号;- 读取回响信号;- 计算距离;- 显示距离。
(3)使用HAL库函数实现上述功能。
3. 调试与测试(1)将程序烧录到STM32单片机中。
(2)使用调试工具检查程序运行情况。
(3)调整超声波测距模块的位置,测试不同距离下的测量结果。
五、实验结果与分析1. 实验数据通过实验,得到以下数据:| 距离(cm) | 测量值(cm) || :--------: | :--------: || 10 | 9.8 || 20 | 19.7 || 30 | 29.6 || 40 | 39.5 || 50 | 49.4 |2. 数据分析实验结果表明,超声波测距模块的测量精度较高,误差在±1cm以内。
超声波雷达测距实训报告

一、实训目的本次实训旨在通过实际操作,了解超声波雷达测距的原理和实现方法,掌握超声波传感器的基本使用技巧,并学会利用STM32单片机进行数据处理和显示,从而完成一个简单的超声波雷达测距系统。
二、实训器材1. STM32F103单片机开发板2. HC-SR04超声波传感器模块3. OLED显示屏4. 连接线5. 电源三、实训原理超声波雷达测距的原理是利用超声波在空气中的传播速度来测量距离。
当超声波传感器发射超声波时,它会遇到障碍物后反射回来,通过测量超声波从发射到接收的时间差,可以计算出障碍物与传感器之间的距离。
四、实训步骤1. 硬件连接:- 将HC-SR04超声波传感器模块的两个引脚分别连接到STM32单片机的GPIO引脚。
- 将OLED显示屏的相应引脚连接到STM32单片机的SPI或I2C接口。
- 将电源连接到STM32单片机和超声波传感器模块。
2. 软件设计:- 编写STM32单片机的初始化程序,配置GPIO引脚、SPI/I2C接口等。
- 编写超声波传感器的控制程序,用于控制超声波传感器的发射和接收。
- 编写数据处理程序,用于计算超声波从发射到接收的时间差,从而得到距离值。
- 编写OLED显示屏的显示程序,用于显示距离值。
3. 程序实现:- 使用STM32 HAL库函数或直接操作寄存器来实现程序。
- 通过定时器中断来实现超声波传感器的时序控制。
- 使用查表法或直接计算法来实现距离值的转换。
4. 系统测试:- 将系统放置在测试环境中,调整测试距离,观察OLED显示屏上显示的距离值是否准确。
- 分析测试结果,找出系统误差的来源,并进行优化。
五、实训结果与分析1. 测试结果:- 在不同的测试距离下,OLED显示屏上显示的距离值与实际距离基本相符,说明系统具有较高的测量精度。
2. 误差分析:- 超声波在空气中的传播速度受温度、湿度等因素的影响,导致测距误差。
- 超声波传感器的响应时间存在一定的延迟,也会导致测距误差。
基于STM32的HC-SR04超声波测距模块实验

基于STM32的HC-SR04超声波测距模块实验硬件环境STM32F407探索板(其他开发板皆可以)HC-SR04超声波模块软件环境KEIL5CUBEMX串口调试助手(sscom或其他)实验目标•了解HC-SR04超声波模块工作原理•实现超声波模块测距1、超声波模块介绍1.1 超声波测距原理及系统组成超声波测距是借助于超声脉冲回波渡越时间法来实现的。
设超声波脉冲由传感器发出到接收所经历的时间为t,超声波在空气中的传播速度为c,则从传感器到目标物体的距离D可用下式求出:D = ct/2,图2是相应的系统框图。
基本原理:经发射器发射出长约 6mm,频率为 40KHZ 的超声波信号。
此信号被物体反射回来由接收头接收,接收头实质上是一种压电效应的换能器。
它接收到信号后产生 mV 级的微弱电压信号。
1.2 HC-SR04模块原理HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm,模块包括超声波发射器、接收器与控制电路。
基本工作原理:(1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2,下面是实物图。
如上图接线,VCC供5V电源,GND为地线,TRIG触发控制信号输入,ECHO 回响信号输出等四个接口端。
1.3 超声波时序图以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。
一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。
由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
超声波测距程序_代码全

/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。
3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下: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>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#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 P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_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);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_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); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。