• 红外通信基础(含代码)


    红外发光二极管。它实际上是一只特殊的发光二极管

    编码方式

    • 二进制脉冲码的形式有多种,其中最为常用的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。

    数据格式

    • 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。数据反码是数据码反相后的编码,编码时可用于对数据的纠错。

    传输位定义

    • 用户码或数据码中的每一个位可以是位 ‘1’ ,也可以是位 ‘0’。区分 ‘0’和 ‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM

    传输过程,注意有上拉电阻,即输出端口默认为高电平

    附上代码

    /**************************************************************************************
    *		              红外通信实验												  *
    实现现象:	具体接线操作请参考视频
    			下载程序后,数码管显示红外遥控键值数据
    注意事项:	红外遥控模块的短接片J1短接,
    			红外遥控器内的电池绝缘片一定要抽掉																			  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    	
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    sbit IRIN=P3^2;
    
    u8 IrValue[6];
    u8 Time;
    
    u8 DisplayData[8];
    u8 code smgduan[17]={
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
    //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    
    /*******************************************************************************
    * 函数名         :DigDisplay()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<3;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=0;LSB=0;LSC=0; break;//显示第0位
    			case(1):
    				LSA=1;LSB=0;LSC=0; break;//显示第1位
    			case(2):
    				LSA=0;LSB=1;LSC=0; break;//显示第2位	
    		}
    		P0=DisplayData[i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    
    /*******************************************************************************
    * 函数名         : IrInit()
    * 函数功能		   : 初始化红外线接收
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    
    void IrInit()
    {
    	IT0=1;//下降沿触发
    	EX0=1;//打开中断0允许
    	EA=1;	//打开总中断
    
    	IRIN=1;//初始化端口
    }
    
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	IrInit();
    	while(1)
    	{	
    		DisplayData[0] = smgduan[IrValue[2]/16];
    		DisplayData[1] = smgduan[IrValue[2]%16];
    		DisplayData[2] = smgduan[16];
    	    DigDisplay();		
    	}		
    }
    
    /*******************************************************************************
    * 函数名         : ReadIr()
    * 函数功能		   : 读取红外数值的中断函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    
    void ReadIr() interrupt 0
    {
    	u8 j,k;
    	u16 err;
    	Time=0;					 
    	delay(700);	//7ms
    	if(IRIN==0)		//确认是否真的接收到正确的信号
    	{	 
    		
    		err=1000;				//1000*10us=10ms,超过说明接收到错误的信号
    		/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
    		侯,程序死在这里*/	
    		while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		
    		{			
    			delay(1);
    			err--;
    		} 
    		if(IRIN==1)			//如果正确等到9ms低电平
    		{
    			err=500;
    			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高电平过去
    			{
    				delay(1);
    				err--;
    			}
    			for(k=0;k<4;k++)		//共有4组数据
    			{				
    				for(j=0;j<8;j++)	//接收一组数据
    				{
    
    					err=60;		
    					while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
    					{
    						delay(1);
    						err--;
    					}
    					err=500;
    					while((IRIN==1)&&(err>0))	 //计算高电平的时间长度。
    					{
    						delay(10);	 //0.1ms
    						Time++;
    						err--;
    						if(Time>30)
    						{
    							return;
    						}
    					}
    					IrValue[k]>>=1;	 //k表示第几组数据
    					if(Time>=8)			//如果高电平出现大于565us,那么是1
    					{
    						IrValue[k]|=0x80;
    					}
    					Time=0;		//用完时间要重新赋值							
    				}
    			}
    		}
    		if(IrValue[2]!=~IrValue[3])
    		{
    			return;
    		}
    	}			
    }
    
    
    
  • 相关阅读:
    关闭浏览器清除cookie
    JSONP跨域请求数据报错 “Unexpected token :”的解决办法
    HTTP请求方法
    Html 中判断某个class的个数
    将div标签中的table水平居中
    js阻止事件冒泡
    Vue中V-bind的使用。为何标签中style="height:90px"也需要写为V-bind:style="height:90px",哪些属性需要绑定?哪些属性不需要绑定?
    css中 !important的作用。
    Notification通知
    DataAdapter中DeleteCommand和UpdateCommand
  • 原文地址:https://www.cnblogs.com/guguobao/p/9665641.html
Copyright © 2020-2023  润新知