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

📄 main.c

📁 手把手教你单片机
💻 C
字号:
/*
* 红外接收数据,中断方式,并通过串口发送
*
* 晶振:11.0592M
*/

#include <reg52.h>

typedef unsigned char uint8;

sbit Ir_Pin = P3^3;

uint8 Ir_Buf[4]; //用于保存解码结果


/*
 * 外部中断初始化
*/
void int1_init(void)
{
	IT1 = 1; //下降沿有效
	EX1 = 1;
	EA = 1;
}

/*
 * UART初始化
 * 波特率:9600
*/
void uart_init(void)
{
    TMOD = 0x21; 
    SCON = 0x50; 

    TH1 = 0xFD;
    TL1 = 0xFD;

    TR1 = 1;
}

/*
 * UART发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
	SBUF = dat;
	while (TI == 0);
	TI = 0;
}


/*
 * 获取低电平时间
*/
unsigned int Ir_Get_Low()
{
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	while (!Ir_Pin && (TH0&0x80)==0);  
              
	TR0 = 0;           
	return (TH0 * 256 + TL0);
}

/*
 * 获取高电平时间
*/
unsigned int Ir_Get_High()
{
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	while (Ir_Pin && (TH0&0x80)==0);

	TR0 = 0;
	return (TH0 * 256 + TL0);
}


main()
{
	uart_init();
	int1_init();

	while (1);
}

void int1_isr() interrupt 2
{
	unsigned int temp;
	char i,j;

	temp = Ir_Get_Low();
	if ((temp < 7833) || (temp > 8755))  //引导脉冲低电平8500~9500us
		return;
	temp = Ir_Get_High();
	if ((temp < 3686) || (temp > 4608))  //引导脉冲高电平4000~5000us
		return;

	for (i=0; i<4; i++) //4个字节
	{
		for (j=0; j<8; j++) //每个字节8位
		{
			temp = Ir_Get_Low();
			if ((temp < 184) || (temp > 737)) //200~800us
				return;

			temp = Ir_Get_High();
			if ((temp < 184) || (temp > 1843)) //200~2000us
				return;

			Ir_Buf[i] >>= 1;
			if (temp > 1032) //1120us
				Ir_Buf[i] |= 0x80;
		}
	}

	UART_Send_Byte(Ir_Buf[0]);
	UART_Send_Byte(Ir_Buf[1]);
	UART_Send_Byte(Ir_Buf[2]);
	UART_Send_Byte(Ir_Buf[3]);
}



⌨️ 快捷键说明

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