📄 ds18b20的c51程序.c
字号:
/*DQ为数据口,接于P3.4
/*18b20采用三线接法,上拉5.1k电阻*/
/*晶体:11.0592M*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[10]={0xfd,0x05,0x3e,0x7a,0x63,0x5b,0x5f,0x70,0x7f,0x7b};//一位数码管
sbit dq= P3^4;
bit flag;
uint temp;
void init_18b20 (void);
uint read_word (void);
void write (uchar wr);
void get_temp (void);
void delay (uint us);
display_temp(uint temp1);
void delay1(uint t);
main ()
{ /*P1=0x63;
while(1); */
TMOD=0x20;
PCON=0x00;
TH1=0xfd;TL1=0xfd;
TR1=1;
SCON=0x50;
EA=1;
dq=0;
_nop_();
dq=1;
init_18b20();
get_temp();
temp=temp;
while(1){get_temp();display_temp(temp);
SBUF=temp;
while(TI==0);TI=0;}
}
void init_18b20 (void)
{ dq=1;
_nop_();
dq=0;
delay(90); //delay 530 uS
dq=1;
delay(6); //delay 100 uS
if(dq==0)
flag=1; //detect 1820 success!
else
flag=0; //detect 1820 fail!
delay(20);
dq=1;
}
//
void write (uchar wr)
{
uchar i;
for (i=0;i<8;i++)
{
dq=0;
_nop_();
dq=wr&0x01;
delay(5); //delay 45 uS
dq=1;
wr>>=1;
}
}
//
uint read_word (void)
{
uchar i;
uint u=0;
for(i=0;i<16;i++)
{
dq=0;
u>>=1;
dq=1;
if(dq==1)
u|=0x8000;
delay (4);
}
return(u);
}
void get_temp (void)
{
uint bdata tem;
init_18b20();
if (flag)
{ write (0xcc); //skip rom
write (0x44); //temp convert
init_18b20 ();
write (0xcc); //skip rom
write (0xbe); //read temp
tem=read_word(); //read
if(tem<0x8000)
temp=tem*0.0625; //temperature>=0
else
temp=tem*(-0.0625); //temperature< 0
}
}
void delay (uint us)
{
while (us--);
}
void delay1(uint t) /*****************************************延时函数*************************************/
{ uint i,j;
for(i=0;i<=t;i++) {
for(j=0;j<=200;j++);}
}
display_temp(uchar temp1) //显示温度
{uchar t1,t2;
t1=temp1/10;
t2=temp1%10;
P1=table[t1];
delay1(500);
P1=table[t2];
delay1(500);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -