#include<reg51.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int #define on 0 #define off 1
void delay(uint i){while(i--);}
sbit f=P1^6; sbit k=P1^5; sbit ka=P1^4; sbit cs1=P2^0; sbit cs2=P2^1; sbit wr=P2^2; sbit DQ=P1^2; sbit con=P1^3; sbit LED0=P2^3; sbit LED1=P2^4; sbit LED2=P2^5; sbit LED3=P2^6; sbit LED4=P2^7; sbit sw0=P3^0; sbit sw1=P3^1; sbit sw2=P3^2; sbit sw3=P3^3; sbit row0=P1^0; sbit row1=P1^1; sbit col0=P3^4; sbit col1=P3^5; sbit col2=P3^6; sbit col3=P3^7; //10 o 11 n 12 - 13 灭 14 E 15 r uchar code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xa3, 0xab, 0xbf, 0xff, 0x86, 0x9f}; uchar buf[8]; uchar TCL,TCH,TC,szwd=25,sjwd=0; uint c=0; bit fflag=0,keydown=0,swsz=0,sws=0,sdss=0,sdjr=0;
uchar key() { uchar k=25; row0=0; k=col0==0?1:col1==0?2:col2==0?3:col3==0?4:k; row0=1; row1=0; k=col0==0?5:col1==0?6:col2==0?7:k; row1=1; return k; }
/* 数码管驱动 */ void dis() { uchar i,j=0x7f; for(i=0;i<8;i++) { cs1=0;cs2=1; P0=ledcode[buf[ i]];wr=1;wr=0; cs1=1;cs2=0; P0=j;wr=1;wr=0; delay(100); j=_cror_(j,1); cs1=cs2=0; P0=0xff;wr=1;wr=0; } } //初始化DS18B20,成功返回0,失败返回1 bit STA_1820(void){ bit ack; DQ=1;delay(5); DQ=0;delay(80); //拉低总线480~960μS DQ=1;delay(5); //拉高等待15~60μS ack=DQ;delay(50); //读应答位并延时480μS以上 return ack; }
//读DS18B20一字节,返回读到的数 char Read_1820(void){ unsigned char i,dat=0; for(i=0;i<8;i++){ DQ=0; dat>>=1; //拉低,右移兼延时 DQ=1; if(DQ)dat|=0x80; //拉高,读数据 delay(7); //延时使总时间>60μS } return(dat); }
//向DS18B20写一字节,参数为要写的数 void Write_1820(unsigned char dat){ unsigned char i; for(i=0;i<8;i++) { DQ=0; //拉低开始 DQ=dat&0x01; delay(7);//送数并保持60μS以上 DQ=1; dat>>=1; //拉高,右移准备下一位 } }
void st() { if(STA_1820())return; Write_1820(0xcc); Write_1820(0x44); }
unsigned int rt(void) //读温度 { STA_1820(); Write_1820(0xcc); Write_1820(0xbe); TCL=Read_1820(); TCH=Read_1820(); return(TCH*0X100+TCL)*0.0625; } uchar j,n=3,s,s1=1; void main() { TMOD=0x01; EA=ET0=1; while(1) { if(k==0) { EA=0;st();EA=1; EA=0;sjwd=rt();EA=1; buf[0]=10; buf[1]=11; buf[2]=12; buf[3]=szwd/10; buf[4]=szwd%10; buf[5]=12; buf[6]=(sjwd)/10; buf[7]=(sjwd)%10; //按键处理部分 if(key()!=25&&keydown==0) { delay(200); if(key!=25) { j=key(); //取键值 keydown=1; switch(j) { case 1: //水位设置 swsz=1; break; /* case 2: //水温设置 sws=1; break; case 3: //手动上水 sdss=!sdss; break; case 4: //手动加热 sdjr=!sdjr; break;*/ } } } if(key()==25)keydown=0; //水位处理 if(swsz==0&&key()==25) //检测 { if(sw0&&sw1&&sw2&&sw3){LED0=0;LED1=1;LED2=1;LED3=1;LED4=1;} //0% LED0亮 if(sw0==0){LED0=1;LED1=0;LED2=1;LED3=1;LED4=1;} //20% LED1亮 if(sw0==0&&sw1==0){LED0=1;LED1=1;LED2=0;LED3=1;LED4=1;} //50% LED2亮 if(sw0==0&&sw1==0&&sw2==0){LED0=1;LED1=1;LED2=1;LED3=0;LED4=1;} //80% LED3亮 if(sw0==0&&sw1==0&&sw2==0&&sw3==0){LED0=1;LED1=1;LED2=1;LED3=1;LED4=0;} //100% LED4亮 } if(swsz==1&&key()==1) //水位设置 { while(key()==1); n=(n+1)%4; //支取0~3 switch(n) { case 0: LED0=1;LED1=0;LED2=1;LED3=1;LED4=1; //设置20%水位 break; case 1: LED0=1;LED1=1;LED2=0;LED3=1;LED4=1; //设置50%水位 break; case 2: LED0=1;LED1=1;LED2=1;LED3=0;LED4=1; //设置80%水位 break; case 3: LED0=1;LED1=1;LED2=1;LED3=1;LED4=0; //设置100%水位 break; }
} if(swsz==1&&key()==25) //水位设置按键复位 { s1=1; TR0=1; if(s1==0&&key()==25) { s=2; if(s==0&&key()==25) { swsz=0; TR0=0; } } else TR0=0; } } /* 总关闭 */ else { buf[0]=buf[1]=buf[2]=buf[3]=13; buf[4]=buf[5]=buf[6]=buf[7]=13; f=0; con=1; LED0=LED1=LED2=LED3=LED4=1; ka=1; } dis(); } } void time0() interrupt 1 { TH0=0XFC; TL0=0X17; if(++c==1000) { c=0; if(s>0)s--; } if(++c==999) { if(s1>0)s1--; } }
|