📄 ds18b20.h
字号:
#define dq_clr PORTB&=~(1<<PB7) //数据线强制拉低
#define dq_set PORTB|=(1<<PB7) //数据线强制拉高,上拉
#define hold_dq DDRB|=(1<<PB7) //Mega16控制总线
#define rls_dq DDRB&=~(1<<PB7) //释放总线
#define stu_dq PINB&(1<<PB7) //数据线的状态
unsigned char resetDS18B20(void)
{
unsigned char errTime=0;
rls_dq; //释放总线
_NOP();
hold_dq; //Maga16控制总线
dq_clr; //强制拉低
delay_nus(480);
//以上延时大于480us
rls_dq; //释放总线,总线自动上拉
_NOP();
while(stu_dq)
{
delay_nus(5); //5us
errTime++;
if(errTime>12)
return(0x00); //如果等带大于约 5*12就返回0x00,报告复位失败(实际上只要等待15-60us)
}
errTime=0;
while(!(stu_dq))
{
delay_nus(5); //5us
errTime++;
if(errTime>50)
return(0x00); //如果等带大于约 5us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
}
return(0xff);
}
unsigned char readByteDS18B20(void)
{
unsigned char i;
unsigned char retVal=0;
rls_dq; //释放总线
for(i=8;i>0;i--)
{
retVal>>=1;
hold_dq; //Maga16控制总线
dq_clr; //强制拉低
delay_nus(8); //延时大于1us
dq_set; //释放总线,DS18B20会将总线强制拉低
rls_dq; //释放总线
if(stu_dq)
retVal|=0x80;
delay_nus(30); //30us
hold_dq; //释放总线
dq_set; //释放总线,DS18B20会将总线强制拉低
}
delay_nus(5); //2.71us(大于1us就行了)
return(retVal);
}
void writeByteDS18B20(unsigned char wb)
{
unsigned char i;
unsigned char temp;
rls_dq; //释放总线
for(i=0;i<8;i++)
{
hold_dq; //Maga16控制总线
dq_clr; //强制拉低
delay_nus(4);
temp=wb>>i;
temp&=0x01;
if(temp)
dq_set; //释放总线
else
dq_clr; //强制拉低
delay_nus(50);
dq_set; //释放总线
delay_nus(4); //(大于1us就行了)
}
}
void readTempDS18B20(void)
{
unsigned char tempL,tempH;
unsigned int x;
resetDS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0x44); //启动温度转换
delay_nus(500); //等待500us
resetDS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0xbe); //读数据
tempL=readByteDS18B20();
tempH=readByteDS18B20();
x=(tempH<<8)|tempL;
resetDS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0x44); //启动温度转换
x=x*0.625;
LCD_DisplayInt(2,3,x); //未将温度值的小数点显示出
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -