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

📄 irda2.c

📁 MCS-51单片机实验 39个实用实验和源码
💻 C
字号:
//---红外接收---


//-----头文件引用-----
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>

//-----宏声明-----
#define	C8279	XBYTE[0xF239]      //定义8279命令口地址
#define	D8279 	XBYTE[0xF238]      //定义8279数据口地址
#define	uchar	unsigned char  
#define	uint 	unsigned int

//-----变量定义-----
uchar	code	ledseg[]={	0x3f,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,//显示'0,1,2,3,4,5,6,7,8'
							0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};//'9,a,b,c,d,e,f, ,-'
uchar	idata	diss[8];      			 	//定义显示缓冲区 
uchar	idata	jsdat[4]={0x00,0xff,0x00,0x00};    //定义接收数组
uint    time0,time1,time2;    	//时间存储变量							
bit		bdata	yesdatbz=0,yesredatbz=0; 	 //定义接收数据、持续码标志
sbit		JSCOM=P1^7;         		//定义接收口


//-----初始化-----
void	first()							
{
	C8279=0x00;						//置8279工作方式
	C8279=0x2f;						//置键盘扫描速率
	C8279=0xc1;						//清除LED显示
	while(C8279&0x80);				//等待清除结束
	
	TMOD=0x10;                     //置定时器工作方式
	ET1=1;
	EA=1;
	TL1=0;
	TH1=0;	
}

//-----中断-----
void ctc0() interrupt  3
{}
	

//-----显示-----
void	disp()			   		
{
	uchar	i;	
	for(i=0;i<8;i++)
	{
		C8279=i+0x80;
		D8279=ledseg[diss[i]];		
	}
}

//-----等待显示------
void dis0()
{
	uchar i;
	for(i=0;i<8;i++)
	{
		diss[i]=0x11;
	}
	diss[2]=0x10;
	diss[3]=0x10;
	disp();	
}

//-----负跳变-----
void	tb1_0()               				
{
	while(1)
	{
		if(JSCOM==1)
		{
			while(JSCOM==1);
			return;
		}		
	}
}

//-----跳变-----
void tb()
{	
	if(JSCOM==1)
	{
		while(JSCOM==1);
		return;
	}
	else
	{
		while(JSCOM==0);
		return;
	}		
}

//-----毛刺处理-----
void mc()  	
{
	uint 	timeval;
	do
	{
		tb();
		time2=TH1*256+TL1;
		timeval=time2-time1;
		if(timeval>200)			//判时间是否小于200us
		{
			return;
		}
		else
		{
			tb();    
    		time1=TH1*256+TL1;
		}
	}while(timeval<200);
}

//-----接收引导码-----
void yindao()
{	
	uint 	timeval;
	do
	{
		tb1_0();					//等待负跳变
    	TR1=1;    					//开定时器
   	 	time0=TH1*256+TL1;			//读定时器初始值    
    	tb();    					//等待跳变
    	time1=TH1*256+TL1;			//读定时器值   
    	timeval=time1-time0;		//时间处理
    }while((timeval<8000)||(timeval>10000));//判时间是否在引导码9200us(L)左右
}


//-----数据接收子程序-----
void   read(void)					
{
	uchar i,k;
	uint 	timeval;
	yindao();    					//判引导码				
    time0=time1;					//时间值迭代    	
    tb();    						//等待跳变
    time1=TH1*256+TL1;				//读定时器值 
    mc();							//毛刺处理
    timeval=time1-time0;	    
    if((timeval>3800)&&(timeval<4800))	//判时间是否在引导码4400us(H)范围内
    {
    	
    	for(k=0;k<4;k++)
    	{
    		for(i=0;i<8;i++)
    		{
    			time0=time1;			//时间值迭代
    	        time1=time2;
    	        mc();					//毛刺处理    			
    	        timeval=time1-time0;
    	        if((timeval>300)&&(timeval<900))//判时间是否在数据码680us(L)范围内
    	        {
    	        
    	        	time0=time1;				//时间值迭代
    	            time1=time2;        
    	           	mc();						//毛刺处理    				
    	       		timeval=time1-time0;
    	            if((timeval>200)&&(timeval<800))//判时间是否在数据码500us(H)范围内
    	            {   	
    	            	jsdat[k]=_cror_(jsdat[k],1); //数据接收保存
    	            	jsdat[k]=jsdat[k]&0x7f;		//为数据码500us(H),置0
    	            }			
    	            else 
    	            {
    	            	if((timeval>1000)&&(timeval<2000))//判时间是否在数据码1600uS(H)范围内
    	            	{   
    	            		jsdat[k]=_cror_(jsdat[k],1); //数据接收保存
    	            		jsdat[k]=jsdat[k]|0x80;		 //为数据码1600us(H),置1
    	            	}
    	            	else
    	            	{					
    	            		yesdatbz=0;			//置无数据接收标志
    	            		yesredatbz=0;    	            	
    	            		return;
    	            	}
    	            }    	            
    	        }
    	        else
    	        {						 
					yesdatbz=0;		//置无数据接收标志
    	            yesredatbz=0; 	         	
    	         	return;
    	        }
    	     }    	   
    	 }    	
        yesdatbz=1;				//置接收到数据标志          			
        return;
	}     
    else
    {
    	if((timeval>1700)&&(timeval<2500))
   		 {									
    		yesredatbz=1;		//置持续码标志
    		return;
    	}
    	else
   		{									
    		yesdatbz=0;			//置无数据接收标志
    		yesredatbz=0; 
    	}
	}
}

//-----接收显示处理-----
void 	disdeal()
{
	if(yesdatbz==1)
	{
		if(jsdat[2]==~jsdat[3])//接收数据校验
		{
			diss[7]=jsdat[0]/16;//数据送显示缓冲区
			diss[6]=jsdat[0]%16;
			diss[5]=jsdat[1]/16;
			diss[4]=jsdat[1]%16;
			diss[1]=jsdat[2]/16;
			diss[0]=jsdat[2]%16;			
		}
		else
		{
			diss[1]=0x11;
			diss[0]=0x11;
		}
	}
	else
	{
		 if(yesredatbz==1)//接收持续码处理
		{
			return;
		}
		else
		{
			diss[1]=0x11;
			diss[0]=0x11;
		}
	}
}			

//-----延时子程序------
void delay()		
{
	unsigned int k,j;
	for(k=0;k<200;k++)		
	{
		for(j=0;j<500;j++);	
	}
}

//-----主程序-----
main()
{
	first();		//初始化
	while(1)
	{
		dis0();		//等待显示
		read();		//接收
		disdeal();	//接收处理
		disp();		//显示
		delay();	//延时	
	}
}	

⌨️ 快捷键说明

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