⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 基于单片机89C51和ds18b20的汇编程序
💻 C
字号:
#include"DS18B20.h"
void initialize_clk()
{
    uchar i;
    BCSCTL1&=~XT2OFF;  //打开XT振荡器
    BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M  
    do
	{
        IFG1 &= ~OFIFG;                 //清除振荡错误标志 
        for(i = 0; i < 100; i++)
	  _NOP();			//延时等待
        }
    while ((IFG1 & OFIFG) != 0);	//如果标志为1继续循环等待
    IFG1&=~OFIFG;
}

void delay_18B20(int i)
{
    while(i--);
}

void initialize_DS18B20(void) 
{
    DS18B20|=DQ;
    DQ_OUT |= DQ;           //DQ复位            ______                      _____    ____
    delay_18B20(10);        //稍做延时                |_____.......________|     |__|
    DQ_OUT &= (~DQ);        //主机将DQ拉低            |<---">480us"------->|   ->|  |<-18B20将数据线拉低
    delay_18B20(680);       //大于 480us延时
    DS18B20&=(~DQ);         //转为输入状态
    delay_18B20(100);       //等待18B20将数据线拉低
    while(!(DQ_IN&DQ));     //为低则等待18B20释放数据线,
}


void WriteOneChar(unsigned char dat)
{
    unsigned char i=0;
    DS18B20|=DQ;    
    for (i=8; i>0; i--)
    {
        DQ_OUT &= (~DQ);          //拉低数据线
        delay_18B20(5);           //稍做延时
        if(dat&0x01)
            DQ_OUT |= DQ;
        else    DQ_OUT &= (~DQ);  //输出数据
        delay_18B20(70);          //保持45us
        DQ_OUT |= DQ;             //恢复数据线
        delay_18B20(1);           //两位间隔>1us
        dat>>=1;		  //dat=dat右移一位
    }
}

unsigned char ReadOneChar(void)
{
    unsigned char i=0;
    unsigned char dat = 0;
    DS18B20|=DQ;         
    for (i=8;i>0;i--)
    {
        DS18B20|=DQ;
        DQ_OUT &= (~DQ);      //拉低数据线
        dat>>=1;	      //dat=dat右移一位
        DS18B20&=(~DQ);       //将数据线交给18b20,此时端口被上啦电阻拉高
        delay_18B20(5);       //等待18b20送出数据
        if(DQ_IN&DQ)          //读取数据
            dat|=0x80;	      //dat=dat||0x80
        delay_18B20(60);      //读间隙>60us
    }
    return(dat);
}

unsigned long ReadTemperature(void)
{
        unsigned char a,b; 
        unsigned long l; 
        initialize_clk();
        delay_18B20(100);        
        initialize_DS18B20();
        WriteOneChar(0xcc);     //跳过ROM
        WriteOneChar(0xBE);     //读暂存存储器
        a=ReadOneChar();        //读低八位
        b=ReadOneChar();        //读高八位
        l=b;
        l=l<<8;
        l=l|a;
        l=l*625;
        delay_18B20(100);
        initialize_DS18B20();
        WriteOneChar(0xcc);
        WriteOneChar(0x44);     //启动下一次转换
        return l;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -