打印
[51单片机]

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

[复制链接]
1063|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
574644054|  楼主 | 2017-12-30 05:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
574644054|  楼主 | 2017-12-30 05:54 | 只看该作者
#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;
                               

      
}
}

使用特权

评论回复
板凳
574644054|  楼主 | 2017-12-30 05:55 | 只看该作者
是我寄存器设置不正确吗  还是我的电路问题

使用特权

评论回复
地板
广东梁百万| | 2017-12-30 08:22 | 只看该作者
如果是汇编语言就容易解决了

使用特权

评论回复
5
574644054|  楼主 | 2017-12-30 12:26 | 只看该作者
广东梁百万 发表于 2017-12-30 08:22
如果是汇编语言就容易解决了

c不可以吗  我没学汇编

使用特权

评论回复
6
574644054|  楼主 | 2017-12-30 15:09 | 只看该作者
求救  我的毕设。。。。。

使用特权

评论回复
7
一周一天班| | 2017-12-30 16:28 | 只看该作者
ad7705读出数据是有符号16位,你用有符号short int和unsigned char[2]组成union联合,可以很简单处理了。]

使用特权

评论回复
8
574644054|  楼主 | 2017-12-30 16:33 | 只看该作者
一周一天班 发表于 2017-12-30 16:28
ad7705读出数据是有符号16位,你用有符号short int和unsigned char[2]组成union联合,可以很简单处理了。] ...

具体代码是???

使用特权

评论回复
9
xyz549040622| | 2017-12-31 21:22 | 只看该作者
我觉得不是这个问题,你测量一个固定的电压,比如vcc或者gnd,还会跳动吗?

使用特权

评论回复
10
gujiamao12345| | 2018-1-1 10:20 | 只看该作者
先采固定电压试试

使用特权

评论回复
11
zqx1000| | 2018-4-10 22:21 | 只看该作者
kankan

使用特权

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

本版积分规则

5

主题

16

帖子

0

粉丝