电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 5291|回复: 4

c51遥控 按键 控制风扇高中低速 定时关机 15分钟 半个小时

[复制链接]
发表于 2013-7-27 10:08:33 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
#include <reg52.h>
#define uchar unsigned char
/*sbit dula=P2^6;
sbit wela=P2^7;
sbit feng=P2^3;        */
sbit duan=P2^5;       
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
unsigned int ge,shi,kai,jia;
unsigned int i,i2,i3,jia2,jia3;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar f;

#define Imax 14000    //此处为晶振为11.0592时的取值,
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取值。
#define Inum2 700
#define Inum3 3000

unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;

//按键 延时
void delay1(void) //用于按键 延时
{
  unsigned int x,y;

  for(x=5;x>0;x--)
  for(y=110;y>0;y--);
}


// 1秒延时 程序
void delay1s(void)   //延时1S 用于11.0596晶振误差 -0.00000000024us
  
{
    unsigned char a,b,c;
    for(c=95;c>0;c--)
        for(b=26;b>0;b--)
            for(a=185;a>0;a--);
}


//按键 选择高 中 低
void anjian(void)          //按键S1 控制高中低档
{
  if(s1==0)
    {
          delay1();
          if(s1==0)
            {
                  
                  jia++;
                  if(jia==4)
                    jia=0;
                 switch(jia)
          {
                  case 01=0xff;break;  //关机
                  case 11=0xfe;break;  //高
                  case 21=0xfd;break;  //中
                  case 31=0xfb;break;  //低
                  }
                }
                  while(!s1);
                  delay1();
                  while(!s1);
        }
       
}

//按键时间选择  
void xuanzhe(void)                //按键延时的选择 S3
{
  if(s3==0)
    {
          delay1();
          if(s3==0)
            {
                  
                  jia3++;
                  if(jia3==3)
                   jia3=0;
                  switch(jia3)
          {
                   case 0:i2=12=0xff;break;       //1秒关机
                   case 1:i2=9002=0x7f;break;  //15分钟
                   case 2:i2=18002=0xbf;break;//半个小时
                  
                  }
                  
                }
                  while(!s3);
                  delay1();
                  while(!s3);
        }

}

//按键延时
void delay1f(i2) //按键延时 关机 延时 时间由 i2定
{  
   i=1;
   do{
       delay1s();
           i++;
   }
   while(i<=i2);
   P1=0xff;
}


//15分钟延时
void delay15f(void)        //遥控延时 15分钟 延时 关机
{ P2=0x7f;
  i3=1;
  do{
           delay1s();
         i3++;
  }
  while(i3<=900);
  P1=0xff;
  P2=0xff;
}


//按键 总控制
void anjianzhong()        //按键的 总控制程序 先判断 S2确定 延时关机启动
{                                           
  if(s2==0)
    {
          delay1();
          if(s2==0)
            {
                  
                   delay1f(i2);
                         
                   P1=0xff;

                }
                  while(!s2);
                  delay1();
                  while(!s2);

         }
     else
            anjian();
                xuanzhe();
}


/*void delay(uchar i)
{
  uchar j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void display()
{
   dula=0;
   P0=table[show[0]];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[show[1]];
   dula=1;
   dula=0;
   
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);
} */

//遥控控制 高中低 延时关机 控制
void fengkai()           //遥控键 识别控制程序 高 中 低 延时关机
{
   duan=1;
  
  ge=table[show[0]];        //取个位赋值
  shi=table[show[1]];        //取十位赋值
  ge=ge&shi;

   switch(ge)
    {
         case 0x391=0xfe; //这四个数是 根据显示将 各位与十位做与 的结果//控制高速
           
                         break;
         case 0x061=0xfd;//中
         
                        break;
         case 0x691=0xfb;//低

                     break;
         case 0x641=0xff;//关机

                     break;
         case 0x66:delay15f();//延时15分钟关
                 break;
        }


}


//外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0*256+TL0;         //提取中断时间间隔时长
TH0=0;
    TL0=0;              //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
      {
  m=0;
        f=1;
  return;
      }       //找到启始码
   if(f==1)
      {
        if(Tc>Inum1&&Tc<Inum3)
    {
   Im[m/8]=Im[m/8]>>1|0x80; m++;
       }
      if(Tc>Inum2&&Tc<Inum1)
        {
         Im[m/8]=Im[m/8]>>1; m++; //取码
  }
  if(m==32)
   {
         m=0;  
         f=0;
         if(Im[2]==~Im[3])
      {
           IrOK=1;
   }
        else IrOK=0;   //取码完成后判断读码是否正确
     }
               //准备读下一码
   }

}


/*演示主程序 */
void main(void)
{
   
    m=0;
    f=0;
    EA=1;

    IT1=1;
        EX1=1;

    TMOD=0x11;  
    TH0=0;
        TL0=0;
    TR0=1;//ET0=1;

while(1)
{
       
       if(IrOK==1)
      {
       show[1]=Im[2] & 0x0F;     //取键码的低四位
           show[0]=Im[2] >> 4;  
           IrOK=0;
                fengkai();
      }
            //display();
                    anjianzhong();
           
                 
  }
}
 楼主| 发表于 2013-7-27 10:11:51 | 显示全部楼层
初学 请指教
发表于 2013-7-27 10:55:30 | 显示全部楼层
弄这些符号有什么作用。?
发表于 2013-7-27 11:12:23 | 显示全部楼层
 楼主| 发表于 2013-7-27 11:28:30 | 显示全部楼层
下载都单片机中 可做风扇的控制啊    初学还有很多不完善的 请多指教
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2025-1-18 17:59 , Processed in 0.059186 second(s), 4 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

快速回复 返回顶部 返回列表