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

📄 display.c

📁 这是一个单片机控制DS18B20芯片测温度的程序,十分简洁和经典,如果有需要的朋友就下载吧...:)
💻 C
字号:
#include"reg52.h"
#define period 20          //设定占空比信号输出的周期,单位:5ms
sfr WDTRST = 0xA6;
sbit ge=P2^7;
sbit shi=P2^6;
sbit k_temp=P2^3;            //调温键sw6
sbit k_power=P3^3;           //休眠/唤醒键sw5
sbit k_warm=P2^5;            //加热键sw8
sbit k_motor=P2^4;             //电机键sw7
sbit led_run=P1^0;           //运行灯
sbit led_motor=P1^1;           //冲水指示灯
sbit led_warm=P1^2;          //空比加热指示灯
sbit led_err=P1^3;           //缺水信号灯
sbit warmer=P1^4;            //普通发热器
sbit motor_out1=P1^5;
sbit motor_out2=P1^6;
sbit motor_out3=P1^7;               //三个电机信号
sbit kongbi_delay=P3^6;       //空比加热器散热器
sbit fmq=P3^5;                //定义蜂鸣器P35
//unsigned char flag_system=1;             //系统运行中标志
unsigned char tab[]={ 0x3f,0x30,0x6d,0x79,0x72,0x5b,0x5f,0x31,0x7f,0x7b,0x40};
                    //0,    1,   2   3    4    5    6    7    8    9    -
extern unsigned char temp;
extern unsigned char flag_tempset;
extern unsigned char flag_temp;
extern unsigned char flag_wat;
extern unsigned char temp_set[];
extern unsigned char ReadTemperature();
extern void delay(unsigned int);
unsigned int total_time;       //系统运行总时间
unsigned int kongbi[]={0,2,4,6,8,10};  //初始化空比,单位为:5ms,为整数,且小于period
unsigned char key_scan(void); 
void sleep(void);
void start_t1(void);
unsigned int time_int;
timer0() interrupt 1 using 1
{TH0=(65536-5000)/256;                  //定时器5ms中断一次
 TL0=(65536-5000)%256;
 if(++time_int==kongbi[flag_temp])
   led_warm=0;
  else if(time_int==period)
       {time_int=0;
	    led_warm=1;
		}

}
void timer1(void) interrupt 3
{TH1=(65536-50000)/256;                  //定时器50ms中断一次
 TL1=(65536-50000)%256;                  //无按键动作延时
 total_time+=1;
  if(total_time==6000)                      //工作300S
  {TR1=0;
  total_time=0;
  sleep();
  }
}
void intter0(void) interrupt 0           //缺水信号
{unsigned char keyflag;
 EA=0;
 fmq=0;
 led_err=0;
 motor_out1=1;
 motor_out2=1;
 motor_out3=1;
 warmer=1;
 P0=tab[10];
 ge=0;
 shi=1;
 while(1)
 {WDTRST=0x1E;
  WDTRST=0xE1;
  keyflag=key_scan();
  if(keyflag!=0)
    { EA=1;
      fmq=1;
	  break;
     }
  }
 }
