⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 DS1820智能温控系统,使用1602液晶显示,51单片机控制,KEIL开发
💻 C
字号:
#include "lcd1602.h"
#include "DS1820.h"
#include"24C02.h"
//#include "isr.h"
//#include "hardware.h"
sbit ENTER=P1^0;
sbit UP=P1^1;
sbit DOWN=P1^2;
sbit MENU=P1^3;
sbit P3_0=P3^0;

 uchar flag=0,flag2=0;
uchar display_code[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar dispbuf[5]; //显示缓冲区   
uchar  temper[2];//存放温度的数组
HTemperature();
LTemperature();
//***********************************************************************
//正常读取温度时的显示函数
display()
{      uchar temp;
       float backbit; 
       readtemp();//读18B20
       backbit = temper[0];//换成浮点数
       backbit = backbit * 625;//乘以0.0625*100
       temp = backbit;//取低2位整数部分
	   dispbuf[4] = temp%10 ;
       temp = temp/10;
       dispbuf[3] = temp%10 ;
       temp = temper[1];//取整数部分
       dispbuf[2] = temp%10;	  //整数个位
       temp = temp/10;
       dispbuf[1]= temp%10;      //整数十位
	   temp = temp/10;
       dispbuf[0]= temp%10;		 //整数百位
	   if(flag2==1)
	   lcd_strwdat( 0,"warnHTemperature  " );
	   else
	    if(flag2==2)
		lcd_strwdat( 0,"warnLTemperature  " );
	   else
	   lcd_strwdat( 0,"Now Temperature  " );
	   lcd_pos(0x42);
	   if(dispbuf[0]!=0)					   //如果上一百度则百数才显示
       	lcd_write(1,display_code[dispbuf[0]]);
		lcd_write(1,display_code[dispbuf[1]]);	//显示十位
		
		lcd_write(1,display_code[dispbuf[2]]);	 //显示个位
		lcd_write(1,0x2E);
		lcd_write(1,display_code[dispbuf[3]]);	 //显示小数个位
		lcd_write(1,display_code[dispbuf[2]]);	 //显示小数十位
}
//**********************************************************************

//***********************************************************************
//设置最高与最低值温度时的显示函数
display1(uchar temp)
{
        lcd_pos(0x42);
		if(temp/100!=0)
		lcd_write(1,display_code[temp/100]); //显示百位
	    lcd_write(1,display_code[temp/10]);	 //显示十位
		lcd_write(1,display_code[temp%10]);	 //显示个位
		lcd_write(1,0x2E);
		lcd_write(1,display_code[0]);		 //在设置温度时小数不可设置此时为0
		lcd_write(1,display_code[0]);
}
//*************************************************************************

//*************************************************************************
//蜂鸣器函数
void beer()
 {	  unsigned char j;
  	  int i=100;
      while(i--)
        {
           P3_0=0;
	       for(j=0;j<70;j++);
	       P3_0=1;
	       for(j=0;j<70;j++);
        }
  }
//************************************************************************

//**************************************************************************
//设置高温报警函数
HTemperature()
{  
   uchar htemp ;
   
   lcd_strwdat( 0," H temp setting " );		 //第一行显示高温设置
   display1(I2CReadByte(1));				 //读取上次设置高温值并显示 
   if(ENTER==0)								 //有键1按下
	  {  
	       while(ENTER==0);					 //等待释放
		   lcd_init();
	   	   htemp=I2CReadByte(1);			 //	把上次设置高温值给某变量方便调整
	       beer();							 //有键按下则蜂鸣器响一下 
           while(1)							 //在设置中循环直至设置完成
	         {
               if(UP==0)	
	             {  
	   	           while(UP==0);
		           beer();
	               htemp++;					 //up按下时高温值加一
		         }
	           if(DOWN==0&&(htemp!=0))		 //高温值不能小于0
	              {
	              while(DOWN==0);
		          beer();
	              htemp--;					 //down按下时高温值减一
	              }
		        if(flag==0)					//此段功能是在设置时闪动flag值用中断改变
				 {
				  lcd_strwdat( 0," H temp setting " );		 //第一行显示高温设置
	              display1(htemp);
				  }
	            else
		           lcd_strwdat( 0x40,"                 " );		
                if(MENU==0)							  //MENU按下则退出设置
		           {  
		             while(MENU==0);
		             I2CSendByte(1,htemp);			 //保存设置值
		             beer();
		             lcd_init();					 //刷新lcd
		             break;
		           }
			  }
        }
}
//*********************************************************************************

//**********************************************************************************
//设置低温报警函数
//原理与高温报警函数相同
LTemperature()
{	 uchar ltemp=0;
     lcd_strwdat( 0," L temp setting" );
     display1(I2CReadByte(2));
     if(ENTER==0)
	   {   while(ENTER==0);
		   lcd_init();
		   ltemp=I2CReadByte(2);
	   	    beer();
           while(1)
            {
              if(UP==0)
	             {  
	   	           while(UP==0);
		           beer();
	               ltemp++;
		          }
	          if(DOWN==0&&(ltemp!=99)&&(ltemp!=0))
	               {
	                 while(DOWN==0);
		             beer();
	                 ltemp--;
	               }
		       if(flag==0)
				{
			     lcd_strwdat( 0," L temp setting" );
		         display1(ltemp);
				}
	           else
		         lcd_strwdat( 0x40,"                 " );
               if(MENU==0)
		        {	 
				  while(MENU==0);
		          I2CSendByte(2,ltemp);
		          beer();
		          lcd_init();
		          break;
		        }
	        }
	    }
}

//******************************************************************************

//****************************************************************************
//按键处理
 key()
 {
   uchar tem=0;
   if(ENTER==0)			 //ENTER按下时进入选择高低报警温度设置
	   {   
	       while(ENTER==0);
		   beer();
	       while(1)
	            {
	   	          switch(tem)
		            {
		              case 0:  HTemperature();break;	  //高温设置
	   		          case 1: LTemperature();break;		   //低温设置
	   	            }
		          if(UP==0)								   //UP/DOWN都是改变选择画面
	                {  
	   	              while(UP==0);
		              beer();
	                  if(tem==0)
		                tem=1;
			          else 
			            tem=0;
		             }
	              if(DOWN==0)
	                 {
	                   while(DOWN==0);
		               beer();
	                   if(tem==0)
		                tem=1;
			           else 
			            tem=0;
	                 }
		          if(MENU==0)							  //MENU按下则退出到读取当前温度状态
		             {
		               while(MENU==0);
		               beer();
		               lcd_init();
		               break;
		             }
	            }
	   

		}
}
//************************************************************************** 

//***************************************************************************
//到设定温度时报警函数
warn()
{
	if(temper[1]>=I2CReadByte(1))			 //当前温度大于或等于高温设定时报警
	 {
	    flag2=1;
		if(flag==0)
		lcd_strwdat(0,"                 " );  // 用于第一行闪动
       beer();								 //蜂鸣器长叫
	  }
  	 else
     if(temper[1]<=I2CReadByte(2))
	 {										   //当前温度小于或等于低温设定时报警
	    flag2=2;
		if(flag==0)
		lcd_strwdat(0,"                 " );   // 用于第一行闪动
       beer();
	  }	 
    else
    flag2=0;


}

main()
{ uchar i,CON;
  
  TMOD=0X01;			   //用定时器一
  TH0=(65536-50000)/256;   //定时为0.05s
  TL0=(65536-50000)%256;
  ET0=1;
  EA=1;					  //开总中断
  TR0=1;				  //开定时器
  lcd_init(); 			  //初始化lcd
  for(i=0;i<4;i++)		  //显示缓冲区置0
  dispbuf[i] = 0;
  while(1)
    {
  	   display();		  //显示 
	    key();
		warn();
		CON++;
		if(CON==500)	 //写时刷屏
		lcd_init();


    }
}

//****************************************************
void time0() interrupt 1
{  uchar contuer;
  TH0=(65536-50000)/256;			//定时为0.05s
  TL0=(65536-50000)%256;
   contuer++;
   if(contuer==7)					//当到0.35s改变 flag
   {
   contuer=0;
  flag=~flag;
  }
  
}

//*****************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -