鼻子整形缩小要多少钱:红外遥控风扇C+汇编程序(有原理图和程序

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 02:34:04
红外遥控风扇C+汇编程序(有原理图和程序)2009-03-13 07:59

红外遥控风扇程序,如下:         

/*************晶体为11.0592M
***************红外线遥控风扇控制程序*******/
#include
unsigned char data e1 _at_ 0x1A;       //分别存放红外线译码后的数据,高8位地址
unsigned char data w1 _at_ 0x1B;       //低8位地址
unsigned char data e2 _at_ 0x1C;       //编码数据
unsigned char data w2 _at_ 0x1D;       //数据反码
sbit Irf="P3"^2;       //红外线输入引脚,可自定义
sbit PWM="P3"^3;           //PWM控制输出脚
sbit Led1=P3^7;          //LED个位控制
sbit Led2=P3^5;          //LED十位控制


/*******************红外线查询子程序*******************/
void Irda(void)
{
     #pragma asm
   MOV R6,#10;
SB:
     MOV    R4,#19     ;//延时880微秒
D1:  
     MOV    R5,#19;
     DJNZ   R5,$;
     DJNZ   R4,D1;

    JB P3.2,EXIT      ;//延时882微秒后判断P3.2脚是为1
     DJNZ R6, SB       ;//在8820微秒内如P3.2为1就退出
     JNB P3.2, $       ;//等待高电平避开9毫秒低电平引导脉冲

     MOV    R4,#10     ;//延时4740微秒
D2: MOV    R5,#218;
     DJNZ   R5,$;
     DJNZ   R4,D2;//延时4.74毫秒避开4.5毫秒的结果码

     MOV R1,#1AH       ;//设定1AH为起始RAM区
     MOV R2,#4         ;//接收从1AH到1DH,用于存放操作码和操作反码
PP:
     MOV R3,#8         ;//每组数据为8位

SS:
     JNB P3.2,$        ;//等待地址码第一位的高电平信号
     MOV    R4,#19     ;//延时880微秒
D5:
     MOV    R5,#19;
     DJNZ   R5,$;
     DJNZ   R4,D5 ;//高电平开始后882微秒判断信号的高低电平
     MOV C,P3.2       ;//将P3.2引脚此时的电平状态0或1存入C中
     JNC TT           ;//如果为0就跳转到TT

     MOV R4,#2        ;//延时1000微秒
     D6:MOV R5,#248;
     DJNZ R5,$;
     DJNZ R4,D6;//检测到高电平1的话延时1毫秒等待脉冲高电平结束
TT:
     MOV A,@R1        ;//将R1中地址的给A
     RRC A            ;//将C中的值0或1移入A中的最低位
     MOV @R1,A        ;
     DJNZ R3,SS       ;//接收满8位换一个内存
     INC R1           ;//对R1中的值加1,换下一个RAM
     DJNZ R2,PP       ;//接收完所有数据
EXIT:
     #pragma endasm
}

/*延时程序,由x参数确定延迟时间*/
void msec(int x)    // @ 11.0592 MHz
{
int j="0";
while(x>=0)
{  
for (j=0;j<1350;j++);
x--;
if(!Irf) break;   
}
}


void main(void)//主程序
{   P1=0x41;
    Led1=0;
Led2=0;

while(1)                             
{   
      if(!Irf)
        {
Irfda:   e1=e2=0;
   Irda();   //调用红外线解码程序
      if((e1==~w1)&&(e2==~w2)) //校验,错误码输入返回
          {
        switch(e2)
     { case 0x1D:P1=0x83;for(;;){PWM=1;msec(1000);PWM=0;msec(5);if(!Irf){P1=0xFF;goto Irfda;}}//按键1,风最大
     case 0x11:P1=0x83;for(;;){PWM=1;msec(500);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键2,风最大
     case 0x05:P1=0xA1;for(;;){PWM=1;msec(100);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键3,风最大
     case 0x5E:P1=0x39;for(;;){PWM=1;msec(60);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键4,风最大
              case 0x52:P1=0x25;for(;;){PWM=1;msec(30);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键5,风最大
              case 0x46:P1=0x05;for(;;){PWM=1;msec(10);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键6,风最大
              case 0x5D:P1=0xF1;for(;;){PWM=1;msec(5);PWM=0;msec(10);if(!Irf){P1=0xFF;goto Irfda;}}//按键7,风最小
              case 0x00:P1=0xFE;break;//按键POWER ON/OF,风关闭

             case 0x45:P1=0x21;PWM=0x01;e1=e2=0;break;
              case 0x50:P1=0x41;PWM=0x01;e1=e2=0;break;
              case 0x1C:P1=0x13;PWM=0x01;e1=e2=0;break;
              case 0x04:P1=0x86;PWM=0x01;e1=e2=0;break;
              case 0x00:P1=0xFE;PWM=0x01;e1=e2=0;break;
              default :break;
         }
     }
}
     }
}

PROTEL 99SE画的此程序硬件原理图