📄 ds18b20_drive._h
字号:
/*****************************************
返回三个值dis_buf_18b20[0]小数dis_buf_18b20[1]个位dis_buf_18b20[2]十位
调用Read_1820_temperature();
****************************************/
#include <iom8v.h>
#include <macros.h>
#define ddrt DDRD
#define port PORTD
#define uchar unsigned char
#define uint unsigned int
#define D0 0x01 //18b20端口,PD.0
#define pin PIND
#define CL_DQ PORTD&=~(1<<PD0)
#define SET_DQ PORTD|=(1<<PD0)
#define SET_OUT DDRD|=(1<<PD0)
#define SET_IN DDRD&=~(1<<PD0)
#define IN_DQ PIND&(1<<PD0)
unsigned int temp=0;
unsigned char temp_data[2]={0};
unsigned char dis_buf_18b20[3]={0};
uchar temp_comp;
void write_1820(unsigned char x) ;
/*-----------------------------------------------------------------
函数名称:void init_1820()
函数功能: 18b20的复位
参 数:
返 回 值:
-----------------------------------------------------------------*/
void init_1820(void)
{
SET_OUT; //设置端口输出
SET_DQ; //输出一个脉冲
CL_DQ; //低电平保持480us以上
delay_us(500); //延时480us以上
SET_DQ; //没有输出一个脉冲
SET_IN; //设置端口输入,即释放总线,外接上拉电阻,端口被拉高
delay_us(60); //延时15~60us
while(IN_DQ); //等待应答,即等待低电平信号
delay_us(80);
SET_OUT; //设置输出
SET_DQ; //输出高电平
delay_us(80); //60~240us
}
/*-----------------------------------------------------------------
函数名称:void write_1820(unsigned char x)
函数功能: 写18B20温度
参 数: x
返 回 值:
-----------------------------------------------------------------*/
void write_1820(unsigned char x) //下降沿写数据
{
unsigned char m;
//SET_DQ;
for(m=0;m<8;m++)
{
CL_DQ; //写数据,从低位开始
if(x&(1<<m)) //判断数据极性
SET_DQ;
else
CL_DQ;
delay_us(40); //延时15~60us
SET_DQ;
delay_us(1); //连续写两位数据的间隔要大于1us
}
SET_DQ; //结束写数据,置高总线
}
/*-----------------------------------------------------------------
函数名称:unsigned char read_1820(void)
函数功能: 读取18B20温度
参 数:
返 回 值: count
-----------------------------------------------------------------*/
unsigned char read_1820(void) //上升沿读数据
{
unsigned char temp=0,k,n;
for(n=0;n<8;n++)
{
CL_DQ; //输出一个起始脉冲
delay_us(1); //保持1us
SET_DQ;
SET_IN; //设端口为输入
k=IN_DQ; //读数据,从低位开始
delay_us(1);
if(k) //判断数据极性
temp|=(1<<n);
else
temp&=~(1<<n);
delay_us(60); //延时60~120us
SET_OUT; //设端口为输出
}
return (temp); //返回读出的数据
}
/*-----------------------------------------------------------------
函数名称:unsigned int Read_1820_temperature(void)
函数功能: 读取18B20温度,计算
参 数:
返 回 值: count
-----------------------------------------------------------------*/
void Read_1820_temperature(void)
{
unsigned int count;
unsigned char temh,teml;
init_1820(); //复位18b20
write_1820(0xcc); //跳过ROM
write_1820(0x44); //发出温度转换命令
delay_ms(750);
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml=read_1820(); //读数据
temh=read_1820();
temp_data[0]=read_1820();
temp_data[1]=read_1820();
count=temh<<8+teml;
count=count*0.0625;
count=(temh*256+teml)*6.25; //计算具体温度
dis_buf_18b20[2]=(count%10000)/1000+0x30;
dis_buf_18b20[1]=(count%1000)/100+0x30;
dis_buf_18b20[0]=(count%100)/10+0x30;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -