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

📄 sendircode.c

📁 原创ateml avr 单片机遥控器解码程序
💻 C
字号:
#include <SendIRCode.h>
BYTE sendIRintervaltimecount;
unsigned int  sendIRintervaltimecounttemp;	//存储第一次发送数据后低电平持续的时间  31.5MS--49.5MS
BYTE sendIRdatatemp;				//传输遥控码时使用的临时变量
BYTE sendIRdata;					//要发送的遥控码
BYTE sendIRbitcount;				//计算一个字节16位电平发送完没
BYTE sendIRstate;					//遥控码发送状态
	//1:	传输引导码高电平			9ms
	//2:	传输引导码低电平			4.5ms
	//3:	传输客户码高位
	//4:	传输客户码低位		3+4=	18-27ms
	//5:	传输遥控码高位
	//6:	传输遥控码低位		5+6 =	27ms
	//7:	传输截止码高电平			560us
	//8:	传输截止码低电平			31.5MS--49.5MS
	
	//9:	传输重复发送引导码高电平	9ms
	//10:	传输重复发送引导码高电平	2.25ms
	//11:	传输截止码高电平			560us
	//12:	传输截止码低电平			96190us


void TIMER0Init(void)
{	
	BYTE i,j,k;
	
	SetPortIROutPut();							//遥控输出所使用的IO口设为输出
	SetPortIRHigh();							//设置遥控输出口为高电平
	TCNT_IR=0;//TCNT0=0;						//初始化T0计数器

	//*******************************************设置T0的工作时钟频率是主频的几分之一  
	sbi(TCCR0,CS02);
	cbi(TCCR0,CS01);
	sbi(TCCR0,CS00);
	//*******************************************设置T0的工作时钟频率是主频的几分之一  
			
	sendIRstate=0;								//初始化遥控码发送状态

	//********************************************计算第一次发送数据后低电平持续的时间  31.5MS--49.5MS
	j=IRCUSTOMCODEH;
	k=0;
	for(i=0;i<8;i++)
	{
		if(j&0x80)
			k++;
		j<<=1;
	}
	j=IRCUSTOMCODEL;
	for(i=0;i<8;i++)
	{
		if(j&0x80)
			k++;
		j<<=1;
	}
	sendIRintervaltimecounttemp=TIMER0_108MS-TIMER0_9MS*4-TIMER0_4500US-TIMER0_560US*32-
									(TIMER0_1685US-TIMER0_560US)*k;				
	//*********************************************计算第一次发送数据后低电平持续的时间  31.5MS--49.5MS
}


//向遥控接收口发送一个遥控码IRdata,客户码高位是IRCUSTOMCODEH,客户码低位是IRCUSTOMCODEL

void SendIRCodeStart(BYTE IRdata)
{
	sendIRdata=IRdata;
	sendIRintervaltimecount=0;	
	sendIRstate=1;
	TCNT_IR=0;
	sbi(TIMSK,TOV0);//TIMSK |=0x01;									//T0中断允许
}


//停止发送遥控码
void SendIRCodeStop(void)
{
	sendIRstate=0;
	SetPortIRHigh();
	cbi(TIMSK,TOV0); //TIMSK &=0xFE;								//T0中断关闭
}

//向遥控接收口发送一个字节数据
void SendIRByte(BYTE data)
{
	if(sendIRbitcount==0)
	{
		sendIRbitcount=16;
		sendIRdatatemp=data;
	}	
	if(sendIRbitcount&0x01)
	{	
		SetPortIRHigh();
		if(sendIRdatatemp&0x80)
			sendIRintervaltimecount=TIMER0_1685US;
		else
			sendIRintervaltimecount=TIMER0_560US;
		sendIRdatatemp<<=1;
	}
	else
	{					
		SetPortIRLow();
		sendIRintervaltimecount=TIMER0_560US;
	}
	sendIRbitcount--;
	if(sendIRbitcount==0)
		sendIRstate++;
}



	//sendIRstate
	//1:	传输引导码高电平			9ms
	//2:	传输引导码低电平			4.5ms
	//3:	传输客户码高位
	//4:	传输客户码低位		3+4=	18-27ms
	//5:	传输遥控码高位
	//6:	传输遥控码低位		5+6 =	27ms
	//7:	传输截止码高电平			560us
	//8:	传输截止码低电平			31.5MS--49.5MS
	
	//9:	传输重复发送引导码高电平	9ms
	//10:	传输重复发送引导码高电平	2.25ms
	//11:	传输截止码高电平			560us
	//12:	传输截止码低电平			96190us
ISR(TIMER0_OVF_vect)
{
	TCNT0=TCNT0_560US;
	if(sendIRstate!=0)
	{
		sendIRintervaltimecount--;
		if(sendIRintervaltimecount==0)
		{
			switch(sendIRstate)
			{

				case 1:
				case 9:
					SetPortIRLow();
					sendIRintervaltimecount=TIMER0_9MS;
					sendIRstate++;
					break;
				case 2:
					SetPortIRHigh();
					sendIRintervaltimecount=TIMER0_4500US;
					sendIRstate++;
					break;
				case 3:
					SendIRByte(IRCUSTOMCODEH);
					break;
				case 4:
					SendIRByte(IRCUSTOMCODEL);
					break;
				case 5:
					SendIRByte(sendIRdata);
					break;
				case 6:
					SendIRByte(~sendIRdata);
					break;
				case 7:	
				case 11:		
					SetPortIRLow();
					sendIRintervaltimecount=TIMER0_560US;
					sendIRstate++;
					break;
				case 8:		
					SetPortIRHigh();
					sendIRintervaltimecount=sendIRintervaltimecounttemp;
					sendIRstate++;
					break;
					
				case 10:		
					SetPortIRHigh();
					sendIRintervaltimecount=TIMER0_2250US;
					sendIRstate++;
					break;
				case 12:		
					SetPortIRHigh();
					sendIRintervaltimecount=TIMER0_96190us;
					sendIRstate=9;								//重复发送
					break;
			}
		}
	}	
}

⌨️ 快捷键说明

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