📄 18b20sj.c
字号:
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RDATA=P2^0;//18B20口
sbit alarm=P1^6;//报警口
uchar temh,teml;
//延时
void dmsec(uint count)
{
uint i;
while(count--)
{
for(i=0;i<125;i++){}
}
}
void tmreset(void)
{
uint i;
RDATA=0;
i=103;while(i>0) i--;
RDATA=1;
i=4;while(i>0) i--;
}
void tmpre(void)
{
uint i;
while(RDATA);
while(~RDATA);
i=4;while(i>0) i--;
}
bit tmrbit(void)
{
uint i;
bit dat;
RDATA=0;i++;
RDATA=1;i++;i++;
dat=RDATA;
i=8;while(i>0) i--;
return(dat);
}
uchar rebyte(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void wrbyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
RDATA=0; //写1
i++;i++;
RDATA=1;
i=8;while(i>0) i--;
}
else
{
RDATA=0; //写0
i=8;while(i>0) i--;
RDATA=1;
i++;i++;
}
}
}
void tempsta(void)
{
tmreset();
tmpre();
dmsec(1);
wrbyte(0xcc);
wrbyte(0x44);
}
uchar readtemp(void)//读温度
{
tmreset();
tmpre();
dmsec(1);
wrbyte(0xcc);
wrbyte(0xbe);
teml=rebyte();
temh=rebyte();
}
void Delay(uint Delayms)
{
uchar j;
uint i;
for(i=0;i<Delayms;i++)
for(j=0;j<255;j++);
}
char senddata(char c)//发送数据
{
while (!TI);
TI = 0;
return (SBUF = c);
}
void init(void)//串口初始化
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
SCON=0x53;
PCON&=0x7f;
TR1=1;
}
void main()
{
uchar a,b,c;
signed char cc;
unsigned long tem;
init();
while(1)
{
tempsta();//启动转换
dmsec(20);
readtemp();//读温度值
c=teml>>4|temh<<4;
a=c/10+48;
b=c%10+48;
senddata(a);//发送整数,(两位)
senddata(b);
tem=(teml&0x0f)*625;
a=tem/1000+48;
b=(tem/100)%10+48;
senddata(a);//发送小数,(两位)
senddata(b);
TI=0;
cc=SBUF; //接受上位机数据
RI=0;
if(cc=='o') alarm=0; //如果上位机发送的是"o",报警
else if (cc=='p') alarm=1;//为"p"或者其他解除报警
else alarm=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -