標(biāo)題:
超聲波測距程序,無法測出距離,lcd顯示為一固定值
[打印本頁]
作者:
看好自己
時間:
2016-9-13 23:39
標(biāo)題:
超聲波測距程序,無法測出距離,lcd顯示為一固定值
第一次進入測距時,一切正常,然后就出現(xiàn)問題了
1602.c程序應(yīng)該沒問題,在調(diào)試第一次時,GetDistance()函數(shù)運行正常,然后就無法再次進入GetDistance函數(shù),
用不同值測試了ValueToStr函數(shù)(整形數(shù)值 轉(zhuǎn)換成字符串,用于液晶顯示),顯示正常。
調(diào)試好幾天了,實在調(diào)不出來了,求大神幫忙看看。拜謝
/****************************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() //延時函數(shù)
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
void InitTimer0() //初始化定時器0,便于計時
{
TMOD = 0x01;
TH0 = 0;
TL0 = 0;
TR0 = 0;
}
void SendStart() //發(fā)送起始信號
{
tring = 1;
delay();
tring = 0;
}
unsigned int GetDistance() //超聲波測距函數(shù)
{
float distance=0,time=0; //初始時間距離
SendStart();
while(!echo); //未接收到信號時等待
TR0 = 1; //接收到信號后,跳出等待,開始計時
while(echo); //等待高電平結(jié)束
TR0 = 0; //關(guān)閉定時器
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;//將距離強制轉(zhuǎn)換成整數(shù)后返回
}
void ValueToStr(unsigned char *str,unsigned int value) //把距離轉(zhuǎn)換成字符串,以便于在液晶上顯示
{
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
作者:
看好自己
時間:
2016-9-13 23:43
P1^6是tring發(fā)射開始信號,P3^2是接收回傳信號,高電平時間就是總時間,P0用作總線,連接1602液晶,超聲波是用最便宜的超聲波模塊
作者:
yzwzfyz
時間:
2016-9-18 17:21
先設(shè)一個斷點,看看超聲模塊返的數(shù)據(jù)對不對。
如對:則是譯碼顯示的問題了。
不對:則需要看超聲模塊的使用手冊
作者:
howudoing_Joey
時間:
2019-5-12 18:41
挖個墳,樓主不要見怪。樓主用的是金沙灘的板子嗎?我也是卡在這個問題上好幾天了。樓主做出來這個程序了嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1