📄 18b20.h
字号:
#define b20_io PC7
#define b20_port PORTC
#define b20_pin PINC
#define b20_ddr DDRC
/********************************************************************************************
* 函数名称:Sensor_Delay(uint16 US)//延时函数
* 功 能:DS18B20软件延时专用
* 入口参数:US
* 出口参数:无
*********************************************************************************************/
void Sensor_Delay(unsigned int US)
{
unsigned int i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for(i=0;i<US;i++);
}
/*******************************************
函数名称: B20_init
功 能: 复位DS18B20
参 数: 无
返回值 : 无
********************************************/
void B20_init(void)
{
b20_ddr|=(1<<b20_io); //配置为输出
b20_port&=~(1<<b20_io); //拉低
Sensor_Delay(600); //等待600微秒
b20_port|=(1<<b20_io); //释放总线
Sensor_Delay(60); //等待60微秒
b20_ddr&=~(1<<b20_io); //配置为输入
while((b20_pin&(1<<b20_io))); //等待DS18B20拉低
while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
}
/*******************************************
函数名称: B20_readB
功 能: 读取一个字节的数据
参 数: 无
返回值 : retd--返回的一个字节数据
********************************************/
unsigned char B20_readB(void)
{
unsigned char i,retd=0;
for(i=0;i<8;i++) //位计数值
{
retd>>=1; //右移,准备接受新的数据位
b20_ddr|=(1<<b20_io); //配置为输出
b20_port&=~(1<<b20_io); //拉低,启动读数据位
b20_port|=(1<<b20_io); //释放总线
Sensor_Delay(5); //等待5微秒
b20_ddr&=~(1<<b20_io); //配置为输入,开始读取数据位
if(b20_pin&(1<<b20_io)) //该位是否为高
{
retd|=0x80; //是就将此位置高
}
Sensor_Delay(50); //等待50微秒
}
return retd; //将读到的一个字节返回
}
/*******************************************
函数名称: B20_writeB
功 能: 写入一个字节的数据
参 数: wrd--要写入的数据
返回值 : 无
********************************************/
void B20_writeB(unsigned char wrd)
{
unsigned char i;
for(i=0;i<8;i++) //位计数值
{
b20_ddr|=(1<<b20_io); //配置为输出
b20_port&=~(1<<b20_io); //拉低,启动写数据位
Sensor_Delay(1); //等待1微秒
if(wrd&0x01) //此位数据是否为高
{
b20_port|=(1<<b20_io); //是高则将单总线拉高
}
else
{
b20_port&=~(1<<b20_io); //是低则将单总线拉低
}
Sensor_Delay(50); //等待50微秒
b20_port|=(1<<b20_io); //释放总线
wrd>>=1; //右移,为写入新的数据位做准备
}
Sensor_Delay(50); //等待50微秒
}
/*******************************************
函数名称: Read_temp
功 能: 读取温度值
参 数: templ温度值低位,temph温度值高位
返回值 : 无
********************************************/
void Read_temp(unsigned char *templ,unsigned char *temph)
{
B20_init(); //初始化,每次写命令都从初始化开始
B20_writeB(0xcc); //跳过ROM
B20_writeB(0x44); //启动温度转换
B20_init(); //初始化,每次写命令都从初始化开始
B20_writeB(0xcc); //跳过ROM
B20_writeB(0xbe); //读寄存器
*templ=B20_readB(); //读温度低字节
*temph=B20_readB(); //读温度高字节
}
/*******************************************
函数名称: b20_display
功 能: 温度值显示
参 数: lz为液晶显示位置
返回值 : 无
********************************************/
void b20_display(unsigned char lz)
{
unsigned char b20_h=0,b20_l=0;
unsigned char inter=0;
unsigned int fraction=0;
Read_temp(&b20_l,&b20_h); //读取温度值
if(b20_h&0xf8)
{
lcd_write(command,lz);
lcd_write(data,' -');
b20_l=~b20_l;
b20_h=~b20_h;
}
inter=b20_h*16+(b20_l>>4);//整数部分
int_disp(lz+1,inter);
lcd_write(data,'.');
fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
lcd_write(data,fraction/1000+48);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -