最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于单片机的温度报警系统+proteus仿真

来源:动视网 责编:小OO 时间:2025-09-24 23:24:15
文档

基于单片机的温度报警系统+proteus仿真

#include#include#defineucharunsignedchar#defineuintunsignedint#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitHI_LED=P2^3;//高温,低温白净闪烁LEDsbitLO_LED=P2^6;s数据线s报警sbitRS=P2^0;sbitRW=P2^1;sbitEN=P2^2;s正常显示温度,越界时报警s显示报警温度s查看ROMCODEucharcodeRomCodeS
推荐度:
导读#include#include#defineucharunsignedchar#defineuintunsignedint#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitHI_LED=P2^3;//高温,低温白净闪烁LEDsbitLO_LED=P2^6;s数据线s报警sbitRS=P2^0;sbitRW=P2^1;sbitEN=P2^2;s正常显示温度,越界时报警s显示报警温度s查看ROMCODEucharcodeRomCodeS


#include

#include

#define uchar unsigned char

#define uint unsigned int

#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit HI_LED=P2^3; //高温,低温白净闪烁 LED

sbit LO_LED=P2^6;

s数据线

s报警

sbit RS=P2^0; 

sbit RW=P2^1; 

sbit EN=P2^2; 

s正常显示温度,越界时报警

s显示报警温度

s查看 ROM CODE

uchar code RomCodeStr[]={"-- ROM  CODE --"};

uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //位ROM CODE

uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};  //温度示字符

uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};

uchar Alarm_HI_LO_STR[]={"Hi:    Lo:      "};

uchar temp_data[2]={0x00,0x00};

uchar temp_alarm[2]={0x00,0x00};

u温度值

u温度报警值

u温度小数位对照表

//.......................................................

//报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125)

//数组中前一位为高温值,后一位为低温值

//此处类型注意设为char,否则不能进行有符号数的比较

char Alarm_Temp_HL[2]={70,-20};

//............................................................

uchar CurrentT=0; //当前读取温度整数部分

uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值

uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位

bit HI_Alarm=0,LO_Alarm=0; //高低温报警标志

bit DS18B20_IS_OK=1; //传感器正常标志

u定时器延时累加

//...........................

//延时

//...........................

void DelayXus(int x)

{

}

//.......................................

 

//忙检测

bit LCD_Busy_Check()

{

bit LCD_Status;

RS=0;//寄存器选择

RW=1;//读状态寄存器EN=1;//开始读

DelayXus(1);

LCD_Status=(bit)(P0&0x80) ;

EN=0;

return LCD_Status;

}

//写LCD指令

void Write_LCD_Command(uchar cmd)

{

 忙等待

   RS=0;   //写选择命令寄存器

 写

   P0=cmd; EN=1;   DelayXus(1);   EN=0;

}

//向LCD写数据

void Write_LCD_Data(uchar dat)

{

 忙等待

   RS=1;RW=0;EN=0;P0=dat;EN=1;   DelayXus(1);   EN=0;

}

//设置液晶显示位置

void Set_LCD_POS(uchar pos)

{

}

//LCD初始化

void LCD_Initialise()

{

  Write_LCD_Command(0x38);

DelayXus(1);

 清屏

 字符进入模式:屏幕不动,字符后移

 显示开,关光标

}

//...............................................

//..........................................

//自定义字符写CGRAM

//..................................

void Write_NEW_LCD_Char()

{

     Write_LCD_Command(0x40);     //写CGRAM

 写入温度符号

}

//............................................

//延时

//........................................................

void Delay(uint num)

{

}

//...............................................

//初始化DS18B20

//...............................................

uchar Init_DS18B20()

{

    return status;                                            //初始化成功时返回0

}

//...............................................

//读一节

//...............................................

uchar ReadOneByte()

{

}

//...............................................

//写一字节

//...............................................

void WriteOneByte(uchar dat)

{

  uchar i;

for(i=0;i<8;i++)

  {

  }

}

//...............................................

//读取温度值

//...............................................

void Read_Temperature()

