您的位置 首页 新品

单片机的红外解码程序设计

单片机的红外解码程序设计-我照着原子的移植,我用的是自己的延时,也就是系统定时器,MTD,单步调试的时候,发现居然死在了systick那里,进不了中断,一步步观察,好像导致进不了中断的原因就是:我已经进了外部中断,心想,没道理啊,系统定时器的优先级不应该是高于外部中断的么,因为他是核决定的呀(至少我是这么想的),然后又查了相关资料,据说系统定时器的中断优先级是最低的,这时候我才恍然大悟!

一、红外遥控解码部分从昨日开端整,一向到现在才解码成功!半途遇到了不少问题,成果出来后仍是觉得有必要总结一下,唉!

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位(4×8)从一体化红外接纳头提取出来,并转化成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 ; 
责任编辑;zl

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/343554.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部