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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超聲波測距程序,無法測出距離,lcd顯示為一固定值

[復制鏈接]
跳轉到指定樓層
樓主
ID:130544 發表于 2016-9-13 23:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
第一次進入測距時,一切正常,然后就出現問題了
1602.c程序應該沒問題,在調試第一次時,GetDistance()函數運行正常,然后就無法再次進入GetDistance函數,
用不同值測試了ValueToStr函數(整形數值 轉換成字符串,用于液晶顯示),顯示正常。


調試好幾天了,實在調不出來了,求大神幫忙看看。拜謝


/****************************main**********************************/
#include<reg52.h>
#include<intrins.h>
#include"1602.h"
sbit tring = P1^6;
sbit echo = P3^2;

bit flag200ms = 0;

void ValueToStr(unsigned char *str,unsigned int value);
unsigned int GetDistance();
void InitTimer0();
void InitTimer1();
void main()
{
        unsigned char str[10];
        unsigned int distance;
        InitLcd();
        InitTimer0();
        InitTimer1();
        tring = 0;
        while(1)
        {
                 if(flag200ms)
                {
                         flag200ms = 0;
                        distance = GetDistance();
                        ValueToStr(str,distance);
                        WriteCmd(0x01);
                        ShowStr(0,0,"distance  mm ");
                        ShowStr(0,1,str);
                }       
        }
}
void InitTimer1()  //初始化定時器1,用于計時200ms
{
        EA = 1;
        TMOD &= 0x0f;/配置定時器1
        TMOD |= 0x10
        TH1 = 0xfc;
        TL0 = 0x66;
        ET1 = 1;
        TR1 = 1;
}
void delay()  //延時函數
{
        _nop_();_nop_();
        _nop_();_nop_();
        _nop_();_nop_();
        _nop_();_nop_();
        _nop_();_nop_();
}

void InitTimer0() //初始化定時器0,便于計時
{
        TMOD = 0x01;
        TH0 = 0;
        TL0 = 0;
        TR0 = 0;
}

void SendStart()  //發送起始信號
{
        tring = 1;
        delay();
        tring = 0;
}

unsigned int GetDistance() //超聲波測距函數
{
    float  distance=0,time=0;  //初始時間距離
        SendStart();
        while(!echo);                //未接收到信號時等待
        TR0 = 1;                        //接收到信號后,跳出等待,開始計時
        while(echo);                //等待高電平結束
        TR0 = 0;                         //關閉定時器

        if(TH0>=0x3e)//距離大于3m無法精確測距,3e為大于3m時間
                {
                        TH0 = 0;
                        TL0 = 0;
                        return 0;
                }

        time = (256*TH0 +TL0)*1.085; //計算時間 單位us
        TH0 = 0;
        TL0 = 0;
        distance = time * 344/1000/2;//計算距離 單位mm

        return (unsigned char ) distance;//將距離強制轉換成整數后返回
}

void ValueToStr(unsigned char *str,unsigned int value)        //把距離轉換成字符串,以便于在液晶上顯示
{
        unsigned char dat[10];
        char index;
        for(index=0;value!=0;index++)
        {
                 dat[index] = value%10;
                value /= 10;
        }
       
        index--;
       
        for(;index>=0;index--)
        {
                 *str++ = dat[index]+'0';
        }
        *str = '\0';       
}

void InterruptTimer1()interrupt 3
{
        static unsigned int cnt = 0;
        TH1 = 0xfc;
        TL1 = 0x66;
        cnt++;
        if(cnt == 200)
        {
                flag200ms = 1;
                cnt = 0;
        }
}



/************************1602.c*****************************/


#define _1602_C
#include<reg52.h>
#define LCD_DB P0
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit ENLCD = P1^5;

void LcdReady()
{
        unsigned char sta;
        LCD_DB = 0xff;//¸ßμçÆ½¼ì2a
        LCD_RS = 0;
        LCD_RW = 1;
        do
        {
                 ENLCD = 1;
                sta = LCD_DB;
                ENLCD = 0;
        }while(sta & 0x80);

}

void WriteCmd(unsigned char cmd)
{
        LcdReady();
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_DB = cmd;
        ENLCD = 1;
        ENLCD = 0;

}

void InitLcd()
{
        WriteCmd(0x38);
        WriteCmd(0x0c);
        WriteCmd(0x06);
        WriteCmd(0x01);
}

void WriteDat(unsigned char dat)
{
        LcdReady();
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_DB = dat;
        ENLCD = 1;
        ENLCD = 0;
}

void ShowStr(unsigned char x,unsigned char y,unsigned char *ptr)
{
  unsigned char addr;
  if(y==0)
  addr =0x00 + x;
  else if(y == 1)
  addr = 0x40 +x;
  WriteCmd(0x80 | addr);//í¨1yÖ¸áîÂëéèÖÿaê¼Î»ÖÃ
  while(*ptr != '\0')
  {
           WriteDat(*ptr++);
  }
}




/*************************1602.h*****************************/


#ifndef _1602_H
#define _1602_H

#ifndef _1602_C

#endif

void ShowStr(unsigned char x,unsigned char y,unsigned char *ptr);
void InitLcd();
void WriteCmd(unsigned char cmd);

#endif


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:130544 發表于 2016-9-13 23:43 | 只看該作者
P1^6是tring發射開始信號,P3^2是接收回傳信號,高電平時間就是總時間,P0用作總線,連接1602液晶,超聲波是用最便宜的超聲波模塊
回復

使用道具 舉報

板凳
ID:123289 發表于 2016-9-18 17:21 | 只看該作者
先設一個斷點,看看超聲模塊返的數據對不對。
如對:則是譯碼顯示的問題了。
不對:則需要看超聲模塊的使用手冊
回復

使用道具 舉報

地板
ID:521534 發表于 2019-5-12 18:41 來自手機 | 只看該作者
挖個墳,樓主不要見怪。樓主用的是金沙灘的板子嗎?我也是卡在這個問題上好幾天了。樓主做出來這個程序了嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品视频 | 在线中文字幕av | 日本a v在线播放 | 国产无人区一区二区三区 | 欧美日韩成人影院 | 91秦先生艺校小琴 | 国产视频精品区 | 午夜免费福利片 | 成人午夜在线 | 精品一区二区三区免费视频 | 欧美精品在欧美一区二区 | 香蕉二区 | 欧美一级α片 | 亚洲91视频 | 欧美xxxx网站 | 99热都是精品 | 久久99精品久久久久久噜噜 | 色欧美片视频在线观看 | 亚洲欧洲视频 | 夜夜艹天天干 | 国产精品久久久久久久久久东京 | 作爱视频免费看 | 国产精品伦理一区 | 久久久久国产一区二区三区四区 | 成人国产精品入口免费视频 | 亚洲视频一区在线播放 | 日韩欧美一二三区 | 日韩欧美电影在线 | 午夜视频精品 | 一区二区三区四区在线视频 | 成人伊人| 91精品国产综合久久久久久漫画 | 久久精品国产免费一区二区三区 | 风间由美一区二区三区在线观看 | 欧美影院久久 | 69av在线视频 | 免费看国产一级特黄aaaa大片 | 韩国理论电影在线 | 久久国产精品视频 | 国产精品美女久久久久aⅴ国产馆 | 伊人久久免费视频 |