求AT89S52数字温度计{用DS18B20温度传感器}程序

 我来答
gerka
2010-05-12
知道答主
回答量:3
采纳率:0%
帮助的人:2.6万
展开全部
52单片机 18b20温度传感器程序2009-11-05 18:20
#include<reg52.h>
#include<math.h>
#include<INTRINS.H>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P1^3; //ds18b20 端口

uchar Temp_Integer=0;
uchar Temp_Decimal=0;
uchar fg=0;

void delay2(uint us)
{
while(us--);
}

uchar Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay2(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay2(80); //精确延时 大于480us
DQ = 1; //拉高总线
delay2(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay2(5);
return x;
}

uchar ReadOneChar(void) //读一个字节,"LSB"
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay2(5);
}
return(dat);
}

void WriteOneChar(unsigned char dat) //写一个字节
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay2(5);
DQ = 1;
dat>>=1;
}
delay2(5);
}

/**********************DS18b20读取主函数,整个流程5ms左右************************/
uchar ReadTemperature(void) //读取温度
{

uchar L_18B20=0;
uchar H_18B20=0;

Init_DS18B20();
WriteOneChar(0xCC); // skip:跳过读序号列号的操作
WriteOneChar(0x44); // convert:启动温度转换
delay2(200);

Init_DS18B20();
WriteOneChar(0xCC); //skip:跳过读序号列号的操作
WriteOneChar(0xBE); //read:读取温度寄存器,前两个就是温度

L_18B20=ReadOneChar(); //读取温度低八位数据
H_18B20=ReadOneChar(); //读取温度高八位数据

if(H_18B20>0x7f) //最高位为1时温度是负
{
L_18B20=~L_18B20+1; //补码转换,取反加一
H_18B20=~H_18B20;
fg=1; //读取温度为负时fg=1
}
Temp_Decimal=L_18B20&0x0f; //取温度小数部分二进制
L_18B20=L_18B20>>4; //取温度整数部分二进制
H_18B20=H_18B20<<4;
Temp_Integer=H_18B20|L_18B20;
}

/***********************串口通信***************************/
0 外部中断0
1 定时器1
2 外部终端1
3 定时器1
4 串行口中断

RCAP2H = 0xff;
RCAP2L = 0xd9;
TCLK = 1;
RCLK = 1;
SCON = 0x50;//模式1异步传输模式
PCON = 0x00;

IE |= 0x90; //Enable Serial Interrupt

TR2=1//开中断

void serial() interrupt 4
{
if(RI == 1)
{
tempnum = SBUF;
RI = 0;
}
TI = 0;
}
void receiveinfo()
{
convert();
return;
}
void sendinfo()
{
SBUF = 100*displaynum[2] + 10*displaynum[1] + displaynum[0];
return;
}
void convert()
{
displaynum[0] = tempnum%10;
tempnum /= 10;
displaynum[1] = tempnum%10;
tempnum /= 10;
displaynum[2] = tempnum;
return;
}

void main()
{
while(1)
{
sendinfo();
receiveinfo();
}
return;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式