📄 18b20.c
字号:
#include<reg51.h>
sbit DQ=P2^2; //定义通信端口
code unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int sdata=0;//测温度的整数部分
unsigned char xiaoshu1=0;//小数第一位
unsigned char xiaoshu2=0;//小数第二位
unsigned char xiaoshu=0;// 二位小数
void delay1(unsigned int tc) //显示延时
{ while(tc!=0)
{unsigned int i;
for(i=0;i<100;i++);
tc--;
}
}
void delay(unsigned int i) //时间片延时
{ while(i--);
}
init_DS18b20(void) //初始化
{ unsigned char x=0;
DQ=1; //DQ复位
delay(8);
DQ=0; //单片机将DQ拉低
delay(80);//精确延时大于480um
DQ=1; //拉高总线
delay(14);
x=DQ; //延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
readonechar(void) // 读一个字节
{ unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{ DQ=0; //给脉冲信号
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
writeonechar(unsigned char dat) //写一个字节
{ unsigned char i=0;
for(i=8;i>0;i--)
{ DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
readtemperature(void)
{ unsigned char a=0;
unsigned char b=0;
init_DS18b20();
writeonechar(0xCC); //跳过读序列号
writeonechar(0x44); //启动温度转换
init_DS18b20();
writeonechar(0xCC); //
writeonechar(0xBE); // 读温度积存器
a=readonechar(); //低位
b=readonechar(); //高位
sdata=a/16+b*16; //整数
xiaoshu1=(a&0x0f)*10/16; //小数第一位
xiaoshu2=(a&0x0f)*100/16%10; //小数第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小数
}
void led()
{ P2=P2&0xef;
P0=seg7code[sdata/10];
delay1(8);
P2=P2|0xf0;
P2=P2&0xdf;
P0=seg7code[sdata%10]|0x80;
delay1(8);
P2=P2|0xf0;
P2=P2&0xbf;
P0=seg7code[xiaoshu1];
delay1(8);
P2=P2|0xf0;
P2=P2&0x7f;
P0=seg7code[xiaoshu2];
delay1(8);
P2=P2|0xf0;
}
void main()
{ while(1)
{ led();
readtemperature();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -