转基于DS18B20数字温度计C语言程序设计Word文档格式.docx
《转基于DS18B20数字温度计C语言程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《转基于DS18B20数字温度计C语言程序设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![转基于DS18B20数字温度计C语言程序设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/3b3b2932-72fe-4e1d-9741-5712fc2b9c71/3b3b2932-72fe-4e1d-9741-5712fc2b9c711.gif)
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();
if(DS18B20)//判断DS1820是否存在?
若DS18B20不存在则返回
DS18B20_write(0xcc);
//跳过ROM匹配
DS18B20_write(0x44);
//发出温度转换命令
//跳过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_()
voidDS18B20_write(ucharin_data)//写DS18B20的子程序(有具体的时序要求)
uchari,out_data,k;
out_data=in_data;
for(i=1;
i<
9;
i++)//串行发送数据
DQ=0;
DQ=1;
_nop_();
k=out_data&
0x01;
if(k==0x01)//判断数据写1
else//写0
delay(4);
//延时62us
out_data=_cror_(out_data,1);
//循环右移1位
/**************************DS18B20读函数**************************/
voidDS18B20_read()
DS18B20读数据
读到的一字节内容
delay()
/******************************************************************/
ucharDS18B20_read()
uchari,in_data,k;
in_data=0;
k=DQ;
//读DQ端
if(k==1)//读到的数据是1
in_data=in_data|0x01;
in_data=in_data|0x00;
delay(3);
//延时51us
in_data=_cror_(in_data,1);
//循环左移1位
return(in_data);
/**************************DS18B20初始化函数**************************/
voidDS18B20_init(void)
DS18B20初始化
voidDS18B20_init(void)
uchara;
//主机发出复位低脉冲
delay(44);
//延时540US
0x36&
&
DQ==1;
a++)
{//等待DS18B20回应
a++;
a--;
if(DQ)
DS18B20=0;
//18B20不存在
DS18B20=1;
//18B20存在
delay(120);
//复位成功!
延时240US
/**************************数码管显示函数**************************/
voiddisplay(void)
数码管显示
voiddisplay(void)
{
PS1=1;
P0=0x01;
PS1=0;
PS2=1;
P0=tab[htd(temp)>
>
4];
//转换成十进制输出
PS2=0;
delay(200);
PS1=1;
P0=0x02;
P0=tab[htd(temp)&
0x0f];
P_L=~DS18B20;
/*********************原显示函数***********************************
voiddisplay(void)
{
P0=tab[htd(temp)>
delay(200);
P0=tab[htd(temp)&
P_L=~DS18B20;
}
*******************************************************/
/**************************十六进制转十进制函数**************************/
ucharhtd(uchara)
十六进制转十进制
要转换的数据
转换后的数据
ucharhtd(uchara)
ucharb,c;
b=a%10;
c=b;
a=a/10;
c=c|b<
<
4;
returnc;
/*******************************延时函数*********************************/
delay(unsignedintdelay_time)
延时函数
delay_time(输入要延时的时间)
2005/10/21
voiddelay(unsignedintdelay_time)//延时子程序
{for(;
delay_time>
0;
delay_time--)
{}