找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1664|回复: 0
打印 上一主题 下一主题
收起左侧

STM32红外通信实验程序 实现最基本的红外命令控制

[复制链接]
跳转到指定楼层
楼主
ID:555895 发表于 2021-1-17 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PA0为红外接收模块信号口
能实现最基本的红外命令控制
仅供参考
主函数
  1. uint8_t IrValue[4];         //设置一个4元素数组变量

  2. void delay_us(uint16_t time)     //粗略微秒延时函数
  3. {   
  4.    uint16_t i=0;  
  5.    while(time--)
  6.    {
  7.       i=10;  
  8.       while(i--) ;   
  9.    }
  10. }

  11. int main(void)                                                  //主函数
  12. {
  13.         
  14.         EXTI_Config();
  15.         GPIO_Config();
  16.                                 
  17.         while(1)
  18.         {               
  19.                 if(IrValue[2] == 0x46)  //红外按键键值
  20.                 {
  21.                         GPIO_SetBits(GPIOB,GPIO_Pin_0);
  22.                 }                        
  23.                 else
  24.                 {
  25.                         GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  26.                 }
  27.         }               
  28.                
  29. }
复制代码
中断服务函数
  1. void EXTI0_IRQHandler(void)//中断服务函数
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line0) == 1)
  4.         {
  5.                 uint16_t i,j;
  6.                 uint16_t Time=0;
  7.                                 
  8.                
  9.                 delay_us(5000);        //延时5ms
  10.                
  11.                 if(DO==1)               //确定不是外界干扰,DO为红外模块OUT口连接的引脚PA0
  12.                 {
  13.                         return;
  14.                 }               
  15.                 while(!DO);   //跳过9ms
  16.                 while(DO);    //跳过4.5ms
  17.                
  18.                 for(j=0;j<4;j++)
  19.                 {
  20.                         for(i=0;i<8;i++)
  21.                         {
  22.                                 while(!DO);
  23.                                 while(DO)
  24.                                 {
  25.                                         delay_us(100);
  26.                                         Time++;
  27.                                         if(Time>30)
  28.                                         {
  29.                                                 return;
  30.                                         }                                       
  31.                                 }
  32.                                 IrValue[j] = IrValue[j] >>1;
  33.                                 if(Time>=10)
  34.                                 {
  35.                                                 IrValue[j] |= 0x80;
  36.                                 }                                
  37.                                 Time=0;
  38.                         }
  39.                 }                                                        
  40.         }
  41.         EXTI_ClearITPendingBit(EXTI_Line0);
  42. }
复制代码
中断配置函数
  1. void EXTI_Config(void)              //中断初始化配置函数
  2. {
  3.         GPIO_InitTypeDef  GPIO_InitStruct;//GPIO结构体变量
  4.         EXTI_InitTypeDef  EXTI_InitStruct;//EXTI结构体变量
  5.         NVIC_InitTypeDef  NVIC_InitStruct;//NVIC结构体变量
  6.         
  7.         //NVIC初始化配置
  8.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  9.         NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
  10.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  11.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  12.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  13.         NVIC_Init(&NVIC_InitStruct);
  14.         
  15.         //GPIO初始化配置
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  17.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  18.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  19.         GPIO_Init(GPIOA,&GPIO_InitStruct);        
  20.         
  21.         //EXTI初始化配置
  22.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  23.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
  24.         EXTI_InitStruct.EXTI_Line = EXTI_Line0;
  25.         EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
  26.         EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
  27.         EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  28.         EXTI_Init(&EXTI_InitStruct);
  29. }
复制代码

全部资料51hei下载地址:
IR.7z (175.27 KB, 下载次数: 32)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表