基于单片机的温度监测与控制系统程序.docx
- 文档编号:28460240
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:16
- 大小:17.76KB
基于单片机的温度监测与控制系统程序.docx
《基于单片机的温度监测与控制系统程序.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度监测与控制系统程序.docx(16页珍藏版)》请在冰豆网上搜索。
基于单片机的温度监测与控制系统程序
//------------------------------------------------------------------------
//名称:
用1602LCD和DS18B20设计的温敏报警器(含读ROMCODE,温度上下限显示)
//------------------------------------------------------------------------
//说明:
本例将报警温度为高:
70℃,低:
-20℃当DS18B20感知温度达此临界
//值时对应的LED闪烁,且发出警报声。
//本例还可以显示DS18B20的ROMCODE及报警温度上下限。
//------------------------------------------------------------------------
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelayNOP(){_nop_();_nop_();_nop_();nop_()}
sbitHI_LED=P2^3;//高温,低温报警闪烁LED
sbitLO_LED=P2^6;
sbitDQ=P3^3;//DS18B20数据线
sbitBEEP=P3^7;//报警器
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitK1=P1^7;//正常显示温度,越界时报警
sbitK2=P1^4;//显示报警温度
sbitK3=P1^1;//查看ROMCODE
ucharcodeRomCodeStr[]={"--ROMCODE--"};
ucharRomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//64位ROMCODE
ucharcodeTemp_Disp_Title[]={"CurrentTemp:
"};
ucharCurrent_Temp_Display_Buffer[]={"TEMP:
"};
ucharcodeTemperature_Char[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
//温度字符
ucharcodeAlarm_Temp[]={"ALARMTempHILO"};
ucharAlarm_HI_LO_STR[]={"HI:
LO:
"};
uchartemp_date[2]={0x00,0x00};
uchartemp_alarm[2]={0x00,0x00};
uchardisplay[5]={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};
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;i<200;i++);
}
bitLCD_Busy_check()
{
bitresult;
RS=0;RW=1;E=1;DelayXus(4);result=(bit)(P0&0x80);E=0;
returnresult;
}
//-------------------------------------------------------
//向LCD发送命令
//-------------------------------------------------------
voidWrite_LCD_Command(ucharc)
{
while(LCD_Busy_check());//判断LCD是否忙碌
RS=0;RW=0;E=0;_nop_();_nop_();P0=c;DelayXus(4);
E=1;DelayXus(4);E=0;
}
//-------------------------------------------------------
//设置LCD显示位置
//-------------------------------------------------------
voidSet_LCD_POS(ucharpos)
{
Write_LCD_Command(pos|0x80);
}
//-------------------------------------------------------
//向LCD发送数据
//-------------------------------------------------------
voidWrite_LCD_Data(uchardat)
{
while(LCD_Busy_check());
RS=1;RW=0;E=0;
P0=dat;DelayXus(4);
E=1;DelayXus(4);E=0;
}
//-------------------------------------------------------
//初始化LCD
//-------------------------------------------------------
voidLCD_Initialise()
{
Write_LCD_Command(0x38);//开显示
Write_LCD_Command(0x0f);//清屏
Write_LCD_Command(0x01);//画面不动光标右移
Write_LCD_Command(0x06);
}
//-------------------------------------------------------------------------------
//
//通用显示函数
//
//-------------------------------------------------------------------------------
voidWrite_NEW_LCD_Char()
{
uchari;
Write_LCD_Command(0x40);
for(i=0;i<8;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;i<8;i++)
{
DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;Delay(30);DQ=1;
}
returndat;
}
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;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();
Temp_Value[1]=ReadOneByte();
Alarm_Temp_HL[0]=ReadOneByte();
Alarm_Temp_HL[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
//-------------------------------------------------------------
//设置DS18B20温度报警值
//-------------------------------------------------------------
voidSet_Alarm_Temp_Value()
{
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x4E);
WriteOneByte(Alarm_Temp_HL[0]);
WriteOneByte(Alarm_Temp_HL[1]);
WriteOneByte(0x7F);
WriteOneByte(0x48);
}
//-------------------------------------------------------------
//在LCD上显示温度
//-------------------------------------------------------------
voidDisplay_Temperature()
{
uchari;
uchart=150;
ucharng=0;
charSigned_Current_Temp;
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]&0x0F)>>4)|(Temp_Value[1]&0x07)<<4;
Signed_Current_Temp=ng?
-CurrentT:
CurrentT;
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]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
//高位为0时不显示
if(Display_Digit[3]==0)Current_Temp_Display_Buffer[7]='';
//
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]='';
if(ng)
{
if(Current_Temp_Display_Buffer[8]=='')
Current_Temp_Display_Buffer[8]='-';
else
if(Current_Temp_Display_Buffer[7]=='')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行显示标题
Set_LCD_POS(0x00);
for(i=0;i<16;i++)Write_LCD_Data(Temp_Disp_Title[i]);
//在第二行显示标题
Set_LCD_POS(0x40);
for(i=0;i<16;i++)Write_LCD_Data(Current_Temp_Display_Buffer[i]);
//显示温度符号
Set_LCD_POS(0x4D);Write_LCD_Data(0x00);
Set_LCD_POS(0x4E);Write_LCD_Data('C');
}
//---------------------------------------------------------------------------
//定时器中断,控制警报声音
//---------------------------------------------------------------------------
voidT0_INT()interrupt1
{
TH0=-1000/256;
TL0=-1000%256;
BEEP=!
BEEP;
if(++Time0_Count==400)
{
Time0_Count=0;
if(HI_Alarm)HI_LED=~HI_LED;elseHI_LED=0;
if(LO_Alarm)LO_LED=~LO_LED;elseLO_LED=0;
TR0=0;
}
}
//---------------------------------------------------------------------------
//ROMCODE转换和显示
//---------------------------------------------------------------------------
voidDisplay_Rom_Code()
{
uchari,t;
Set_LCD_POS(0x40);
for(i=0;i<8;i++)
{
t=((RomCode[i]&0xF0)>>4);
if(t>9)t+=0x37;elset+='0';
Write_LCD_Data(t);//高位显示
t=RomCode[i]&0x0F;
if(t>9)t+=0x37;elset+='0';
Write_LCD_Data(t);
}
}//低位显示
//---------------------------------------------------------------------------
//读64位序列码
//---------------------------------------------------------------------------
voidRead_Rom_Code()
{
uchari;
Init_DS18B20();
WriteOneByte(0x33);
for(i=0;i<8;i++)RomCode[i]=ReadOneByte();
}
//---------------------------------------------------------------------------
//显示ROMCODE
//---------------------------------------------------------------------------
voidDisplay_RomCode()
{
uchari;
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
Write_LCD_Data(RomCodeStr[i]);
Read_Rom_Code();
Display_Rom_Code();
}//显示64位ROMCODE
//------------------------------------------------------------------------------
//显示报警温度
//------------------------------------------------------------------------------
voidDisp_Alarm_Temperature()
{
uchari,ng;
//------------------------------------------------------------------------------
//显示Alarm_Temp_HL数组中的报警温度
//由于Alarm_Temp_HL类型为char故可以直接进行正负比较
//高温报警----------------------------------------------------------------------
ng=0;
if(Alarm_Temp_HL[0]<0)//如果为负数则取反加1
{
Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;
ng=1;
}
//分解高温各数位到待显示串中
Alarm_Temp_HL[0]=Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';
Alarm_Temp_HL[0]=Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';
Alarm_Temp_HL[0]=Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';
//屏蔽高位不显示的0
if(Alarm_HI_LO_STR[4]=='0')Alarm_HI_LO_STR[4]='';
if(Alarm_HI_LO_STR[4]==''&&Alarm_HI_LO_STR[5]=='0')
Alarm_HI_LO_STR[5]='';
//“-”符号显示
if(ng)
{
if(Alarm_HI_LO_STR[5]=='')Alarm_HI_LO_STR[5]='-';
else
if(Alarm_HI_LO_STR[4]=='')Alarm_HI_LO_STR[4]='-';
else
Alarm_HI_LO_STR[3]='-';
}
//低温报警值
ng=0;
if(Alarm_Temp_HL[1]<0)//如果为负数则取反加1
{
Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;
ng=1;
}
//分解高温各数位到待显示串中
Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';
Alarm_HI_LO_STR[13]=Alarm_Temp_HL[1]/10%10+'0';
Alarm_HI_LO_STR[14]=Alarm_Temp_HL[1]%10+'0';
//屏蔽高位不显示的0
if(Alarm_HI_LO_STR[12]=='0')Alarm_HI_LO_STR[12]='';
if(Alarm_HI_LO_STR[12]==''&&Alarm_HI_LO_STR[13]=='0');
Alarm_HI_LO_STR[13]='';
if(ng)
{
if(Alarm_HI_LO_STR[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 温度 监测 控制系统 程序