×
单片机 > 单片机程序设计 > 详情

学习型红外线遥控程序——C51

发布时间:2020-05-30 发布时间:
|

/*************晶体为11.0592M,波特率9600bps
***************学习型红外线遥控程序*******/
#include
void Ewen(void);
void Ewds(void);
void Delay(void);
void Irda(void);
void Study(void);
void Output(unsigned int h);
void Comput(unsigned char outdata);
void Erase(unsigned char Address);
unsigned int Read(unsigned char Address);
unsigned char Display(unsigned char inAddress);
void Write(unsigned char Address,unsigned int InData);
unsigned int Both(unsigned char data1,unsigned char data2);
unsigned char data e1 _at_ 0x1A;        //分别存放红外线译码后的数据
unsigned char data w1 _at_ 0x1B; 
unsigned char data e2 _at_ 0x1C;
unsigned char data w2 _at_ 0x1D;
sbit IrInput=P3^2;        //红外线输入引脚,可自定义
sbit Study1=P3^6;       //学习按键,可自定义
sbit Led2=P2^5;          //接收成功、学习成功指示
sbit Led1=P2^6;          //空闲指示
sbit Dout=P2^3;         //at93c16--DO
sbit Din=P2^2;          //at93c16--DI
sbit sk=P2^1;           //at93c16--SK
sbit cs=P2^0;           //at93c16--CS

/*********************主程序***************************/

void main(void)
{
unsigned int i;
SCON = 0x50;    //串口方式1,允许接收
TMOD = 0x20;    //定时器1定时方式2
TH1 = 0xFD;      //波特率9600
TL1 = 0xFD;
IT0 = 1; //INT0下降沿有效
EX0 = 1; //开INT0中断;
TR1 = 1;         //启动定时器
P2_7=0;          //初始化引脚
P1=0xff;
EA = 1; //允许CPU中断
while(1)                              
   { 
    for (i=0; i<20000; i++)
        { Led1=1;
                if(!Study1) Study();
             }
    for (i=0; i<20000; i++)
        { Led1=0;
                if(!Study1) Study();
             }
   }
}

/***********************串口输出**********************/
void Comput(unsigned char outdata)
{
SBUF = outdata; 
while(!TI); 
TI = 0; 
}

/*******************红外线查询子程序*******************/
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 
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址