51单片机超声波测距程序代码分享

发布时间:2023-08-16  

/超声波模块ME007显示程序

//晶振=8M

//MCU=STC10F04XE

//P0.0-P0.6共阳数码管引脚

//Trig = P1^0

//Echo = P3^2

#include //包括一个52标准内核的头文件

#define uchar unsigned char //定义一下方便使用

#define uint unsigned int

#define ulong unsigned long

//***********************************************

sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频

//为STC单片机的IO口设置地址定义

sfr P0M1 = 0X93;

sfr P0M0 = 0X94;

sfr P1M1 = 0X91;

sfr P1M0 = 0X92;

sfrP2M1 = 0X95;

sfrP2M0 = 0X96;

//***********************************************

sbit Trig = P1^0; //产生脉冲引脚

sbit Echo = P3^2; //回波引脚

sbit test = P1^1; //测试用引脚

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 pai_xu();

void main(void) // 主程序

{ uint distance_data,a,b;

uchar CONT_1;

CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)

P0M1 = 0; //将io口设置为推挽输出

P1M1 = 0;

P2M1 = 0;

P0M0 = 0XFF;

P1M0 = 0XFF;

P2M0 = 0XFF;

i=0;

flag=0;

test =0;

Trig=0; //首先拉低脉冲输入引脚

TMOD=0x11; //定时器0,定时器1,16位工作方式

TR0=1; //启动定时器0

IT0=0; //由高电平变低电平,触发外部中断

ET0=1; //打开定时器0中断

//ET1=1; //打开定时器1中断

EX0=0; //关闭外部中断

EA=1; //打开总中断0

while(1) //程序循环

{

EA=0;

Trig=1;

delay_20us();

Trig=0; //产生一个20us的脉冲,在Trig引脚

while(Echo==0); //等待Echo回波引脚变高电平

succeed_flag=0; //清测量成功标志

EX0=1; //打开外部中断

TH1=0; //定时器1清零

TL1=0; //定时器1清零

TF1=0; //

TR1=1; //启动定时器1

EA=1;

while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)

TR1=0; //关闭定时器1

EX0=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分频www.dgzj.com

distance_data/=58; //微秒的单位除以58等于厘米

} //为什么除以58等于厘米, Y米=(X秒*344)/2

// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58

if(succeed_flag==0)

{

distance_data=0; //没有回波则清零

test = !test; //测试灯变化

}

/// distance[i]=distance_data; //将测量结果的数据放入缓冲区

/// i++;

/// if(i==3)

/// {

/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;

/// pai_xu();

/// distance_data=distance[1];

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);

}

/// 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=0xfd;flag++;break;

case 0x01:P0=shi;P2=0xfe;flag++;break;

case 0x02:P0=bai;P2=0xfb;flag=0;break;

}

}

//*****************************************************************

/*

//定时器1中断,用做超声波测距计时

timer1() interrupt 3 // 定时器0中断是1号

{

TH1=0;

TL1=0;

}

*/

//******************************************************************

//显示数据转换程序

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];

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<100;bt++);

}

/*

void pai_xu()

{ uint t;

if (distance[0]>distance[1])

{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值

if(distance[0]>distance[2])

{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值

if(distance[1]>distance[2])

{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值

}

*/


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    波特率或者晶振频率再点击计算按钮马上就会显示结果! 第6款:单片机代码自动生成器,不管是51单片机还是AVR单片机,只要输入你的要求,哪一组IO口高低电平,哪一个定时器延时多少,SPI口如何配置。点一下代码生成自动输出代码......
    )然后便可以在c文件里编写51单片机代码了;此时还差一个步骤,需要选择keil软件编译代码后自动生成HEX文件; (7)以下编写一段单片机控制LED闪烁的代码例程。编写好了后点击编译按钮; (8......
    可用于集成到产品中。单片机通常具有模拟和数字输入/输出功能。用户可以使用各种编程语言对微控制器进行编程。可以开发这些软件程序来监视和获取某些输入,执行高速计算和分析并生成输出以控制各种设备,例如......
    上位机可以设置温度上下限,当测量温度低于或高于上限,温度报警,上位机可以控制下位机加热设备启动与关闭,实现上位机和下位机的交换数据。 二、硬件设计原理图如下: 三、单片机软件设计1、单片机代码......
    AT与STC单片机的主要区别;1.常用的51单片机 51单片机即传统的兼容8051指令代码的8位单片机,对于新手来说,刚接触单片机主要已AT单片机和STC单片机。其两种单片机主要区别为不同的厂家生成......
    双击makefile.cmd文件,系统为自动编译并生成51.hex   后记:最近才刚刚接触对各种单片机代码的手工编译,因此今天只是简单介绍一下C51编译器的简单用法,更高......
    如何利用STM32CubeMX来自动生成STM32代码;众所周知,ARM Cortex M 系列是 ARM 专门为单片机设计的内核。其中,STM32 系列的芯片可以算得上最成功的 ARM......
    沟通的桥梁。 第二个就是STC-ISP它是用来下载的,就是我们从Keil5写好程序之后它会生成一个文件,这个文件就是二进制的单片机可以识别的文件然后通过STC-ISP这个软件传送到单片机里,STC-ISP这个软件......
    的数据手册。 2. 51单片机编程环境概述2.1. 代码编译工具 51单片机开发软件基本无疑选用Keil C51集成开发环境。Keil C51是德国Keil Software公司(ARM公司收购了)出品......
    数据点如下表: 到此数据点的创建就完成了。4、单片机代码生成,在产品页面点击MCU开发,按照如下图步骤生成STM32的程序代码。 5、在线APP创建于生成,在开发者中心首页移动页面右侧点击创建,创建......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>