|
這是一個簡易的基于DS18B20和AT89C2051單片機的測溫系統,參考程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char //???
sbit DQ=P3^7; //??DS18B20 ? I/O
uchar x=0; //???
signed char m; //???????
uchar n; //???????
uint z;
uint c;
uchar code LEDData[]={0x3F,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F};
//*****?????*****{0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,//
//0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};//
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****???DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ??
Delay_DS18B20(8); //????
DQ = 0; //????DQ??
Delay_DS18B20(80); //????,??480us
DQ = 1; //????
Delay_DS18B20(14);
x = DQ; //?????,??x=0??????,x=1??????
Delay_DS18B20(20);
}
/*****?????*****/
unsigned char 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_DS18B20(4);
}
return(dat);
}
/*****?????*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
/*****????*****/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); //??????????
WriteOneChar(0x44); //??????
Init_DS18B20();
WriteOneChar(0xCC); //??????????
WriteOneChar(0xBE); //???????
a=ReadOneChar(); //??8?
b=ReadOneChar(); //??8?
t=b; //?8????t
t<<=8; //t????8?
t=t|a; //?t?a???,????16???
tt=t*0.0625; //?t??0.0625???????
//(???????12???,??????0.0625)
t= tt*10+0.5; //??10?(???????????)???????
return(t); //?????
}
/*****?????*****/
void Delay(uint num)
{
while( --num );
}
/*****????*****/
void check_wendu(void)
{
uint a,b;
c=ReadTemperature(); //?????
a=c/100; //????????
b=c/10-a*10; //????????
m=c/10; //???????
if(m<=0) //??????0,?????0
{
m=0;
}
n=c-a*100-b*10;
//???????
}
/*****???????????*****/
void Disp_init(void)
{
P1 = ~0x80; //??-
P3 = 0xFB;
Delay(200);
P3 = 0xDF;
Delay(200);
P3 = 0xEF;
Delay(200);
P3 = 0xF7;
Delay(200);
P3 = 0xFF; //????
}
/*****???????*****/
void Disp_Temperature(void)
{
P1 = 0x98; //??c
P3 = 0x7F;
Delay(1000);
P3=0xff; //????
P1=LEDData[n]; //?????
P3 = 0xdf;
Delay(1000);
P3=0xff; //????
P1 =LEDData[m%10]+0x80; //????
P3 = 0xef;
Delay(1000);
P3=0xff; //????
P1 =LEDData[m/10]; //????
P3 = 0xf7;
Delay(1000);
P3 = 0xff; //????
}
/*****???*****/
void main(void)
{
check_wendu();
check_wendu();
for(z=0;z<300;z++)
{
Disp_init();
}
while(1)
{
check_wendu();
Disp_Temperature();
}
}
|
-
123.png
(76.95 KB, 下載次數: 29)
下載附件
2019-6-19 17:32 上傳
-
圖片1.png
(29.68 KB, 下載次數: 34)
下載附件
2019-6-19 17:32 上傳
仿真圖
-
-
基于DS18B20的測溫系統.rar
2019-6-19 17:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
253.94 KB, 下載次數: 18, 下載積分: 黑幣 -5
|