/********************************************************************************************功能1:采用89c52控制18b20对温度的多点采集并将其显示在lcd1602上面当温度超过32度是蜂鸣器报警温度低于32度时蜂鸣器关闭*功能2:采用89c52读取18b20的rom值并将其显示在lcd1602上面*按键p3.4为转换显示是4个温度还是读取的DS18B20的序列号显示*LCD1602的数据位接MCU的p0口,其他的端口连线如下定义*2013.6.28单点测温高于32度报警*2013.6.304点测温高于32度报警*2013.7.14点测温高于32度报警添加了读取DS18B20的ROM号并可以显示在LCD1602上面通过按键切换*****************************************************************************************/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitRS=P1^0;//lcd的rssbitRW=P1^1;//lcd的rwsbitEN=P2^5;//lce的ensbitDQ=P2^2;//ds18b20数据位sbitbeep=P2^3;//蜂鸣器sbitstop=P3^4;//按键ucharcodestr1[]={0x28,0x2F,0x49,0x2E,0x04,0x00,0x00,0x6D};//DS18B201的ROM号ucharcodestr2[]={0x28,0x90,0x0AF,0x2E,0x04,0x00,0x00,0x08};//DS18B202的ROM号ucharcodestr3[]={0x28,0x88,0x1F,0x2E,0x04,0x00,0x00,0x0BD};//DS18B203的ROM号ucharcodestr4[]={0x28,0x0DB,0x2B,0x2E,0x04,0x00,0x00,0x51};//DS18B204的ROM号unsignedcharcodestra[]={18b20xuliehao};unsignedcharcodestrb[]={};ucharfCode[8];//读取rom值存放处ucharcodetable[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//摄氏温度符号uchardatadisdata[5]=00000;uinttvalue;//温度值uchartflag;//温度正负标志uintd=0,j=0,st=1;/*********************************************************************名称:InitTimer0(void)*功能:timer0的初始化TMOD的高四位是T1,低四位是T0(D2=0)。选择工作方式1(M1=0M0=1)*输入:无*输出:无***********************************************************************/voidInitTimer0(void){TMOD=0x01;//定时器0,工作方式1TH0=0x0FC;//1msTL0=0x18;EA=1;//允许总中断ET0=1;//允许中断TR0=1;}/*********************************************************************名称:InitTimer1(void)*功能:timer1的初始化TMOD的高四位是T1(D6=0),低四位是T0。选择工作方式1(M1=0M0=1)*输入:无*输出:无***********************************************************************/voidInitTimer1(void){TMOD=0x11;//定时器1,工作方式1TH1=0x0ff;//10usTL1=0x16;EA=1;}/*********************************************************************名称:wr_com(ucharcom)*功能:LCD1602的写命令*输入:要执行的命令对应的指令编码*输出:无***********************************************************************/voidwr_com(ucharcom){RS=0;RW=0;EN=0;P0=com;EN=1;d=0;while(d1);//延时1msEN=0;}/*********************************************************************名称:wr_dat(uchardat)*功能:LCD1602的写数据*输入:要写入的数据*输出:无***********************************************************************////////lcd//写数据/////////////////////////////////////////voidwr_dat(uchardat){RS=1;RW=0;EN=0;P0=dat;EN=1;d=0;while(d1);//延时1msEN=0;}/*********************************************************************名称:wr_new()*功能:LCD1602的写入温度符号(。)的函数*输入:调用的温度符号的编码用写数据函数把编码写入LCD中并可以显示出来*输出:无***********************************************************************/voidwr_new(){uchari;wr_com(0x40);for(i=0;i8;i++){wr_dat(table[i]);}}/*********************************************************************名称:lcd_init()*功能:0x38设置16*2显示,5*7点阵,8位数据接口0x0c设置开显示,不显示光标0x06写一个字符后地址指针加1//输入方式设置:000001I/DSI/D=1游标右移;S=0画面不整体移位0x01显示清0,数据指针清0*输入:无*输出:无***********************************************************************/voidlcd_init(){wr_com(0x38);//功能设置:0000DLXREXXDL=1为8位MPU控制方式;RE=0为基本指令集;wr_com(0x08);wr_com(0x01);//显示开关设置:00001DCBD=1整体显示打开;C=1游标显示关闭;B=0游标反白关闭wr_com(0x06);//输入方式设置:000001I/DSI/D=1游标右移;S=0画面不整体移位wr_com(0x0c);//清屏:DDRAM填满20H(0)并且DDRAM-AC到00H}/*********************************************************************名称:display(unsignedchar*p)*功能:在LCD上显示读入的字符串*输入:待显示的字符串,但每次输入函数的是一个字符通过循环可以达到输入字符串的效果*输出:无***********************************************************************/voiddisplay(unsignedchar*p){while(*p!='\0'){wr_dat(*p);p++;d=0;while(d1);//延时1ms}}/*********************************************************************名称:init_play()*功能:当按键标志位st=1是显示采集到的4个温度第一行显示两个第二行显示两个具体那么现实如下代码当按键标志位st=0是显示读取到的DS18B20的ROM号,并且第一行显示开始存入数组stra中的字符串*输入:无*输出:无***********************************************************************/voidinit_play(){if(st==1){wr_new();//写新字符。wr_com(0x86);wr_dat(0x00);//摄氏温度字符wr_com(0x87);wr_dat('C');wr_com(0x8e);wr_dat(0x00);//摄氏温度字符wr_com(0x8f);wr_dat('C');wr_com(0xc6);wr_dat(0x00);//摄氏温度字符wr_com(0xc7);wr_dat('C');wr_com(0xce);wr_dat(0x00);//摄氏温度字符wr_com(0xcf);wr_dat('C');}else{lcd_init();wr_com(0x80);display(stra);wr_com(0xc0);display(strb);}}/*********************************************************************名称:ds1820rst()*功能:产生复位脉冲DS18B20的初始化先让DQ高电平在拉低在拉高产生一个上升沿*输入:无*输出:无***********************************************************************/voidds1820rst(){DQ=1;//DQ复位_nop_();_nop_();DQ=0;//DQ拉低d=0;while(d1);//精确延时大于480usDQ=1;//拉高j=0;ET1=1;TR1=1;while(j80);//延时80usET1=0;}/*********************************************************************名称:ds1820rd()*功能:读取DS1820中的数据因为DS18B20要执行一个功能有严格的时序要求所以先DS18B20复位-执行ROM指令在执行DS18B20功能指令(RAM指令)*输入:无*输出:dat在DS18B20中读到的数据***********************************************************************/uchards1820rd(){uchari=0;uchardat=0;for(i=0;i8;i++){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;j=0;ET1=1;TR1=1;while(j2);//延时20usET1=0;}return(dat);}/*********************************************************************名称:ds1820wr(ucha