📄 ds18b20数字温度传感器.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code bitscan[]={0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef}; //扫描码
uchar code displaycode[]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x40}; //显示码
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
sbit dt=P3^7;
bit sflag;
unsigned char displaycount;
unsigned char timecount;
uchar readdata[8];
uchar displaybuf[8]={16,16,16,16,16,16,16,16}; //显示缓冲区
bit resetds18b20(void) //复位
{
uchar i;
dt=0;
for(i=255;i>0;i--);
dt=1;
for(i=60;i>0;i--);
return(dt);
for(i=200;i>0;i--);
}
void writecommandtods18b20(uchar command) //写DS18B20
{
uchar i,j;
for(i=0;i<8;i++);
{
if((command&0x01)==0)
{
dt=0;
for(j=35;j>0;j--);
dt=1;
}
else
{
dt=0;
for(j=2;j>0;j--);
dt=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1);
}
}
uchar readdatafromds18b20(void) //读DS18B20
{
uchar i,j,temp;
temp=0;
for(i=0;i<8;i++);
{
temp=_cror_(temp,1);
dt=0;
_nop_();
_nop_();
dt=1;
for(j=10;j>0;j--);
if(dt==1)
{
temp=temp|0x80;
}
else
{
temp=temp|0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}
void showtemp(void) //温度显示
{
uchar x;
unsigned int result;
if(displaycount==2)
{
P0=displaycode[displaybuf[displaycount]]&0x7f;
}
else
{
P0=displaycode[displaybuf[displaycount]];
}
P2=bitscan[displaycount];
displaycount++;
if(displaycount==8)
{
displaycount=0;
}
timecount++;
if(timecount==150)
{
timecount=0;
while(resetds18b20());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
for(x=0;x<8;x++)
{
displaybuf[x]=16;
}
sflag=0;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]++;
}
}
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
x=readdata[0];
x=x>>4;
x=x & 0x0f;
readdata[1]=readdata[1] | x;
x=2;
result=readdata[1];
while(result/10)
{
displaybuf[x]=result%10;
result=result/10;
x++;
}
displaybuf[x]=result;
if(sflag==1)
{
displaybuf[x+1]=17;
}
x=readdata[0] & 0x0f;
x=x<<1;
displaybuf[0]=(dotcode[x])%10;
displaybuf[1]=(dotcode[x])/10;
while(resetds18b20());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
}
}
void main() //主函数
{
unsigned int x;
for(x=0;x<2000;x++);
while(resetds18b20());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
while(1)
{
showtemp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -