- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
18b20多点温度检测c语言实例
//***************************
//冯新刚 2011-3-24
// 读取18b2064位序列号+led 显示,
//11.0592HMZ,8位LED循环显示
//***************************
#include reg52.h
#include INTRINS.H
sbit DQ=P1^2; //定义通信端口
#define sel P2 //led
#define cod P0 //led
unsigned char x,ttt; //显示用变量
unsigned int x1;
unsigned char shu[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //温度转换后存储变量
unsigned char code Select[]={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0x0bf,0x7f};
unsigned char code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf,0xff}; //-,灭
unsigned char code SN[2][8]={{40,106,47,152,02,00,00,55},{40,44,45,152,02,00,00,115}};
//18b20序列号,这里为两路温度检测,要先读出序列号填在这里才能读取温度
void delay1(int z)
{
int x,y;
for(x=z;x0;x--)
{for(y=10;y0;y--);
}}
void delay(unsigned int i)
{
while(--i);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(70); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
DQ=1;
return (x);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i0;i--)
{
DQ = 0; // 给脉冲信号
dat=1;
DQ = 1; // 给脉冲信号
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i0; i--)
{
DQ = 0;
DQ = dat0x01;
delay(5);
DQ = 1;
dat=1;
}
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0,t1;
float tt=0;
unsigned char i;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay1(10);
Init_DS18B20(); //调用复位函数
WriteOneChar(0x55); //发送ROM匹配命令
if(x11000)
{
ET0=0;
for(i=0;i8;i++)
{
WriteOneChar(SN[0][i]); //发送64位序列号
}
ET0=1;
} else if(1000=x12000)
{ET0=0;
for(i=0;i8;i++)
{
WriteOneChar(SN[1][i]); //发送64位序列号
}
ET0=1;
}
if(x1=2000) x1=0;
WriteOneChar(0xBE);
ET0=0;
a=ReadOneChar();
b=ReadOneChar();
文档评论(0)