大神求解如何分时控制两个超声波测距US-100模块
时间:10-02
整理:3721RD
点击:
菜鸟学习中,我想编一个两个超声波测距模块US-100测出来的数值相加的c程序采用分时控制
用的是stc89c51单片机,1602显示。大神能不能讲解一下,或者给个范例。
最直接的当然是编一个我参考啦。先谢谢了
下面是我测试成功的一个超声波测距的程序
修改了网上的,但是还是不太懂。
奖励分数不多还请见谅
#include <AT89x51.H> //器件配置文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define RX P1_2
#define TX P1_1
#define LCM_RW P3_6 //定义LCD引脚
#define LCM_RS P3_5
#define LCM_E P3_4
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
unsigned char code mcustudio[] ={" The distance "};
unsigned char code Cls[] = {" "};
unsigned char code ASCII[16] = {'0','1','2','3','4','5','6','7','8','9','.','-','C','M'};
static unsigned char DisNum = 0; //显示用指针
uint time=0;
unsigned long S=0;
bit flag =0;
uchar disbuff[4]={ 0,0,0,0,};
/*********************5ms延时************/
void delay5Ms(void)
{
uint TempCyc = 5552;
while(TempCyc--);
}
/***********400ms延时******************/
void delay400Ms(void)
{
uchar TempCycA = 5;
uint TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
/*********************延迟****************/
void delayms(uint ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/**************读状态**********************************/
uchar readStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while(LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
/*****************读数据***************************************/
/*uchar readDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
} */
/******************写数据*********************************/
void writeDataLCM(uchar WDLCM)
{
readStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
/*****************写指令*********************************/
void writeCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC)
readStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*************初始化*************************************/
void LCMInit(void) //LCM初始化
{
writeCommandLCM(0x38,0); //显示模式设置,不检测忙信号
delay5Ms();
writeCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
writeCommandLCM(0x08,1); //关闭显示
writeCommandLCM(0x01,1); //显示清屏
writeCommandLCM(0x06,1); // 显示光标移动设置
writeCommandLCM(0x0c,1); // 显示关及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y)
{
X |= 0x40; //当要显示第二行时地址码+0x40;
}
X |= 0x80; //算出指令码
writeCommandLCM(X, 1); //发命令字
writeDataLCM(DData); //发数据
}
/**************显示字符*************************************/
//按指定位置显示一串字符
void displayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
/************计数*****************************/
void count(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //当距离超出测量时,范围显示“-”
{
flag=0;
DisplayOneChar(4, 1, ASCII[11]);
DisplayOneChar(5, 1, ASCII[11]);
DisplayOneChar(6, 1, ASCII[11]);
DisplayOneChar(7, 1, ASCII[12]); //显示C
DisplayOneChar(8, 1, ASCII[13]); //显示M
}
else //当距离未超出距离限制时,正常显示
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
DisplayOneChar(4, 1, ASCII[disbuff[0]]);
DisplayOneChar(5, 1, ASCII[disbuff[1]]);
DisplayOneChar(6, 1, ASCII[disbuff[2]]);
DisplayOneChar(7, 1, ASCII[12]); //显示C
DisplayOneChar(8, 1, ASCII[13]); //显示M
}
}
/*************************中断**************************/
void timer0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/******************启动模块*********************************/
void startModule() //启动模块
{
uchar i;
TX=1; //启动一次模块
for(i=0;i<20;i++) //延迟 以便于进行传送数据
{
_nop_();
}
TX=0;
}
/*****************主函数***********************************/
void main()
{
LCMInit(); //LCM初始化
delay5Ms(); //延时片刻(可不要)
displayListChar(0, 0, mcustudio);
displayListChar(0, 1, Cls);
TMOD=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
EA=1; //开启总中断
while(1)
{
startModule();
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
count(); //计算
delayms(80); //80MS
}
}
拜托大家给个意见呗
我最近也在搞双测距模块,你程序搞好了吗?
你既然能写出一个超声波测距,再加一个超声波原理还不是一样啊?