#includereg51.h#includeintrins.h//nop函数#includestdlib.h#includemath.h#defineucharunsignedchar#defineuintunsignedintsbitDS18B20_DQ=P2^7;sbitfeng=P2^0;sbitdeng=P1^0;#defineLCD_dataP0//ch375数据端口ucharcount1,count2,count;sbitLCD_RS=P3^5;sbitLCD_RW=P3^6;//ch375的rw也是此口sbitLCD_EN=P3^4;#includekey_fo.huchards18b20_serial[4][8]={0x28,0x51,0x8c,0x9e,0x03,0x00,0x00,0xfd,//第1个18B20的ID0x28,0x71,0x91,0x9e,0x03,0x00,0x00,0xdb,//第2个18B20的ID0x28,0x43,0xa6,0x9a,0x03,0x00,0x00,0x83,//第3个18B20的ID0x28,0xe3,0x8a,0x9e,0x03,0x00,0x00,0x08//第4个18B20的ID};#include12864.huchartemp_num1;uchartemp_num2;uinttemper=0,yushe1=325,yushe2=325,yushe3=325,yushe4=325,piancha;/****************************************************函数:voidDs18b20_Delay(uinttimer)功能:STC单片机严格的us级延时函数*****************************************************/voidDs18b20_Delay(uinttimer)//us{while(timer--){_nop_();_nop_();_nop_();}}/***************************************************函数:voidrest()功能:DS18B20芯片复位函数说明:复位时,MCU将数据线置为低电平,并且保持480uS-960uS,然后置为高电平,延时一段时间后,然后由MCU接受DS18B20的响应信号。如果接受到了响应信号,则完成了复位操作。****************************************************/ucharReset(void)//初始化18b20{ucharx;DS18B20_DQ=1;//复位脉冲_nop_();_nop_();DS18B20_DQ=0;Ds18b20_Delay(700);DS18B20_DQ=1;Ds18b20_Delay(40);//48usx=DS18B20_DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败while(!DS18B20_DQ);//等到存在脉冲的结束returnx;}/************************************************************函数:ucharread_bit(void)功能:从DS18B20读一个位*************************************************************/ucharread_bit(void)//从DS18B20读一个位值{ucharbdat=0;DS18B20_DQ=1;Ds18b20_Delay(4);//两次间隔大于1usDS18B20_DQ=0;Ds18b20_Delay(4);//读操作开始DS18B20_DQ=1;Ds18b20_Delay(4);bdat=DS18B20_DQ;Ds18b20_Delay(45);//读时间最短为60usreturn(bdat);}/************************************************************函数:voidwrite_bit(ucharbitval)功能:向DS18B20写一个位*************************************************************/voidwrite_bit(ucharbitval)//向DS18B20写一位{DS18B20_DQ=1;Ds18b20_Delay(4);//jiangeDS18B20_DQ=0;Ds18b20_Delay(4);//写操作开始DS18B20_DQ=bitval;Ds18b20_Delay(60);DS18B20_DQ=1;}/************************************************************函数:ucharread_DS18B20()功能:DS18B20读取函数*************************************************************/ucharread_byte(void)//从DS18B20读一个字节{uchari;uchartemp=0;for(i=0;i8;i++){temp|=(read_bit()i);}returntemp;//把读到的8位数据输出}/************************************************************函数:voidds1820wr(ucharwdata)功能:DS18B20写入函数说明:DS18B20写入数据时,1.数据线先置低电平0、延时确定的时间为15us按从低位到高位的顺序发送数据(一次只发送一位)、延时时间为45us;将数据线拉到高电平、重复上1到5步,知道发送完整个字节、最后将数据线拉高*************************************************************/voidwrite_byte(uchardat)//向DS18B20写8位{unsignedchari;for(i=0;i8;i++){write_bit(dat&(1i));}}/*****************************************************函数:voidread_temp()功能:读取温度值*******************************************************/uintgettemperature(ucharnum)//读取温度{uchari;uchartempl=0;uinttemph=0;num=key_scan();while(Reset());write_byte(0x55);//匹配ROM指令write_byte(0xcc);//跳过ROMfor(i=0;i8;i++)write_byte(ds18b20_serial[num][i]);//发出64位ROM码write_byte(0x44);//启动温度转换Ds18b20_Delay(150);while(Reset());write_byte(0x55);for(i=0;i8;i++)write_byte(ds18b20_serial[num][i]);write_byte(0xbe);//读取温度templ=read_byte();temph=read_byte();//先低后高为二进制的数值temph=8;temper=(uint)((temph|templ)*0.0625*10+0.5);return(temper);}/*****************************************************函数:dis_temperature(void)功能:各个DS18B20温度显示、预设值改变和显示、偏差显示函数*******************************************************/dis_temperature1(void)//SW_K6{Init_12864();write_hanzi(0,0,str1);write_hanzi(2,0,str10);while(SW_K5==1&&SW_K4==1&&SW_K3==1&&(key_scan()!=26)&&(key_scan()!=21)){write_shuzi(1,2,gettemperature(0));//while(count12);//200ms钟更新一次显示//count1=0;TR0=0;if(key_scan()==2)yushe1+=10;//write_shuzi2(3,0,yushe1);if(key_scan()==1)yushe1-=10;write_shuzi2(3,0,yushe1);//yushe为PID中的SetPointpiancha=gettemperature(0)-yushe1;write_shuzi2(3,5,abs(piancha));if(yushe1gettemperature(0)){feng=0;deng=0;}else{feng=1;deng=1;}delay_x_ms(20);}}dis_serial1(ucharz){uchari;Init_12864();for(i=0;i8;i++){if(i4)write_serial(i,0,ds18b20_serial[z][i]);elsewrite_serial(i-4,4,ds18b20_serial[z][i]);}}/*****************************************************函数:voidget_ser(void)功能:显示DS18B20的序列号*******************************************************/dis_serial(void)//读取序列号{uchari,temp;Init_12864();while(Reset());write_byte(0x33);//读取光刻ROM中编码命令3for(i=0;i8;i++){temp=read_byte();if(i4)write_serial(i,0,temp);elsewrite_serial(i-4,4,temp);}}/*****************************************************12864程序模块*******************************************************/#ifndefuchar#defineucharunsignedchar#defineuintunsignedint#endifucharcodestr5[]=度;voiddelay_1ms(uintz){uinti,j;for(j=0;jz;j++)for(i=0;i110;i++);}/*****************************************写指令到指令寄存器******************************************/voidwrite_cmd(uintcmd){delay_1ms(1);LCD_RS=0;LCD_RW=0;//LCD_EN=0;LCD_data=cmd;LCD_EN=1;delay_1ms(1);LCD_EN=0;delay_1ms(1);}/*****************************************写数据到指令寄存