求AT89S52数字温度计{用DS18B20温度传感器}程序
1个回答
展开全部
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;
}
#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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询