转基于DS18B20数字温度计C语言程序设计.docx

上传人:b****7 文档编号:9029195 上传时间:2023-02-02 格式:DOCX 页数:11 大小:19.86KB
下载 相关 举报
转基于DS18B20数字温度计C语言程序设计.docx_第1页
第1页 / 共11页
转基于DS18B20数字温度计C语言程序设计.docx_第2页
第2页 / 共11页
转基于DS18B20数字温度计C语言程序设计.docx_第3页
第3页 / 共11页
转基于DS18B20数字温度计C语言程序设计.docx_第4页
第4页 / 共11页
转基于DS18B20数字温度计C语言程序设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

转基于DS18B20数字温度计C语言程序设计.docx

《转基于DS18B20数字温度计C语言程序设计.docx》由会员分享,可在线阅读,更多相关《转基于DS18B20数字温度计C语言程序设计.docx(11页珍藏版)》请在冰豆网上搜索。

转基于DS18B20数字温度计C语言程序设计.docx

转基于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--) 

   {} 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1