找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4201|回复: 13
打印 上一主题 下一主题
收起左侧

超声波测距

  [复制链接]
跳转到指定楼层
楼主
我用两个超声波模块hc-sr04测距并显示在1602上,当用一个超声波测距时显示并无问题,两个一起测距时1602就不显示了--------------------------------------主程序----------------------------------------

#include <reg52.h>
#include <stdio.h>
#include <math.h>
#include "1602.h"
#include "delay.h"

sbit TRIG = P1^0 ;
sbit ECHO = P1^1 ;
sbit TRIG1 = P1^2 ;
sbit ECHO1 = P1^3 ;
unsigned char DisTempData[16],TempData[16];

/*------------------------------------------------
                    定时器初始化
------------------------------------------------*/
void TIM0init(void)
{
  TMOD=0x11;//定时器0,1工作方式1
  TH0=0x00;   
  TL0=0x00;
  TH1=0x00;   
  TL1=0x00;
  ET0=1;
  ET1=1;
  EA=1;
}
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
  float S;       //距离变量
float c;       //距离变量
  TIM0init();    //初始化定时器0
  LCD_Init();    //初始化LCD
// LCD_Write_String(0,1,"LY-UR04 demo");
  while(1)
  {

   TRIG=1;       //触发信号是高电平脉冲,宽度大于10us
   DelayUs2x(10);
   TRIG=0;
   while(!ECHO); //等待高电平
   TR0=1;
   while(ECHO);  //等待低电平
   TR0=0;
   S=TH0*256+TL0;//取出定时器值高8位和低8位合并
   S=S/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
                             // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
   TH0=0;
   TL0=0;        //清除定时器0寄存器中的值
   sprintf(DisTempData,"S=%6.2f CM     ",S);//打印输出结果
   LCD_Write_String(0,0,DisTempData);       //在液晶屏上显示
  // DelayMs(250);                            //延时决定采样速度


   TRIG1=1;       //触发信号是高电平脉冲,宽度大于10us
   DelayUs2x(10);
   TRIG1=0;
   while(!ECHO1); //等待高电平
   TR1=1;
   while(ECHO1);  //等待低电平
   TR1=0;
   c=TH1*256+TL1;//取出定时器值高8位和低8位合并
   c=c/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
                             // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
   TH1=0;
   TL1=0;        //清除定时器0寄存器中的值
   sprintf(TempData,"c=%6.2f CM     ",c);//打印输出结果
   LCD_Write_String(0,1,TempData);       //在液晶屏上显示
   DelayMs(250);                            //延时决定采样速度   

  }
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
ECHO=0;
}
/*------------------------------------------------
                 定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
ECHO1=0;
}


-------------------------1602显示程序----------------------------

#include "1602.h"
#include "delay.h"

#define CHECK_BUSY//是否使用判断忙语句条件,后面使用条件编译

sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;

#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

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
#ifdef CHECK_BUSY
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
#else
return 0;
#endif
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
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)
{     

while (*s)
        {     
LCD_Write_Char(x,y,*s);     
s ++;  x++;   
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
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);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
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);    /*显示开及光标设置*/
}


-----------------------------延时程序-------------------------------
#include "delay.h"

