DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx
《DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
sbitdula=P2^6;
//数码管段选线
sbitwela=P2^7;
//数码管位选线
sbitbeep=P2^3;
uinttemper;
uchara1,a2,a3,a4,a5,n;
uintaaa,num;
uintwarn_l=3000;
//低温-40℃报警,测试温度乘以100
uintwarn_h=10000;
//高温100℃报警,测试温度乘以100
floatttt;
voiddisp(ucharnum0,ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5);
constuchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x40,0x00};
//不带小数点0-9编码
constuchartable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
//带小数点0-9编码
uchardatatemp_data[2]={0x00,0x00};
//读出温度暂放
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
/*******************************************************************
18B20复位初始化函数
1、将数据线拉高到1
2、延时2us(该时间要求不是很严格,但是要尽可能短一点)
3、将数据线拉低到0
4、延时750us(该时间范围可以在480~960us)
5、将数据线拉高到1
6、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,
据该状态可以确定它的存在。
但是应注意,不能无限的等待,不然会使程序进入死循环,所以要进行超时判断。
7、若CPU读到数据线上的低电平0后,还要进行延时,其延时时间从发出高电平算起(第5步的时间算起最少要480us)。
8、将数据线再次拉高到1后结束
**********************************************************************/
voiddsreset()
ucharst=1;
DQ=1;
//拉高数据线
_nop_();
_nop_();
while(st)
{
DQ=0;
//控制器向DS18B20发低电平脉冲
delayus(81);
//延时750us左右
DQ=1;
////控制器拉高总线
delay70us();
//延时70us
if(DQ==1)st=1;
else
st=0;
delayus(54);
//延时500us等待
}
向DS18B20写一个字节函数
1、将数据线置低电平0
2、延时15us
3、按从低位到高位的顺序发送数据(一次只发送一位)
4、延时45us
6、重复1~5步骤,直到发送完整个字节
7、最后将数据线拉高到1
voidtempwritebyte(uchardate)
uchari,temp;
//因为写之前需要置0,所以先置为高电平
for(i=8;
i>
i--)//一位一位的写
{
temp=date&
0x01;
//取数据最低位
delay20us();
//延时20us
if(temp==1)//判断数据为1还是0
DQ=1;
//如果为1则发送1,即DQ=1;
如果是0则保持,因为之前DQ已经置为0,所以不用判断。
delay45us();
date=date>
>
1;
}
读1个字节数据函数
2、延时2us
4、延时6us
6、延时4us
7、读数据线的状态得到一个状态位,并进行数据处理。
8、延时30us
9、重复1~7步骤,直到读取完一个字节(一个字节共8位需要循环8次)。
uchartempread()//uchar为带返回值的函数,void不带
uchari,date;
staticbitj;
//定义静态变量位
i--)
//读出的数据最低位在最前面,这样刚好一个字节在date里
//将数据线拉高到1
_nop_();
//延时2us
//将数据线拉低到0
//延时6us
////将数据线拉高到1
//延时4us
j=DQ;
if(j==1)
date=date|0x80;
//10000000
delay30us();
return(date);
voidget_tem()
dsreset();
//复位
tempwritebyte(0xCC);
//跳过ROM
tempwritebyte(0x44);
//温度转换
//每次操作ROM之前要先复位,然后执行跳过或其他指令
tempwritebyte(0xBE);
//读暂存器
temp_data[0]=tempread();
//第0位,温度值低8位;
RAM共9个字节,从0开始自动读
temp_data[1]=tempread();
//第1位,温度值高8位
aaa=temp_data[1];
aaa<
<
=8;
aaa=aaa|temp_data[0];
//两字节合成一个整型变量。
work_aaa()
n=0;
if(aaa>
63488)//温度值正负判断63448=1111100000000000
{
aaa=65536-aaa;
n=1;
//负温度求补码,标志位置1
}
ttt=aaa*6.25;
//0.0625*100=6.25
temper=(int)ttt;
a1=temper/10000;
//对1000求模,取万位
a2=temper%10000/1000;
//对10000求余对1000求模,取千位
a3=temper%1000/100;
//对1000求余再对100求模,取百位
a4=temper%100/10;
//取小数十位
a5=temper%10;
//取个位
for(num=100;
num>
num--)
if(n==1)//负温度
if(ttt>
warn_l)//超温报警
{
beep=0;
delay(100);
beep=1;
}
if(a2!
=0)disp(11,10,a2,a3,a4,a5);
elsedisp(11,11,10,a3,a4,a5);
else//正温度
warn_h)//超温报警
}
if(a1==0&
&
a2==0)disp(11,11,11,a3,a4,a5);
a2!
=0)disp(11,11,a2,a3,a4,a5);
if(a1!
=0)disp(11,a1,a2,a3,a4,a5);
voiddisp(ucharnum0,ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5)
{
wela=1;
P0=0xFE;
wela=0;
dula=1;
P0=table[num0];
//显示第一个数码管显示'
-'
号
dula=0;
delay
(2);
P0=0xFD;
P0=table[num1];
//显示第二个数码管
P0=0xFB;
P0=table[num2];
//显示第三个数码管
P0=0xF7;
P0=table1[num3];
//显示第四个数码管
P0=0xEF;
P0=table[num4];
//显示第五个数码管
P0=0xDF;
P0=table[num5];
//显示第六个数码管
dula=0