您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于单片机的温度报警系统+proteus仿真
#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitHI_LED=P2^3;//高温,低温白净闪烁LEDsbitLO_LED=P2^6;sbitDQ=P3^3;//DS18B20数据线sbitBEEP=P3^7;//报警sbitRS=P2^0;sbitRW=P2^1;sbitEN=P2^2;sbitK1=P1^7;//正常显示温度,越界时报警sbitK2=P1^4;//显示报警温度sbitK3=P1^1;//查看ROMCODEucharcodeRomCodeStr[]={--ROMCODE--};ucharRomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//64位ROMCODEucharcodeTemp_Disp_Title[]={CurrentTemp:};ucharCurrent_Temp_Display_Buffer[]={TEMPE:};ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//温度示字符ucharcodeAlarm_Temp[]={ALARMTEMPHiLo};ucharAlarm_HI_LO_STR[]={Hi:Lo:};uchartemp_data[2]={0x00,0x00};uchartemp_alarm[2]={0x00,0x00};uchardisplay[5]={0x00,0x00,0x00,0x00,0x00,};//温度值uchardisplay1[3]={0x00,0x00,0x00};//温度报警值ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//温度小数位对照表//.......................................................//报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125)//数组中前一位为高温值,后一位为低温值//此处类型注意设为char,否则不能进行有符号数的比较charAlarm_Temp_HL[2]={70,-20};//............................................................ucharCurrentT=0;//当前读取温度整数部分ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值ucharDisplay_Digit[]={0,0,0,0};//待显示的各温度数位bitHI_Alarm=0,LO_Alarm=0;//高低温报警标志bitDS18B20_IS_OK=1;//传感器正常标志uintTime0_Count=0;//定时器延时累加//...........................//延时//...........................voidDelayXus(intx){uchari;while(x--)for(i=0;i200;i++);}//.......................................//忙检测bitLCD_Busy_Check(){bitLCD_Status;RS=0;//寄存器选择RW=1;//读状态寄存器EN=1;//开始读DelayXus(1);LCD_Status=(bit)(P0&0x80);EN=0;returnLCD_Status;}//写LCD指令voidWrite_LCD_Command(ucharcmd){while((LCD_Busy_Check()&0x80)==0x80);//忙等待RS=0;//写选择命令寄存器RW=0;//写EN=0;P0=cmd;EN=1;DelayXus(1);EN=0;}//向LCD写数据voidWrite_LCD_Data(uchardat){while((LCD_Busy_Check()&0x80)==0x80);//忙等待RS=1;RW=0;EN=0;P0=dat;EN=1;DelayXus(1);EN=0;}//设置液晶显示位置voidSet_LCD_POS(ucharpos){Write_LCD_Command(pos|0x80);}//LCD初始化voidLCD_Initialise(){Write_LCD_Command(0x38);DelayXus(1);Write_LCD_Command(0x01);//清屏DelayXus(1);Write_LCD_Command(0x06);//字符进入模式:屏幕不动,字符后移DelayXus(1);Write_LCD_Command(0x0C);//显示开,关光标DelayXus(1);}//...............................................//..........................................//自定义字符写CGRAM//..................................voidWrite_NEW_LCD_Char(){uchari;Write_LCD_Command(0x40);//写CGRAMfor(i=0;i8;i++)Write_LCD_Data(Temperature_Char[i]);//写入温度符号}//............................................//延时//........................................................voidDelay(uintnum){while(--num);}//...............................................//初始化DS18B20//...............................................ucharInit_DS18B20(){ucharstatus;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;returnstatus;//初始化成功时返回0}//...............................................//读一节//...............................................ucharReadOneByte(){uchari,dat=0;DQ=1;_nop_();for(i=0;i8;i++){DQ=0;dat=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;Delay(30);DQ=1;}returndat;}//...............................................//写一字节//...............................................voidWriteOneByte(uchardat){uchari;for(i=0;i8;i++){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat=1;}}//...............................................//读取温度值//...............................................voidRead_Temperature(){if(Init_DS18B20()==1)//DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC);//跳过序列号WriteOneByte(0x44);//启动温度转换Init_DS18B20();WriteOneByte(0xCC);//跳过序列号WriteOneByte(0xBE);//读取温度寄存器Temp_Value[0]=ReadOneByte();//温度低8位Temp_Value[1]=ReadOneByte();//温度高8位Alarm_Temp_HL[0]=ReadOneByte();//报警温度THAlarm_Temp_HL[1]=ReadOneByte();//报警温度TLDS18B20_IS_OK=1;}}//...............................................//设置DS18B20温度报警值//...............................................voidSet_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xCC);//跳过序列号WriteOneByte(0x4E);//将设定的温度报警值写入DS18B20WriteOneByte(Alarm_Temp_HL[0]);//写THWriteOneByte(Alarm_Temp_HL[1]);//写TLWriteOneByte(0x7F);//12位精度Init_DS18B20();WriteOneByte(0xCC);//跳过序列号WriteOneByte(0x48);//温度报警值存入DS18B20}//......................................................//在LCD上显示当前温度//.....................................................voidDisplay_Temperature(){uchari;uchart=150;//延时值ucharng=0;//负数标识charSigned_Current_Temp;//如果为负数则取反加1,并设置负数标识if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng=1;//设负数标识}//查表得到温度小数部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//获取温度整数部分(无符号)CurrentT=((Temp_Value[0]&0xF0)4)|((Temp_Value[1]&0x07)4);//有符号的当前温度值,注意此处定义为char,其值可为-128~+127Signed_Current_Temp=ng?-CurrentT:CurrentT;//高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区分正负比较)HI_Alarm=Signed_Current_Temp=Alarm_Temp_HL[0]?1:0;LO_Alarm=Signed_Current_Temp=Alarm_Temp_HL[1]?1:0;//将整数部分分解为三位待显示数字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;//刷新LCD显示缓冲Current_Temp_Display_Buffer[11]=D
本文标题:基于单片机的温度报警系统+proteus仿真
链接地址:https://www.777doc.com/doc-4611941 .html