找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stm32f103c8t6学习型红外遥控器程序

[复制链接]
跳转到指定楼层
楼主
ID:846373 发表于 2020-12-21 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"
#include "bit_band.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "timer.h"
#include "infrared.h"
#include "SysTick.h"


u16 TIM2_IT_Update_Cnt = 0 ;                // TIM2的溢出次数,用于LED1的闪烁计时

int main(void)
{
        u16        user_code_16bit = 0x1234;        // 初始化16位用户码
        
        u8 data_code_8bit = 0x66 ;                // 初始化8位数据码
        
        u8 F_key_down = 0 ;                                // 按键按下标志位
        
        
        // 注:程序中使用中断时,NVIC分组设置应尽量位于程序起始处,并且在设置后尽量不要再更改NVIC分组

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //NVIC分组2:2位抢占优先级,2位响应优先级
        
  delay_Init();                                // 延时初始化(注:调用延时函数之前,必须先调用delay_Init()将SysTick初始化)
        
        LED_Init_JX() ;                                // 初始化LED硬件接口        
        
        KEY_Init_JX() ;                                // 初始化按键的硬件配置
        
        TIM2_Time_Init();                        // 初始化定时器2:1ms中断一次

        Infrared_IE_Init_JX();                // 初始化红外发射管脚:Infrared_IE = PB9
        
        Infrared_IR_Init_JX();                // 初始化红外接收管脚:Infrared_REMOTE_IN = PB8
        
        
        NEC_IE_code_message(user_code_16bit,data_code_8bit);        // 上电发送:用户码0x1234 + 数据码0x66
        
        
        while(1)
        {        
                // 判断是否接收到有效的NEC红外信息
                if(Current_bit_CNT>=34)
                {
                        // 解码NEC格式红外信息
                        if( ! NEC_IR_decode_message() )
                        {
                                // 判断数据码和数据码反码是否相反
                                if( Receive_data_code_8bit == (u8)(~Receive_data_code_opposite) )
                                {
                                        // 避免重复保存
                                        if( user_code_16bit!=Receive_user_code_16bit || data_code_8bit!=Receive_data_code_8bit )
                                        {
                                                user_code_16bit = Receive_user_code_16bit;        // 保存用户码
                                       
                                                data_code_8bit  = Receive_data_code_8bit ;        // 保存数据码
                                                                                                
                                                PB_out(5) = 0;        // LED0亮一下,表示将红外码接收
                                                delay_ms(200);
                                                PB_out(5) = 1;
                                        }
                                }
                        }
                }
               
                // 按键发码
                KEY_Scan_delay_JX();        // 扫描按键是否按下
               
                if( S_KEY_down == 0x04 )
                {
                        if( F_key_down == 0 )
                        {
                                F_key_down = 1;        // 长按只有效一次
                                
                                NEC_IE_code_message(user_code_16bit,data_code_8bit);        // 红外发送:用户码 + 数据码
                                
                                
                        }
                }
               
                else F_key_down = 0;
               
        }        
        
}


// TIM2中断:20ms更新中断一次
void TIM2_IRQHandler(void)                                                                           //TIM2中断
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)                  //判断是否为TIM2的更新中断
        {
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update );                          //清除TIM2更新中断标志
               
               
                // 当接收到一个下降沿后,下一个下降沿须在20ms内被接收到,否则此次红外接收认为是出错的
                Current_bit_CNT = 0;        // 将当前红外接收的位数清0
               
                TIM2_IT_Update_Cnt ++ ;
               
                if( TIM2_IT_Update_Cnt >= 25 )                // LED1闪烁速率:1s
                {
                        TIM2_IT_Update_Cnt = 0 ;
                        
                        
                        PA_out(5) = !PA_out(5);                // LED1闪烁
                }
        }
}
//红外接收管脚PB8的下降沿中断函数
void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)         // 判断是否为中断线0的中断
        {
                EXTI_ClearITPendingBit(EXTI_Line0);     // 清除中断标志位
                                
                Each_bit_duration[Current_bit_CNT] = TIM2->CNT;        // 将此下降沿的TIM2计数存入Each_bit_duration[x]中
               
                Current_bit_CNT ++ ;        // 将当前红外接收的位数+1
               
               
                // 1、方便下一个下降沿的计时
                // 2、等待下一个下降沿20ms
                TIM2->CNT=0;                        // 红外接收管脚接收到一个下降沿后,将TIM2计数器清0
        }         
}


stm32f103c8t6标准库.7z

465.37 KB, 下载次数: 83, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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