这篇讲DS18B20温度传感器
仿真图用的是我自己做的一个51单片机开发板 图纸比较大,截图可能看不清,需要的话可以私信联系我。
程序:
源代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2;
sbit smg1=P2^4;
sbit smg2=P2^5;
sbit smg3=P2^6;
uchar temp; unsigned char code smg_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77, 0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={
0x08,0x18,0x28,0x38,
0x48,0x58,0x68,0x78};
void init_ds18b20(void);
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature(void);
void display(void);
void delay(uint t);
void delay_50us(uint t);
//************************************************//延时函数,在12MHz 的晶振频率下//大约50us 的延时//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
///////////////////////////////
void delay(uint t)
{ while(t--); }
////////////////////////////
void main(void)
{
while(1)
{
temp=readtemperature();
display();
}
}
/////////////////////////
void init_ds18b20(void)
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(14);
}
///////////////////////////////
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(8);
DQ=1;
dat>>=1;
}
delay(8);
}
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(4);
}
return value;
}
////////////////////////////
uchar readtemperature(void)
{
uchar a,b;
init_ds18b20();
write_byte(0xcc); //跳过ROM
write_byte(0x44); // 启动温度测量
delay(300);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void display(void)
{
smg3=0;
smg2=0;
smg1=0;
P1=smg_du[temp/10];
delay_50us(20);
smg2=0;
smg1=1;
P1=smg_du[temp%10];
delay_50us(20);
}
仿真结果:
数码管显示的数字就是温度传感器的温度,数码显示的跟实际的温度位置相反,这个可以程序里面的数码管的位定义即可。
本文暂时没有评论,来添加一个吧(●'◡'●)