您的位置 首页 报告

C51单片机对DS18B20温度计的操控

C51单片机对DS18B20温度计的控制-18B20温度计,正负温度显示。最大99摄氏度。用万能板手工焊接。调试成功,正常显示。共阳数码管由三极管驱动。

18B20温度计,正负温度显现。最大99摄氏度。用全能板手艺焊接。调试成功,正常显现。共阳数码管由三极管驱动。

下面是C51程序,您一看就懂了:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[20]={

0x14,0xf5,0x19,0x51,

//0123

0xf0,0x52,0x12,0x75,

//4567

0x10,0x50,0x30,0x92,

//89ab

0x1e,0x91,0x1a,0x3a,0x38,0xfb,0xef,0xff};//P0口数码管摆放:AEDDPCGBF

//cdeFP-。平息

ucharaa;

ucharwei_1,wei_2,wei_3,v,wei_4;

ucharshuju;//得到的十进制温度值

uchartemp[2]={0,0};//寄存DS18B20的温度寄存器值

uintvalue=0;//读字节变量

sbitL1=P1^2;//负温度显现指示

sbitL2=P1^3;

sbitL3=P1^4;

sbitL4=P1^5;

sbitDQ=P2^1;//数据线

sbitFM=P2^2;//超温操控引脚

voidReadSerialNumber(void);

voidow_reset(void);

voidtmstart(void);

voidReadSerialNumber(void);

voidRead_Temperature(void);

voidwrite_byte(char);

uintread_byte(void);

voiddelay_18B20(uint);

voidbaojing();

voidzhuanhuan();

voiddisplay();

voiddelay_led(uintz);

/*******主函数**********/

voidmain()

{

intt;

L1=L2=L3=L4=0;

for(t=0;t《19;t++)

{

P0=table[t];

delay_led(100);

}

P0=0xff;

L1=1;

L2=1;

L3=1;

L4=1;

tmstart();//18B20初始化

delay_18B20(50);

while(1)

{

Read_Temperature();//读温度

delay_18B20(50);

tmstart();//初始化

delay_18B20(50);//*等候转化完毕

zhuanhuan();//显现数值转化

display();//数值LED显现

baojing();//报警扫描

}

}

/******转化************/

voidzhuanhuan()

{

aa=shuju;

wei_4=aa%10;//个位

wei_3=aa/10;//十位

wei_2=aa/100;//百位

}

/******延时函数*********/

voiddelay_led(uintz)

{

uintx,y;

for(x=z;x》0;x–)

for(y=110;y》0;y–);

}

/********显现函数*********/

voiddisplay()

{L1=0;

P0=table[wei_1];

delay_led(2);

L1=1;

L2=0;

P0=table[wei_2];//百位显现

delay_led(2);

L2=1;

L3=0;

P0=table[wei_3];//十位显现

delay_led(2);

L3=1;

L4=0;

P0=table[wei_4];//个位显现

delay_led(2);

L4=1;

}

//========18b20延时程序=================*/

voiddelay_18B20(uintseconds)//12us延时

{

for(;seconds》0;seconds–);

}

/******************************************

18b20程序

******************************************/

//===============复位===========

voidow_reset(void)

{

ucharx;

DQ=0;//pullDQlinelow

delay_18B20(44);//至少480微秒,

DQ=1;

delay_18B20(3);//waitforpresence18b2036us

x=DQ;//X=0,则初始化成功,X=1,则失利。

delay_18B20(12);

}

//=========从总线上读取一个字节========

uintread_byte(void)

{

uchari;

for(i=8;i》0;i–)

{

value》》=1;

DQ=0;

_nop_();_nop_();_nop_();_nop_();

DQ=1;

if(DQ)

{

value|=0x80;//取出高位数据

}

delay_18B20(4);

}

return(value);//回来value值

}

//===========向18B20写一个字节=================

voidwrite_byte(charval)

{

uchari,j;

for(i=8;i》0;i–)//writesbyte,onebitataTIme

{

DQ=0;//pullDQlowtostartTImeslot

j++;/*延时4us*/

DQ=val&0x01;//从低位开端写

delay_18B20(8);

DQ=1;

j++;

val》》=1;//写完一位,移除它

}

}

//============读取温度============

voidRead_Temperature(void)

{

uchark,i,t;

floattemple;/*寄存读取的温度值将其除以16即为得到的值*/

ow_reset();//复位

k++;//延时4us

write_byte(0xCC);//直访ROM

k++;//延时4us

write_byte(0xBE);//写入读指令

k++;k++;//延时8us

temp[0]=read_byte();//读取低字节

temp[1]=read_byte();//读取高字节

i=temp[1];

t=temp[0];

t=t&0xf0;

t=t》》4;

i《《=4;

i+=t;

if((temp[1]&0x80))//符号位判别

{

temple=(~i+1);//假如为负温则去除其补码,先将补码转化成原码

wei_1=17;/*表明温度为负数*/

}

else

{

temple=i;

wei_1=19;//*表明温度为正数

}

shuju=temple*10/16;

}

//=======初始化============

voidtmstart(void)

{

ow_reset();//复位

delay_18B20(1);//延时

write_byte(0xCC);//越过序列号指令,对一切器材有用

write_byte(0x44);//发转化指令44H,

}

//========报警===========//

voidbaojing()

{

if(aa》=60)

FM=0;

elseFM=1;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/347008.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部