一个用MCU将SHARP 遥控码转为NEC码的小程序

源代码在线查看: 可接收nec和sharp码_exmple_1.c

软件大小: 1114 K
上传用户: xiaoyunwang
关键词: SHARP MCU NEC 遥控
下载地址: 免注册下载 普通下载 VIP

相关代码

				//C51单片机红外线编解码遥控源程序 
				/*******************************************
				* 程序描述:红外遥控RC5码解码程序,经串口发送
				* 目标cpu:at89s52
				* 晶振:12M
				* 硬件描述:一体化接收头接P3.2.指示LED接P2.0,P2.1
				* 编译器:KEIL 7.05
				* 日期:2005/9/24
				* 作者:刘玉宏(liu1234)
				实现波特率2400(系统时钟12.000MHZ)
				*******************************************/
				#include 
				#include 
				
				#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				newFall=times;
				temp=newFall-oldFall; //计算脉冲加间隔的时间
				oldFall=newFall;
				//printf("t=%d,w=%d\n",times,temp);
				if(temp>1024 && temp					{
					temp=0;
				//	printf("zero\n");
					}
				else if(temp>2145 && temp					{
					temp=1;
				//	printf("one\n");
					}
				//	else if(temp>100 && temp					else if(temp>13400 && temp						{
						bitcnt=0;
						data0=0;
						data1=0;
				//		printf("header\n");
						return; //返回,等待下次开始接收
					}
				else ///干扰信号
				{
				//printf("noise\n");
				    return;
				}
				bitcnt++;
				//printf("bit%d\n",bitcnt);
				if(bitcnt				{
				data0=data0|(uint)temp;
				data0=data0				}
				else if(bitcnt==16)
				{
				data0=data0|(uint)temp;
				}
				else if(bitcnt				{
				data1=data1|(uint)temp;
				data1=data1				}
				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				newFall=times;
				temp=newFall-oldFall; //计算脉冲加间隔的时间
				oldFall=newFall;
				if(temp>930 && temp					{
					temp=0;
					}
				else if(temp>1970 && temp					{
					temp=1;
					}
				else ///干扰信号
				{
				    return;
				}
				bitcnt++;
				//printf("bit%d\n",bitcnt);
				if(bitcnt				{
				data0=data0|(uint)temp;
				data0=data0				}
				else if(bitcnt==5)//将5位用户码存到data0
				{
				data0=data0|(uint)temp;
				}
				else if(bitcnt				{
				data1=data1|(uint)temp;
				data1=data1				}
				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--);
				}
				
							

相关资源