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

📄 programe.txt

📁 遥控窗帘程序
💻 TXT
字号:
红外遥控接收程序
2008-06-10 13:50:46 来源:本站原创 作者:尘封往事 【大 中 小】 点击: 次 
 
ORG 0000H 
LJMP START;转入主程序
ORG 0010H 
START: 

MAIN:
JNB P2.2,IR
LJMP MAIN


;以下为进入P3.2脚外部中断子程序,也就是解码程序
IR: 
MOV R6,#9
SB:
ACALL DELAY882 ;调用882微秒延时子程序
JB P2.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL DELAY2400
JNB P2.2,IR_Rp ;
ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#4 
PP: 
MOV R3,#8
JJJJ: 
JNB P2.2,$ ;等待地址码第一位的高电平信号
LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P2.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
LCALL DELAY1000
UUU: 
MOV A,@R1 ;将R1中地址的给A
RRC A ;将C中的值0或1移入A中的最低位
MOV @R1,A ;将A中的数暂时存放在R1中
DJNZ R3,JJJJ ;接收地址码的高8位
INC R1 ;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据,存放在1AH/1BH/1CH/1DH的RAM中

MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!
CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
SETB P2.3;蜂鸣器停止


LJMP MAIN

IR_Rp:
LJMP MAIN

EXIT:
LJMP MAIN ;退出解码子程序


;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
END





RC-5红外遥控程序!2007年03月19日 星期一 20:19这个程序是我从网上找来的,原作者是刘玉宏

不过我没看出来他用的什么片子,我用AT89S51没法编译

现在已经改过来了,嘿嘿,希望能对大家学RC-5协议有些帮助

include<reg52.h>

// 波特率发生器的初值(115200波特率)XTAL 11.0592M
//#define BRGR1_DATA 00   
//#define BRGR0_DATA 0x50

sbit WAY_0 = P2^0;
//sbit LED_RECIEVE= P0^6;

unsigned char bdata buffer;//发往串口的缓冲器
sbit way0=buffer^0;        
unsigned char irtype;      //RC5一帧的各段的标志

unsigned char count,buf_s[3];       //红外接收位寄存器
unsigned char end;         //红外一帧接收结束标志

void t0_service(void) interrupt 1 using 1         
{
     //第一次进入中断,为定时1/4位的时间445us
     //以后则定时一位时间1.778ms进入中断
way0=~WAY_0; //一体化解码后,有载频的部分变为低电平
TH0=(0xffff-1522)/256;
TL0=(0xffff-1522)%256;
count++;
if((irtype==0)&&(count==3)) //起始码部分2个1和翻转位
{
      buf_s[0]=buffer;
      count=0;
      irtype=1;
      buffer=0;
}
else if((irtype==1)&&(count==5)) //5位地址
{
//      TI=0;
      buf_s[1]=buffer;
      count=0;
      irtype=2;
      buffer=0;
}
else if((irtype==2)&&(count==6)) //6位命令
{
//      TI=0;
      buf_s[2]=buffer;
   P0 = ~buffer;
      count=0;
      irtype=3;
      buffer=0;

}
else if(irtype==3) //等最后半位结束,实际延时1位时间
{
TI=0;
count=0;
irtype=0;
buffer=0;
end=1;
TR0=0; //解码结束,定时器停止
return;
}
buffer=buffer<<1;
// if(way0 == 1) buffer++;
}

void powerup( void )
{
TMOD = 0X21; //定时器1为方式2
TL1 = 0xfd;   //置初值,波特率为9600
TH1 = 0xfd;
PCON = 0x00; //SMOD = 0
// TR0=1;
TR1 = 1;   //启动定时器1
IE=0x82;
SCON = 0x50;
}

void main(void)
{
unsigned char i;
     WAY_0=1;     //输入首先写1
powerup();
while(1)
{
     buffer=0;
     irtype=0;
     count=0;
     end=0;
TH0=(0xffff-381)/256;
TL0=(0xffff-381)%256;
     while (WAY_0);//等待低电平,一帧的开始
     TR0=1;        //开始定时,红外接收
     while(!end); //等一帧解码结束
for(i = 0;i<3;i++)
{
   TI=0;
   SBUF = buf_s[i]+0x30;
   while(!TI);  
}
     }
}

 


⌨️ 快捷键说明

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