基于51单片机的红外遥控

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的红外遥控

红外遥控是无线遥控的一种方式,本文讲述的红外遥控,采用STC89C52单片机,1838红外接收头和38k红外遥控器。

1838红外接收头:

红外遥控器:

原理:

红外接收的原理我不赘述,百度文库上不少,我推荐个网址,这篇文章写得比较清楚,也比较全面,

我主要讲下程序的具体意思,在了解原理的基础上,我们知道,当我们在遥控器上每按下一个键,遥控器上的红外发射头都会发出一个32位的编码(32位编码分成4组8位二进制编码,前16位为用户码和用户反码,后16位为数据码和数据反码,用户码表示遥控器类型,数据码表示按键编码),不同的键对应不同的编码,红外接收头接收到这个编码后,发送给单片机,再进行相关操作。

源程序1:(这个程序的功能是将用户码和用户反码,数据码和数据反码显示在1602液晶上,因为遥控器买回来是不会说明按键对应什么码值,所以先自己测试,确定每个

按键的码值)

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define _Nop() _nop_()

#define TURE 1

#define FALSE 0

/*端口定义*/

sbit lcd_rs_port = P3^5; /*定义LCD控制端口*/

sbit lcd_rw_port = P3^6;

sbit lcd_en_port = P3^4;

#define lcd_data_port P0

///////////////////////////////////

void delay1 (void)//关闭数码管延时程序

{

int k;

for (k=0; k<1000; k++);

}

////////////////////////////////////

uchar code line0[16]={" user: "};

uchar code line1[16]={" data: "};

uchar code lcd_mun_to_char[16]={"0123456789ABCDEF"};

unsigned char irtime;//红外用全局变量

bit irpro_ok,irok;

unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码unsigned char irdata[33];//用来存放32位码值

void ShowString (unsigned char line,char *ptr);

//////////////////////////////////////////////

void Delay(unsigned char mS);

void Ir_work(void);

void Ircordpro(void);

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数

{

irtime++;

}

void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数

{

static unsigned char i;

static bit startflag;

if(startflag){

if(irtime<63&&irtime>=33)//引导码TC9012的头码

i=0;

irdata[i]=irtime;

irtime=0;

i++;

if(i==33){

irok=1;

i=0;

}

}

else{

irtime=0;

startflag=1;

}

}

void TIM0init(void)//定时器0初始化

{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值

TH0=0x00;//reload value

TL0=0x00;//initial value

ET0=1;//开中断

TR0=1;

}

void EX0init(void)

{

IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)

EX0 = 1; // Enable EX0 Interrupt

EA = 1;

}

void Ircordpro(void)//红外码值处理函数(关键函数)

{

unsigned char i, j, k=1;

unsigned char cord,value;

for(i=0;i<4;i++){//处理4个字节

for(j=1;j<=8;j++){ //处理1个字节8位

cord=irdata[k];

value=value>>1;

if(cord>7) value=value|0x80; //大于某值为1

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

///////////////////////////////////////////

void lcd_delay(uchar ms) /*LCD1602 延时*/

{

uchar j;

while(ms--){

for(j=0;j<250;j++)

{;}

相关文档
最新文档