#includereg52.h#includestdio.h#defineucharunsignedchar#defineuintunsignedintsbitds=P2^2;//温度传感器信号线sbitdula=P2^6;//数码管段选线sbitwela=P2^7;//数码管位选线sbitbeep=P2^3;//蜂鸣器uinttemp;floatf_temp;uintwarn_l1=260;uintwarn_l2=250;uintwarn_h1=300;uintwarn_h2=320;sbitled0=P1^0;sbitled1=P1^1;sbitled2=P1^2;sbitled3=P1^3;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//不带小数点的编码voiddelay(uintz)//延时函数{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voiddsreset(void)//18B20复位,初始化函数{uinti;ds=0;i=103;while(i0)i--;ds=1;i=4;while(i0)i--;}bittempreadbit(void)//读1位函数{uinti;bitdat;ds=0;i++;//i++起延时作用ds=1;i++;i++;dat=ds;i=8;while(i0)i--;return(dat);}uchartempread(void)//读1个字节{uchari,j,dat;dat=0;for(i=1;i=8;i++){j=tempreadbit();dat=(j7)|(dat1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}voidtempwritebyte(uchardat)//向18B20写一个字节数据{uinti;ucharj;bittestb;for(j=1;j=8;j++){testb=dat&0x01;dat=dat1;if(testb)//写1{ds=0;i++;i++;ds=1;i=8;while(i0)i--;}else{ds=0;//写0i=8;while(i0)i--;ds=1;i++;i++;}}}voidtempchange(void)//DS18B20开始获取温度并转换{dsreset();delay(1);tempwritebyte(0xcc);//写跳过读ROM指令tempwritebyte(0x44);//写温度转换指令}uintget_temp()//读取寄存器中存储的温度数据{uchara,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();//读低8位b=tempread();//读高8位temp=b;temp=8;//两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;returntemp;//temp是整型}////////////////////显示程序//////////////////////////voiddisplay(ucharnum,uchardat){uchari;dula=0;P0=table[dat];dula=1;dula=0;wela=0;i=0XFF;i=i&(~((0X01)(num)));P0=i;wela=1;wela=0;delay(1);}voiddis_temp(uintt){uchari;i=t/100;display(0,i);i=t%100/10;display(1,i+10);i=t%100%10;display(2,i);}//////////////////////////////////////////////voidwarn(uints,ucharled)//蜂鸣器报警声音,s控制音调{uchari;i=s;dula=0;wela=0;beep=0;P1=~(led);while(i--){dis_temp(get_temp());}beep=1;P1=0XFF;i=s;while(i--){dis_temp(get_temp());}}voiddeal(uintt){uchari;if((twarn_l2)&&(t=warn_l1))//大于25度小于27度{warn(40,0x01);}elseif(t=warn_l2)//小于25度{warn(10,0x03);}elseif((twarn_h2)&&(t=warn_h1))//小于32度大于30度{warn(40,0x04);}elseif(t=warn_h2)//大于32度{warn(10,0x0c);}else{i=40;while(i--){dis_temp(get_temp());}}}voidinit_com(void){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFd;TL1=0xFd;TR1=1;}voidcomm(char*parr){do{SBUF=*parr++;//发送数据while(!TI);//等待发送完成标志为1TI=0;//标志清零}while(*parr);//保持循环直到字符为'\0'}voidmain(){ucharbuff[4],i;dula=0;wela=0;init_com();while(1){tempchange();for(i=10;i0;i--){dis_temp(get_temp());}deal(temp);sprintf(buff,%f,f_temp);for(i=10;i0;i--){dis_temp(get_temp());}comm(buff);for(i=10;i0;i--){dis_temp(get_temp());}}}