红外学习.c

来自「单片机模拟红外信号」· C语言 代码 · 共 109 行

C
109
字号
/*uchar=1us/次				uint=2us/次
0.56MS=560US=51*11US		while()=11us/次
0.84ms=840us=76*11us
9MS=9000US=818*11US
4.5MS=4500US=409*11US
4MS=4000US=363*11US */
#include<reg51.h>
#define uchar unsigned char
#define	uint unsigned int
sbit ir=P3^2;
sbit deng1=P1^0;
sbit deng2=P1^1;
sbit deng3=P1^2;
bit  ir_byte;
delayus(uint z)
{
while(z--);
}

//功能:接收红外波形,并分地址,数据与数据反码
void ir_data()
{
	uchar i,ir_date,ir_buck;
	uint ir_add;	
	while(ir==1)								//有信号进入 
	{
		while(ir!=0);	
		delayus(450);		
		while(ir==0)							//延时9MS判断是否为起始信号
		{
			delayus(50);										
		for(i=0;i<16;i++)
			{				
			    while(ir!=1);	
				while(ir!=0);	
				delayus(90);					//延时0.84MS判断为高电平还是低电? 							
												
				if(ir==0)
				ir_byte=1;					
				else
				ir_byte=0;
				
				if(ir_byte)
				ir_add=(ir_add>>1)|0x8000;
				else
				ir_add>>=1;
			}					
				
			
		for(i=0;i<8;i++)
			{
				while(ir!=1);	
				while(ir!=0);	
				delayus(90);						//延时0.84MS判断为高电平还是低电? 							
												
				if(ir==0)
				ir_byte=1;					
				else
				ir_byte=0;
				
				if(ir_byte)
				ir_date=(ir_date>>1)|0x80;
				else
				ir_date>>=1;						//数据码 
			}
		

		for(i=0;i<8;i++)
			{
				while(ir!=1);	
				while(ir!=0);	
				delayus(90);						//延时0.84MS判断为高电平还是低电? 							
												
				if(ir==0)
				ir_byte=1;					
				else
				ir_byte=0;
				
				if(ir_byte)
				ir_buck=(ir_buck>>1)|0x80;
				else
				ir_buck>>=1;						//数据反码
			}
			
			if(ir_date!=(~ir_buck))				//校验
			deng1=0;				
		/*
			while(add==0xf0f0)
					deng1=0;
			//	while(date==0xf0)
			//		deng2=0;
			//	while(date1==0xf0)
			//		deng3=0;*/
			
		}
	}							
}

main()
{	
	while(1)
	{
		ir_data();
		
	}
}


⌨️ 快捷键说明

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