一、红外遥控解码部分从昨天开始整,一直到现在才解码成功!中途遇到了不少问题,结果出来后还是觉得有必要总结一下,唉!
1、首先我又是怀疑我硬件电平不兼容德问题,后来给接上3.3v的电压,还是不行,好吧,算失败了,在网上查阅了比较多的帖子,也找了比较多的资料,最终还是决定用原本那个生了锈的遥控来解码!
2、然后准备参照着原来51的思想来移植代码,也确实找到类似的代码貌似使用的2.0的库写的,单步调试了半天,总感觉在延时部分出了点问题,所以比较郁闷,好吧,分析来分析去的,结果真的是没有半点现象啊!果断网上求助,游荡了一会,压根没人理,高手不屑一顾呀!!偶然间让我遇到了原子哥的那段红外的代码,拖出来分析,所以就有了今晚解码成功的结果!
3、我照着原子的移植,我用的是自己的延时,也就是系统定时器,mtd,单步调试的时候,发现居然死在了systick那里,进不了中断,一步步观察,好像导致进不了中断的原因就是:我已经进了外部中断,心想,没道理啊,系统定时器的优先级不应该是高于外部中断的么,因为他是核决定的呀(至少我是这么想的),然后又查了相关资料,据说系统定时器的中断优先级是最低的,这时候我才恍然大悟!
现在开始分析代码,虽然说原子的代码风格不怎么样,但是个人觉得他真的好牛逼,库函数是人家st公司搞出来的,我想,原子的这套代码,应该基本上是他自己一个人整出来的吧!
二、所谓红外遥控!(针对我手上的红外遥控)
1、红外解码一直是单片机中应用较多的,需要设备加装专用解码芯片,这就大大减轻了单片机的负担。需要单片机样例使用延时做红外解码,比较容易理解,
下面通过tc9012和upd6121芯片为例大致了解解码原理:
先看一接收头产生的波形图,这是原子的一张图
% u, k“ ?3 k2 _( j‘ a! e: k: o
从上图可以看出 9.0ms高电平+4.5ms低电平称为头码,用于识别是否遥控码开始,这是一张连续发射码的波形图(就是一直按下某一遥控器按键)。; n5 [
+ z; ^4 d( t# l) h” y6 b5 j3 t
头码过后会出现4个8位的数据,我们最终目的就是要把这个 32位(4x8)从一体化红外接收头提取出来,并转换成16进制数,用于区分不同按键按下得出的不同数值。
在遥控器发射波形中,可以知道,8位数中的0或者1不是用高低电平表示,而是用不同的低电平的宽度表示,0.565ms表示0,1.69ms表示1,2个位中间还会有一个0.56ms的高电平
看到如上图波形,表示单片机引脚可以接收到的波形,我们只要通过单片机读取波形并分析波形的宽度,然后分辨出是头码,还是0或者1,最后整理出这组码的16进制组合。正确的解码结果是按同一个按键得出的16进制数值是不变化的。通过这个原理,我们可以分辨出每个按键的键值。
! z7 b/ `2 q: z
基本原理分析如下,如接收到头码是4.5ms低电平+4.5ms高电平,我们分析 第一个下降沿到第二个下降沿的宽度是 9ms,我们判断这个头码可以给定一个范围,只要数据在这个范围内则认为头码是正确的,检测头码正确后接着检测剩下的32位数值。
2、用自己的话概括就是:平常是高电平---》按键按下---》产生引导码(9+4.5)ms---》然后判断是不是连续发送---》1还是0---》存储码值---》转换码值!简单就是这样!
3、首先是我的主程序,代码注释都非常详细,不解释了!注意码值需要依据自己的遥控而定,我就是单步测试出来的!
#include“stm32f10x.h”
#include“usart.h”
#include“stdio.h”
#include“remote_control.h”
#include“delay.h”
/**************************pa1接红外接收端************************************/
/************由于没有做外设测试的程序是:按键pa0仅一个led灯*******************/
/*******由于没有做外设测试的程序是:串口采用的是pa9-》(t《-》t),pa9-》(r《-》r)*****/
intmain(void)
{
u8key;
usart1_config();
delay_init(72);//延时初始化
nvic_prioritygroupconfig(nvic_prioritygroup_2);//设置nvic中断分组2:2位抢占优先级,2位响应优先级
printf(“rn(”__date__“-”__time__“)rn”);
remote_init();
while(1)
{
if(remote_rdy)
{
key=remote_process();
switch(key)
{
case0x68:printf(“0n”);break;//0
case0x30:printf(“1n”);break;//1
case0x18:printf(“2n”);break;//2
case0x7a:printf(“3n”);break;//3
case0x10:printf(“4n”);break;//4
case0x38:printf(“5n”);break;//5
case0x5a:printf(“6n”);break;//6
case0x42:printf(“7n”);break;//7
case0x4a:printf(“8n”);break;//8
case0x52:printf(“9n”);break;//9
default:break;
}
}
}
}
4、然后是驱动程序
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是发送4个8位二进制码,第一二个是遥控识别码(remote_id),第一个为
正码(0),第二个为反码(255),接着两个数据是键值,第一个为正码
第二个为反码。发送完后40ms,遥控再发送一个9ms低,2ms高的脉冲,
表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可
以认为是持续按下该键。
---------------------------------------------------------*/
#include“remote_control.h”
#include“delay.h”
u32remote_odr=0;//命令暂存处
u8remote_cnt=0;//按键次数,此次按下键的次数
u8remote_rdy=0;//红外接收到数据
/************************初始化红外接收引脚的设置**********************************/
/******************选择pa1脚作为外部中断,用于红外输入*****************************/
voidremote_init(void)
{
gpio_inittypedefgpio_initstructure;//gpio
nvic_inittypedefnvic_initstructure;//中断
exti_inittypedefexti_initstructure;//外部中断线
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_afio,enable);
gpio_initstructure.gpio_pin=gpio_pin_1;
gpio_initstructure.gpio_mode = gpio_mode_ipu ;
Facebook宣布研发操作系统安卓系统的有一个对手
索尼多层传感器专利,推动影像发展
vivo X Fold+新配色华夏红亮相
推动显示器行业创新发展,创维打响显示器行业的“变局之战”
怎样从传输线的等效电路推导出传输线的电报方程呢?
单片机的红外解码程序设计
简要介绍美国半导体的实力分析
基于计量芯片ATT7022B的交流配电柜监控系统设计
密码经济学和经济学的区别在于数字货币的行为和激励应用
新东方董事长加入比亚迪汉EV车主阵营
电子显示器件:现代信息显示技术的核心
英特尔Q2净赚42亿美元:利润是高通6倍,市值只有阿里一半
伺服电机控制器传动涉及到的产品部件
纯电动汽车日常使用习惯及保养注意事项
Magic Leap进行了他们第三次在Twitch的直播
最新可穿戴技术能隐身_是真是假?
急!67个欧美著名半导体公司热招高薪职位~
马斯克脑机技术公司Neuralink拟融资5100万美元,现已完成3900万美元
ev3颜色传感器能够识别几种颜色
边缘计算快速发展,瑞芯微探索模型在边缘侧应用