51单片机超声波测距模块

发布者:正在搬砖的河马71最新更新时间:2017-09-09 来源: eefocus关键字:51单片机  超声波  测距模块 手机看文章 扫描二维码
随时随地手机看文章
  1. //晶振=8M  

  2. //MCU=STC10F04XE  

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

  4. //Trig  = P1^0  

  5. //Echo  = P3^2  

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

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

  8. #define uint  unsigned int  

  9. #define ulong unsigned long  

  10. //***********************************************  

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

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

  13. sfr   P0M1   = 0X93;  

  14. sfr   P0M0   = 0X94;  

  15. sfr   P1M1   = 0X91;  

  16. sfr   P1M0   = 0X92;  

  17. sfr P2M1   = 0X95;  

  18. sfr P2M0   = 0X96;  

  19. //***********************************************  

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

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

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

  23.   

  24. uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9  

  25. uint distance[4];  //测距接收缓冲区  

  26. uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;  //自定义寄存器  

  27. bit succeed_flag;  //测量成功标志  

  28. //********函数声明  

  29. void conversion(uint temp_data);  

  30. void delay_20us();  

  31. //void pai_xu();  

  32.   

  33. void main(void)   // 主程序  

  34. {  uint distance_data,a,b;  

  35.    uchar CONT_1;     

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

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

  38.      P1M1 = 0;  

  39.      P2M1 = 0;  

  40.      P0M0 = 0XFF;  

  41.      P1M0 = 0XFF;  

  42.      P2M0 = 0XFF;  

  43.    i=0;  

  44.    flag=0;  

  45.     test =0;  

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

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

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

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

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

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

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

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

  54.     

  55.       

  56. while(1)         //程序循环  

  57.     {  

  58.   EA=0;  

  59.          Trig=1;  

  60.         delay_20us();  

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

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

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

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

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

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

  67.          TF1=0;          //  

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

  69.    EA=1;  

  70.   

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

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

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

  74.   

  75.     if(succeed_flag==1)  

  76.          {    

  77.            distance_data=outcomeH;                //测量结果的高8位  

  78.            distance_data<<=8;                   //放入16位的高8位  

  79.              distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据  

  80.             distance_data*=12;                  //因为定时器默认为12分频  

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

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

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

  84.     if(succeed_flag==0)  

  85.            {  

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

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

  88.            }  

  89.   

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

  91.      ///        i++;  

  92.       ///    if(i==3)  

  93.       ///        {  

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

  95.      ///        pai_xu();  

  96.      ///        distance_data=distance[1];  

  97.   

  98.         

  99.        a=distance_data;  

  100.        if(b==a) CONT_1=0;  

  101.        if(b!=a) CONT_1++;  

  102.        if(CONT_1>=3)  

  103.            { CONT_1=0;  

  104.               b=a;  

  105.               conversion(b);  

  106.             }         

  107.       ///        i=0;  

  108.       ///       }          

  109.      }  

  110. }  

  111. //***************************************************************  

  112. //外部中断0,用做判断回波电平  

  113. INTO_()  interrupt 0   // 外部中断是0号  

  114.  {      

  115.      outcomeH =TH1;    //取出定时器的值  

  116.      outcomeL =TL1;    //取出定时器的值  

  117.      succeed_flag=1;   //至成功测量的标志  

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

  119.   }  

  120. //****************************************************************  

  121. //定时器0中断,用做显示  

  122. timer0() interrupt 1  // 定时器0中断是1号  

  123.    {  

  124.      TH0=0xfd; //写入定时器0初始值  

  125.      TL0=0x77;        

  126.      switch(flag)     

  127.       {case 0x00:P0=ge; P2=0xfd;flag++;break;  

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

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

  130.       }  

  131.    }  

  132. //*****************************************************************  

  133. /*  

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

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

  136.     {  

  137. TH1=0;  

  138. TL1=0;  

  139.      }  

  140. */  

  141. //******************************************************************  

  142. //显示数据转换程序  

  143. void conversion(uint temp_data)    

  144.  {    

  145.     uchar ge_data,shi_data,bai_data ;  

  146.     bai_data=temp_data/100 ;  

  147.     temp_data=temp_data%100;   //取余运算  

  148.     shi_data=temp_data/10 ;  

  149.     temp_data=temp_data%10;   //取余运算  

  150.     ge_data=temp_data;  

  151.   

  152.     bai_data=SEG7[bai_data];  

  153.     shi_data=SEG7[shi_data];  

  154.     ge_data =SEG7[ge_data];  

  155.   

  156.     EA=0;  

  157.     bai = bai_data;  

  158.     shi = shi_data;  

  159.     ge  = ge_data ;   

  160.      EA=1;  

  161.  }  

  162. //******************************************************************  

  163. void delay_20us()  

  164.  {  uchar bt ;  

  165.     for(bt=0;bt<100;bt++);  

  166.  }  

  167. /*  

  168. void pai_xu()  

  169.   {  uint t;  

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

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

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

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

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

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

  176.     }  

  177. */  


关键字:51单片机  超声波  测距模块 引用地址:51单片机超声波测距模块

上一篇:基于DS18B20温度传感器和MQ2烟雾传感器的火灾报警器设计
下一篇:电机转速信号的单片机测量程序

推荐阅读最新更新时间:2024-03-16 15:36

手把手教你学51单片机:定时器与数码管
一、逻辑电路与逻辑运算 逻辑运算符: (1)按变量整体值进行运算 :逻辑与(&&) 逻辑或(||) 逻辑非(!) (2)按变量的每一位进行运算: 按位与(&) 按位或(|) 按位取反(~) 二、定时器学习 2.1定时器的初步认识 (1)时钟周期:时序中最小的时间单位。 时钟周期(T)=1/时钟源频率 (2)机器周期:单片机完成一个操作的最短时间。 51单片机系列,机器周期是12个时钟周期。 定时器和计数器是单片机内部的同一个模块,通过配置SFR(特殊功能寄存器)可以实现两种不同的功能。主要用于定时。定时器内部有一个寄存器,让他开始计数后,这个寄存器的值没经过一个机器周期就会自动加1,因此可以把机器周期理解
[单片机]
手把手教你学<font color='red'>51单片机</font>:定时器与数码管
2-基于51单片机的蓝牙智能台灯设计
具体实现功能 系统由单片机最小系统+光敏电阻及AD模块+蓝牙模块+红外模块+LED灯+蜂鸣器+电源构成 具体功能: (1)当人靠近的时候灯亮,太靠近的时候,蜂鸣器鸣叫发出警报,如果在一定时间内人没有离开,灯会自动灭; (2)当人离开的时候,灯灭; (3)手机蓝牙可以控制灯的亮灭和亮度,轮番发送“1”、“2”灯会在“较亮”、“很亮”切换;发送指令“C”,灯灭。 设计背景 智能台灯可分成自动和手动两种模式。在自动模式下,台灯能根据环境光的亮暗与人是否被台灯所检测到(人是否在)来自动开启台灯。当人被微机检测到,环境光又达到某个程度的时候(可以设定与调节),台灯就会开启。如果环境光没有达到这个程度,台灯不会开启。
[单片机]
2-基于<font color='red'>51单片机</font>的蓝牙智能台灯设计
51单片机(STC15W408AS)映射printf函数 串口收发实现
前提:实现串口收发数据 /************************************************* *函数名称:char putchar(char c) *功 能:映射printf *参 数:char c *返 回 值:char *************************************************/ char putchar(char c) { UartPutc((uint8_t)c);//把自己实现的串口打印一字节数
[单片机]
51单片机的串行通信口原理解析
MCS-51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,它们的地址为99H。这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。如果在传行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。下面我们分别介绍。 [1]。 基本概念 数据通信的传输方式 常用于数据通信的传输方式有单工、半双工、全双工和多工方式。 单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。 半双工
[单片机]
<font color='red'>51单片机</font>的串行通信口原理解析
51单片机综合学习系统之 红外线遥控篇
大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了12864点阵型液晶显示的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习红外线遥控的基本原理与使用方法。 先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。 上图是我们将要使用的51单片机综合学习系统硬件平台,本期实验我们用到了综合系统主机,1602液晶屏、超薄型红外线遥控
[单片机]
<font color='red'>51单片机</font>综合学习系统之 红外线遥控篇
51单片机汇编语言实例2
简介:上面的单片机系统和汇编语言控制指令,很容易被更改为多口、多位的单键控制系统。图5为多个LED灯-单个按键的运行结果与汇编语言。图6中对P2.0口改用双掷开关,实现P2.0口的两种电平状态。 a)单个按键与多个LED灯(位操作—输入与字节操作—输出)—判断与子程序 此处只是将输出指令由位指令换成了字节指令,而输入判断仍然是位判断指令。 ORG 0000H MAIN: ;CLR C MOV C,P2.0 ;获取P2.0位状态送位累加器;位与字节转换需要判断指令 JNC ZIJIE;JC位累加器—进位位为1转移到ZIJIE , JNC位累加器为0转移到ZIJIE
[单片机]
<font color='red'>51单片机</font>汇编语言实例2
51单片机的中断体系结构_中断的响应过程
  51单片机的中断系统十分重要,分为外部中断和定时器中断。本文主要详解51单片机的中断体系结构以及中断的响应过程,具体的跟随小编一起来了解一下。   51单片机的中断体系结构详解   80C51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。MCS-51系列单片机中断系统的机构如下:      与中断系统相关的特殊寄存器:   1)中断允许控制寄存器(IE)------ 控制各中断的开放和屏蔽   2)中断优先级控制寄存器(IP)------设置各中断的优先级   3)定时器/计数器控制寄存器(TCON)----定时器和外部中断的控制   4)串行口控制寄存器(SCON)------串行中断
[单片机]
<font color='red'>51单片机</font>的中断体系结构_中断的响应过程
基于USB总线和89C51单片机的数据采集系统设计
在工业生产和科学技术研究过程的各行业中,常常要对各种数据进行采集,现在常用的采集方式是在PC机或工控机内安装数据采集卡,如A/D卡及RS-422卡、RS-485卡。采集卡不仅安装麻烦,易受机箱内环境的影响,而且由于受计算机插槽数量和地址、中断资源的限制,不可能挂接很多设备。而通用串行总线(Universal Serial Bus,简称USB)的出现能很好地解决以上这些冲突。我们利用89C51单片机设计了基于USB总线的数据采集设备,并可与MAX485结合起来实现数据的远程采集。 系统硬件设计 USB数据采集系统硬件模块主要由串行A/D转换器、89C51芯片、USB接口芯片和多路模拟开关等组成。硬件总体结构框图如图1所示。
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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