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

📄 可接收nec和sharp码_exmple_1.c

📁 一个用MCU将SHARP 遥控码转为NEC码的小程序
💻 C
字号:
//C51单片机红外线编解码遥控源程序 
/*******************************************
* 程序描述:红外遥控RC5码解码程序,经串口发送
* 目标cpu:at89s52
* 晶振:12M
* 硬件描述:一体化接收头接P3.2.指示LED接P2.0,P2.1
* 编译器:KEIL 7.05
* 日期:2005/9/24
* 作者:刘玉宏(liu1234)
实现波特率2400(系统时钟12.000MHZ)
*******************************************/
#include <reg51.h>
#include <stdio.h>

#define UCHAR unsigned char
//#define UINT unsigned int
#define uint unsigned int

//#define IR_TYPE  1
#define NEC_IR_TYPE    0
#define SHARP_IR_TYPE  1

void delay(UCHAR i);
sbit LED_GREEN=P1^0;
sbit LED_RED=P1^1;
sbit int0=P3^2;

char bitcnt;
uint data0=0,data1;
// sbit Key=P2^0;

// ------------IR 外部 INT0 中断服务程序------------------
#if(NEC_IR_TYPE)
void int0Remote() interrupt 0 // IR 外部 INT0 中断服务程序
{
//unsigned int ir_code;
//bit ir_bit;
static uint oldFall;
uint temp,newFall,times;

times=(TH0<<8)+TL0;
newFall=times;
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
//printf("t=%d,w=%d\n",times,temp);
if(temp>1024 && temp<1225) // "0"信号
	{
	temp=0;
//	printf("zero\n");
	}
else if(temp>2145 && temp<2345) //"1"信号
	{
	temp=1;
//	printf("one\n");
	}
//	else if(temp>100 && temp<13600) //header信号
	else if(temp>13400 && temp<13600) //header信号
		{
		bitcnt=0;
		data0=0;
		data1=0;
//		printf("header\n");
		return; //返回,等待下次开始接收
	}
else ///干扰信号
{
//printf("noise\n");
    return;
}
bitcnt++;
//printf("bit%d\n",bitcnt);
if(bitcnt<16) //开始接收前16位
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32) //开始接收后16位
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else if(bitcnt==32) //接收完最后一位
{
data1=data1|(uint)temp;
printf("ir=%x,%x\n",data0,data1);
}

}
#endif

#if(SHARP_IR_TYPE)
void int0Remote() interrupt 0 // IR 外部 INT0 中断服务程序
{
static uint oldFall;
uint temp,newFall,times;

times=(TH0<<8)+TL0;
newFall=times;
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
if(temp>930 && temp<1130) // "0"信号
	{
	temp=0;
	}
else if(temp>1970 && temp<2170) //"1"信号
	{
	temp=1;
	}
else ///干扰信号
{
    return;
}
bitcnt++;
//printf("bit%d\n",bitcnt);
if(bitcnt<5) //开始接收前5位用户码
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==5)//将5位用户码存到data0
{
data0=data0|(uint)temp;
}
else if(bitcnt<13) //开始接收后8位命令
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else if(bitcnt==13) //接收完最后一位命令,将8位命令存到data1
{
data1=data1|(uint)temp;
}
else if(bitcnt==15) //接收完最后两位尾缀
{
printf("ir=%x,%x\n",data0,data1);
data0=0;
data1=0;
bitcnt=0;
}
}
#endif

// ------------IR 外部 INT0 中断服务程序------------------

void int1() interrupt 2// INT1 外部中断服务程序
{
LED_RED=1;
delay(2000);
LED_RED=0;
delay(2000);
printf("int1\n");
}
main()
{
INT0=1;
EA=0;//关CPU总中断
LED_RED=0;
delay(2000);
LED_RED=1;
delay(2000);

//---------------uart init------------

SCON=0x50;//0x50;// 0101 0000
TMOD=0x21;//0x20
TCON=0x40;
TH1=0xf3;//实现波特率2400(系统时钟12.000MHZ)
TI=1;
TR1=1;


/*
SCON =0x58;          //选择串口工作方式,打开接收允许
TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1;              //启动定时器T1
ET1 =0;
ES=1;                //允许串行口中断
PS=1;                //设计串行口中断优先级
EA =1;               //单片机中断允许
*/
//---------------uart init------------

//-----------timer init----------
//TMOD=1;
TR0=1;
TH0=0;
TL0=0;
//-----------timer init----------

//-----------intinit------------
EA=1;//开CPU总中断
EX0=1;//开外部中断0
EX1=1;//关外部中断1
IT0=1;//下降沿触发中断0
IT1=1;//下降沿触发中断1
PX0=1;
//----------intinit------------

LED_GREEN=0;
LED_RED=0;
delay(200);
printf("init_ok\n");
while(1)
{
LED_GREEN=0;
LED_RED=0;
delay(200);
}

}
void delay(UCHAR i)		//延时程序
{
	UCHAR j;
	for(i; i > 0; i--)
		for(j = 200; j > 0; j--);
}

⌨️ 快捷键说明

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