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

  • 格式:doc
  • 大小:25.50 KB
  • 文档页数:6

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

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

/*************晶体为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

}