{

    if(Init_DS18B20()==1)                              //DS18B20故障

       WriteOneByte(0xCC);                             //跳过序列号

       WriteOneByte(0x44);                             //启动温度转换

       WriteOneByte(0xCC);                             //跳过序列号

       WriteOneByte(0xBE);                             //读取温度寄存器

       Temp_Value[0]=ReadOneByte();                    //温度低8位

       Temp_Value[1]=ReadOneByte();                    //温度高8位

       Alarm_Temp_HL[0]=ReadOneByte();                 //报警温度TH

       Alarm_Temp_HL[1]=ReadOneByte();                 //报警温度TL

}

//...............................................

//设置DS18B20温度报警值

//...............................................

void Set_Alarm_Temp_Value()

{

   WriteOneByte(0xCC);                                  //跳过序列号

   WriteOneByte(0x4E);                                  //将设定的温度报警值写入DS18B20

   WriteOneByte(Alarm_Temp_HL[0]);                      //写TH

   WriteOneByte(Alarm_Temp_HL[1]);                      //写TL

   WriteOneByte(0x7F);                                  //12位精度

   WriteOneByte(0xCC);                                  //跳过序列号

   WriteOneByte(0x48);                                  //温度报警值存入DS18B20

}

//......................................................

//在LCD上显示当前温度

//.....................................................

void Display_Temperature()

{

    uchar t=150;     //延时值

    uchar ng=0;      //负数标识

//如果为负数则取反加1,并设置负数标识

if((Temp_Value[1]&0xF8)==0xF8)

{

 设负数标识

}

//查表得到温度小数部分

Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];

//获取温度整数部分(无符号)

CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);

//有符号的当前温度值,注意此处定义为char, 其值可为-128~+127

Signed_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]=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]=' ';

//高位为0且次高位为0时,次高位不显示

if(Display_Digit[2]==0&&Display_Digit[3]==0)

Current_Temp_Display_Buffer[8]=' ';

//负数符号显示恰当位置

if (ng)

{

}

//在第一行显示标题

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');

}

//.....................................

//定时器中断,控制报警声音

//.................................

void T0_INT() interrupt 1

{

{

}

}

//...............................................

//ROM CODE转换与显示

//.....................................................

void Display_Rom_Code()

{

{

   Write_LCD_Data(t);             //高位数显示

   Write_LCD_Data(t);             //低位数显示

  }

}

//..................................

//读位序列码

//...............................

void Read_Rom_Code()

{

   WriteOneByte(0x33);                  //读序列码

}

//.........................................

//显示ROM CODE

//...............................

void Display_RomCode()

{

 显示标题

    Write_LCD_Data(RomCodeStr[i]);   

    Read_Rom_Code();                 //读位序列码

    Display_Rom_Code();          //显示位ROM CODE

}

//.......................................

//显示报警温度

//...............................................

void Disp_Alarm_Temperature()

{

  uchar i,ng;

//显示Alarm_Temp_HL数组中的报警温度值

//由于Alarm_Temp_HL类型为char,故可以直接进行正负比较

//高温报警值.........................

  ng=0;

if(Alarm_Temp_HL[0]<0) //如果为负数则取反加1

  {

}

//分解高温各数位到待显示串中

Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';

Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'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)

}

//低温报警值

ng=0;

i如果为负数则取反加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[0]/10%10+'0';

Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%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)

}

//显示高低温报警温度值

S显示标题

for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);

S显示高低温

for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]);

}

//................................

//主函数

//..................................

void main()

{

   uchar Current_Operation=1;    //默认当前操作为显示温度

 正常显示当前温度,越界时报警

 显示报警温度上下限

 显示DS18B20  ROM CODE

}

}

文档

基于单片机的温度报警系统+proteus仿真

#include#include#defineucharunsignedchar#defineuintunsignedint#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitHI_LED=P2^3;//高温,低温白净闪烁LEDsbitLO_LED=P2^6;s数据线s报警sbitRS=P2^0;sbitRW=P2^1;sbitEN=P2^2;s正常显示温度,越界时报警s显示报警温度s查看ROMCODEucharcodeRomCodeS
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top