野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9422|回复: 5

红外遥控

[复制链接]
发表于 2016-1-21 16:44:03 | 显示全部楼层 |阅读模式
我把定时器配置为1us中断一次,调试不出来
7)KOP{NQWQ]3SLG}T[B6YAD.png
回复

使用道具 举报

发表于 2016-1-21 17:08:02 | 显示全部楼层
最好你调试跟踪一下看看问题出哪里?
回复 支持 反对

使用道具 举报

发表于 2016-1-24 11:26:24 | 显示全部楼层
u8         irtime; //红外时间
u32        irdata;
u8         irreceiveok;//红外接收完毕



//红外接收初始化
//IR_IN                PA6
void Remote_Init(void)                              
{  
        GPIO_InitTypeDef GPIO_InitStructure; //GPIO
        NVIC_InitTypeDef NVIC_InitStructure; //中断
        EXTI_InitTypeDef EXTI_InitStructure; //外部中断线
   
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );   

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//上拉输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);   //选择PA6所在的GPIO管脚用作外部中断线路EXIT6

        EXTI_InitStructure.EXTI_Line = EXTI_Line6; //外部线路EXIT6
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求  EXTI_Mode_Event ;//设置
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//外部中断触发沿选择:设置输入线路下 降 沿为中断请求
        EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断新状态
        EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄

        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  //使能按键所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
        static u8 i;
        static u8 startflag;
        if(EXTI_GetITStatus(EXTI_Line6)!=RESET)//判断某个线上的中断是否发生
        {
                EXTI_ClearITPendingBit(EXTI_Line6);
                //捕获2个下降沿之差
                if(startflag)
                {
                        if(irtime>=160&&irtime<=180)//引导码 标准13.5ms 13500us
                        {
                                i=0;
                                irdata=0;
                        }
                        else
                        {
                                i++;
                                if(irtime>=13&&irtime<=18)//Logic 0 标准[1.125ms] 1125us
                                {
                                        irdata<<=1;
                                }       
                                if(irtime>=24&&irtime<=32)//Logic 1 标准[2.250ms]        2250us
                                {
                                        irdata+=1;
                                        irdata<<=1;
                                }
                                if(i>=32) //处理完一帧 4个字节
                                {
                                        i=0;//一开始没有 ,出错,只能检测 一次红外值 。再按键没反应
                                        irreceiveok=1;
                                        startflag=0;
                                }
                        }
         
                }
                else
                {
                        startflag=1;
                }
                irtime=0;
        }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-24 15:10:39 | 显示全部楼层
vimli 发表于 2016-1-24 11:26
u8         irtime; //红外时间
u32        irdata;
u8         irreceiveok;//红外接收完毕

能把完整的发给我吗
回复 支持 反对

使用道具 举报

发表于 2016-2-19 23:19:24 | 显示全部楼层
#include "time.h"
#include "remote.h"

extern vu8 Count;                        //延时计数器
extern vu8 Flag;                   //红外发送标志

extern u8 irtime; // 红外时间
/*
* 函数名:TIM2_NVIC_Configuration
* 描述  :TIM2中断优先级配置
* 输入  :无
* 输出  :无       
*/
void TIM2_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
                                                                                                             
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2中断          
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//先占优先级1级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//从优先级3级               
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);
}
/*TIM_Period--640   TIM_Prescaler--8 -->中断周期为80us*/
void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
    TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period=640;                                                                                 /* 自动重装载寄存器周期的值(计数值) */
    /* 累计 TIM_Period个频率后产生一个更新或者中断 */
    TIM_TimeBaseStructure.TIM_Prescaler= (9 - 1);                                    /* 时钟预分频数 72M/9 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                 /* 采样分频 */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);                                                                            /* 清除溢出中断标志 */
                TIM_SetCounter(TIM2,0x00);//清零计数器值
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM2, ENABLE);
}
/**
  * @brief  This function handles TIM2 interrupt request.
  * @param  None
  * @retval : None
  */
void TIM2_IRQHandler(void)
{
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) == SET )
        {       
                irtime++;
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
        }               
}
回复 支持 反对

使用道具 举报

发表于 2016-4-9 16:44:43 | 显示全部楼层
vimli 发表于 2016-2-19 23:19
#include "time.h"
#include "remote.h"

为什么我在红外遥控实验的代码中找不到你这段?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-11 21:00 , Processed in 0.029374 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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