资源描述
看了好多天单片机,找了好多资料想自己利用实验板上的DS18B20做个温度计(最近温度实在是太热了)。在网上找了好多关于这个的程序,结果发现对我的板子来说就这个好用,温度三十度不算高,因为我把它放到风扇下面了,现在和大家分享一下吧,不过里面我自己也改了一点点。希望高手不要见笑,红色的部分是我改的或者是后加上的。如果还有什么更好的建议或意见请 记得给我留言哦……
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit PS2=P2^6; //数码管十位,位选
sbit PS1=P2^7; //数码管个位,段选
sbit P_L=P1^0; //测量指示
sbit DQ=P2^2; //DS18B20数据接口
void delay(uint); //延时函数
void DS18B20_init(void); //DS18B20初始化
void get_temper(void); //读取温度程序
void DS18B20_write(uchar in_data); //DS18B20写数据函数
uchar DS18B20_read(void); ////读取数据程序
uchar htd(uchar a); //进制转换函数
void display(void); //显示函数
uchar temp; //温度寄存器
bit DS18B20; // 18B20存在标志,1---存在 0---不存在
uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //字段转换表
void main(void)
{
uint a;
while(1)
{
get_temper(); //测量温度
for(a=0;a<200;a++) ;//显示,兼有延时的作用
display();
}
}
/****************************DS18B20读取温度函数**************************/
/*函数原型:void get_temper(void)
/*函数功能:DS18B20读取温度
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void get_temper(void)
{
uchar k,T_sign,T_L,T_H;
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc); // 跳过ROM匹配
DS18B20_write(0x44); //发出温度转换命令
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc); //跳过ROM匹配
DS18B20_write(0xbe); //发出读温度命令
T_L=DS18B20_read(); //数据读出
T_H=DS18B20_read();
k=T_H&0xf8;
if(k==0xf8)
T_sign=1; //温度是负数
else
T_sign=0; //温度是正数
T_H=T_H&0x07;
temp=(T_H*256+T_L)*0.0625; //温度转换常数
}
}
}
/****************************DS18B20写数据函数**************************/
/*函数原型:void DS18B20_write(uchar in_data)
/*函数功能:DS18B20写数据
/*输入参数:要发送写入的数据
/*输出参数:无
/*调用模块:_cror_()
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求)
{
uchar i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
}
else //写0
{
DQ=0;
}
delay(4); //延时62us
DQ=1;
out_data=_cror_(out_data,1); //循环右移1位
}
}
/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:站长
/******************************************************************/
uchar DS18B20_read()
{
uchar i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行发送数据
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //读DQ端
if(k==1) //读到的数据是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
delay(3); //延时51us
DQ=1;
in_data=_cror_(in_data,1); //循环左移1位
}
return(in_data);
}
/**************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init(void)
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:站长
/******************************************************************/
void DS18B20_init(void)
{
uchar a;
DQ=1; //主机发出复位低脉冲
DQ=0;
delay(44); //延时540US
DQ=1;
for(a=0;a<0x36&&DQ==1;a++)
{ //等待DS18B20回应
a++;
a--;
}
if(DQ)
DS18B20=0; //18B20不存在
else
{
DS18B20=1; // 18B20存在
delay(120); //复位成功!延时240US
}
}
/**************************数码管显示函数**************************/
/*函数原型:void display(void)
/*函数功能:数码管显示
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:站长
/******************************************************************/
void display(void)
{
PS1=1;
P0=0x01;
PS1=0;
PS2=1;
P0=tab[htd(temp)>>4]; //转换成十进制输出
PS2=0;
delay(200);
PS1=1;
P0=0x02;
PS1=0;
PS2=1;
P0=tab[htd(temp)&0x0f]; //转换成十进制输出
PS2=0;
delay(200);
P_L=~DS18B20;
}
/*********************原显示函数***********************************
void display(void)
{
P0=tab[htd(temp)>>4]; //转换成十进制输出
PS2=1;
PS1=0;
delay(200);
P0=tab[htd(temp)&0x0f]; //转换成十进制输出
PS1=1;
PS2=0;
delay(200);
P_L=~DS18B20;
}
*******************************************************/
/**************************十六进制转十进制函数**************************/
/*函数原型:uchar htd(uchar a)
/*函数功能:十六进制转十进制
/*输入参数:要转换的数据
/*输出参数:转换后的数据
/*调用模块:无
/*建立时间:2005/11/14
/*作者:站长
/******************************************************************/
uchar htd(uchar a)
{
uchar b,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c|b<<4;
return c;
}
/*******************************延时函数*********************************/
/*函数原型:delay(unsigned int delay_time)
/*函数功能:延时函数
/*输入参数:delay_time (输入要延时的时间)
/*输出参数:无
/*调用模块:无
/*建立时间:2005/10/21
/*作者:站长
/**********************************************************************/
void delay(unsigned int delay_time) //延时子程序
{for(;delay_time>0;delay_time--)
{}
}
展开阅读全文