intter1() interrupt 2 using 0           //唤醒
{unsigned int i;
 for(i=0;i<10000;i++)
  {WDTRST=0x1E;
  WDTRST=0xE1;}
 EX1=0;
 led_run=0;
 start_t1();
}
void start0(void)        //启动定时器0控制空比加热
{
//TR0=0;
TH0=(65536-5000)/256;   //定时器初值为5000,即5ms中断一次
TL0=(65536-5000)%256;
kongbi_delay=0;      //启动散热器
EA=1;
ET0=1;
TR0=1;
}
void start_t1(void)      //系统运行总时间
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void display_temp(unsigned char i)             //温度显示函数
{
  P0=tab[i/10];
  shi=0;
  ge=1;
  delay(500);
  P0=tab[i%10];
  shi=1;
  ge=0;
  delay(500);
}
void display_tempmain(unsigned char i)             //主程序温度显示函数
{
  P0=tab[i/10];
  shi=0;
  ge=1;
  delay(1000);
  P0=tab[i%10];
  shi=1;
  ge=0;  
}
void display_dang(unsigned char i)//占空比加热时温度档位与冲水档位显示
{
  P0=tab[i];
  ge=0;
  shi=1;
  delay(100);  
}
unsigned char key_scan()           //扫描键盘
{  unsigned char ret;
  unsigned int i;
  unsigned int j;
 j=50000;
  k_temp=1;
  k_warm=1;
  k_motor=1;
  k_power=1;
  ret=0;
if(k_power==0)                   //进入休眠
  {for(i=0;i<30000;i++)
     {WDTRST=0x1E;
     WDTRST=0xE1;}
   if(k_power==0)
     ret=4;
	}
if(k_temp==0)                     //调温键
   {  
      fmq=0;                  //蜂鸣器响
	  for(i=0;i<13;i++)
	  display_temp(temp_set[flag_tempset]);
	  fmq=1;
     if(k_temp==0)
	   {while(j--)
	    {display_temp(temp_set[flag_tempset]);
	    if(k_temp==1)
	      {ret=1;
          break;}
        }
	  }
	}
if(k_warm==0)                     //空比加热键
   { 
       fmq=0;                  //蜂鸣器响
      for(i=0;i<13;i++)
      display_dang(flag_temp);
	  fmq=1;
	  if(k_warm==0)
       {while(j--)
         {display_dang(flag_temp);
	    	if(k_warm==1)
	         {ret=2;
             break;}
         }
	   }
	}
if(k_motor==0)                     //电机键空比控制
   { 
       fmq=0;                  //蜂鸣器响
	   for(i=0;i<13;i++)
	  display_dang(flag_wat);
	  fmq=1;
	 
	  if(k_motor==0)
	    { while(j--)
	      {display_dang(flag_wat);
		    if(k_motor==1)
	          {ret=3;
			    break;
				}
		   }
		}
	}
if(ret!=0) 
   total_time=0;
return ret;
}
void key_back(unsigned char i)   //按键响应程序
{unsigned int j,loop;
 unsigned char keyflag;
j=5000;
  switch(i)
  {
  case 1:                       //按下调温键
      {
         j=5;                   //调温结束后闪烁j次退出调温程序
         while(j--)
		   { temp=ReadTemperature();
             warmer=0;           //普通加热器开始工作
             if(temp>=temp_set[flag_tempset])   //温度达到设定值
                warmer=1;                       //停止加热
		     for(loop=0;loop<=50;loop++)    //闪烁状态数码管亮起的时长
               {
		         display_temp(temp_set[flag_tempset]);
		         keyflag=key_scan();        //扫描键盘
		         if(keyflag==1)             //该键继续按下
                    {if(flag_tempset++==2)  //达到最高温度
			             flag_tempset=0;
			         j=5;
			         }
				  if(keyflag==2)           //其他按键按下
				    j=0;
				  if(keyflag==3)
				    j=0;
				  if(keyflag==4)
				    j=0;
		        }
		    ge=1;
		    shi=1;
		    for(loop=0;loop<=50;loop++)     //闪烁状态数码管关闭的时长
		       {
		         delay(1000);
		         keyflag=key_scan();       //扫描键盘
		         if(keyflag==1)             //该键继续按下
                     {if(flag_tempset++==2) //达到最高温度
			             flag_tempset=0;
			          j=10;
			         }
				 if(keyflag==2)             //其他按键按下
				    j=0;
				 if(keyflag==3)
				    j=0;
                 if(keyflag==4)
				    j=0;
               }
		 }
         break;
	   }
  case 2:                      //按下空比加热键
       {
         warmer=1;            //空比加热时停止普通加热器
         start0();            
		  motor_out1=1;
		 motor_out2=1;
		 motor_out3=1;        //加热时关闭电机
         
		 while(1)
		 {  
		    kongbi_delay=0;
            if(flag_temp==4)
		     {
             led_warm=0;
			 }
            display_dang(flag_temp);
		    keyflag=key_scan();
		    if(keyflag==2)
              {flag_temp+=1;
			  	start0();
			  if(flag_temp==5)
			     {flag_temp=0;      //停止加热
				  TR0=0;
				  led_warm=1;
				 kongbi_delay=1;
				 }
              else
                 {TR0=1;
                 kongbi_delay=0;  
			      }
			
			   }
           if(keyflag!=2&&keyflag!=0)             //其他按键按下
		     {led_warm=1;
			  TR0=0;
               kongbi_delay=1;
		       break;
			  }
		   			  
			  
         }
        break;
		 }
  case 3:                      //按下电机键
      {
	     TR0=0;    
                      //停止加热
		 led_warm=1;
		 led_motor=0;
		 if(flag_wat==1)
			      {motor_out1=0;
				  motor_out2=1;
				  motor_out3=1;
				  }
	    if(flag_wat==2)
			      {
			      motor_out2=0;
				  motor_out1=1;
				  motor_out3=1;
				  }
		 if(flag_wat==3)
			      {
			      motor_out3=0;
				  motor_out1=1;
				  motor_out2=1;
				  }
         if(flag_wat==0)    //停止所有电机
			     {
				  motor_out1=1;
				  motor_out2=1;
				  motor_out3=1;
				  }
         while(j--)
		 {  
            display_dang(flag_wat);  //显示冲水等级
		    keyflag=key_scan();
			temp=ReadTemperature();
			if(temp<temp_set[flag_tempset])
			   warmer=0;
			else
			   warmer=1;
		    if(keyflag==3)
              {if(flag_wat++==3)      
			     flag_wat=0;
			  if(flag_wat==1)
			      {motor_out1=0;
				  motor_out2=1;
				  motor_out3=1;
				  led_motor=0;
				  }
			   if(flag_wat==2)
			      {
			      motor_out2=0;
				  motor_out1=1;
				  motor_out3=1;
				  }
			   if(flag_wat==3)
			      {
			      motor_out3=0;
				  motor_out1=1;
				  motor_out2=1;
				  }
               if(flag_wat==0)    //停止所有电机
			     {
				  motor_out1=1;
				  motor_out2=1;
				  motor_out3=1;
				  led_motor=1;
				  }
			    j=5000;
			   }
            if(keyflag!=3&&keyflag!=0)             //其他按键按下
		      {led_motor=1;
			  motor_out1=1;
			  motor_out2=1;
			  motor_out3=1;
			  break;
			  }
		   
       }
		break;
 }
  case 4:
	    {sleep();
	     break;
         }
default:
          break;
	   }
	  }
void sleep(void)
{
 unsigned char i;
 WDTRST=0x1E;
 WDTRST=0xE1;
 P1=0xFF;
 P0=0xFF;
 P2=0xFF;
 P3=0xFF;
 for(i=0;i<100;i++)
 delay(1000);
 EX1=1;
 EA=1;
 PCON=0X02;
 }

⌨️ 快捷键说明

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