DS18B20温度控制程序.docx

上传人:b****3 文档编号:3663715 上传时间:2022-11-24 格式:DOCX 页数:13 大小:16.39KB
下载 相关 举报
DS18B20温度控制程序.docx_第1页
第1页 / 共13页
DS18B20温度控制程序.docx_第2页
第2页 / 共13页
DS18B20温度控制程序.docx_第3页
第3页 / 共13页
DS18B20温度控制程序.docx_第4页
第4页 / 共13页
DS18B20温度控制程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

DS18B20温度控制程序.docx

《DS18B20温度控制程序.docx》由会员分享,可在线阅读,更多相关《DS18B20温度控制程序.docx(13页珍藏版)》请在冰豆网上搜索。

DS18B20温度控制程序.docx

DS18B20温度控制程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

voidstart();

voidstop();

voidack();

voidiicw_byte(uchardat);

uchariicr_byte();

voidwirtebyte(ucharadd,uchardat);

ucharreadbyte(ucharadd);

voidinit_ii();

sbitDQ=P3^7;

sbithot=P2^6;

sbitkey0=P2^0;

sbitkey1=P2^1;

sbitsda=P2^4;

sbitscl=P2^5;

ucharaa;

uchara,zhen,xiao;

uintsdtemp,temp;//些两个变量类型必须要与它对应的函数要是一样的才行

bitflag=0;

/*ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};*/

//ucharcodesmg_wu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharcodesmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay_us()

{

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

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

}

voiddelay(uchart)

{

while(t--);

}

voiddelayms(uinta)

{

uinti,j;

for(i=a;i>0;i--)

for(j=110;j>0;j--);

}

voidinit_ds18b20()

{

/*ucharn;//这种写法不行

DQ=1;

delay(8);

DQ=0;

delay(80);

DQ=1;

delay(8);

n=DQ;

delay(4);*/

DQ=1;

delay(8);

DQ=0;

delay(80);

DQ=1;

delay(35);

}

voidwrite_byte(uchardat)

{

uchari;

for(i=0;i<8;i++)

{

DQ=0;

DQ=dat&0x01;

delay(4);

DQ=1;

dat>>=1;

}

delay(3);

}

ucharread_byte()

{

uchari,value;

for(i=0;i<8;i++)

{

DQ=0;

value>>=1;

DQ=1;

if(DQ)

value|=0x80;

delay(4);

}

returnvalue;

}

uintreadtemp()

{

uchara,b;

uintT;

init_ds18b20();

write_byte(0xcc);//跳过ROM

write_byte(0x44);//启动温度测量

delay(250);

init_ds18b20();

write_byte(0xcc);

write_byte(0xbe);

a=read_byte();//保存低位

b=read_byte();//保存高位

//b<<=4;//不要小数部分

//b+=(a&0xf0)>>4;

T=b;

T<<=8;

T|=a;

T*=0.625;

returnT;

}

voiddisplay()

{

P1=0xbf;

P0=smg_du[temp/100];

delayms(3);

P0=0x00;

P1=0xdf;

P0=smg_du[temp%100/10]|0x80;//或个0x80的目的是把小数点显示出来

delayms(3);

P0=0x00;

P1=0xef;

P0=smg_du[temp%100%10];

delayms(3);

P0=0x00;

}

voidSZdisplay()

{

P1=0xbf;

P0=smg_du[sdtemp/100];

delayms

(1);

P0=0x00;

P1=0xdf;

P0=smg_du[sdtemp%100/10]|0x80;//同上

delayms

(1);

P0=0x00;

P1=0xef;

P0=smg_du[sdtemp%100%10];

delayms

(1);

P0=0x00;

}

voidWDSheZhi()

