当前位置:
文档之家› STM32 实验21 红外遥控实验
STM32 实验21 红外遥控实验
//初始化红外接收引脚的设置
//开启中断,并映射
void Remote_Init(void)
{
RCC->APB2ENR|=1<<2;
//PA 时钟使能
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000080; //PA1 输入
GPIOA->ODR|=1<<1;
//PA.1 上拉
接着是发送 4 个 8 位二进制码,第一二个是遥控识别码(REMOTE_ID),第一个为
正码(0),第二个为反码(255),接着两个数据是键值,第一个为正码
第二个为反码.发送完后 40ms,遥控再发送一个 9ms 低,2ms 高的脉冲,
表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可
以认为是持续按下该键.
POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"REMOTE TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2010/6/17");
321
3.21.2 硬件设计
本实验采用中断解码(也可以采用输入捕获解码),本节实验功能简介:开机在 LCD 上显示 一些信息之后,即进入等待红外触发,如过接收到正确的红外信号,则解码,并在 LCD 上显示 键值和所代表的意义,以及按键次数等信息。同样我们也是用 LED0 来指示程序正在运行。
所要用到的硬件资源如下: 1)STM32F103RBT6。 2)DS0(外部 LED0)。 3)TFTLCD 液晶模块。 4)红外接收头。 5)红外遥控器。 前面三部分,在之前的实例已经介绍过了,遥控器属于外部器件,遥控接收头在板子上, 与MCU的连接原理图如下:
{
res=Pulse_Width_Check();//获得此次高脉冲宽度
if(res==250)break;//非有用信号
if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
else if(res>=85&&res<200) //按键次数加一(2ms)
{
Remote_Rdy=1;//接受到数据
{
u8 t=0;
while(RDATA)
{
t++;delay_us(20);
if(t==250)return t; //超时溢出
}
return t;
}
//处理红外接收
/*-------------------------协议--------------------------
323
开始拉低 9ms,接着是一个 4.5ms 的高脉冲,通知器件开始传送数据了
LCD_ShowString(30,130, "KEYVAL:"); LCD_ShowString(130,130,"KEYCNT:"); LCD_ShowString(30,150, "SYMBOL:"); while(1) {
if(Remote_Rdy) {
key=Remote_Process(); LCD_ShowNum(86,130,key,3,16);//显示键值 LCD_ShowNum(186,130,Remote_Cnt,3,16);//显示按键次数 switch(key) {
Remote_Cnt++;//按键次数增加
break;
}
else if(res>=50&&res<85)RODATA=1;//1.5ms
else if(res>=10&&res<50)RODATA=0;//500us
(OK)
{
Remote_Odr<<=1;
Remote_Odr+=RODATA;
Remote_Cnt=0; //按键次数清零
#include "remote.h"
#include "delay.h"
//Mini STM32 开发板
//红外遥控接收 驱动函数
//正点原子@ALIENTEK
//2010/6/17
u32 Remote_Odr=0; //命令暂存处
u8 Remote_Cnt=0; //按键次数,此次按下键的次数
u8 Remote_Rdy=0; //红外接收到数据
Ex_NVIC_Config(GPIO_A,1,FTIR);//将 line1 映射到 PA.1,下降沿触发.
MY_NVIC_Init(2,1,EXTI1_IRQChannel,2);
}
//检测脉冲宽度
//最长脉宽为 5ms
//返回值:x,代表脉宽为 x*20us(x=1~250);
u8 Pulse_Width_Check(void)
图 3.21.2.2 红外遥控器
322
3.21.3 软件设计
打开上一节的工程,首先在 HARDWARE 文件夹下新建一个 REMOTE 的文件夹。然后新
建一个 remote.c 和 remote.h 的文件保存在 REMOTE 文件夹下,并将这个文件夹加入头文件包
含路径。
打开 remote.c 文件,输入如下代码:
图 3.21.2.1 红外遥控接收头与 STM32 的连接电路图 红外遥控接收头与 STM32 的 PA1 通过跳线帽连接,这个在硬件上要连接上,否则 PA1 将 得不到信号,我们采用中断解码,PA1 对应的中断为中断 1,所以在程序设计的时候,我们只 要开启中断 1,然后在中断里执行解码就可以了。 开发板配套的红外遥控器外观如下:
}
}
}
EXTI->PR=1<<1;
//清除中断标志位
}
//处理红外键盘
//返回相应的键值
u8 Remote_Process(void)
{
u8 t1,t2;
324
t1=Remote_Odr>>24; //红外解码 t2=(Remote_Odr>>16)&0xff; Remote_Rdy=0;//清除标记 if(t1==(u8)~t2&&t1==REMOTE_ID)//检验遥控识别码(ID) {
u8 key; u8 t; Stm32_Clock_Init(9);//系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口 1 初始化
325
LCD_Init(); LED_Init(); Remote_Init();
//初始化液晶 //LED 初始化 //初始化红外接收
extern u8 Remote_Cnt; //按键次数,此次按下键的次数 extern u8 Remote_Rdy; //红外接收到数据 extern u32 Remote_Odr; //命令暂存处 void Remote_Init(void); //红外传感器接收头引脚初始化 u8 Remote_Process(void); //红外接收到数据处理 u8 Pulse_Width_Check(void);//检查脉宽 #endif 这里的 REMOTE_ID 就是我们开发板配套的遥控器的识别码,对于其他遥控器可能不一样, 只要修改这个为你所使用的遥控器的一致就可以了。其他是一些函数的声明,我们保存此部分 代码,然后在 test.c 里面修改主函数如下: int main(void) {
3.21 红外遥控实验
ALIENTKE MiniSTM3 开发板给使用者配备了标准的红外接收头和一个很小巧的红外遥控 器。本节将向大家介绍,如何在 ALIENTEK MiniSTM32 开发板上实现红外遥控器的控制。本 节分为如下几个部分:
3.21.1 红外遥控简介 3.21.2 硬件设计 3.21.3 软件设计 3.21.4 下载与测试
t1=Remote_Odr>>8; t2=Remote_Odr; if(t1==(u8)~t2)return t1; //处理键值 } return 0; } 该部分代码比较简单,主要是通过中断解码,解码程序是按照前面介绍的 NEC 码来解的, 在这里我们就不再多说了。保存 remote.c,然后把该文件加入 HARDWARE 组下。接下来打开 remote.h 在该文件里面加入如下代码: #ifndef __RED_H #define __RED_H #include "sys.h" //Mini STM32 开发板 //红外遥控接收 驱动函数 //正点原子@ALIENTEK //2010/6/17 #define RDATA PAin(1) //红外数据输入脚 //红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的. //我们选用的遥控器识别码为 0 #define REMOTE_ID 0
图 3.21.1.1 按键 2 所对应的红外波形 从图中可以看到,其地址码为 0,控制码为 168。可以看到在 100ms 之后,我们还受到了 几个脉冲,这是 NEC 码规定的连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平+97.94ms 高 电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,即连发码,可 以通过统计连发码的次数来标记按键按下的长短/次数。
红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。我们配套的遥控器使用的是 NEC 协议,其特征如 下: 1、8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控 接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到 的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码 由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可 用于校验)。 我们遥控器的按键 2 按下时,从红外接收头端收到的波形如下: