📄 ds18b20.c
字号:
#include<reg52.h>
#include<intrins.h>
#define SkipRom 0xcc//跳过读取编码值操作,使以后的操作具有通用性
#define ConvertTemperature 0x44//温度转换命令
#define ReadScratchpad 0xbe//读内部数据存储器地址
sbit DQ=P2^7;
unsigned int buffer[6];
unsigned char code buff[12]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0x40,0x00
};//数字0~9及"EP=OC"共阴数码管代码
void delay(unsigned char delay_time)//延时时间:=(8+delay_time*6)us;
{
while(delay_time)
delay_time--;
}
void init_ds18b20(void)//初始化
{
DQ=0;//复位信号
delay(80);//延时600us
DQ=1;
delay(4);//延时30us
DQ=1;
delay(35);//延时180us
DQ=1;
_nop_();//短暂延时
}
void wr_byte(unsigned int wdata)//ds18b20写一个字节(wdata)
{
unsigned int n;//循环变量
for(n=0;n<8;n++)//8个bit
{
DQ=0;//每次写入都要先复位
_nop_();//短暂延时
if(wdata&0x01==1)//写最低位
DQ=1;
delay(10);//延时68us
wdata=wdata>>1;//依次移位
DQ=1;
_nop_();
}
delay(20);//延时128us
}
unsigned int rd_byte(void)//ds18b20读一个字节
{
unsigned int m,bb=0;
bit b;
for(m=0;m<8;m++)
{
DQ=0;
_nop_();
DQ=1;
b=DQ;
delay(12);//延时70us
if(b)
bb|=0x01<<m;
DQ=1;
_nop_();
}
delay(10);//延时68us
return(bb);
}
void rd_ds18b20()//读ds18b20
{
unsigned int msb=0,lsb=0;
unsigned char t1=0;
unsigned int t2=0;
unsigned int flag;
init_ds18b20();//初始化
wr_byte(SkipRom);//单片机发送命令,ds18b20跳过内部ROM,使以后命令通用
_nop_();//短暂延时
wr_byte(ConvertTemperature);//单片机发送温度转换命令
delay(5);//延时40us
init_ds18b20();//初始化,为显示做准备
wr_byte(SkipRom);//跳过内部ROM
wr_byte(ReadScratchpad);//准备读温度数据
lsb=rd_byte();//为温度整数显示准备
msb=rd_byte();//为温度小数显示准备
if((msb&0xf0)>1)//取整数部分
flag=1;
else flag=0;
if(flag)
{
msb=~msb;//正数取反仍为正,不必加1
lsb=~lsb+1;//负数取反要加1才为补码
}
t1=(msb<<4)|(lsb>>4);//整数部分
t2=(lsb&0x0f)*0.0625*10000;//小数部分
if(flag)
{
buffer[0]=10;//负数,因为最低为-55度,故为5位显示
}
else
{
buffer[0]=11;//正数,因为最高为125度,故为6位显示
}
buffer[1]=t1/100;//数码管第二位
buffer[2]=(t1/10)%10;
buffer[3]=t1%10;
buffer[4]=t2/1000;//数码管小数部分
buffer[5]=(t2%1000)/100;
}
void display()//数码管显示
{
unsigned int j,b=0xdf,k;
for(j=0;j<6;j++)
{
P1=b;//位选,b的值即为0xdf
if(j==3)
{
P0=buff[buffer[j]]|0x80;//段选
}
else
{
P0=buff[buffer[j]];
}
b=(b>>1)|0x80;
for(k=0;k<5;k++)
{
delay(120);//延时720us
}
}
}
void main()
{
while(1)
{
rd_ds18b20();//读ds18b20
display();//数码管显示
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -