【转载请注明出处:http://blog.csdn.net/leytton/article/details/38687537

本程序主要利用外部中断,实现红外遥控器信号接收解码,并利用串口通信把编码传至计算机显示

注:请用质量好点的遥控器实验用了劣质遥控器浪费了一天时间,数据位接收总是不完整,后来用宿舍空调遥控器就解码成功了

相关资料

STM32单片机学习(2) 外部中断 http://blog.csdn.net/leytton/article/details/38063335

STM32单片机学习(3) 串口中断通信  http://blog.csdn.net/leytton/article/details/38393553

STM32单片机学习(7) 串口通信printf重定向 http://blog.csdn.net/leytton/article/details/38393967

STM32-外设篇 视频教程(Cortex-M3)-主讲人:刘洋   http://yun.baidu.com/pcloud/album/info?uk=2853967793&album_id=5492137931588632574

效果如图:格力空调遥控器红外信号接收解码,很多复合按键编码,不同编码实现不同空调功能

贴代码:

/*******************************************************************************
*
* 软件功能:  红外线接收
*
*******************************************************************************/
#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART1_Configuration(void);
void Uart1_PutChar(u8 ch);
void Uart1_PutString(u8* buf , u8 len);
int fputc(int ch, FILE *f);void NVIC_Configuration(void);
void EXTI_Configuration(void);u8 HW_ReceiveTime(void);/*************************************************
函数: int main(void)
功能: main主函数
参数: 无
返回: 无
**************************************************/
int main(void)
{RCC_Configuration();GPIO_Configuration();delay_init(72);USART1_Configuration();NVIC_Configuration();EXTI_Configuration();printf("start\n");GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭   while(1);
}/*************************************************
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
**************************************************/
void RCC_Configuration(void)
{ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHzRCC_PLLCmd(ENABLE);                                   //使能PLL时钟while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪{}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟{}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOA、USART1、AFIO时钟
}/*************************************************
函数: void GPIO_Configuration(void)
功能: GPIO配置
参数: 无
返回: 无
**************************************************/
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复合推挽输出   GPIO_Init(GPIOA, &GPIO_InitStructure);        //PA9串口输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;    //红外接收GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //配置成上拉输入; GPIO_Init(GPIOA, &GPIO_InitStructure);}/*******************************************************************************函数名:USART1_Configuration输  入:输  出:功能说明:初始化串口硬件设备,启用中断配置步骤:(1)打开GPIO和USART1的时钟(2)设置USART1两个管脚GPIO模式(3)配置USART1数据格式、波特率等参数(4)使能USART1接收中断功能(5)最后使能USART1功能
*/
void USART1_Configuration(void)   //串口配置   详见《STM32的函数说明(中文).pdf》P346
{USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600;   //波特率为9600USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //数据位为8USART_InitStructure.USART_StopBits=USART_StopBits_1; //在帧结尾传输 1 个停止位USART_InitStructure.USART_Parity=USART_Parity_No; //校验模式:奇偶失能USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制失能USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能发送和接收模式:发送使能|接收失能USART_Init(USART1, &USART_InitStructure);    //初始化配置USART_Cmd(USART1,ENABLE);  //使能或者失能 USART 外设USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.USART_FLAG_TC为发送完成标志位
}//发送一个字符
void Uart1_PutChar(u8 ch)
{USART_SendData(USART1, (u8) ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成
}//发送一个字符串 Input : buf为发送数据的地址 , len为发送字符的个数
void Uart1_PutString(u8* buf , u8 len)
{   u8 i;for(i=0;i<len;i++){Uart1_PutChar(*(buf++));}
}int fputc(int ch, FILE *f)
{
Uart1_PutChar((u8)ch);  //此处为自定义函数,参见串口中断通信,请勿盲目复制
return (ch);
}void NVIC_Configuration(void)   //中断分组和优先级配置    详见《STM32的函数说明(中文).pdf》P165
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);     //0组,先占优先级0位,从优先级4位NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中断线 9_5 中断(5-9号引脚是统一使用中断线EXTI9_5_IRQn)NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     //0组无抢占优先级,所以只配置从优先级,即响应式优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(& NVIC_InitStructure); //初始化配置
}void EXTI_Configuration(void)  //中断配置  //详见《STM32的函数说明(中文).pdf》      P99
{EXTI_InitTypeDef EXTI_InitStructure;       EXTI_ClearITPendingBit(EXTI_Line8);//清除 EXTI 线路挂起位EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求EXTI_InitStructure.EXTI_Line = EXTI_Line8; //外部中断线 8EXTI_InitStructure.EXTI_LineCmd   = ENABLE;//使能EXTI_Init(& EXTI_InitStructure); //初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);    ///*将EXTI线8连接到PA8*/
}u8 HW_ReceiveTime(void)
{u8 t=0;while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)//高电平{t++;delay_us(20);if(t>=250) return t;//超时溢出}return t;
}/*********************************************************中断服务程序
********************************************************/
void EXTI9_5_IRQHandler()
{u8 time=0,startSignal=0,Data=0,Count=0;u32 HW_ReceivedData=0;//printf("1\n");if(EXTI_GetITStatus(EXTI_Line8) == SET)//检查指定的EXTI线路触发请求发生与否,返回一个EXTI_Line新状态{//printf("5\n"); //if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))  GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED//else  GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1){time = HW_ReceiveTime();if(time>=250){//printf("VoverTime:%x\n",time); startSignal=0;HW_ReceivedData=0;Count=0;break;} else if(time>=200 && time<250){startSignal=1;//收到起始信号HW_ReceivedData=0;Count=0;continue;} else if(time>=60 && time<90)  Data=1;//收到数据 1else if(time>=10 && time<50)  Data=0;//收到数据 0//printf("%x ",Data);if(startSignal==1){HW_ReceivedData<<=1;HW_ReceivedData+=Data;Count++;if(Count>=32){//printf("received:%x\n",HW_ReceivedData);if(HW_ReceivedData==0x1090000a)  printf("红外编码:0x%8X,指令:打开空调\n",HW_ReceivedData);else if(HW_ReceivedData==0x90000a)  printf("红外编码:0x%08X,指令:关闭空调\n",HW_ReceivedData);else   printf("红外编码:0x%08X,指令:未知\n",HW_ReceivedData);HW_ReceivedData=0;Count=0;startSignal=0;break;} }      }}EXTI_ClearITPendingBit(EXTI_Line8);//清除线路挂起位EXTI_ClearFlag(EXTI_Line8);//清除中断挂起位 }
}

STM32单片机(12) 红外信号接收解码(外部中断)相关推荐

  1. LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口

    LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...

  2. 51单片机入门教程(6)——外部中断

    51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...

  3. stm32单片机+amg8833+红外热成像/单片机红外测温成像/stm32 amg8833红外热成像

    基于stm32单片机的amg8833红外热成像/单片机红外测温成像,测温模块用的是AMG8833 IR 8x8红外热像传感器. 具体功能:可红外热成像,可以设置报警阈值,可以语音播报温度异常,单片机s ...

  4. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

    前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且 ...

  5. 【STM32学习笔记】(13)——外部中断详解

    EXTI 简介         EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...

  6. 单片机实验说明<二>外部中断基本使用

    实验二 外部中断应用 设计要求: 自行设计实验线路并编制程序:要求在无外部中断时最右一位发光二极管点亮.请编程实现:当外部中断0请求中断时发光二极管左移:当外部中断1请求中断时发光二极管闪烁. 电路设 ...

  7. 【蓝桥杯嵌入式】【STM32】2_KEYBOARD(主循环扫描+外部中断)

    文章目录 1 原理图 2 部分源码 主循环扫描实现 外部中断实现   下载工程文件:   https://gitee.com/Joseph_Cooper/blue-bridge-embedded 1 ...

  8. 单片机第四次实验课——外部中断实验

    (1)通过外部中断使 P1 口的开关控制 8 个发光二极管,开始是 P1.0 所接的灯亮,以后每中断一次,下一个灯亮,顺序左移,周而复始. (2)外部中断控制 P1 口连接的 8 个发光二极管,同时亮 ...

  9. 基于单片机的红外遥控接收仿真设计(#0023)

    功能描述 1.本系统由遥控器+接收机两部分组成: 2.遥控器部分由51单片机+矩阵键盘组成: 3.接收机部分由51单片机+1602液晶组成: 4.当遥控器键盘按下时,接收机液晶显示按下的对应键值: 仿 ...

最新文章

  1. Spring系列之AOP实现的两种方式
  2. AT91SAM9XEK ramdisk 启动笔记
  3. C++STL——概述
  4. CF1305E Kuroni and the Score Distribution
  5. P4254-[JSOI2008]Blue Mary开公司【李超树】
  6. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
  7. [Python] Ubuntu 安装/卸载 python
  8. C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
  9. python 中读取yaml
  10. (9)Redis-Cluster集群理论及实践【下】
  11. Hardware概述
  12. 遗传算法求解立体仓库货位优化
  13. C#基础之vs2010安装与使用教程
  14. Zookeeper轻松上手
  15. Userland中debian系统打开chromium
  16. 小哈机器人发布新品_解决孩子学习烦恼 小哈教育机器人二代新品上市
  17. Dreamweaver CS6下载及安装步骤
  18. 组装电脑中毒目录变exe应用程序文件恢复方案
  19. 电路板上的这些标志你都知道是什么含义吗?
  20. jQuery 遍历 - 后代

热门文章

  1. 软件工程 学习管理系统 需求分析文档
  2. 如何在水晶报表中添加条形码-winform ,c#.net
  3. ABOV单片机端口引脚GPIO讲解及示例代码-[MC96F6332D]
  4. 快乐数(HappyNumber)
  5. JAVA开发常用API及封装
  6. 盛天海电商:拼多多的等级制度
  7. vue3搭建多页面应用的方法
  8. java反射机制到底是什么?
  9. YouTube资源利用——1)Clip Converter在线下载
  10. Portal技术在SOA系统集成应用中的实现