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

控制/MCU

1799人已加入

描述

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;

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分