久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5220|回復(fù): 13
收起左側(cè)

超聲波測距

  [復(fù)制鏈接]
ID:85375 發(fā)表于 2015-9-9 10:10 | 顯示全部樓層 |閱讀模式
我用兩個超聲波模塊hc-sr04測距并顯示在1602上,當(dāng)用一個超聲波測距時顯示并無問題,兩個一起測距時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;
}
/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
main()
{
  float S;       //距離變量
float c;       //距離變量
  TIM0init();    //初始化定時器0
  LCD_Init();    //初始化LCD
// LCD_Write_String(0,1,"LY-UR04 demo");
  while(1)
  {

   TRIG=1;       //觸發(fā)信號是高電平脈沖,寬度大于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);//打印輸出結(jié)果
   LCD_Write_String(0,0,DisTempData);       //在液晶屏上顯示
  // DelayMs(250);                            //延時決定采樣速度


   TRIG1=1;       //觸發(fā)信號是高電平脈沖,寬度大于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);//打印輸出結(jié)果
   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

/*------------------------------------------------
              判忙函數(shù)
------------------------------------------------*/
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
}
/*------------------------------------------------
              寫入命令函數(shù)
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫入數(shù)據(jù)函數(shù)
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函數(shù)
------------------------------------------------*/
/*void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}*/
/*------------------------------------------------
              寫入字符串函數(shù)
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     

while (*s)
        {     
LCD_Write_Char(x,y,*s);     
s ++;  x++;   
        }
}
/*------------------------------------------------
              寫入字符函數(shù)
------------------------------------------------*/
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);  
}
/*------------------------------------------------
              初始化函數(shù)
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標(biāo)移動設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/
}


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

/*------------------------------------------------
uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延時1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}

回復(fù)

使用道具 舉報

ID:85375 發(fā)表于 2015-9-9 10:18 | 顯示全部樓層
求大神幫忙修改
回復(fù)

使用道具 舉報

ID:79544 發(fā)表于 2015-9-12 19:35 | 顯示全部樓層
分別寫兩個子函數(shù),放在主函數(shù)里試試。中間加延時。如,chaosb1();delay(3000);chaosb2();
回復(fù)

使用道具 舉報

ID:34643 發(fā)表于 2016-5-1 11:32 | 顯示全部樓層
這個程序好象用不了啊,我試過了。后來在百度上找了一個:仿真調(diào)試通過的超聲波測距程序 這個可以用。
回復(fù)

使用道具 舉報

ID:123126 發(fā)表于 2016-5-28 02:44 | 顯示全部樓層
  1.   while(!ECHO); //等待高電平
  2.    TR0=1;
  3.    while(ECHO);  //等待低電平
  4.    TR0=0;
復(fù)制代碼
你這個當(dāng)傳感器2檢測到障礙物,而1沒有檢測到時,是不是意味著程序一直在這空運行?
回復(fù)

使用道具 舉報

ID:34643 發(fā)表于 2016-5-28 07:21 | 顯示全部樓層
我看到過三路的,還有仿真。
回復(fù)

使用道具 舉報

ID:34643 發(fā)表于 2016-12-26 07:23 | 顯示全部樓層
我把仿真圖找出來了,給大家參考。
三路超聲波測距仿真.png
回復(fù)

使用道具 舉報

ID:146892 發(fā)表于 2016-12-27 13:37 | 顯示全部樓層
我這里有很全的測距資料,仿真圖源程序都有,上次課堂設(shè)計就用這個,你參考一下 超聲波測距設(shè)計資料.zip (493.92 KB, 下載次數(shù): 95)
回復(fù)

使用道具 舉報

ID:77398 發(fā)表于 2017-2-24 13:41 | 顯示全部樓層
添啊 發(fā)表于 2016-12-27 13:37
我這里有很全的測距資料,仿真圖源程序都有,上次課堂設(shè)計就用這個,你參考一下

這段程序中藍色語句        s=s*csbc-8;是做什么的咧????
捕獲.PNG
回復(fù)

使用道具 舉報

ID:125378 發(fā)表于 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; } /*------------------------------------------------                     主函數(shù) ------------------------------------------------*/ main() {   float S;       //距離變量 float c;       //距離變量   TIM0init();    //初始化定時器0   LCD_Init();    //初始化LCD // LCD_Write_String(0,1,"LY-UR04 demo");   while(1)   {     TRIG=1;       //觸發(fā)信號是高電平脈沖,寬度大于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);//打印輸出結(jié)果    LCD_Write_String(0,0,DisTempData);       //在液晶屏上顯示   // DelayMs(250);                            //延時決定采樣速度      TRIG1=1;       //觸發(fā)信號是高電平脈沖,寬度大于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);//打印輸出結(jié)果    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  /*------------------------------------------------               判忙函數(shù) ------------------------------------------------*/ 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 } /*------------------------------------------------               寫入命令函數(shù) ------------------------------------------------*/ void LCD_Write_Com(unsigned char com)  {   while(LCD_Check_Busy()); //忙則等待 RS_CLR;  RW_CLR;  EN_SET;  DataPort= com;  _nop_();  EN_CLR; } /*------------------------------------------------               寫入數(shù)據(jù)函數(shù) ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data)  {  while(LCD_Check_Busy()); //忙則等待 RS_SET;  RW_CLR;  EN_SET;  DataPort= Data;  _nop_(); EN_CLR; }  /*------------------------------------------------                 清屏函數(shù) ------------------------------------------------*/ /*void LCD_Clear(void)  {  LCD_Write_Com(0x01);  DelayMs(5); }*/ /*------------------------------------------------               寫入字符串函數(shù) ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)  {       while (*s)          {      LCD_Write_Char(x,y,*s);      s ++;  x++;            } } /*------------------------------------------------               寫入字符函數(shù) ------------------------------------------------*/ 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);   } /*------------------------------------------------               初始化函數(shù) ------------------------------------------------*/ void LCD_Init(void)  {    LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/     DelayMs(5);     LCD_Write_Com(0x38);     DelayMs(5);     LCD_Write_Com(0x38);     DelayMs(5);     LCD_Write_Com(0x38);      LCD_Write_Com(0x08);    /*顯示關(guān)閉*/     LCD_Write_Com(0x01);    /*顯示清屏*/     LCD_Write_Com(0x06);    /*顯示光標(biāo)移動設(shè)置*/     DelayMs(5);     LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/ }   -----------------------------延時程序------------------------------- #include "delay.h"  /*------------------------------------------------ uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS  ------------------------------------------------*/ void DelayUs2x(unsigned char t) {    while(--t); } /*------------------------------------------------ mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編 ------------------------------------------------*/ void DelayMs(unsigned char t) {  while(t--) {      //大致延時1mS      DelayUs2x(245);          DelayUs2x(245); } }
回復(fù)

使用道具 舉報

ID:99130 發(fā)表于 2017-3-27 09:58 | 顯示全部樓層
51mcu 發(fā)表于 2016-5-1 11:32
這個程序好象用不了啊,我試過了。后來在百度上找了一個:仿真調(diào)試通過的超聲波測距程序 這個可以用。

這個程序編譯不了啊 能指導(dǎo)一下嗎
回復(fù)

使用道具 舉報

ID:99130 發(fā)表于 2017-3-27 13:01 | 顯示全部樓層
添啊 發(fā)表于 2016-12-27 13:37
我這里有很全的測距資料,仿真圖源程序都有,上次課堂設(shè)計就用這個,你參考一下

你資料里超聲波模塊的5腳在哪?電位器該怎么接
回復(fù)

使用道具 舉報

ID:75447 發(fā)表于 2017-3-27 13:18 | 顯示全部樓層
你這兩個超聲波用的是同一組IO,貌似這樣不可以,需要像7#一樣,分開IO接
回復(fù)

使用道具 舉報

ID:111182 發(fā)表于 2017-4-10 09:21 | 顯示全部樓層
51mcu 發(fā)表于 2016-12-26 07:23
我把仿真圖找出來了,給大家參考。

仿真可以發(fā)一份不?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 拍戏被cao翻了h承欢 | 亚洲国产精品日本 | 午夜一区 | 欧美a在线 | 伊人网一区| 在线一区二区三区 | 国产精品久久久久久久久久久久 | 亚洲精品视频在线 | 久久综合久色欧美综合狠狠 | 亚洲精品中文字幕 | 性色的免费视频 | 亚洲精品久久久久久国产精华液 | 在线亚洲欧美 | 99精品视频一区二区三区 | 在线观看av不卡 | 蜜桃日韩| 在线精品一区二区 | 亚洲一区二区三区在线 | 亚洲九九精品 | 户外露出一区二区三区 | 亚洲成人三级 | av中文在线 | 波霸ol一区二区 | 日韩在线观看视频一区 | 在线免费看91 | 国产精品99久久久久久www | 日韩亚洲一区二区 | 亚洲欧美日韩精品久久亚洲区 | 在线亚洲欧美 | 伊人免费网 | 国产1区2区在线观看 | 日韩中文字幕视频 | 亚洲高清在线 | 亚洲欧美视频一区 | www.欧美视频 | 久久久亚洲精品视频 | 在线视频a | 欧美日韩激情 | 欧美一区二区网站 | 国产中文在线观看 | 亚洲欧美一区二区三区在线 |