先贴程序 楼下上图#include<reg52.h> //no result
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar tempL=0; //设全局变量
uchar tempH=0;
uint z; //测量到的温度的整数部分
uchar p1; //小数第一位
uchar p2; //小数第二位
uchar p; //两位小数
bit flag=1; //温度正负标志
bit DS18B20_IS_OK = 1;
uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//IO
sbit c1=P2^0;
sbit c2=P2^1;
sbit en_139=P2^2;
sbit DQ=P2^3;//ds18b20与
单片机连接口
sbit en_573=P2^4;
void delay0(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=80;y>0;y--);
}
void select(uchar i)
{
switch(i)
{
case 1:c1=0,c2=0;break;
case 2:c1=1,c2=0;break;
case 3:c1=0,c2=1;break;
default:c1=1,c2=1;break;
}
}
void display(uchar dat,uchar i)
{
select(i);
P3=number[dat];
delay0(1);
}
void Delay(uint x)
{
while(--x);
}
/*void Init_DS18B20(void)
{
uchar x=0;
DQ=1; //DQ先置高
delay0(8); //稍延时
DQ=0; //发送复位脉冲
delay0(80); //延时(>480us)
DQ=1; //拉高数据线
delay0(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay0(20);
}*/
uchar Init_DS18B20(void)
{
uchar status;
DQ = 1;
Delay(8);
DQ = 0;
Delay(90);
DQ = 1;
Delay(8);
DQ = 1;
return status;
}
//读一个字节
/*uchar ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
uchar i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
uchar dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay0(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay0(4);
}
return(dat);
}*/
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}
//写一个字节
/*void WriteOneChar(uchar dat)
{
uchar i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=dat&0x01;
delay0(5);
DQ=1;
dat>>=1;
}
delay0(4);
}*/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
//读温度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
tempL=ReadOneByte();
tempH=ReadOneByte();
DS18B20_IS_OK=1;
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1;
flag=0; //读取温度为负时flag=0
}
//z=tempL/16+tempH*16; //整数部分
z=((tempL&0xf0)>>4)|((tempH&0x07)<<4);
p1=(tempL&0x0f)*10/16; //小数第一位
p2=(tempL&0x0f)*100/16%10; //小数第二位
p=p1*10+p2; //小数两位
DS18B20_IS_OK=1;
}
}
//显示函数
void display_0()
{
display(z/10,1);
display(z%10,2);
display(p1,3);
display(p2,4);
}
void sys_init()
{
en_139=0;
}
void main()
{
sys_init();
ReadTemperature();
Delay(5000);
Delay(5000);
while(1)
{
if(DS18B20_IS_OK)
display_0();
delay0(1);
}
}
这里有参考,你先看看,如果还不行我们在商量。
一周热门 更多>