标题:
基于stm32的红外遥控器学习与发射程序源码
[打印本页]
作者:
wjs1033
时间:
2018-7-12 15:21
标题:
基于stm32的红外遥控器学习与发射程序源码
通过载波学习红外,并可还原发送出去
单片机源程序如下:
#include "stdio.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "myuart.h"
#include "ir.h"
#include "irsend.h"
#include "learn.h"
#include "key.h"
#include "pwm.h"
#include "remoteflash.h"
#include "lcd.h"
/* 接口
发送指示灯 LED_SEND -- PC.0
学习指示灯 LED_COPY -- PC.1
按键 K1 -- PA.3
K2 -- PA.4
K3 -- PA.5
K4 -- PA.6
K5 -- PA.7
学习按键 KEY -- PA.2
接收使能 DQ -- PC.3
红外接收引脚 OUT -- PA.1
载波38K 38K -- PA.0
发送控制 Txd -- PC.2
*/
u8 Flag_RemoteSet = 0;
u8 Flag_LearnState = 0;
extern u16 PulseTab[];
int main(void)
{
u16 i;
u8 temp = 0;
/* 延时函数初始化 */
DelayInit();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
/* MYUART 初始化 */
MY_UartInit(9600);
/* KEY 初始化 */
KEY_Init();
LearnKEY_Init();
/* PWM 初始化 */
TIM2_PWM_Init(1895,0); //72000/(1895+1) = 37.99K
/* LED 初始化 */
LED_Init();
/* IR 初始化 */
IR_Init(); // 红外接收函数
SendPort_Init();
/* TFT1.8初始化 */
LCD_PortInit();
LCD_Init();
/***************************** 以下添加代码区 *****************************/
/* 设置窗口 */
LCD_SetRamAddr(0,127, 0,29);
for(i=0; i<3839; i++) LCD_Wirte_Data16(CYAN);
ChineseChar(32,10,0,BLACK,CYAN,1); // 遥
ChineseChar(48,10,0,BLACK,CYAN,2); // 控
ChineseChar(64,10,0,BLACK,CYAN,3); // 器
ChineseChar(80,10,0,BLACK,CYAN,4); // 码
LCD_SetRamAddr(0,127,30,89);
for(i=0; i<11520; i++) LCD_Wirte_Data16(YELLOW);
ChineseChar(0,40,0,BLACK,YELLOW,5); // 红
ChineseChar(15,40,0,BLACK,YELLOW,6);// 外
ChineseChar(30,40,0,BLACK,YELLOW,7);// 协
ChineseChar(45,40,0,BLACK,YELLOW,8);// 议
LCD_ShowChar(55,40,BLACK,YELLOW,':');
LCD_SetRamAddr(0,127,90,159);
for(i=0; i<11520; i++) LCD_Wirte_Data16(PUEPLE);
ChineseChar( 0,100,0,BLACK,PUEPLE,1); // 红
ChineseChar(15,100,0,BLACK,PUEPLE,2); // 外
ChineseChar(30,100,0,BLACK,PUEPLE,9); // 状
ChineseChar(45,100,0,BLACK,PUEPLE,10); // 态
LCD_ShowChar(55,100,BLACK,PUEPLE,':');
/***************************** 以上添加代码区 *****************************/
LEARN_ON = 0; // 关闭红外接收
LED1 = 1; // 收到脉冲指示
LED_SEND = 1; // 发送状态指示
LED2 = 0;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
// TFTDisplay(); // 测试
while(1)
{
/* 页面定义 */
//#define KEY1_ADDR 0x0807E000 VOL+
//#define KEY2_ADDR 0x0807E800 VOL-
//#define KEY3_ADDR 0x0807F000 CH+
//#define KEY4_ADDR 0x0807F800 CH-
//#define KEY5_ADDR 0x0807D800 POWER
//#define VOL_UP 1
//#define VOL_DOWN 2
//#define CH_UP 3
//#define CH_DOWN 4
//#define PWR_ON 5
LED2 = 0;
temp = KEY_Scan(0); // 按键扫描,非连按模式
/* 红外协议检测 */
if(PulseTab[1]>3500 && PulseTab[1]<5500) {
LCD_ShowString(50,65,BLACK,YELLOW,"NEC ");
}else{
LCD_ShowString(50,65,BLACK,YELLOW,"Other");
}
/* 遥控器状态检测 */
if((Flag_RemoteSet==0) && (temp!=0)) {
LCD_ShowString(18,120,BLACK,PUEPLE,"Sending....");
}
if((Flag_RemoteSet==0) && (temp==0)) {
LCD_ShowString(18,120,BLACK,PUEPLE,"Idle State ");
}
// TFTDisplay(); // 测试
//=======================学习状态=======================//
if(Flag_RemoteSet == 1){
// ChineseChar(20,110,2,BLACK,PUEPLE,1);// 学
// ChineseChar(45,110,2,BLACK,PUEPLE,2);// 习
// ChineseChar(70,1` 10,2,BLACK,PUEPLE,3);// 中
// LCD_ShowString(95,115,BLACK,YELLOW,"...");
//LCD_ShowString(18,115,BLACK,PUEPLE,"Learning...");
switch(temp){
case VOL_UP :temp = 0; // 按键按下标志清零
LED3 = ~LED3; // 调试用
FLASH_WriteData(KEY1_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
break;
case VOL_DOWN:temp = 0; // 按键按下标志清零
LED3 = ~LED3;
FLASH_WriteData(KEY2_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
break;
case CH_UP :temp = 0; // 按键按下标志清零
LED3 = ~LED3;
FLASH_WriteData(KEY3_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
break;
case CH_DOWN :temp = 0; // 按键按下标志清零
LED3 = ~LED3;
FLASH_WriteData(KEY4_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
break;
case PWR_ON :temp = 0; // 按键按下标志清零
LED3 = ~LED3;
FLASH_WriteData(KEY5_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
break;
}
}
//=======================发送状态=======================//
if(Flag_RemoteSet == 0){
//LCD_ShowString(18,115,BLACK,PUEPLE,"SendingStat");
switch(temp){
case VOL_UP :temp = 0; // 按键按下标志清零
SendLight(1); // 发送指示灯亮
//LED3 = ~LED3; // 调试用
IR_SendData(KEY1_ADDR); // 红外发送
delay_ms(150);
SendLight(0); // 发送完熄灭
break;
case VOL_DOWN:temp = 0; // 按键按下标志清零
SendLight(1); //发送指示灯亮
//LED3 = ~LED3;
IR_SendData(KEY2_ADDR);
delay_ms(150);
SendLight(0);
break;
case CH_UP :temp = 0; // 按键按下标志清零
SendLight(1); //发送指示灯亮
//LED3 = ~LED3;
IR_SendData(KEY3_ADDR);
delay_ms(150);
SendLight(0);
break;
case CH_DOWN :temp = 0; // 按键按下标志清零
SendLight(1); //发送指示灯亮
//LED3 = ~LED3;
IR_SendData(KEY4_ADDR);
delay_ms(150);
SendLight(0);
break;
case PWR_ON :temp = 0; // 按键按下标志清零
SendLight(1); //发送指示灯亮
//LED3 = ~LED3;
IR_SendData(KEY5_ADDR);
delay_ms(150);
SendLight(0);
break;
}
}
}
}
复制代码
所有资料51hei提供下载:
IR_remote.zip
(382.88 KB, 下载次数: 579)
2018-7-12 15:23 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
择一城终老
时间:
2018-7-30 15:54
楼主你好,很有用的学习资料,这里想问个问题,这个红外发射的硬件电路,你是通过三极管b基级(即PC2口)负责控制,c集电极是38K载波信号,是这样的吗?
作者:
择一城终老
时间:
2018-7-30 15:58
楼主你好,资料非常有用,想问个问题,红外发射模块的硬件电路,是b基级(PC2口)负责控制,然后c集电极是38K载波信号吗?
作者:
leng_qian
时间:
2018-11-14 11:18
楼主你好,很有用的学习资料,这里想问个问题,这个红外发射的硬件电路,你是通过三极管b基级(即PC2口)负责控制,c集电极是38K载波信号,是这样的吗?
作者:
hughtain
时间:
2019-2-28 10:31
感谢楼主的分享,我下载来参考,如果可行,真的感激
作者:
li121788501
时间:
2019-3-25 16:42
感谢楼主的分享,我下载来参考,如果可行,真的感激
作者:
1436925556
时间:
2019-5-1 07:47
下载试试看,谢谢分享
作者:
yuanxiang1
时间:
2019-5-2 07:45
资料不错值得学习
作者:
hopepan
时间:
2019-7-17 11:48
就想要个积分下载,以后可能用得上,先储存
作者:
zxasq
时间:
2019-7-20 11:12
很好像下载过来看看
作者:
wang930626
时间:
2019-8-2 09:38
下载学习学习,感谢楼主分享!!!
作者:
BG6BXN
时间:
2019-8-2 18:52
没有看到硬件原理图
作者:
壹勿所知
时间:
2019-11-18 15:59
感谢楼主分享
作者:
czr027010
时间:
2019-11-19 20:35
非常感谢
作者:
Monday_
时间:
2019-11-24 20:41
非常感谢楼主的分享
作者:
取个名字真的难
时间:
2020-3-21 23:05
感谢楼主的分享,我下载来参考,如果可行,真的感激
作者:
roadgo
时间:
2020-3-24 21:40
感谢楼主的分享,我下载来参考,如果可行,真的感激
作者:
potatoo
时间:
2020-3-25 15:23
非常感谢楼主分享,下载来做参考,感谢。
作者:
lyseg
时间:
2020-3-27 09:55
非常感谢楼主的分享
作者:
liberv
时间:
2021-1-29 08:41
没有看到硬件原理图
作者:
Grey.Tu
时间:
2021-7-25 16:33
@择一城终老
好像红外频率是38K吧, 三极管选型需要支持38K.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1