📄 ds18b20.c
字号:
#include "ds18b20.h"
void delay_us(uchar us)
{
while(us--);
}
/*
uchar crc1820(uchar jj)
{
uchar ii,crc_data=0;
for(ii=0;ii<jj;ii++){
crc_data=crc_table[crc_data^temp_buff[ii]];
}
return(crc_data);
}
*/
bit init_1820(void)
{
bit F18b20;
Bdq18B20=1;
_nop_();
Bdq18B20=0;
delay_us(80); //delay 480us
Bdq18B20=1;
delay_us(14); //delay 100us
if(Bdq18B20==0) F18b20=1;
else F18b20=0;
delay_us(20);
Bdq18B20=1;
return(F18b20);
}
void write_1820(uchar wr)
{
uchar ii;
for (ii=0;ii<8;ii++)
{
Bdq18B20=0;
_nop_();
Bdq18B20=wr&1;
delay_us(5);//delay 45us
Bdq18B20=1;
wr>>=1;
}
}
uchar read_1820(void) //
{
uchar ii,uu=0;
for(ii=0;ii<8;ii++){
Bdq18B20=0;
uu>>=1;
Bdq18B20=1;
if(Bdq18B20==1) uu|=0x80;
delay_us(4);
}
return(uu);
}
void read_1820s(uchar jj)
{
uchar ii;
p=temp_buff;
for(ii=0;ii<jj;ii++)
{
*p=read_1820();
p++;
}
}
/*
void config_1820(void)
{
bit Berr;
Berr=init_1820();
if(!Berr) return;
write_1820(0xcc);
write_1820(0x4e);
write_1820(0x19);
write_1820(0x1a);
write_1820(0x7f);
init_1820();
write_1820(0xcc);
write_1820(0x48);
init_1820();
write_1820(0xcc);
write_1820(0xb8);
}
*/
/*返回值低四位为小数部分16进制精度,高五位为负数标志(>63488),
若为负数则此五位全部为1,求其正数的方法为(65536-当前值)中间七位为整数部分*/
uint get_temp1820(void)
{
//unsigned char crc_temp;
uint tmp;
init_1820(); //启动1820
write_1820(0xcc); //SKIP ROM
write_1820(0x44); //启动转换
init_1820(); //启动1820
write_1820(0xcc); //SKIP ROM
write_1820(0xbe); //发送读取命令
read_1820s(2); //读取温度值
//crc_temp=crc1820(9); //CRC校验,此处不用
//if(crc_temp==0){
tmp=temp_buff[1]*0x100+temp_buff[0];
return(tmp);
//}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -