想用C51实现小于50°则P1.0口置低电平!
对18B20比较陌生,不知道retemp的返回值是一个十进制还是其它?
没有想到办法去读取这个返回值并进行判断?
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1 =out^4;
sbit smg2 =out^5;
sbit DQ =P3^7;
sbit P10 =P1^0;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void)
{
uchar i,temp,a=10;
P1=0xff;
out=0xff;
delay5(1000);
while(1)
{
temp=retemp();
if(a<=0x05) P10=0;
for(i=0;i<10;i++)
{
out=(temp/10)&0x0f;
a=out;
smg1 =0;
smg2 =1;
delay5(10);
out=(temp%10)&0x0f;
smg1 =1;
smg2 =0;
delay5(10);
/*a=(temp/10);
out=a&0x0f;
smg1 =0;
smg2 =1;
delay5(10);
a=(temp%10);
out=a&0x0f;
smg1 =1;
smg2 =0;
delay5(10);*/
}
}
}
void delay5(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
void init_ds18b20(void)
{
uchar x=0;
DQ =0;
delay5(120);
DQ=1;
delay5(16);
delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
uchar date =0;
for(i=8;i>0;i--)
{
DQ=0;
delay5(1);
DQ=1;
date >>=1;
if(DQ)
date|= 0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay5(12);
DQ=1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void)
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
delay5(1000);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}