{

ucharp;

if(!

key0)

{

delayms(5);

if(!

key0)

{

a=0;//有键按下a就清0,以防止有键按下时就开始记数

flag=1;

sdtemp++;

/*zhen=sdtemp/10;

xiao=sdtemp%10;

wirtebyte(0,zhen);

delayms

(2);//最少要2ms

wirtebyte(1,xiao);

if(sdtemp==610)sdtemp=400;*/

while(!

key0)

{

SZdisplay();//按键时也让数码管显示出来//必须要写在此处

delayms(6);//这个延时必须要,不然数码管会有点儿闪

p++;

if(p>100)

{

sdtemp+=5;

SZdisplay();

p=70;

}

zhen=sdtemp/10;

xiao=sdtemp%10;

wirtebyte(0,zhen);

delayms

(2);//最少2ms

wirtebyte(1,xiao);

if(sdtemp==610)sdtemp=400;

}

P=0;

}

delay(5);

while(!

key0);//按键时也让数码管显示出来//必须要写在此处

TR0=1;//启动定时器计数

}

elseif(!

key1)

{

delayms(5);

if(!

key1)

{

a=0;//同上

flag=1;

sdtemp--;

/*zhen=sdtemp/10;

xiao=sdtemp%10;

wirtebyte(0,zhen);

delayms

(2);//最少2ms

wirtebyte(1,xiao);

if(sdtemp==0)sdtemp=400;*/

while(!

key1)

{

SZdisplay();//按键时也让数码管显示出来//必须要写在此处

delayms(6);

p++;

if(p>100)

{

sdtemp-=5;

SZdisplay();

p=70;

}

zhen=sdtemp/10;

xiao=sdtemp%10;

wirtebyte(0,zhen);

delayms

(2);//最少2ms

wirtebyte(1,xiao);

if(sdtemp==0)sdtemp=400;

}

p=0;

}

delay(5);

while(!

key1);

TR0=1;//当按键一松手时启动定时器计数

}

}

voidinitime0()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;

}

voidmain()

{

initime0();//初始化函数一定要放在while

(1)前面才有效

zhen=readbyte(0);

delayms(3);

xiao=readbyte

(1);

sdtemp=zhen*10+xiao;

while

(1)

{

/*wirtebyte(0,zhen);//可以不要

delayms

(2);

wirtebyte(1,xiao);*/

temp=readtemp();

WDSheZhi();

if(!

flag)

{

display();

}

else

{

SZdisplay();

if(a==200)

{

a=0;

flag=0;

}

}

if(temp

elsehot=0;

}

}

voidtime0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

}

///////////////////////////////////////

///////////////////////////////////////

voidinit_ii(void)

{

sda=1;

scl=1;

}

voidstart()

{

sda=1;

scl=1;

delay_us();

sda=0;

delay_us();

}

voidstop()

{

sda=0;

scl=1;

delay_us();

sda=1;

delay_us();

}

voidack()

{

uchari;

scl=1;

delay_us();

while((sda==1)&&(i<200))i++;

scl=0;

delay_us();

}

voidno_ack()

{

sda=1;

scl=1;

delay_us();

scl=0;

delay_us();

}

voidiicw_byte(uchardat)

{

uchari;

scl=0;

for(i=0;i<8;i++)

{

if(dat&0x80)

sda=1;

else

sda=0;

dat=dat<<1;

delay_us();

scl=1;

delay_us();

scl=0;

delay_us();

}

sda=1;

delay_us();

}

uchariicr_byte()

{

uchari,dat;

scl=0;

delay_us();

sda=1;

delay_us();

for(i=0;i<8;i++)

{

scl=1;

delay_us();

dat=dat<<1;

if(sda)

dat++;

scl=0;

delay_us();

}

returndat;

}

voidwirtebyte(ucharadd,uchardat)

{

init_ii();

start();

iicw_byte(0xa0);

ack();

iicw_byte(add);

ack();

iicw_byte(dat);

ack();

stop();

}

ucharreadbyte(ucharadd)

{

uchara;

init_ii();

start();

iicw_byte(0xa0);

ack();

iicw_byte(add);

ack();

start();

iicw_byte(0xa1);

ack();

a=iicr_byte();

no_ack();

stop();

returna;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1