📄 温度计.c
字号:
#include <reg52.h>
#include <serial.h>
#define uint unsigned int
sbit DQ=P1^4;
static uchar HT,LT;
void delay(uint i) //小延时
{
while(i--);
}
void delayms(uchar i) //延时 1MS
{
uchar j=0;
for (;i>0;i--)
{
for (j=0;j<125*2;j++)
{;}
}
}
/****************DS18B20初始化函数************/
uchar init_18b20()
{
uchar present=0;
DQ=1; //DQ复位
delay(8*2); //稍做延时
DQ=0; //单片机将DQ拉低
delay(80*2); //精确延时 大于 480us
DQ=1; //拉高总线
delay(14*2);
present=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20*2);
return present;
}
/***************读一个字节****************/
uchar read_18b20(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
delay(1);
date>>=1; // 逐位右移
DQ = 1; // 给脉冲信号
if(DQ) //DQ为1 时,表示收到高电平1
date|=0x80; // 把收到的高电平置给DAT的最高位
delay(4);
}
return(date);
}
/*****************写一个字节*******************/
void write_18b20(uchar date)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=date&0x01; //把要发送的高电平或者低电平给DQ 发送出去
delay(5*2);
DQ=1;
date>>=1; //逐位右移
}
delay(4*2);
}
/*******************读取温度******************/
void readtemper()
{
uchar a=0;
uchar b=0;
init_18b20(); //调用初始化函数
write_18b20(0xCC); // 跳过读序号列号的操作
//不需要验证序列号。
write_18b20(0x44); // 发送温度转换命令 启动温度转换
init_18b20();
write_18b20(0xCC); //跳过读序号列号的操作
write_18b20(0xBE); //读暂存器
a=read_18b20(); //读取温度值低位
b=read_18b20(); //读取温度值高位
LT=(a&0xF0)?5:0; //
HT=b<<4; //
HT+=(a&0xF0)>>4; //
}
main()
{
uchar tem[5];
init_serial();
while(1)
{
readtemper();
tem[0]=HT/100+48;
tem[1]=HT/10+48;
tem[2]=HT%10+48;
tem[3]='.';
tem[4]=LT+48;
if(HT<1)
tem[0]='-';
serial_t("the temperature is ",18);
if(tem[0]=='0')
serial_t(&tem[1],4);
else serial_t(tem,5);
serial_t(" ",3);
delayms(255);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -