转基于DS18B20数字温度计C语言程序设计.docx
- 文档编号:9029195
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:11
- 大小:19.86KB
转基于DS18B20数字温度计C语言程序设计.docx
《转基于DS18B20数字温度计C语言程序设计.docx》由会员分享,可在线阅读,更多相关《转基于DS18B20数字温度计C语言程序设计.docx(11页珍藏版)》请在冰豆网上搜索。
转基于DS18B20数字温度计C语言程序设计
看了好多天单片机,找了好多资料想自己利用实验板上的DS18B20做个温度计(最近温度实在是太热了)。
在网上找了好多关于这个的程序,结果发现对我的板子来说就这个好用,温度三十度
不算高,因为我把它放到风扇下面了
,现在和大家分享一下吧,不过里面我自己也改了一点点。
希望高手不要见笑,红色的部分是我改的或者是后加上的。
如果还有什么更好的建议或意见请记得给我留言哦……
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitPS2=P2^6;//数码管十位,位选
sbitPS1=P2^7;//数码管个位,段选
sbitP_L=P1^0;//测量指示
sbitDQ=P2^2;//DS18B20数据接口
voiddelay(uint);//延时函数
voidDS18B20_init(void);//DS18B20初始化
voidget_temper(void);//读取温度程序
voidDS18B20_write(ucharin_data);//DS18B20写数据函数
ucharDS18B20_read(void);////读取数据程序
ucharhtd(uchara);//进制转换函数
voiddisplay(void);//显示函数
uchartemp;//温度寄存器
bitDS18B20;//18B20存在标志,1---存在0---不存在
uchartab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//字段转换表
voidmain(void)
{
uinta;
while
(1)
{
get_temper();//测量温度
for(a=0;a<200;a++);//显示,兼有延时的作用
display();
}
}
/****************************DS18B20读取温度函数**************************/
/*函数原型:
voidget_temper(void)
/*函数功能:
DS18B20读取温度
/*输入参数:
无
/*输出参数:
无
/*调用模块:
/*建立时间:
2005/11/14
/*作者:
站长
/**********************************************************************/
voidget_temper(void)
{
uchark,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写数据函数**************************/
/*函数原型:
voidDS18B20_write(ucharin_data)
/*函数功能:
DS18B20写数据
/*输入参数:
要发送写入的数据
/*输出参数:
无
/*调用模块:
_cror_()
/*建立时间:
2005/11/14
/*作者:
站长
/**********************************************************************/
voidDS18B20_write(ucharin_data)//写DS18B20的子程序(有具体的时序要求)
{
uchari,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读函数**************************/
/*函数原型:
voidDS18B20_read()
/*函数功能:
DS18B20读数据
/*输入参数:
无
/*输出参数:
读到的一字节内容
/*调用模块:
delay()
/*建立时间:
2005/11/14
/*作者:
站长
/******************************************************************/
ucharDS18B20_read()
{
uchari,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初始化函数**************************/
/*函数原型:
voidDS18B20_init(void)
/*函数功能:
DS18B20初始化
/*输入参数:
无
/*输出参数:
无
/*调用模块:
delay()
/*建立时间:
2005/11/14
/*作者:
站长
/******************************************************************/
voidDS18B20_init(void)
{
uchara;
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
}
}
/**************************数码管显示函数**************************/
/*函数原型:
voiddisplay(void)
/*函数功能:
数码管显示
/*输入参数:
无
/*输出参数:
无
/*调用模块:
delay()
/*建立时间:
2005/11/14
/*作者:
站长
/******************************************************************/
voiddisplay(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;
}
/*********************原显示函数***********************************
voiddisplay(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;
}
*******************************************************/
/**************************十六进制转十进制函数**************************/
/*函数原型:
ucharhtd(uchara)
/*函数功能:
十六进制转十进制
/*输入参数:
要转换的数据
/*输出参数:
转换后的数据
/*调用模块:
无
/*建立时间:
2005/11/14
/*作者:
站长
/******************************************************************/
ucharhtd(uchara)
{
ucharb,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c|b<<4;
returnc;
}
/*******************************延时函数*********************************/
/*函数原型:
delay(unsignedintdelay_time)
/*函数功能:
延时函数
/*输入参数:
delay_time(输入要延时的时间)
/*输出参数:
无
/*调用模块:
无
/*建立时间:
2005/10/21
/*作者:
站长
/**********************************************************************/
voiddelay(unsignedintdelay_time)//延时子程序
{for(;delay_time>0;delay_time--)
{}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DS18B20 数字 温度计 语言程序设计