找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3315|回复: 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 单片机教程网

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