/*------------------------------------------------
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--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:85375 发表于 2015-9-9 10:18 | 只看该作者
求大神帮忙修改
回复

使用道具 举报

板凳
ID:79544 发表于 2015-9-12 19:35 | 只看该作者
分别写两个子函数,放在主函数里试试。中间加延时。如,chaosb1();delay(3000);chaosb2();
回复

使用道具 举报

地板
ID:34643 发表于 2016-5-1 11:32 | 只看该作者
这个程序好象用不了啊,我试过了。后来在百度上找了一个:仿真调试通过的超声波测距程序 这个可以用。
回复

使用道具 举报

5#
ID:123126 发表于 2016-5-28 02:44 | 只看该作者
  1.   while(!ECHO); //等待高电平
  2.    TR0=1;
  3.    while(ECHO);  //等待低电平
  4.    TR0=0;
复制代码
你这个当传感器2检测到障碍物,而1没有检测到时,是不是意味着程序一直在这空运行?
回复

使用道具 举报

6#
ID:34643 发表于 2016-5-28 07:21 | 只看该作者
我看到过三路的,还有仿真。
回复

使用道具 举报

7#
ID:34643 发表于 2016-12-26 07:23 | 只看该作者
我把仿真图找出来了,给大家参考。
回复

使用道具 举报

8#
ID:146892 发表于 2016-12-27 13:37 | 只看该作者
我这里有很全的测距资料,仿真图源程序都有,上次课堂设计就用这个,你参考一下 超声波测距设计资料.zip (493.92 KB, 下载次数: 95)


回复

使用道具 举报

9#
ID:77398 发表于 2017-2-24 13:41 | 只看该作者
添啊 发表于 2016-12-27 13:37
我这里有很全的测距资料,仿真图源程序都有,上次课堂设计就用这个,你参考一下

这段程序中蓝色语句        s=s*csbc-8;是做什么的咧????

捕获.PNG (14.96 KB, 下载次数: 89)

捕获.PNG
回复

使用道具 举报

10#
ID:125378 发表于 2017-2-24 20:09 | 只看该作者
#include <reg52.h> #include <stdio.h> #include <math.h> #include "1602.h" #include "delay.h"  sbit TRIG = P1^0 ; sbit ECHO = P1^1 ; sbit TRIG1 = P1^2 ; sbit ECHO1 = P1^3 ; unsigned char DisTempData[16],TempData[16];  /*------------------------------------------------                     定时器初始化 ------------------------------------------------*/ void TIM0init(void) {   TMOD=0x11;//定时器0,1工作方式1   TH0=0x00;       TL0=0x00;   TH1=0x00;       TL1=0x00;    ET0=1;   ET1=1;   EA=1; } /*------------------------------------------------                     主函数 ------------------------------------------------*/ main() {   float S;       //距离变量 float c;       //距离变量   TIM0init();    //初始化定时器0   LCD_Init();    //初始化LCD // LCD_Write_String(0,1,"LY-UR04 demo");   while(1)   {     TRIG=1;       //触发信号是高电平脉冲,宽度大于10us    DelayUs2x(10);    TRIG=0;    while(!ECHO); //等待高电平    TR0=1;    while(ECHO);  //等待低电平    TR0=0;    S=TH0*256+TL0;//取出定时器值高8位和低8位合并    S=S/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2                              // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58     TH0=0;    TL0=0;        //清除定时器0寄存器中的值    sprintf(DisTempData,"S=%6.2f CM     ",S);//打印输出结果    LCD_Write_String(0,0,DisTempData);       //在液晶屏上显示   // DelayMs(250);                            //延时决定采样速度      TRIG1=1;       //触发信号是高电平脉冲,宽度大于10us    DelayUs2x(10);    TRIG1=0;    while(!ECHO1); //等待高电平    TR1=1;    while(ECHO1);  //等待低电平    TR1=0;    c=TH1*256+TL1;//取出定时器值高8位和低8位合并    c=c/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2                              // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58     TH1=0;    TL1=0;        //清除定时器0寄存器中的值    sprintf(TempData,"c=%6.2f CM     ",c);//打印输出结果    LCD_Write_String(0,1,TempData);       //在液晶屏上显示    DelayMs(250);                            //延时决定采样速度        } }  /*------------------------------------------------                  定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { ECHO=0; } /*------------------------------------------------                  定时器1中断子程序 ------------------------------------------------*/ void Timer1_isr(void) interrupt 3 { ECHO1=0; }   -------------------------1602显示程序----------------------------  #include "1602.h" #include "delay.h"  #define CHECK_BUSY//是否使用判断忙语句条件,后面使用条件编译  sbit RS = P2^4;   //定义端口  sbit RW = P2^5; sbit EN = P2^6;  #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  /*------------------------------------------------               判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void)  {  #ifdef CHECK_BUSY DataPort= 0xFF;  RS_CLR;  RW_SET;  EN_CLR;  _nop_();  EN_SET; return (bit)(DataPort & 0x80); #else return 0; #endif } /*------------------------------------------------               写入命令函数 ------------------------------------------------*/ 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)  {       while (*s)          {      LCD_Write_Char(x,y,*s);      s ++;  x++;            } } /*------------------------------------------------               写入字符函数 ------------------------------------------------*/ 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);   } /*------------------------------------------------               初始化函数 ------------------------------------------------*/ 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);    /*显示开及光标设置*/ }   -----------------------------延时程序------------------------------- #include "delay.h"  /*------------------------------------------------ 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--) {      //大致延时1mS      DelayUs2x(245);          DelayUs2x(245); } }
回复

使用道具 举报

11#
ID:99130 发表于 2017-3-27 09:58 | 只看该作者
51mcu 发表于 2016-5-1 11:32
这个程序好象用不了啊,我试过了。后来在百度上找了一个:仿真调试通过的超声波测距程序 这个可以用。

这个程序编译不了啊 能指导一下吗
回复

使用道具 举报

12#
ID:99130 发表于 2017-3-27 13:01 | 只看该作者
添啊 发表于 2016-12-27 13:37
我这里有很全的测距资料,仿真图源程序都有,上次课堂设计就用这个,你参考一下

你资料里超声波模块的5脚在哪?电位器该怎么接
回复

使用道具 举报

13#
ID:75447 发表于 2017-3-27 13:18 | 只看该作者
你这两个超声波用的是同一组IO,貌似这样不可以,需要像7#一样,分开IO接
回复

使用道具 举报

14#
ID:111182 发表于 2017-4-10 09:21 | 只看该作者
51mcu 发表于 2016-12-26 07:23
我把仿真图找出来了,给大家参考。

仿真可以发一份不?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表