1. 首页 > 百科问答 > nec单片机(红外遥控系统的基础)

nec单片机(红外遥控系统的基础)

红外遥控编码格式

一体化红外接收头

STM32显示遥控器按下的数字代码

代码片

总结

红外遥控编码格式

现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。两种形式编码的代表分别为NEC 和PHILIPS 的RC-5、RC-6 以及将来的RC-7。

NEC 格式的特征:

1:使用38 kHz 载波频率

2:引导码间隔是9 ms + 4.5 ms

3:使用16 位客户代码

4:使用8 位数据代码和8 位取反的数据代码

NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PWM) 。 逻辑“0”是由0.56ms的38KHZ载波和0.56ms 的无载波间隔组成; 逻辑“1”是由0.56ms 的38KHZ 载波和1.68ms 的无载波间隔组成; 结束位是0.56ms 的38K 载波。

PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。RC5 编码相对简单一些:

得到一组数字: 110, 11010, 001101根据编码定义:

第一位是起始位S通常是逻辑1

第二位是场位F通常为逻辑1, 在RC5 扩展模式下它将最后6位命令代码扩充到7 位代码(高位MSB) , 这样可以从64 个键值扩充到128 个键值。

第三位是控制位C它在每按下了一个键后翻转, 这样就可以区分一个键到底是一直按着没松手还是松手后重复按。

其后是五个系统地址位:11010=1A, 最后是六个命令位:001101=0D。

一体化红外接收头

红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。

红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。

红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。

STM32显示遥控器按下的数字代码

STM32与红外接收头的连接

一体化红外接收头原理图

代码片

//红外遥控初始化

//设置IO以及定时器3的输入捕获

void Remote_Init(void)

{

RCC->APB1ENR|=1<<1; //TIM3 时钟使能

RCC->APB2ENR|=1<<3; //使能PORTB时钟

GPIOB->CRL&=0XFFFFFFF0; //PB0 输入

GPIOB->CRL|=0X00000008; //上拉输入

GPIOB->ODR|=1<<0; //PB0 上拉


TIM3->ARR=10000; //设定计数器自动重装值 最大10ms溢出

TIM3->PSC=71; //预分频器,1M的计数频率,1us加1.

TIM3->CCMR2|=1<<0; //CC3S=01 选择输入端 IC3映射到TI3上

TIM3->CCMR2|=3<<4; //IC3F=0011 配置输入滤波器 8个定时器时钟周期滤波

TIM3->CCMR2|=0<<2; //IC3PS=00 配置输入分频,不分频

TIM3->CCER|=0<<9; //CC3P=0 上升沿捕获

TIM3->CCER|=1<<8; //CC3E=1 允许捕获计数器的值到捕获寄存器中

TIM3->DIER|=1<<3; //允许CC3IE捕获中断

TIM3->DIER|=1<<0; //允许更新中断

TIM3->CR1|=0x01; //使能定时器3

MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2

}


//遥控器接收状态

//[7]:收到了引导码标志

//[6]:得到了一个按键的所有信息

//[5]:保留

//[4]:标记上升沿是否已经被捕获

//[3:0]:溢出计时器

u8 RmtSta=0;

u16 Dval; //下降沿时计数器的值

u32 RmtRec=0; //红外接收到的数据

u8 RmtCnt=0; //按键按下的次数

//定时器3中断服务程序

void TIM3_IRQHandler(void)

{

u16 tsr;

tsr=TIM3->SR;

if(tsr&0X01)//溢出

{

if(RmtSta&0x80)//上次有数据被接收到了

{

RmtSta&=~0X10; //取消上升沿已经被捕获标记

if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集

if((RmtSta&0X0F)<14)RmtSta++;

else

{

RmtSta&=~(1<<7);//清空引导标识

RmtSta&=0XF0; //清空计数器

}

}

}

if(tsr&(1<<3))//CC3IE中断

{

if(RDATA)//上升沿捕获

{

TIM3->CCER|=1<<9; //CC3P=1 设置为下降沿捕获

TIM3->CNT=0; //清空定时器值

RmtSta|=0X10; //标记上升沿已经被捕获

}else //下降沿捕获

{


Dval=TIM3->CCR3; //读取CCR3也可以清CC2IF标志位

TIM3->CCER&=~(1<<9); //CC3P=0 设置为上升沿捕获


if(RmtSta&0X10) //完成一次高电平捕获

{

if(RmtSta&0X80)//接收到了引导码

{


if(Dval>300&&Dval<800) //560为标准值,560us

{

RmtRec<<=1; //左移一位.

RmtRec|=0; //接收到0

}else if(Dval>1400&&Dval<1800) //1680为标准值,1680us

{

RmtRec<<=1; //左移一位.

RmtRec|=1; //接收到1

}else if(Dval>2200&&Dval<2600) //得到按键键值增加的信息 2500为标准值2.5ms

{

RmtCnt++; //按键次数增加1次

RmtSta&=0XF0; //清空计时器

}

}else if(Dval>4200&&Dval<4700) //4500为标准值4.5ms

{

RmtSta|=1<<7; //标记成功接收到了引导码

RmtCnt=0; //清除按键次数计数器

}

}

RmtSta&=~(1<<4);

}

}

TIM3->SR=0;//清除中断标志位

}

