您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页DS18B20温度控制程序

DS18B20温度控制程序

来源:意榕旅游网
#include #include

#define uchar unsigned char #define uint unsigned int

void start(); void stop(); void ack();

void iicw_byte(uchar dat); uchar iicr_byte();

void wirtebyte(uchar add,uchar dat); uchar readbyte(uchar add); void init_ii();

sbit DQ=P3^7; sbit hot=P2^6; sbit key0=P2^0; sbit key1=P2^1; sbit sda=P2^4; sbit scl=P2^5;

uchar aa;

uchar a,zhen,xiao; uint sdtemp,temp; //些两个变量类型必须要与它对应的函数要是一样的才行 bit flag=0;

/*uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};*/ //uchar code smg_wu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

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

void delay_us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }

void delay(uchar t) { while(t--); }

void delayms(uint a) {

uint i,j; for(i=a;i>0;i--) for(j=110;j>0;j--); }

void init_ds18b20() { /*uchar n; //这种写法不行 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); }

void write_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01; delay(4); DQ=1; dat>>=1; } delay(3); }

uchar read_byte() { uchar i,value; for(i=0;i<8;i++) { DQ=0;

value>>=1; DQ=1; if(DQ) value|=0x80; delay(4); } return value; }

uint readtemp() { uchar a,b; uint T; 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; return T; }

void display() { 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; }

void SZdisplay() { 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; }

void WDSheZhi() { uchar p; 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; //启动定时器计数 } else if(!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; //当按键一松手时启动定时器计数 } }

void initime0() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; }

void main() { 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(tempvoid time0()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; a++; }

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

/////////////////////////////////////// void init_ii(void) {

sda=1; scl=1; }

void start() { sda=1; scl=1; delay_us(); sda=0; delay_us(); }

void stop() { sda=0;

scl=1; delay_us(); sda=1; delay_us(); }

void ack() { uchar i; scl=1; delay_us(); while((sda==1)&&(i<200))i++; scl=0; delay_us(); }

void no_ack() { sda=1; scl=1; delay_us(); scl=0; delay_us(); }

void iicw_byte(uchar dat) { uchar i; 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(); }

uchar iicr_byte() {

uchar i,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(); } return dat; }

void wirtebyte(uchar add,uchar dat) { init_ii(); start(); iicw_byte(0xa0); ack(); iicw_byte(add); ack(); iicw_byte(dat); ack(); stop(); }

uchar readbyte(uchar add) { uchar a; init_ii(); start(); iicw_byte(0xa0); ack(); iicw_byte(add); ack(); start(); iicw_byte(0xa1); ack(); a=iicr_byte(); no_ack();

}

stop(); return a;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务