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

📄 38k.c

📁 51的红外接收程序
💻 C
字号:
/*******************************************************
38K载波接收程序 T1产生波特率 T0用于精确定时            *
数据格式  起始位(9ms 高 4.5ms 低)+8位数据              *
(0.560ms 高  0.565 低:0    1.685ms 高 0.565ms 低:1)    *
write by wisdom           2008-8                       *
*******************************************************/
#include <AT89X51.h> 

#define IR_IN P3_4
unsigned char IR_Data;

//#define _MHz_ 11.0592


void Init_INT0(void)
{
	IT0=1;    	//INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
	EX0=1;    	//外部中断INT0开, (1:开,      0:关    )
	EA=1;    	//开所有中断
}


//T0 精确定时   T1产生波特率  初始化串口
void Init_Timer(void)
{
	TMOD=0x21;		//T0 mode 1      T1 mode 2 
	SCON=0x50;		//mode 1 8位   允许接受
	PCON|=0x80;		//smod=1    波特率=2^SMOD/32 * fosc/(12*(256-X)
	TH1=250;                    //256-11.0592/12.0/9600/16*1000000;
	TL1=TH1;
	TR1=1;
}


void Delay10ms(void)
{
		TH0=220;				//(65536-us/12*11.0592)/256; 
		TL0=0;					//(65536-us/12*11.0592)%256;
		TR0=1;
		while(!TF0);
		TF0=0;
}

void Delay0_8ms(void)
{

}


void main(void)
{
	Init_INT0();
	Init_Timer();
	IR_IN=1;			//set IR_IN as i

	while(1)
	{
		TI=0;
		SBUF=IR_Data;
		while(!TI);
		TI=0;
		Delay10ms();
	}
}


//-----------------------------------------------------------------------
//INT0 ISR
void INT0_ISR(void) interrupt IE0_VECTOR using 1
{
	unsigned char i;
	EA=0;

	IR_Data=0;
	for(i=0;i<4;i++)
	{
		Delay0_8ms();
		if(IR_IN==1)			//0.8ms后位1,不是起始位
			{
				i=5;
				break;
			}
		else if(i==3)			//3.2ms后,判断是起始位
		{
			while(IR_IN==1);
		}
	}
	for(i=0;i<8;i++)
	{
		Delay0_8ms();
		IR_Data=IR_Data<<1;
		if(IR_IN==1)
			IR_Data=IR_Data|0x01;			//接收1
		else
			IR_Data=IR_Data & 0xFE;			//接收0
	}
	EA=1;
}

⌨️ 快捷键说明

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