//处理红外键盘

//返回值:

// 0,没有任何按键按下

//其他,按下的按键键值.

u8 Remote_Scan(void)

{

u8 sta=0;

u8 t1,t2;

if(RmtSta&(1<<6))//得到一个按键的所有信息了

{

t1=RmtRec>>24; //得到地址码

t2=(RmtRec>>16)&0xff; //得到地址反码

if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址

{

t1=RmtRec>>8;

t2=RmtRec;

if(t1==(u8)~t2)sta=t1;//键值正确

}

if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了

{

RmtSta&=~(1<<6);//清除接收到有效按键标识

RmtCnt=0; //清除按键次数计数器

}

}

return sta;

}

// 共阴数字数组

// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭

u8 smg_num[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};

u8 key=0; //按键值

u8 num=0x00;//数值

u8 num1=0x00;//数值

u8 smg_wei=6;//数码管位选

u8 smg_duan=0;//数码管段选

u8 smg_flag=0;//数码管显示标志 0:正常显示 1:不显示(消除鬼影)

u8 t=0;

int main(void)

{


Stm32_Clock_Init(9); //系统时钟设置

uart_init(72,115200); //串口初始化为115200

delay_init(72); //延时初始化

BEEP_Init(); //蜂鸣器初始化

LED_Init(); //初始化与LED连接的硬件接口

LED_SMG_Init(); //数码管初始化

TIM4_Init(19,7199); //数码管2ms定时显示

Remote_Init(); //红外接收初始化

while(1);

}

void TIM4_IRQHandler(void) //TIM4中断

{


if(TIM4->SR&0X0001)//溢出中断

{

key = Remote_Scan();//获取红外遥控键值

if(key)

{

switch(key)

{

case 104:num1=0x00; num = smg_num[1]; BEEP=0;break; //按键'1'

case 152:num1=0x00;num=smg_num[2];BEEP=0;break; //按键'2'

case 176:num1=0x00;num=smg_num[3];BEEP=0;break; //按键'3'

case 48:num1=0x00;num=smg_num[4];BEEP=0;break; //按键'4'

case 24:num1=0x00;num=smg_num[5];BEEP=0;break; //按键'5'

case 122:num1=0x00;num=smg_num[6];BEEP=0;break; //按键'6'

case 16:num1=0x00;num=smg_num[7];BEEP=0;break; //按键'7'

case 56:num1=0x00;num=smg_num[8];BEEP=0;break; //按键'8'

case 90:num1=0x00;num=smg_num[9];BEEP=0;break; //按键'9'

case 66:num1=0x00;num=smg_num[0];BEEP=0;break; //按键'0'

case 82:num1=0x00;num=smg_num[17];BEEP=0;break; //按键'DELETE'

case 162:num1=smg_num[1];num=smg_num[0];BEEP=0; break;//按键'POWER'

case 98:num1=smg_num[1];num=smg_num[1];BEEP=0; break;//按键'UP'

case 226:num1=smg_num[1];num=smg_num[2];BEEP=0; break;//按键'ALIENTEK'

case 34:num1=smg_num[1];num=smg_num[3];BEEP=0; break;//按键'LEFT'

case 2:num1=smg_num[1];num=smg_num[4];BEEP=0; break;//按键'PLAY'

case 194:num1=smg_num[1];num=smg_num[5];BEEP=0; break;//按键'RIGHT'

case 224:num1=smg_num[1];num=smg_num[6];BEEP=0; break;//按键'VOL-'

case 168:num1=smg_num[1];num=smg_num[7];BEEP=0; break;//按键'DOWN'

case 144:num1=smg_num[1];num=smg_num[8];BEEP=0; break;//按键'VOL+'

}

}else

{

BEEP=1;

}

if(smg_wei==6)//数码管位

{

smg_duan = num1;

}

else if(smg_wei==7)//数码管位

{

smg_duan = num;

}

if(smg_flag) LED_Write_Data(0x00,smg_wei);//消除鬼影(段码不显示)

else LED_Write_Data(smg_duan,smg_wei);//正常显示

LED_Refresh();//数码管数据更新

smg_flag=!smg_flag;

if(smg_flag==0)//正常显示才更新位码

{

smg_wei++;

if(smg_wei==8) smg_wei=6;

}

t++;

if(t==250)//LED0每500MS闪烁

{

t=0;

LED0=!LED0;

}

}

TIM4->SR&=~(1<<0);//清除中断标志位


}

总结

通过本实验了解了NEC红外遥控解码的基本原理。红外遥控器的键码都是固定的,不同的遥控器的键码可能会不一样。红外遥控器也可以用红外发射管自己搭建发射电路,单片机程序进行编码,红外接收头根据编码规则进行解码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至3237157959@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:10:00-18:30,节假日休息