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

📄 ir.c

📁 嵌入式C修炼之道,35页,写得很精妙,非常有用
💻 C
字号:
#include<reg52.h>
#define XBYTE ((char *) 0x20000L)
sbit IR=P3^2;
unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char R_data[32];
unsigned char leddata[2];
//************************************************************************************************
//延时4ms
//************************************************************************************************
void delay4ms()
{
	int time=3686;
	while(--time);//延时2*time个机器周期     
}


//************************************************************************************************
//延时600us
//************************************************************************************************
void delay600us()
{
	int time=553;
	while(--time);//延时2*time个机器周期   
}


//************************************************************************************************
//延时500us
//************************************************************************************************
void delay500us()
{
	int time=460;
	while(--time);//延时2*time个机器周期   
}

//************************************************************************************************
//延时2ms
//************************************************************************************************
void delay2ms()
{
	int time=1843;
	while(--time);//延时2*time个机器周期     
}
//************************************************************************************************
//引导码
//************************************************************************************************
void start_code()
{
	
	if(IR==1)//现在是接收别处发送过来的数据,不是模拟时钟脉冲
	{
		while(IR);//高电平就一直空循环,等待低电平到来
		delay4ms();//低电平到来就延时4ms(要小于4.5ms)
		while(IR==0);//在等待高电平的到来
		delay4ms();//高电平到来再延时4ms
	}
}



//***********************************************************************************************
//读数据
//***********************************************************************************************
void read_data(void)
{
	unsigned char count,zancun;
	while(IR);//高电平,等待低电平
	delay500us();//可以延时,也可以省略此延时
	
//	if()
//	for(count=0;count<32;count++)
//	{
		while(IR==0);//等待高电平
		delay600us();//超过560us再判断是高是低,即判断每个数据位高电平的宽度
		if(IR)
		{
			zancun=R_data[0];
			R_data[0]=1;
			while(IR);//等待低电平
			while(IR==0);//在等待高电平的到来
			delay2ms();//延时超过数据1的高电平时间,低于1周期的时间,若还是1就为连发码
			if(IR==1)
				{
					R_data[0]=zancun;	    
				}
			else
				for(count=1;count<32;count++)
				{
					while(IR==0);//等待高电平
					delay600us();
					if(IR)
					{
						R_data[count]=1;
						while(IR);
					}
					else
						R_data[count]=0;
				}
		}
		else
		{
			for(count=0;count<32;count++)
				{
					while(IR==0);//等待高电平
					delay600us();
					if(IR)
					{
						R_data[count]=1;
						while(IR);
					}
					else
						R_data[count]=0;
				}
		}
//	}	
}



//**********************************************************************************************
//检验连发码
/**********************************************************************************************
unsigned char void con_code(void)
{
	unsigned char tag;
//	zancun=R_data[0];		
//	R_data[0]=1;
	while(IR==0);//在等待高电平的到来
	delay2ms;//延时超过数据1的高电平时间,低于1周期的时间,若还是1就为连发码
	if(IR==1)
		tag=1;
	else
		tag=0;	
	return(teg);	
}
*/


//**********************************************************************************************
//显示
//**********************************************************************************************
void display()
{
	unsigned char i;
	for(i = 0; i < 2 ; i++)
	{
		XBYTE[0xc000] = ~(0x01<<i);	//选择数码管
		XBYTE[0xb000] = num[leddata[i]];	//显示数字
		delay4ms();
	}	
}



//**********************************************************************************************
//数据转换
//**********************************************************************************************
void trans()
{
	unsigned char i,tmp=0;
	for(i=0;i<8;i++)
	{
		tmp=(R_data[16+i]<<i)|tmp;//低位在前
	}
	leddata[0]=(tmp&0xf0)>>4;
	leddata[1]=tmp&0x0f;
}



//**********************************************************************************************
//main函数
//**********************************************************************************************
void main()
{
//	unsigned char i;
	XBYTE[0xa000] =0;
	while(1)//程序一直在循环,要判断连发码
	{
		start_code();
		read_data();
		trans();
		display();
	}	
}

⌨️ 快捷键说明

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