找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3651|回复: 2
打印 上一主题 下一主题
收起左侧

有关用2Y0A21红外传感器测量距离的程序,求帮助

[复制链接]
跳转到指定楼层
楼主
ID:166237 发表于 2017-3-2 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做红外测距实验,用的是2Y0A21红外传感器,外加外置的ADC0809转换模块连接到单片机中,用数码管显示出测到的距离,程序在下面,红外模块和ADC的连线应该没有错误,但是不能测到距离,数码管总是显示000,求大神帮助为什么不能测出距离;PS:我的单片机数码管显示程序是正确的,程序编译后没有错误没有警告
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char


  5. sbit ST  = P3^0;
  6. sbit OE  = P3^1;
  7. sbit EOC = P3^2;
  8. sbit CLK = P3^3;
  9. sbit LSA=P2^2;
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. sbit adress_A=P1^0; //这是定义ADIN0输入
  13. sbit adress_B=P1^1;
  14. sbit adress_C=P1^2;

  15. uchar DisplayData[8]; //数码管显示数组

  16. uchar code table[]={ 0x3f  , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d,
  17.                        0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c,
  18.                              0x39 , 0x5e , 0x79 , 0x71} ;

  19. void delayms(uint a)        //延时函数
  20.   {
  21.      uint c,d;
  22.      for(c=a;c>0;c--)
  23.        for(d=110;d>0;d--);
  24.   }


  25. /*******************************************************************************
  26. * 函 数 名         : datapros()
  27. * 函数功能                   :AD读取处理转换函数
  28. * 输    入         : temp
  29. * 输    出         : 无
  30. *******************************************************************************/
  31. void datapros(int temp)  //数据转换函数,用来转换由AD转换而来的电压值,以便让数码管显示
  32. {
  33.    DisplayData[0] = 0x00;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  34.     DisplayData[1]=table[temp/100];
  35.      DisplayData[2]=table[temp%100/10];
  36.      DisplayData[3]=table[temp%100%10];
  37. }

  38. /*******************************************************************************
  39. * 函数名         :DigDisplay()
  40. * 函数功能                 :数码管显示函数
  41. * 输入           : 无
  42. * 输出                  : 无
  43. *******************************************************************************/
  44. void DigDisplay()
  45. {
  46.         uchar i;
  47.         for(i=0;i<3;i++)
  48.         {
  49.                 switch(i)         //位选,选择点亮的数码管,
  50.                 {
  51.                         case(0):
  52.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  53.                         case(1):
  54.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  55.                         case(2):
  56.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  57.                         case(3):
  58.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  59.                         case(4):
  60.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  61.                         case(5):
  62.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位        
  63.                 }
  64.                 P0=DisplayData[3-i];//发送数据
  65.                 delayms(5); //间隔一段时间扫描        
  66.                 P0=0x00;//消隐
  67.         }               
  68. }



  69. void ADC0809 ()          //ADC0809启动程序
  70. {        
  71.       long int temp;
  72.         long int temp1;

  73.       adress_A=0;adress_B=0;adress_C=0;   //选择IN0作为模拟信号输入
  74.       ST=0;         //START下降沿时启动芯片,开始进行A/D转换,转换期间保持低电平
  75.         OE=0;

  76.         delayms(10);

  77.         while(1)
  78.         {
  79.              ST=1;ST=0;
  80.              CLK=1;                     //用作AD的时钟
  81.            CLK=0;
  82.            CLK=1;
  83.            CLK=0;                //给一个脉冲,上升沿寄存器复位,下降沿AD转换开始
  84.              while(!EOC)
  85.              {
  86.                         CLK=1;
  87.                CLK=0;
  88.              }        //当EOC为1时,转换结束
  89.              OE=1;                        //寄存器数据输出到D0-D7
  90.              temp=P0;               
  91.              OE=0;                    //DO-D7复位

  92.              temp1=(temp*500)/256;        //AD值转换成电压值(V=AD*VREF/256)
  93. //显示AD值
  94.            datapros(temp1); //先转换数据
  95.              DigDisplay();
  96.         }
  97. }

  98. void main()
  99.   {
  100.           ADC0809 ();
  101.          
  102.   }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-3-3 17:03 | 只看该作者
你先把ad的输入端分别接地和vcc看看 看看这时候数码管的显示有没有变化
回复

使用道具 举报

板凳
ID:166237 发表于 2017-3-4 18:31 | 只看该作者
admin 发表于 2017-3-3 17:03
你先把ad的输入端分别接地和vcc看看 看看这时候数码管的显示有没有变化

都只是显示000
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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