|
最近在做红外测距实验,用的是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 ();
-
- }
复制代码
|
|