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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1805|回復: 6
打印 上一主題 下一主題
收起左側

超聲波測距程序就是不能顯示測出的距離,單片機程序沒錯誤,求大佬們教我如何解決

[復制鏈接]
跳轉到指定樓層
樓主
程序沒有錯誤
/*
計算公式
我們知道聲速是340m/s
根據x=vt
因為超聲波發送出去和回來是測量距離的兩倍,所以假設距離是L
2L=344xt
t我們用定時器測出來
一般都是us
所以就是tx172x10的-6次方=L,L單位為cm
最終的出 L= t(us) * 0.0172(cm/us)
0.0172=1/58
所以 L= t(us)/58(cm)


對于51單片機,12mhz的周期時間為1us
所以11.059200mzh的計算公式為
L = 計數 x(12/11.0592) x (1/58)
= 計數 x 0.0187
= (計數 x 1.87)/100(cm)
*/
#include "reg52.h"                        
#include "lcd.h"
#include "intrins.h"
#include "delay.h"


typedef unsigned int u16;         
typedef unsigned char u8;
typedef unsigned long u32;


sbit Echo = P2^0;//回響信號輸出
sbit Trig = P2^1;//觸發信號輸入


u8 di[]="Distance";//液晶顯示:Distance(距離)
u8 code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
                                 
u16 time = 0;
u16 s = 0;
u8 disbuff[4] = {0,0,0,0,};//提供4個數據位
u16 i = 0;


//對使用到函數進行聲明定義
void StartModule();
void Timer0Init(void);
void Conut(void);




/******************************************
* 函 數 名         : main
* 函數功能                   : 主函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************/
void main(void)
{        
        Timer0Init();
        LCD_Init();              //液晶初始化
        LCD_Write_String(4,0,di);//液晶第一行顯示字符“Distance”
        
        while(1)//獲取一次超聲波測距模塊的距離
        {
               
                 StartModule();
             while(!Echo);                //當Echo為零時等待
             TR0=1;                            //開啟
             while(Echo);                //當Echo為1計數并等待
             TR0=0;                                //關閉
         Conut();                        //計算
         DelayMs(10);
        }
}


/*-------------啟動超聲波模塊------------*/
void StartModule()         
{
          Trig=1;//啟動一次模塊
   
          _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_();/*可以生成10us脈沖,此處可以使用Delay10us_51();代替*/


          Trig=0;
}
      /*
      51延時10us程序
      void Delay10us_51(void)
      {
          u8 i=15;
          _nop_();
          while(--i);
      }
      */


void Timer0Init(void)        
{
        TMOD &= 0xF0;
        TMOD |= 0x01;                //設T0為方式1
        TH0 = 0;
        TL0 = 0;
    TF0 = 0;                   //清除TF0標志        
        ET0 = 1;           //允許T0中斷
        EA = 1;                           //開啟總中斷
    TR0 = 1;               //開啟定時器0
}




/*--------------距離計算模塊------------*/
void Conut(void)
{
         time=TH0*0x100+TL0;    //獲取時間 0x100=256  TH0*0x100+TL0=256
     /*也可以寫成
     1、time=TH0*256+TL0;
     2、time=TH0<<8|TL0;
    */
         //重置初值
         TH0=0;
         TL0=0;
        
         //s=(time/58.0/100.0)*1000;  與下面的一樣意思
     s=((u16)(time/58.0));       //獲取距離——計數出來的是M
         if( s>= 400 )//超出測量范圍顯示“-”
         {         
         
          LCD_Write_Char(4, 1, ASCII[11]);//液晶第二行第4個點陣顯示ASCII[]第11個數據'-',一下以此類推!!!
          LCD_Write_Char(5, 1, ASCII[10]);//顯示點
          LCD_Write_Char(6, 1, ASCII[11]);
          LCD_Write_Char(7, 1, ASCII[11]);
          LCD_Write_Char(8, 1, ASCII[11]);
          LCD_Write_Char(9, 1, ASCII[12]);//顯示M
         }
         else
         {
          disbuff[0]=s/1000%10;
          disbuff[1]=s/100%10;
          disbuff[2]=s/10%10;
          disbuff[3]=s/1%10;
          LCD_Write_Char(4, 1, ASCII[disbuff[0]]);//顯示千位
          LCD_Write_Char(5, 1, ASCII[10]);//顯示點
          LCD_Write_Char(6, 1, ASCII[disbuff[1]]);//顯示百位
          LCD_Write_Char(7, 1, ASCII[disbuff[2]]);//顯示十位
          LCD_Write_Char(8, 1, ASCII[disbuff[3]]);//顯示個位
          LCD_Write_Char(9, 1, ASCII[12]);//顯示M
         }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1005855 發表于 2022-4-6 17:23 | 只看該作者
仿真不能出數據,怎么解決

51hei圖片20220406172057.png (43.79 KB, 下載次數: 37)

51hei圖片20220406172057.png
回復

使用道具 舉報

板凳
ID:161164 發表于 2022-4-6 23:09 | 只看該作者
試試在while(1)之前加個DelayMs(1000);

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:1005855 發表于 2022-4-7 19:53 | 只看該作者
lkc8210 發表于 2022-4-6 23:09
試試在while(1)之前加個DelayMs(1000);

還是不能顯示數據,還要其他的方法嗎
回復

使用道具 舉報

5#
ID:161164 發表于 2022-4-7 21:14 | 只看該作者
lj2443454061 發表于 2022-4-7 19:53
還是不能顯示數據,還要其他的方法嗎

我又沒有lcd.h和delay.h
回復

使用道具 舉報

6#
ID:1005855 發表于 2022-4-8 10:17 | 只看該作者
lkc8210 發表于 2022-4-7 21:14
我又沒有lcd.h和delay.h

#ifndef __LCD_H_
#define __LCD_H_

/**********************************
包含頭文件
**********************************/
#include <reg52.h>
#include "intrins.h"

//---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

/**********************************
            PIN口定義
**********************************/
sbit EN = P2^7;
sbit RW = P2^5;
sbit RS = P2^6;

/**********************************
            函數聲明
**********************************/
void busy();//忙檢測函數

/*LCD1602寫入8位命令子函數*/
void LCD_Write_Com(unsigned char cmd);

/*LCD1602寫入8位數據子函數*/       
void LCD_Write_Data(unsigned char dat);

/*LCD1602初始化子程序*/               
void LCD_Init(void);

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);
                                                  

