📄 18b20.c
字号:
/*--------------------------------------------------------------------------
DS18B20,数码管显示,显示格式为:零上:100.00°C
零下:-10.00°C
若不DS18B20检测不到,蜂鸣器报警,晶振是11.0592M
----------------------------------------------------------------------------*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^4;//ds18b20 IO口
sbit beep=P2^6;//
sbit aa=P2^0; //74hc138
sbit bb=P2^1;
sbit cc=P2^2;
sbit LE1=P2^7;
uchar flag,flag1,pre;
uchar ds18b20_reset();
uchar read_byte();
void write_byte(uchar );
void read_tempt();
void display();
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x63,0x40,0x80,0x00};
//c o - 、
uchar data tempt_data[2]; //温度暂存 内部RAM低128字节
uchar data ddata[6]; //显示暂存 内部RAM低128字节
void delay_50us(uint t) //12M,延时50us
{
while( --t );
}
void init() //初始化
{
P0=0xff;
P2=0xff;
flag=0;
flag1=0;
LE1=0;
}
void main() //主函数
{
init();
while(1)
{
read_tempt();
if(flag1==0)
{
display();
}
else
{
P0=0x00;
}
}
}
uchar ds18b20_reset() // ds18b20 复位
{
uchar pre;
DQ=1; //增加稳定性
delay_50us(1);
DQ=0;
delay_50us(90); //
DQ=1;
delay_50us(8);
pre=DQ;
delay_50us(100);
DQ=1;
return(pre);
}
uchar read_byte() //读ds18b20一个字节
{
uchar i;
uchar data_t=0;
for(i=8;i>0;i--)
{
DQ=0;
data_t>>=1;
_nop_();
DQ=1;
if(DQ)
data_t|=0x80;
delay_50us(4);
}
return(data_t);
}
void write_byte(uchar dat) //向ds18b20 写一个字节
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
_nop_(); //使其时隙大于1us小于15us
delay_50us(5);
DQ=1;
dat>>=1;
}
}
void read_tempt() //读ds18b20 的温度值,把它放到内部RAM低128字节种
{
uchar i;
if(pre==1) //ds18b20不响应,蜂鸣器报警
{
for(i=10;i>0;i--)
{
beep=~beep;
delay_50us(5);
}
flag1=1;
beep=1;
}
else
{
ds18b20_reset();
write_byte(0xcc);
write_byte(0x44);
ds18b20_reset();
write_byte(0xcc);
write_byte(0xbe);
for(i=0;i<2;i++)
{
tempt_data[i]=read_byte();
}
ds18b20_reset();
}
}
void display() //数码管显示
{
uchar temp,temp_1;
temp=tempt_data[1]&0xf0;
if(temp==0xf0) //温度是否小于零
{
flag=1;
if(tempt_data[0]==0) //LSB是否向MSB进位,若进位,则高8位和低8位都取反加一
{
tempt_data[0]=~tempt_data[0]+1;
tempt_data[1]=~tempt_data[1]+1;
}
else //没有进位,则高8位取反,低8位取反加一
{
tempt_data[0]=~tempt_data[0]+1;
tempt_data[1]=~tempt_data[1];
}
}
temp=((tempt_data[0]&0xf0)>>4)|((tempt_data[1]&0x0f)<<4);
ddata[1]=temp/100;
ddata[2]=temp%100/10;
ddata[3]=temp%100%10;
temp_1=tempt_data[0]&0x0f;
ddata[0]=(temp_1*0.0625)*10000;
ddata[4]=ddata[0]/1000;
ddata[5]=ddata[0]%1000/100;
if(flag==1) //判断温度是否小于零
{
if(!ddata[1]) //若十位等于 零,十位显示"-",百位关闭显示
{
ddata[1]=0x0e;
if(!ddata[2]) //判断十位是否为零
ddata[2]=0x0c;
}
}
else //温度大于零时
{
if(!ddata[1]) //判断百位是否为零
{
ddata[1]=0x0e; //百位为零,关闭百位显示
if(!ddata[2]) //判断十位是否为零
ddata[2]=0x0e; //十位为零,关闭十位显示
}
}
//数码管显示
LE1=1;
delay_50us(20);
aa=0;
bb=0;
cc=0;
P0=table[ddata[1]];
delay_50us(200);
aa=1;
bb=0;
cc=0;
P0=table[ddata[2]];
delay_50us(200);
aa=0;
bb=1;
cc=0;
P0=table[ddata[3]];
delay_50us(200);
aa=0;
bb=1;
cc=0;
P0=table[0x0d];
delay_50us(200);
aa=1;
bb=1;
cc=0;
P0=table[ddata[4]];
delay_50us(200);
aa=0;
bb=0;
cc=1;
P0=table[ddata[5]];
delay_50us(200);
aa=1;
bb=0;
cc=1;
P0=table[0x0b];
delay_50us(200);
aa=0;
bb=1;
cc=1;
P0=table[0x0a];
delay_50us(200);
LE1=0;
P0=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -