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

📄 热水器.c

📁 这是我本科的毕业设计。是一个热水器自动温控系统。要配合里面的电路图看程序
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#include<math.h>
sbit sw=P1^0;
sbit set=P1^1;
sbit up=P1^2;
sbit down=P1^3;
sbit ok=P1^4;
sbit next=P1^5;
sbit buzz=P1^6;
sbit relay=P1^7;
sbit led1=P2^6;
sbit led2=P2^7;
sbit DQ=P3^7;
unsigned char data agtemp[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char data Dgram[3]={0x00,0x00,0x00};
unsigned char data disgram[6]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char data pregram[18]={0x00,0x00,0x00,0x00,0x00,0x00,\
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char data tempdata[2]={0x00,0x00};
unsigned char data ctemp,temp,buf=0,time,hour,minute,max,min;
bit tempov,now;
/******************11us延函数*****************/
void delay(unsigned int t)
{
for(;t>0;t--);
}
//
//
/******************ms延时程序*****************/
void delayms(unsigned int dt)
{
register unsigned char bt; 
for(;dt>0;dt--)
 for(bt=250;bt>0;bt--);
}
//
//
/******************复位函数*****************/
ow_reset(void)
{char presence=1;
 while(presence)
 {
  while(presence)
  {
   DQ=1;_nop_();_nop_();
   DQ=0;
   delay(50);
   DQ=1;
   delay(6);
   presence=DQ;
  }
 delay(45);
 presence=~DQ;
 }
DQ=1;
}
//
//
/******************DS18B20写命令函数*****************/
void write_byte(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
 {
  DQ=1;_nop_();_nop_();
  DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
  DQ=val&0x01;
  delay(6);
  val=val/2;
 }
DQ=1;
delay(1);
}
//
//
/******************DS18B20读一字节函数*****************/
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
 {
  DQ=1;_nop_();_nop_();
  value>>=1;
  DQ=0;_nop_();_nop_();_nop_();_nop_();
  DQ=1;_nop_();_nop_();_nop_();_nop_();
  if(DQ)
   value|=0x80;
  delay(6);
 }
  DQ=1;
return(value);
}
//
//
/******************读出温度函数*****************/
void read_temp(void)
{
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
tempdata[0]=read_byte();
tempdata[1]=read_byte();
ow_reset();
}
//
//
/******************温度数据处理函数*****************/
work_temp()
{
ctemp=((tempdata[0]&0xf0)>>4)|((tempdata[1]&0x0f)<<4);
if(ctemp>65) tempov=1;
else if(ctemp<45) tempov=0;
}
//
//
/******************测温函数*****************/
void temptest (void)
{
ow_reset();
write_byte(0xCC);
write_byte(0x44);
read_temp();
work_temp();
}
//
//
/******************显示函数*****************/
void display(void)
{
unsigned char code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,\
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,\
0xbf,0xff};
unsigned char i,a;
a=0xfe;
for(i=0;i<6;i++)
 {
  P2|=0x3f;
  P0=table[disgram[i]];
  P2&=a;
  delayms(4);
  a=_crol_(a,1);
  P0=0xff;
 }
}
//
//
/******************一位按键函数*****************/
void abc(void)
{
unsigned char bt;
for(bt=0;bt<6;bt++)
 {
  do
   {
    if(up==0)
     {
      buzz=0;
      delayms(30);
      buzz=1;
      disgram[bt]++;
     }
   else if(down==0)
    {
     buzz=0;
     delayms(30);
     buzz=1;
     disgram[bt]--;
    }
  }while(ok==1);
  buzz=0;
  delayms(30);
  buzz=1;
 }
}
//
//
//
//
/******************中断服务函数*****************/
void clock(void) interrupt 1
{
TH0=0x3C;
TL0=0xB7;
buf++;
if(buf==20)
 {
   buf=0;
   Dgram[2]++;
   if(Dgram[2]==60)
    {
      Dgram[2]=0;
      Dgram[1]++;
      if(Dgram[1]==60)
       {
	     Dgram[1]=0;
         Dgram[0]++;
         if(Dgram[0]==24)
         Dgram[0]=0;
       }
    }
  }
}
//
//
/******************加热控制函数*****************/
void heatctrl(void)
{
unsigned char dt;
if(!tempov)
 {
  buzz=1;
  led1=1;
  if(now)
   {
    if(Dgram[0]<(hour+1))
       {
        if(ctemp>=temp)
          relay=1;
        else relay=0;
       }
    else now=0;
   }
  else
   {
    if (time>0)
       {
        if(Dgram[0]==hour&&Dgram[1]==minute)
          {
           relay=0;
           if(ctemp<temp) relay=0;
           else relay=1;
           if(time=1) led2=1;
           else 
             {
              for(dt=0;dt<6;dt++)
              pregram[dt]=pregram[dt+6];
              temp=pregram[4]*10+pregram[5];
              hour=pregram[0]*10+pregram[1];
              minute=pregram[2]*10+pregram[3];
              time--;
             }
          }
        else if(Dgram[0]<(hour+1))
        {
         if(ctemp<temp) relay=0;
         else relay=1;
        }
        else return;
      }
    else led2=1;
   }
  }
else{relay=1;
     buzz=0;
     led1=0;}
}
//
//
/******************按键扫描函数*****************/
unsigned char keyscan(void)
{
unsigned char bt,k=0,ch;
if(set==0)
 {
  buzz=0;
  delayms(30);
  buzz=1;
  led2=0;
  if(ok==0)
   {
    buzz=0;
    delayms(30);
    buzz=1;
    do{
       buzz=0;
       delayms(30);
       buzz=1;
       abc();
       for(bt=0;bt<6;bt++,k++)
        {
         pregram[k]=disgram[bt];
         display();
        }
      }while(next==0);
     hour=pregram[0]*10+pregram[1];
     minute=pregram[2]*10+pregram[3];
     temp=pregram[4]*10+pregram[5];
     time=3;
     now=0;
    return(1);
    }
   else
   {
    abc();
    for(bt=0;bt<7;bt++) display();
    led2=1;
    return(2);
   }
  }
  else if(sw==0)
   {
    buzz=0;
    delayms(30);
    buzz=1;
    sw=1;
    while(sw==0) display();
    ch=IE;
    IE=0x00;
    P0=0xff;
    P1=0xff;
    P2=0xff;
    P3=0xff;
    disgram[0]=0x10;
    disgram[1]=0x10;
    disgram[2]=0x10;
    disgram[3]=0x10;
    disgram[4]=0x10;
    disgram[5]=0x10;
    display();
    while(1)
     {
      while(sw) display();
      buzz=0;
      delayms(30);
      buzz=1;
      if(sw==0) break;
     }
    while(sw==0) display();
    IE=ch;
    return(0);
   }
  else if(ok==0)
   {
    buzz=0;
    delayms(30);
    buzz=1;
    abc();
    for(bt=0;bt<7;bt++) display();
    now=1;
    hour=disgram[0]*10+disgram[1];
    minute=disgram[2]*10+disgram[3];
    temp=disgram[4]*10+disgram[5];
    return(3);
   }
 else return(0);
}       
//
//
/*******************主函数*****************/
void main(void)
{
unsigned char i,j,k,h;
ctemp=15;
tempov=0;
sw=0;
while(1)
 {
  keyscan();
  for(i=1,j=0;i<6,j<3;i+=3,j++)
  Dgram[j]=pregram[i]+pregram[--i]*10;
  TMOD=0x01;
  TL0=0xB0;
  TH0=0x3C;
  IE=0x82;
  TR0=1;
  i=1;
  do
   {
    for(j=0;j<16;j++)
     {
      if(keyscan())
        i=6;
      for(k=3,h=1;k>=1,h>=0;k--,h--)
       {
	    disgram[k]=Dgram[h]%10;
        disgram[--k]=Dgram[h]/10;
	   }
        disgram[4]=ctemp/10;
        disgram[5]=ctemp%10;
        display();
        heatctrl();
       }
    for(k=0;k<=4;k++)
     {
      temptest();
      agtemp[k]=ctemp;
     }
    max=agtemp[0];
    min=agtemp[0];
    for(k=0;k<=4;k++)
     {
      if(agtemp[k]>max) max=agtemp[k];
      if(agtemp[k]<min) min=agtemp[k];
      ctemp+=agtemp[k];
     }
    temp=(ctemp-max-min-agtemp[4])/3;
  }while(i--);
 }
}











⌨️ 快捷键说明

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