📄 sendircode.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 + -