#endif



#ifndef __DELAY_H__
#define __DELAY_H__

void DelayUs2x(unsigned char t);

void DelayMs(unsigned char t);

#endif




回復

使用道具 舉報

7#
ID:1005855 發表于 2022-4-8 10:48 | 只看該作者
#include "lcd.h"

//---------------------------------------------------------------------
//函數:判忙函數
//功能:判斷液晶是否忙碌
void busy()
{
        uchar sta;
        P0= 0xFF;                //P0初始化
        RS = 0;                        //選擇指令寄存器
        RW = 1;                        //讀模式
        do
        {
                EN = 1;
                _nop_();
                sta = P0;         //讀取狀態字
                EN = 0;                //當E端由高電平跳變成低電平時,液晶模塊執行命令
               
        }
        while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重復檢測直到其等于 0 為止
}

//---------------------------------------------------------------------
//函數:寫命令函數
//功能:向液晶寫入一字節命令(8位命令), cmd-待寫入命令值
void LCD_Write_Com(unsigned char cmd)
{
        busy(); //判斷液晶是否忙碌
        RS = 0; //選擇指令寄存器
        RW = 0; //寫模式
        P0 = cmd;//把數據給P0,即寫入指令和地址
        EN = 1;
    _nop_();//短暫延時1us
        _nop_();//短暫延時1us       
        EN = 0;        //當E端由高電平跳變成低電平時,液晶模塊執行命令
       
}

//---------------------------------------------------------------------
//函數:寫數據函數
//功能:向液晶寫入一字節數據(8位數據), dat-待寫入數據值
void LCD_Write_Data(unsigned char dat)
{
        busy(); //判斷液晶是否忙碌
        RS = 1; //選擇數據寄存器
        RW = 0; //寫模式
        P0= dat;//把數據給P0
        EN = 1;
        _nop_();//短暫延時1us
        _nop_();//短暫延時1us               
        EN = 0;        //當E端由高電平跳變成低電平時,液晶模塊執行命令
       
}


//---------------------------------------------------------------------
//函數:初始化液晶函數
//功能:初始化液晶,并顯示啟動界面
void LCD_Init()
{
        LCD_Write_Com(0x38); //16*2 顯示, 5*7 點陣, 8 位數據傳送
        LCD_Write_Com(0x0C); //顯示器開,光標關閉
        LCD_Write_Com(0x06); //文字不動,地址自動+1
        LCD_Write_Com(0x01); //清屏
       
}


//---------------------------------------------------------------------
/*函數:寫入字符函數*/
//功能:設置顯示 DDRAM 起始地址,亦即光標位置, (x,y)-對應屏幕上的字符坐標
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
    if (y == 0) //由輸入的屏幕坐標計算顯示 DDRAM 的地址
        {     
        LCD_Write_Com(0x80 + x); //第一行字符地址從 0x80 起始   
        }   
    else
        {     
        LCD_Write_Com(0xC0 + x); //第二行字符地址從 0xc0起始   
        }        
    LCD_Write_Data( Data);           //寫數據-設置 DDRAM 地址
}

/*函數:寫入字符串函數*/
//可參考網上的
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{            
    while (*s) //先取 s 指向的數據,然后s自加 1,指向下一個待寫字符
    {     
        LCD_Write_Char(x,y,*s);     
        s++;  
        x++;   
    }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合精品久久久 | 久久久久久亚洲欧洲 | 欧美精品一区二区三区四区 在线 | 国产成人精品一区二区三 | 一级黄色绿像片 | 免费视频一区 | 国产精品99一区二区 | 亚洲欧美日韩精品久久亚洲区 | 亚洲欧美一区二区三区国产精品 | 综合九九| 99精品久久久 | 国产午夜精品一区二区三区嫩草 | 欧美日韩久久精品 | 国产精品99久久久久久动医院 | 日韩中文在线视频 | 国产精品久久久久久久午夜片 | 一级二级三级在线观看 | 日韩成人在线网址 | 免费观看a级毛片在线播放 黄网站免费入口 | 久久久美女 | 亚洲91精品 | 91精品国产综合久久小仙女图片 | www.久久国产精品 | 国产极品91 | 6080亚洲精品一区二区 | 国产探花 | 欧美一区二区在线 | 久久精品亚洲精品国产欧美 | a级免费视频 | 日本aa毛片a级毛片免费观看 | 视频一区二区三区中文字幕 | 欧美群妇大交群中文字幕 | 精品国产伦一区二区三区观看方式 | 影视一区| 91精产国品一二三区 | 午夜精品久久久 | 国产不卡一区 | 欧美日本韩国一区二区 | 99精品免费视频 | 日韩一区二区在线播放 | 日韩精品一区二区三区在线播放 |