打印

用ad7705测热敏电阻输出数值从0-65536来回跳

[复制链接]
1044|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
574644054|  楼主 | 2017-12-30 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
574644054|  楼主 | 2017-12-30 14:02 | 只看该作者

#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
#define AD_CLK_WIDTH 1

uchar temp0, temp1,temp2,temp3,temp4,temp5;
uint i;

uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0 1 2 3 4 5 6 7 8 9 -
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};//0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -

uint out;

sbit AD7705_DIN=P2^6;
sbit AD7705_DOUT=P2^5;
sbit AD7705_SCLK=P2^2;
sbit AD7705_DRDY=P2^4;
sbit no1=P3^7;//数码管十位选择
sbit no2=P3^6; //数码管个位选择
sbit no3=P3^3; //数码管小数位选择
sbit rest=P2^3;



void delay(uint z)
        {
        int i,j;                                // 声明变量
        for (i=1;i<x;i++)                // 执行x次,延迟X*1ms
                for (j=1;j<120;j++);// 执行120次,延迟1ms
        }


void AD7705_Reset(void)
{
uchar i;
AD7705_SCLK =1;
for(i=0;i<40;i++)
  {
    AD7705_SCLK =0;
        
    AD7705_DIN =1;    // DIN端口连续写40个周期的高电平,保证复位
               
    AD7705_SCLK =1;
  }
  delay(1);             // 复位之后等待1MS         
}

//****************************************************************************
//功能:往AD7705写1个字节数据
//参数:要写入AD7705的数据
//返回:无
//备注:无
//****************************************************************************
void AD7705_WriteByte(uchar d)
      
      
    }
        uchar i;
        AD7705_SCLK =1;
        
        for(i=0;i<8;i++)
               {
                AD7705_SCLK =0;
                if(d & 0x80)
                        AD7705_DIN =1;
                else      
                        AD7705_DIN =0;
                                                                                      
                AD7705_SCLK =1;
                d<<= 1;
                }
        AD7705_SCLK =1;
        AD7705_DIN =1;
        }

//****************************************************************************
//功能:从AD7705读一个字节的数据
//参数:无
//返回:读到的一字节数据
//备注:无
//****************************************************************************
uchar AD7705_ReadByte()
        {
        uchar i;
                                        uint d=0;
        
        while(AD7705_DRDY);// 写数据的时候不需要判断忙,只有读数据的时候才需?
        AD7705_WriteByte(0x38);
        AD7705_SCLK =1;
        for(i=0;i<16;i++) // 读数据,高位在前
                {
                d<<= 1;
                AD7705_SCLK =0;
                if(AD7705_DOUT)
                        d++;
                AD7705_SCLK =1;
                }
       AD7705_SCLK =1;
        AD7705_DIN =1;
        AD7705_DRDY=1;
        return d;
        }



void AD7705_Init()
        {
                                        uchar i;
    for(i=10;i>0;i--)  
    {AD7705_WriteByte(0xff);}
        AD7705_Reset();  // 复位,防止接口迷失  
        AD7705_WriteByte(0x20);    // 写ch0 clock register   
        AD7705_WriteByte(0x10);    // 2MHz时钟,无分频 50Hz数据更新速率  
        AD7705_WriteByte(0x10);//设置寄存器
        AD7705_WriteByte(0x46);//自校正 单极性 增益1 缓冲开

        delay(50);
        }




float AD7705_ReadVol()
        {
        uchar adc_h=0, adc_l=0;
        uint  ADValue=0;
        

           
        adc_h=AD7705_ReadByte();
        adc_l=AD7705_ReadByte();
        ADValue |=  adc_h;
        ADValue<<= 8;
        ADValue |=  adc_l;
        
        return ADValue;
        }


void main()
{
        TMOD = 0x21;// 定时器1 工作于方式2,8 位自动重载模式, 用于产生波特率。
                                                        // 定时器 0 工作于方式 1,产生 1s 的 AD 间隔时间
        TH0=15536/256;//T0 定时 50ms
        TL0=15536%256;
        TH1 = 0xe1;// 波特率 1000
        TL1 = 0xe1;
        SCON = 0x50;// 设定串行口工作方式 1
        PCON = 0x00;// 波特率不倍增
        TI=0;//清除发送中断标志
        EA = 1; // 开总中断
        ET0 = 1;//开 T0 中断
        ET1=0;
        TR1 = 1;// 启动 T1
        TR0 = 1;//启动 T0
        
        rest=1;
         delay(10);
        rest=0;
         delay(10);
        rest=1;
         delay(10);
        
AD7705_Init();
        

while(1)
        {
         out=AD7705_ReadVol();
                                       
         temp1=out/10000;
         temp2=out%10000/1000;
         temp3=out%10000%1000/100;
         temp4=out%10000%1000%100/10;
         temp5=out%10000%1000%100%10;




        P1=table1[temp3];
        no3=0;no2=1;no1=1;      
        delay(1);
                                P1=0xff;

        P1=table1[temp2];
       no3=1;no2=0;no1=1;
        delay(1);
                                        P1=0xff;
        
        P1=table1[temp1];
        no3=1;no2=1;no1=0;
        delay(1);
                                P1=0xff;
                                

      
}
}

使用特权

评论回复
板凳
xiaxingxing| | 2017-12-30 19:21 | 只看该作者
从硬件角度来说,基准电压会不会太差了,噪声太大了?

使用特权

评论回复
地板
574644054|  楼主 | 2017-12-30 21:32 | 只看该作者
xiaxingxing 发表于 2017-12-30 19:21
从硬件角度来说,基准电压会不会太差了,噪声太大了?

但是奇怪的是会从0-65536一直来回显示

使用特权

评论回复
5
weilaiheike| | 2017-12-31 08:24 | 只看该作者
用万用表测一下AD的输入管脚,如果电压稳定,那么程序问题可能性很大,再好好查一下程序的控制时序。

使用特权

评论回复
6
kingkits| | 2018-1-2 14:57 | 只看该作者
65535 也可以看作0

使用特权

评论回复
7
kingkits| | 2018-1-2 14:58 | 只看该作者
你要是明白负数表示的话,0xffff(65535) = -1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