龙空技术网

51单片机C语言编程(十)-红外通信

Lizayer 105

前言:

现时朋友们对“新概念51单片机c语言教程第二版 pdf”大致比较关注,同学们都想要了解一些“新概念51单片机c语言教程第二版 pdf”的相关知识。那么小编也在网上网罗了一些有关“新概念51单片机c语言教程第二版 pdf””的相关知识,希望兄弟们能喜欢,同学们快快来了解一下吧!

/***************************************************************************************		 红外通信实验												 *实现现象:下载程序后,数码管显示红外遥控键值数据注意事项:	红外遥控器内的电池绝缘片一定要抽掉																			 ***************************************************************************************/#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[2-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;		}	}			}

编译生成的hex文件,下载到单片机的CPU中,即可实验。

标签: #新概念51单片机c语言教程第二版 pdf #消隐c语言 #红外传感器的c语言程序