标题:
有关用2Y0A21红外传感器测量距离的程序,求帮助
[打印本页]
作者:
林懂
时间:
2017-3-2 20:51
标题:
有关用2Y0A21红外传感器测量距离的程序,求帮助
最近在做红外测距实验,用的是2Y0A21红外传感器,外加外置的ADC0809转换模块连接到单片机中,用数码管显示出测到的距离,程序在下面,红外模块和ADC的连线应该没有错误,但是不能测到距离,数码管总是显示000,求大神帮助为什么不能测出距离;PS:我的单片机数码管显示程序是正确的,程序编译后没有错误没有警告
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit ST = P3^0;
sbit OE = P3^1;
sbit EOC = P3^2;
sbit CLK = P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit adress_A=P1^0; //这是定义ADIN0输入
sbit adress_B=P1^1;
sbit adress_C=P1^2;
uchar DisplayData[8]; //数码管显示数组
uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d,
0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c,
0x39 , 0x5e , 0x79 , 0x71} ;
void delayms(uint a) //延时函数
{
uint c,d;
for(c=a;c>0;c--)
for(d=110;d>0;d--);
}
/*******************************************************************************
* 函 数 名 : datapros()
* 函数功能 :AD读取处理转换函数
* 输 入 : temp
* 输 出 : 无
*******************************************************************************/
void datapros(int temp) //数据转换函数,用来转换由AD转换而来的电压值,以便让数码管显示
{
DisplayData[0] = 0x00;//因为数据处理有小数点所以将温度赋给一个浮点型变量
DisplayData[1]=table[temp/100];
DisplayData[2]=table[temp%100/10];
DisplayData[3]=table[temp%100%10];
}
/*******************************************************************************
* 函数名 :DigDisplay()
* 函数功能 :数码管显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void DigDisplay()
{
uchar i;
for(i=0;i<3;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
}
P0=DisplayData[3-i];//发送数据
delayms(5); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void ADC0809 () //ADC0809启动程序
{
long int temp;
long int temp1;
adress_A=0;adress_B=0;adress_C=0; //选择IN0作为模拟信号输入
ST=0; //START下降沿时启动芯片,开始进行A/D转换,转换期间保持低电平
OE=0;
delayms(10);
while(1)
{
ST=1;ST=0;
CLK=1; //用作AD的时钟
CLK=0;
CLK=1;
CLK=0; //给一个脉冲,上升沿寄存器复位,下降沿AD转换开始
while(!EOC)
{
CLK=1;
CLK=0;
} //当EOC为1时,转换结束
OE=1; //寄存器数据输出到D0-D7
temp=P0;
OE=0; //DO-D7复位
temp1=(temp*500)/256; //AD值转换成电压值(V=AD*VREF/256)
//显示AD值
datapros(temp1); //先转换数据
DigDisplay();
}
}
void main()
{
ADC0809 ();
}
复制代码
作者:
admin
时间:
2017-3-3 17:03
你先把ad的输入端分别接地和vcc看看 看看这时候数码管的显示有没有变化
作者:
林懂
时间:
2017-3-4 18:31
admin 发表于 2017-3-3 17:03
你先把ad的输入端分别接地和vcc看看 看看这时候数码管的显示有没有变化
都只是显示000
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1