当前位置:文档之家› DS18B20控制程序

DS18B20控制程序

#ifndef _DS18B20_H_
#define _DS18B20_H_

#include
#include

//BIT在中已经定义#define BIT(x) (1 << (x))

#define DQ_DIR_IN() DDRD&=~BIT(2) //data input
#define DQ_DIR_OUT() DDRD|=BIT(2) //data output
#define DQ_BUS_L() PORTD&=~BIT(2) //Pin output high
#define DQ_BUS_H() PORTD|=BIT(2) //Pin output low
#define BUS_state() (PIND & 0x04) //检测 ds18b20返回信号

unsigned char wmh,wml,wm3,flag=0;
//unsigned char table[]={"0123456789"};

void DS18B20_init(void)
{
DQ_DIR_OUT(); //设置PD2 为输出
DQ_BUS_H();
DQ_BUS_L(); //占领总线
delay_nus(480); //480us以上
DQ_BUS_H(); //释放总线
DQ_DIR_IN();
delay_nus(20); //15~60us
while(BUS_state()); //回读DS18B20返回信号
DQ_DIR_OUT();
DQ_BUS_H(); //释放总线
delay_nus(140); //60~240us
}

void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
DQ_BUS_L(); //占领总线
if(x&(1<DQ_BUS_H();
else
{DQ_BUS_L();}
delay_nus(40); //15~60us
DQ_BUS_H(); //完毕后释放总线
}
DQ_BUS_H();
}

unsigned char read_1820(void)
{
unsigned char temp,n;
temp=0;
for(n=0;n<8;n++)
{
DQ_BUS_L(); //拉低总线
DQ_BUS_H(); //置高总线
DQ_DIR_IN(); //data input
if(BUS_state()) //读数据,从低位开始
temp|=(1<else
temp&=~(1<delay_nus(50); //60~120us
DQ_DIR_OUT(); //data output
}
return (temp);
}

void gettemp(void) //读取温度值
{
unsigned char temh,wm1;
unsigned char wm0,teml,wm2;
DS18B20_init(); //复位18b20
write_1820(0xcc); //skip ROM
write_1820(0x44); //发出转换命令
DS18B20_init();
write_1820(0xcc); //skip rom
write_1820(0xbe); //发出读命令
teml=read_1820(); //读数据
temh=read_1820();
wm0=teml>>4; //低8位的高四位,温度范围0~115啦!
wm1=temh<<4; //只要高8位的低四位
wm2=wm1+wm0 ; //16进制转10进制
if(wm1&0x80) //测试符号位,测温范围-55
{wm2=256-wm2; //求取补码
flag=1;
} //为负温度
else
{
flag=0;
}
wm3=wm2/100;
wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
wml=(wm2%100)%10;
}

void data_display(unsigned char add )
{ //unsigned char add=0;
add=LCD_display_string(0,0,"tem:");
if(flag)
{LCD_display_string(add++,0,"-");}
LCD_display_num(add++,0,table[wm3]);
LCD_display_num(add++,0,table[wmh]);
LCD_display_num(add++,0,table[wml]);
LCD_display_string(add++,0,".");
LCD_displa

y_string(add++,0,"00");
LCD_display_string(add+1,0,"C");
}

#endif

相关主题
文本预览
相关文档 最新文档