打印

DS1624

[复制链接]
1749|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
woshihelloj|  楼主 | 2013-4-10 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

//---------------------------------
//       
//                DS1624测温程序
//       
//------------------------------------

#include <AT89X52.H>
#include <INTRINS.H>
//
//----------变量定义------------------
//
sbit SDA=P1^0;                        //IIC数据线,P1.0
sbit SCL=P1^1;                        //IIC时钟线,P1.1
unsigned char temperdata[2];        //温度值               
unsigned char secondcount=0;        //秒计数器
bit secondflag=0;                                //秒定时到达标志

//
//----------函数预定义------------------
//
void delay(void);
void IIC_start(void);
void IIC_stop(void);
void IIC_init(void);
void IIC_ack(void);
bit IIC_clock(void);
bit IIC_send(unsigned char i_data);
unsigned char IIC_receive(void);
bit start_temperature_T(void);
bit read_temperature_T(unsigned char *p);
//
//----------主函数预定义------------------
//
void main(void)
{
        P1=0xff;
        TMOD=0x21;
        ET0=1;
        EA=1;

        if(start_temperature_T())                        //向DS1624发送启动A/D温度转换命令,成功则启动T0定时1s。
    {
                secondflag=0;
                secondcount=0;
                TH0=55536/256;
                TL0=55536%256;
                TR0=1;      
    }

        while(1)
    {
                if(secondflag==1)
        {
                        secondflag=0;
                        TR0=0;
                        if(read_temperature_T(temperdata))                //T0定时1s时间到,读取DS1624的温度值
            {
                                if(start_temperature_T())                        //温度值数据处理完毕,重新启动DS1624开始温度转换
                {
                                        secondflag=0;
                                        secondcount=0;
                                        TH0=55536/256;
                                        TL0=55536%256;
                                        TR0=1;                        
                }
            }
        }
    }
}
//------------------------------------
//       
//        定时器中断程序,1S定时
//       
//------------------------------------
void T0_1ms(void) interrupt 1 using 0                                //T0用于定时1s时间到
{
        secondcount++;
        if(secondcount==100)
    {
                secondcount = 0;
                secondflag = 1;
    }
        TH0=55536/256;
        TL0=55536%256;
}
//------------------------------------
//       
//        短延时
//       
//------------------------------------
void delay(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

//------------------------------------
//       
//        IIC启动函数
//       
//------------------------------------
void IIC_start(void)
{
        SCL=1;
        delay();
        SDA=0;
        delay();
        SCL=0;
        delay();
}
//------------------------------------
//       
//        IIC停止函数
//       
//-----------------------------------
void IIC_stop(void)
{
        SDA=0;
        delay();
        SCL=1;
        delay();
        SDA=1;
        delay();
        SCL=0;
        delay();
}

//------------------------------------
//       
//        IIC初始化函数
//       
//-----------------------------------
void IIC_init(void)
{
        SCL=0;
        IIC_stop();
}

//------------------------------------
//       
//        IIC应答函数
//       
//-----------------------------------
void IIC_ack(void)
{
        SDA=0;
        IIC_clock();
        SDA=1;
}

//------------------------------------
//       
//        IIC读取数据位
//       
//-----------------------------------
bit IIC_clock(void)
{
        bit sample;

        SCL=1;
        delay();
        sample=SDA;
        _nop_();
        _nop_();
        SCL=0;
        delay();
        return(sample);
}

//------------------------------------
//       
//        IIC发送字节函数
//       
//-----------------------------------
bit IIC_send(unsigned char i_data)
{
        unsigned char i;

        for(i=0;i<8;i++)
    {
                SDA = (bit)(i_data & 0x80);
                i_data = i_data<<1;
                IIC_clock();
    }
        SDA=1;
        return(~IIC_clock());
}

//------------------------------------
//       
//        IIC接收字节数据函数
//       
//-----------------------------------
unsigned char IIC_receive(void)
{
        unsigned char i_data=0;
        unsigned char i;

        for(i=0;i<8;i++)
    {
                i_data*=2;
                if(IIC_clock()) i_data++;
    }
        return(i_data);
}

//------------------------------------
//       
//        启动温度测量函数
//       
//-----------------------------------
bit start_temperature_T(void)
{
        IIC_start();
        if(IIC_send(0x90))        //关键就是这里 求解释下呗 函数到这里在脑里都走不动了 不理解
    {
                if(IIC_send(0xee))
        {
                        IIC_stop();
                        delay();
                        return(1);
        }
        else
                {
                        IIC_stop();
            delay();
            return(0);
                }
    }
    else
        {
                IIC_stop();
        delay();
        return(0);
        }
}

//------------------------------------
//       
//        读取温度测量结果函数函数
//       
//-----------------------------------
bit read_temperature_T(unsigned char *p)
{
        IIC_start();
        if(IIC_send(0x90))
    {
                if(IIC_send(0xaa))
        {
                        IIC_start();
                        if(IIC_send(0x91))
                        {
                                *(p+1) = IIC_receive();
                                IIC_ack();
                                *p = IIC_receive();
                                IIC_stop();
                                delay();
                                return(1);
            }
            else
                        {
                                IIC_stop();
                delay();
                return(0);
                        }
        }
        else
                {
                        IIC_stop();
            delay();
            return(0);
                }
    }
    else
        {
        IIC_stop();
        delay();
        return(0);
        }
}

相关帖子

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

本版积分规则

3

主题

6

帖子

0

粉丝