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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5252|回復: 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, 下載次數: 118)

捕獲.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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区视频播放 | 欧美一级片在线播放 | 亚卅毛片| 成人免费视频网站在线观看 | 国产一区二区三区在线 | 高清视频一区二区三区 | 国产精品久久av | 欧美激情国产精品 | 亚洲综合中文字幕在线观看 | 国产成人精品a视频一区www | 男女网站免费观看 | 久久综合av | 成人高清网站 | 97超在线视频 | 午夜噜噜噜 | av网站在线播放 | 亚洲一区二区三区视频 | 久久成人18免费网站 | 神马九九 | 久久国产一区二区 | 日本不卡在线观看 | 欧美一极视频 | 欧美6一10sex性hd | 日本成人免费网站 | 欧美成人一区二区三区 | 国产一区二区免费 | 精品久久久久久久久久 | 秋霞影院一区二区 | 久久国产三级 | 精品久久久久久久久久 | 日韩网站免费观看 | 一区二区三区在线免费看 | 欧美色综合一区二区三区 | 8x国产精品视频一区二区 | 特黄级国产片 | 久久久夜色精品亚洲 | 久久国产精品久久 | 99视频在线| 99国产精品视频免费观看一公开 | 欧美乱大交xxxxx另类电影 | 99精品免费视频 |