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

📄 systermr1.c

📁 洗衣机手动、自动控制,四挡调速,手动自动调节温度
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
sbit p1_6=P1^6;
uchar code table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,
	                  0x41,0x1f, 0x01,0x09};
uchar key;
bit aut ;     /*手动、自动标志位*/
uint fuck;     /*计算位*/  
uint temp;               /*T为温度的显示数值*/ 
uchar SET_T ;     /*额定温度,用户设定*/
uint TM ;     /*初始测温*/
uchar RS;  /*滑动电阻,待测*/
uint mytime;
bit flag;    /*温度,速度显示转换*/
uchar a;


void initial(void)                               /*初始化程序*/
{
  aut=1;
  SET_T=30;
  TM=19;
  mytime=45104;
  p1_2=1;
  flag=0;
  IP=0x00;        /*中断优先级*/ 
  TMOD=0X51;     /*T1计数方式1,T0定时方式1*/  
  PCON=0x00;
  TH0=mytime/256;  /*晶振为11.0592MHZ*/
  TL0=mytime%256; /*设周期20ms*/ 
 
  EA=1;          /*开中断*/  
  ET0=1;         
  EX0=1;        /*外部中断0*/
  TR0=1;        /*开定时器0*/
  IT0=1;        /*下降沿触发*/
  
}



void dlms(void)                                 /*除抖延时子程序*/
{
  uint i;
  for(i=200;i>0;i--)
    {;}
 }




void delay_for_count(uint x)                       /*延时、开计数器程序*/
{ uchar i;                     
  TH1=0X00;             /*T1计数初值*/
  TL1=0X00;
  TR1=1; 
  while(x>0)
   {
    x-=1;
    for(i=0;i<125;i++){;}
   }
   TR1=0;
}



void delay1(uint x)                                   /*普通延时程序*/
{ 
  uchar i;
  while(x>0)
   {
    x-=1;
    for(i=0;i<125;i++){;}
   }
   
}


void timer0(void) interrupt 1 using 1                /*定时器T0用作方波输出程序*/
{ if(p1_1==1)
	
  { 	
  	TH0=mytime/256;
    TL0=mytime%256;  
  }
  else
  { TH0=(65536-mytime)/256;
    TL0=(65536-mytime)%256;
   }
  
  p1_1=!p1_1;
 
  TF0=0;
}


compute(uint x)                                       /*温度计算程序,X为频率数值*/ 
{ 
  int n;
  n=x*0.25+160;
  
  return (n);
}





void display(uint x)                                     /*显示子程序*/
{    
   uchar j;             /*j为辅助显示变量*/  
   uint display[3];  /*用于显示的各位数字*/ 
              
     display[0]=x/100;
     display[1]=x/10%10;
     display[2]=x%10;     /*分离温度的各位数字*/
       j=display[2];
       SBUF=table[j];
       while(TI==0);
       TI=0;
       j=display[1];
       SBUF=table[j]&0xfe;
       while(TI==0);
       TI=0;
        j=display[0];
       SBUF=table[j];
       while(TI==0);
       TI=0; 
}    




void keybardscan(void)                                  /*按键扫描程序*/
{  
  
  dlms();                     /*去抖延时*/             
  
  key=(P1&0x78); 
  if(key!=0)
     { switch(key)
         {
            case 0x40: aut=!aut;  break;
            case 0x20: if(flag==0) 
                          mytime=mytime+10000;
                        else    
                          SET_T=SET_T+1;break;
            case 0x10:  if(flag==0)
                          mytime=mytime-10000;
                         else
                           SET_T=SET_T-1; break;
            case 0x08:  flag=1;p1_2=!p1_2; break;
            default: break;
 
          }   
      }
}



void intu0(void) interrupt 0 using 2                         /*按键中断程序*/
{
   keybardscan();
}                                 



void main(void)                                             /*主程序*/
{  
   uchar i; 
   
   initial();  /*调用初始化程序*/
   while(1)
  {  
      if(aut==1)         /*判断手动、自动*/
       {
        if(TM>=SET_T)
         { p1_0=0;
           p1_1=1;} 
        else
          p1_0=1;
       }
      else
         p1_0=0; 
       delay_for_count(100);      /*延时100ms*/ 
       fuck=TH1*256+TL1;    
       temp=compute(fuck);   /*带入频率,计算温度显示数值*/
       display(temp);    /*调用显示程序,T为处理过后的温度显示值,为实际值的10倍*/

       TM=temp/10;
       
        if(flag==1||a==1)
        {   
        
          for(i=10;i<=0;i++)
             {
               delay1(100);     /*延时500ms*/  
               temp=SET_T*10;     /*T为额定温度的10倍,用于显示*/
               display(temp);
             }
               flag=0;a=0;
         }
       
          
         
   }
 
}

  

⌨️ 快捷键说明

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