STM32单片机解码NEC红外控制器C语言程序

来源:本站
导读:目前正在解读《STM32单片机解码NEC红外控制器C语言程序》的相关信息,《STM32单片机解码NEC红外控制器C语言程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32单片机解码NEC红外控制器C语言程序》的详细说明。
简介:红外遥控器发射码值的协议有很多种,在百度文库里搜“史​上​最​全​的​红​外​遥​控​器​编​码​协​议”,可以看到是有43种,但是我们今天是解码NEC红外协议的,几乎所有的开发板带的小遥控器都是这个协议的,我是用的定时器配合外部中断写的解码程序。


#include "ir_exti.h"

//利用外部中断和定时器进行红外解码

//在51上学习的

u8 irtime;//定时器时间累加

u8 irflag;//接收到第一个下降沿的标志

u8 irdate;//接收下降沿次数的累加

u8 irtable[33];//装每一次下降沿的时间

//u8 irdateok;

u8 irtable2[4];//解码出地址和数据 地址 地址反码 数据 数据反码

u8 irdatewokeok;//解出正确的数据就把此标志位置1

u8 repeat=0;//按住不放标志位

void TIMER2_INIT(u16 psc,u16 arr);

//战舰板子上面的红外信号端链接在PB9上面,我们把外部中断映射到PB9上即可

void IR_EXTI_INIT()

{

RCC->APB2ENR|=1<<3;//打开PB口时钟

GPIOB->CRH&=0XFFFFFF0F;//清除PB9的原有状态

GPIOB->CRH|=0X00000080;//设置PB9为输入

GPIOB->ODR|=1<<9; //设置PB9输出高电平,上拉

Ex_NVIC_Config(GPIO_B,9,1);//TRIM:触发模式,1,下降沿;2,上升沿;3,任意电平触发

MY_NVIC_Init(1,0,EXTI9_5_IRQChannel,2);

TIMER2_INIT(71,99);//产生0.1ms的中断

}

//定时器2初始化函数

//psc预分频系数,arr自动重装载寄存器

//APB1=36M 则TIM3=72M

//Tout= ((arr+1)*(psc+1))/Tclk

void TIMER2_INIT(u16 psc,u16 arr)

{

RCC->APB1ENR|=1<<0;//开启定时器2的时钟

TIM2->ARR=arr;

TIM2->PSC=psc;

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

//默认是向上计数

TIM2->CR1|=1<<0;//使能计数器

MY_NVIC_Init(1,0,TIM2_IRQChannel,2);

}

void TIM2_IRQHandler(void)

{

static u16 i=0;

if(TIM2->SR&0X0001)

{

irtime++;

//i*10=1(ms) 110ms:i=1100

if(repeat&&(i>1500))//当时间超时了,就把按住不放次数清零

{

i++;

if(i>1500)

{

i=0;

repeat=0;

}

}

}

TIM2->SR&=~(1<<0);

}

//IR解码

void irdatewoke(void)

{

u8 k,value,i,j;

k=1;

for(j=0;j<4;j++)

{

for(i=0;i<8;i++)

{

value=value>>1;

if(irtable[k]>=17)//这个17随着定时器中断时间而改变

{

value=value|0x80;

}

k++;

}

irtable2[j]=value;

}

if(irtable2[0]==(u8)(~irtable2[1]))

{

if(irtable2[2]==(u8)(~irtable2[3]))

irdatewokeok=1;

}

//irdatewokeok=1;

}

//显示测试函数

void diswoke(void)

{

printf("%d %d %d %drn",irtable2[0],irtable2[1],irtable2[2],irtable2[3]);

}

void EXTI9_5_IRQHandler(void)

{

if(irflag)

{

if(irtime>90)//这个90随着中断时间而改变

{

if(irdate==1)

{

repeat++;

irflag=0;

printf("%drn",repeat);

}

else

{

repeat=0;

}

irdate=0;

}

irtable[irdate]=irtime;

irtime=0;

irdate++;

if(irdate==33)

{

irdate=0;

irflag=0;

irdatewoke();

if(irdatewokeok==1)

diswoke();//发送到串口小助手上

irdatewokeok=0;

}

}

else

{

irflag=1;

irtime=0;

}

EXTI->PR=1<<9; //清除 LINE0 上的中断标志位

}

//我得到的键值,左到右、上到下

提醒:《STM32单片机解码NEC红外控制器C语言程序》最后刷新时间 2024-03-14 01:09:42,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32单片机解码NEC红外控制器C语言程序》该内容的真实性请自行鉴别。