📄 temperature.c
字号:
#define DQ_SET PORTA|=(1<<3)
#define DQ_CLR PORTA&=~(1<<3)
/********************/
//复位
/********************/
void drive_Reset(void)
{
DDRA|=(1<<3);//输出
DQ_CLR;
delay(800); //480US~960US
DQ_SET;
delay(1); // DS18B20 WAITS 15~60US
}
/********************/
//应答
/********************/
void RWait(void)
{
uchar timee=0;
DDRA&=~(1<<3);
while(PINA&0X08==0x08)
{
timee++;
delay(1);
if(timee>=200)
break;
}
delay(150);
}
/********************/
//读数据的一个字节
/********************/
uchar Readchar(void)
{
uchar xx;
uchar tempdata;
//DDRE&=~(1<<0);
for(xx=8;xx>0;xx--)
{
DDRA|=(1<<3);//输出时序
tempdata>>=1;
DQ_CLR;
delay(1); //保持至少1US
DQ_SET;
delay(1); //保持至少1US
DDRA&=~(1<<3);//读出数据
if(PINA&0X08) tempdata|=0X80;
delay(50);
}
return (tempdata);
}
/********************/
//写数据的一个字节
/********************/
void WrByte(uchar Commend)
{
uchar xx;
uchar tempdata;
DDRA|=(1<<3);//输出
for(xx=0;xx<8;xx++)
{
tempdata=Commend&0x01;
if(tempdata)
{
/*写1*/
DQ_CLR;
delay(6); //1~15
DQ_SET;
delay(30);//15~45
}
else
{
/*写0*/
DQ_CLR;
delay(30);//15~45
DQ_SET;
delay(40);//15~45
}
Commend=Commend>>1;
}
}
/********************/
//启动温度转换
/********************/
void convert(void)
{
drive_Reset();
RWait();
delay(1);
WrByte(0xcc);
WrByte(0x44);
}
/********************/
//读取温度 .读取之前有加700us的延时
/********************/
void RD_18b20(void)
{
uchar tempL=0;
uchar tempH=0;
drive_Reset();
RWait();
delay(1);
WrByte(0xcc);
WrByte(0xbe);
tempL=Readchar();
tempH=Readchar();
tempresult=tempL+(tempH<<8);
}
/**************************/
//测量温度函数
/**************************/
void RD_TEM(void)
{
delayms(1);
convert();
delay(700);
RD_18b20();
delay(10);
}
void show_t(void)
{
uchar xx=0;
uchar yy=0;
RD_TEM();
delayms(6000);
xx=tempresult/100;
yy=tempresult%100;
show_data(7,xx);
show_data(8,yy);
//BELL(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -