#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(temp /////////////////////////////////////// /////////////////////////////////////// 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; 因篇幅问题不能全部显示,请点此查看更多更全内容