找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32+UCOS+红外控制+编码为志高空调遥控器编码

  [复制链接]
跳转到指定楼层
楼主
ID:373829 发表于 2018-7-18 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
UCOS + 红外控制+编码为志高空调遥控器编码

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"
  7. #include "IR_ENCODE.h"
  8. #include "pwm.h"
  9. #include "includes.h"
  10. #include "remote.h"
  11. #include "24cxx.h"
  12. #include "myiic.h"
  13. #include "touch.h"


  14. #define KEYMSG_Q_NUM        1        //按键消息队列的数量
  15. #define RMOTEMSG_Q_NUM        1        //按键消息队列的数量

  16. OS_Q KEY_Msg;                                //定义一个消息队列,用于按键消息传递,模拟消息邮箱
  17. //OS_Q REMOTE_Msg;
  18. OS_SEM *REMOTE_Sem;
  19. //任务优先级
  20. #define START_TASK_PRIO                3
  21. //任务堆栈大小       
  22. #define START_STK_SIZE                 128
  23. //任务控制块
  24. OS_TCB StartTaskTCB;
  25. //任务堆栈       
  26. CPU_STK START_TASK_STK[START_STK_SIZE];
  27. //任务函数
  28. void start_task(void *p_arg);

  29. //任务优先级
  30. #define TASK1_TASK_PRIO                5
  31. //任务堆栈大小       
  32. #define TASK1_STK_SIZE                 128
  33. //任务控制块
  34. OS_TCB Task1_TaskTCB;
  35. //任务堆栈       
  36. CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
  37. void task1_task(void *p_arg);


  38. //任务优先级
  39. #define TASK2_TASK_PRIO                6
  40. //任务堆栈大小       
  41. #define TASK2_STK_SIZE                 128
  42. //任务控制块
  43. OS_TCB Task2_TaskTCB;
  44. //任务堆栈       
  45. CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
  46. void task2_task(void *p_arg);

  47. //任务优先级
  48. #define TASK3_TASK_PRIO                4
  49. //任务堆栈大小       
  50. #define TASK3_STK_SIZE                 128
  51. //任务控制块
  52. OS_TCB Task3_TaskTCB;
  53. //任务堆栈       
  54. CPU_STK TASK3_TASK_STK[TASK3_STK_SIZE];
  55. void task3_task(void *p_arg);

  56. //任务优先级
  57. #define TASK4_TASK_PRIO                7
  58. //任务堆栈大小       
  59. #define TASK4_STK_SIZE                 128
  60. //任务控制块
  61. OS_TCB Task4_TaskTCB;
  62. //任务堆栈       
  63. CPU_STK TASK4_TASK_STK[TASK4_STK_SIZE];
  64. void task4_task(void *p_arg);


  65. //u8 share_resource[30];   //共享资源区

  66. static u8 ucLCD_SW=1;
  67. //主函数
  68. int main(void)
  69. {
  70.         OS_ERR err;
  71.         u32 Timer3_Frq;
  72.         CPU_SR_ALLOC();
  73.        
  74.         delay_init();  //时钟初始化
  75.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
  76.         uart_init(115200);   //串口初始化
  77.         LED_Init();         //LED初始化       
  78.         LCD_Init();                        //LCD初始化       
  79.         KEY_Init();                        //按键初始化
  80.         tp_dev.init();
  81.         Timer3_Frq=38500;
  82.         PWM_Freq_Set(Timer3_Frq); //38KHz
  83.         Remote_Init();            //初始化红外接收
  84.         POINT_COLOR = RED;
  85.         LCD_Clear(LIGHTBLUE);


  86.         OSInit(&err);                    //初始化UCOSIII
  87.         OS_CRITICAL_ENTER();        //进入临界区                         
  88.         //创建开始任务
  89.         OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块
  90.                                  (CPU_CHAR        * )"start task",                 //任务名字
  91.                  (OS_TASK_PTR )start_task,                         //任务函数
  92.                  (void                * )0,                                        //传递给任务函数的参数
  93.                  (OS_PRIO          )START_TASK_PRIO,     //任务优先级
  94.                  (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址
  95.                  (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位
  96.                  (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小
  97.                  (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
  98.                  (OS_TICK          )0,                                        //当使能时间片轮转时的时间片长度,为0时为默认长度,
  99.                  (void           * )0,                                        //用户补充的存储区
  100.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
  101.                  (OS_ERR         * )&err);                                //存放该函数错误时的返回值
  102.         OS_CRITICAL_EXIT();        //退出临界区         
  103.         OSStart(&err);      //开启UCOSIII
  104. }


  105. //开始任务函数
  106. void start_task(void *p_arg)
  107. {
  108.         OS_ERR err;
  109.         CPU_SR_ALLOC();
  110.         p_arg = p_arg;
  111.        
  112.         CPU_Init();
  113. #if OS_CFG_STAT_TASK_EN > 0u
  114.    OSStatTaskCPUUsageInit(&err);          //统计任务               
  115. #endif
  116.        
  117. #ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间
  118.     CPU_IntDisMeasMaxCurReset();       
  119. #endif
  120.        
  121. #if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
  122.          //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
  123.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
  124. #endif               
  125.         CreateBtn();
  126.         OS_CRITICAL_ENTER();        //进入临界区
  127.                 //创建消息队列KEY_Msg
  128.         OSQCreate ((OS_Q*                )&KEY_Msg,        //消息队列
  129.                 (CPU_CHAR*        )"KEY Msg",        //消息队列名称
  130.                 (OS_MSG_QTY        )KEYMSG_Q_NUM,        //消息队列长度,这里设置为1
  131.                 (OS_ERR*        )&err);                //错误码
  132.                         //创建消息队列KEY_Msg
  133.         OSSemCreate(        (OS_SEM*)REMOTE_Sem,//消息队列长度,这里设置为1
  134.                                                                 "Rmote Sem",
  135.                                                                 0,
  136.                 (OS_ERR*        )&err);                //错误码
  137.         //创建TASK1任务
  138.         OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
  139.                                  (CPU_CHAR        * )"Task1 task",                
  140.                  (OS_TASK_PTR )task1_task,                        
  141.                  (void                * )0,                                       
  142.                  (OS_PRIO          )TASK1_TASK_PRIO,     
  143.                  (CPU_STK   * )&TASK1_TASK_STK[0],       
  144.                  (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
  145.                  (CPU_STK_SIZE)TASK1_STK_SIZE,               
  146.                  (OS_MSG_QTY  )0,                                       
  147.                  (OS_TICK          )0,                                         
  148.                  (void           * )0,                                       
  149.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  150.                  (OS_ERR         * )&err);                       
  151.         //创建TASK2任务
  152.         OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
  153.                                  (CPU_CHAR        * )"Task2 task",                
  154.                  (OS_TASK_PTR )task2_task,                        
  155.                  (void                * )0,                                       
  156.                  (OS_PRIO          )TASK2_TASK_PRIO,     
  157.                  (CPU_STK   * )&TASK2_TASK_STK[0],       
  158.                  (CPU_STK_SIZE)TASK2_STK_SIZE/10,       
  159.                  (CPU_STK_SIZE)TASK2_STK_SIZE,               
  160.                  (OS_MSG_QTY  )0,                                       
  161.                  (OS_TICK          )0,                                         
  162.                  (void           * )0,                                       
  163.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  164.                  (OS_ERR         * )&err);               
  165.         OSTaskCreate((OS_TCB         * )&Task3_TaskTCB,               
  166.                                  (CPU_CHAR        * )"Task3 task",                
  167.                  (OS_TASK_PTR )task3_task,                        
  168.                  (void                * )0,                                       
  169.                  (OS_PRIO          )TASK3_TASK_PRIO,     
  170.                  (CPU_STK   * )&TASK3_TASK_STK[0],       
  171.                  (CPU_STK_SIZE)TASK3_STK_SIZE/10,       
  172.                  (CPU_STK_SIZE)TASK3_STK_SIZE,               
  173.                  (OS_MSG_QTY  )0,                                       
  174.                  (OS_TICK          )0,                                         
  175.                  (void           * )0,                                       
  176.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  177.                  (OS_ERR         * )&err);               
  178.         OSTaskCreate((OS_TCB         * )&Task4_TaskTCB,               
  179.                                  (CPU_CHAR        * )"Task4 task",                
  180.                  (OS_TASK_PTR )task4_task,                        
  181.                  (void                * )0,                                       
  182.                  (OS_PRIO          )TASK4_TASK_PRIO,     
  183.                  (CPU_STK   * )&TASK4_TASK_STK[0],       
  184.                  (CPU_STK_SIZE)TASK4_STK_SIZE/10,       
  185.                  (CPU_STK_SIZE)TASK4_STK_SIZE,               
  186.                  (OS_MSG_QTY  )0,                                       
  187.                  (OS_TICK          )0,                                         
  188.                  (void           * )0,                                       
  189.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  190.                  (OS_ERR         * )&err);               
  191.                                                                  
  192.         OS_CRITICAL_EXIT();        //退出临界区
  193.         OSTaskDel((OS_TCB*)0,&err);        //删除start_task任务自身
  194. }

  195. //任务1的任务函数
  196. void task1_task(void *p_arg) //触屏按键处理
  197. {
  198.         OS_ERR err;
  199.         u8 key;
  200.         u8 ucAirCndiSw=KEY0_PRES; //初始为开
  201.         u8 ucBtnId=-1;
  202.         u8 task1_str[]="First task Running!";
  203.         while(1)
  204.         {
  205.                 key = KEY_Scan(0);  //扫描按键
  206.                 if(key)
  207.                 {
  208.                         //发送消息
  209.                         OSQPost((OS_Q*                )&KEY_Msg,               
  210.                                         (void*                )&key,
  211.                                         (OS_MSG_SIZE)1,
  212.                                         (OS_OPT                )OS_OPT_POST_FIFO,
  213.                                         (OS_ERR*        )&err);
  214.                 }
  215.                 ucBtnId=BtnProcess();
  216.                 if(ucBtnId!= (u8)(-1) && ucLCD_SW) //屏幕开着时候
  217.                 {
  218.                         switch(ucBtnId)
  219.                         {
  220.                                 case 0:
  221.                                         if(stIrTime.StartTime>5)  //开始时间+
  222.                                                 stIrTime.StartTime-=5;
  223.                                                 LCD_ShowNum(145,12,stIrTime.StartTime,3,16);
  224.                                         break;
  225.                                 case 1:
  226.                                         if(stIrTime.StartTime<=115) //开始时间-
  227.                                                 stIrTime.StartTime+=5;
  228.                                                 LCD_ShowNum(145,12,stIrTime.StartTime,3,16);
  229.                                         break;
  230.                                 case 2:
  231.                                         if(stIrTime.OnTime>5)
  232.                                                 stIrTime.OnTime-=5;
  233.                                                 LCD_ShowNum(145,37,stIrTime.OnTime,3,16);
  234.                                         break;
  235.                                 case 3:
  236.                                         if(stIrTime.OnTime<=115)
  237.                                                 stIrTime.OnTime+=5;
  238.                                                 LCD_ShowNum(145,37,stIrTime.OnTime,3,16);
  239.                                         break;               
  240.                                 case 4:
  241.                                         if(stIrTime.OffTime>5)
  242.                                                 stIrTime.OffTime-=5;
  243.                                                 LCD_ShowNum(145,62,stIrTime.OffTime,3,16);
  244.                                         break;
  245.                                 case 5:
  246.                                         if(stIrTime.OffTime<=115)
  247.                                                 stIrTime.OffTime+=5;
  248.                                                 LCD_ShowNum(145,62,stIrTime.OffTime,3,16);
  249.                                         break;
  250.                                        
  251.                                 case 6:  //开关空调
  252.                                         if(KEY0_PRES== ucAirCndiSw)
  253.                                                 ucAirCndiSw= KEY1_PRES;
  254.                                         else if(KEY1_PRES== ucAirCndiSw)
  255.                                                 ucAirCndiSw= KEY0_PRES;
  256.                                                
  257.                                         OSQPost((OS_Q*                )&KEY_Msg,               
  258.                                         (void*                )&ucAirCndiSw,
  259.                                         (OS_MSG_SIZE)1,
  260.                                         (OS_OPT                )OS_OPT_POST_FIFO,
  261.                                         (OS_ERR*        )&err);
  262.                                         break;
  263.                                 case 7: //LCD 背光开关
  264.                                         ucLCD_SW=0;
  265.                                         LCD_DisplayOff();
  266.                                         OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);   //延时1s
  267.                                         break;
  268.                                 default:        break;
  269.                         }
  270.                         //LCD_ShowNum(40,250,btn_id,2,16);
  271.                 }
  272.                 else if(DEF_PRESS_DOWN)
  273.                 {
  274.                         ucLCD_SW=1;
  275.                         LCD_DisplayOn();
  276.                         OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);   //延时1s
  277.                 }
  278.                 OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);   //延时1s
  279.         }
  280. }

  281. //任务2的任务函数
  282. void task2_task(void *p_arg) //自动开关机
  283. {       
  284.         OS_ERR err;
  285.         OS_TICK Os_Tick;
  286.         u8 uc_ir_sendfg=0;
  287.         u32 ulDelayTime=0;
  288.         CPU_SR_ALLOC();
  289.         stIrTime.StartTime=120;//开始时间
  290.         stIrTime.OnTime=30;//开启时间
  291.         stIrTime.OffTime=20;
  292.        
  293.         LCD_ShowString(30,100,200,16,16,"Sys Time ");
  294.         LCD_ShowChar(120,100,':',16,0);
  295.         LCD_ShowChar(146,100,':',16,0);
  296.         LCD_ShowNum(145,12,stIrTime.StartTime,3,16);
  297.         LCD_ShowNum(145,62,stIrTime.OffTime,3,16);
  298.         LCD_ShowNum(145,37,stIrTime.OnTime,3,16);
  299.         SetRmtIntStat(DISABLE);
  300.         Continues_Send(IR_SEND_OPEN);
  301.         SetRmtIntStat(ENABLE);

  302.         while(1)
  303.         {
  304.                 Os_Tick= OSTimeGet(&err)/OSCfg_TickRate_Hz;
  305.                 LCD_ShowNum(148,100,Os_Tick%60,2,16);
  306.                 LCD_ShowNum(124,100,Os_Tick/60%60,2,16);
  307.                 LCD_ShowNum(100,100,Os_Tick/3600,2,16);
  308.                
  309.                 if((Os_Tick/60)>stIrTime.StartTime  ) //开始时间之后,开始间隔开关机
  310.                 {
  311.                         if(Os_Tick> ulDelayTime )
  312.                         {
  313.                                 OS_CRITICAL_ENTER();
  314.                                 if(uc_ir_sendfg)
  315.                                 {
  316.                                         ulDelayTime=Os_Tick+ stIrTime.OnTime*60; //
  317.                                         Continues_Send(IR_SEND_OPEN);
  318.                                         LCD_ShowString(50,140,200,16,16,"Timer OPEN  ");
  319.                                 }
  320.                                 else
  321.                                 {
  322.                                         ulDelayTime=Os_Tick+ stIrTime.OffTime*60; //
  323.                                         Continues_Send(IR_SEND_CLOSE);
  324.                                         LCD_ShowString(50,140,200,16,16,"Timer CLOSE");
  325.                                 }
  326.                                 uc_ir_sendfg=!uc_ir_sendfg;
  327.                                 OS_CRITICAL_EXIT();
  328.                         }
  329.                 }
  330.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
  331.         }
  332. }

  333. void task3_task(void *p_arg) //按键处理
  334. {       
  335.         OS_ERR err;
  336.         u8 *key;
  337.         OS_MSG_SIZE size;
  338.         CPU_SR_ALLOC();
  339.         while(1)
  340.         {
  341.                         //请求消息KEY_Msg
  342.                 key=OSQPend((OS_Q*                        )&KEY_Msg,   
  343.                                         (OS_TICK                )0,
  344.                     (OS_OPT                        )OS_OPT_PEND_BLOCKING,
  345.                     (OS_MSG_SIZE*        )&size,               
  346.                     (CPU_TS*                )0,
  347.                     (OS_ERR*                )&err);
  348.                 OS_CRITICAL_ENTER();
  349.                 switch(*key)
  350.                 {
  351.                         case WKUP_PRES:                //KEY_UP控制LED1
  352.                                 ucLCD_SW=!ucLCD_SW;
  353.                                 if(ucLCD_SW)
  354.                                         LCD_DisplayOn();
  355.                                 else
  356.                                         LCD_DisplayOff();
  357.                                 break;
  358.                         case KEY0_PRES:       
  359.                                         SetRmtIntStat(DISABLE);
  360.                                         LCD_ShowString(50,140,200,16,16,"OPEN        ");
  361.                                         Continues_Send(IR_SEND_OPEN);
  362.                                         SetRmtIntStat(ENABLE);
  363.                         break;
  364.                         case KEY1_PRES:
  365.                                         SetRmtIntStat(DISABLE);                               
  366.                                         LCD_ShowString(50,140,200,16,16,"CLOSE        ");
  367.                                         Continues_Send(IR_SEND_CLOSE);
  368.                             SetRmtIntStat(ENABLE);
  369.                                 break;
  370.                         case REMOTE:
  371.                                
  372.                                 break;
  373.                         default :break;
  374.                 }
  375.                 OS_CRITICAL_EXIT();
  376.                 OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_PERIODIC,&err);   //延时200ms
  377.         }
  378. }
  379. void task4_task(void *p_arg)  //红外解码
  380. {
  381.         OS_ERR err;
  382.         OS_MSG_SIZE size;
  383.         CPU_SR_ALLOC();
  384.         u32 *data;
  385.         char str[9];
  386.         while(1)
  387.         {
  388.                         //请求消息KEY_Msg
  389.                 OSSemPend(REMOTE_Sem,
  390.                                                                                         0,
  391.                                                                                 OS_OPT_PEND_BLOCKING,
  392.                                                                                 (CPU_TS*                )0,
  393.                     (OS_ERR*                )&err);
  394.                 OS_CRITICAL_ENTER();                       
  395.                 sprintf(str,"%8X",ir_data[0]);
  396.                 LCD_ShowString(15,300,200,16,16,str);//显示键值
  397.                 sprintf(str,"%8X",ir_data[1]);
  398.                 LCD_ShowString(90,300,200,16,16,str);//显示键值
  399.                 sprintf(str,"%8X",ir_data[2]);
  400.                 LCD_ShowString(165,300,200,16,16,str);//显示键值
  401.                 OS_CRITICAL_EXIT();
  402.                 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_PERIODIC,&err);   //延时200ms
  403.         }
  404. }

复制代码

所有资料51hei提供下载:
空调遥控红外.rar (688.09 KB, 下载次数: 105)


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

使用道具 举报

沙发
ID:158748 发表于 2018-7-31 10:50 | 只看该作者
接收码是用中断吗
回复

使用道具 举报

板凳
ID:381197 发表于 2018-7-31 11:35 | 只看该作者
IR_ENCODE.h的内容可否直接贴出来?
回复

使用道具 举报

地板
ID:381402 发表于 2018-7-31 20:57 | 只看该作者
附件中有IR_ENCODE.h文件吗?
回复

使用道具 举报

5#
ID:591987 发表于 2019-7-29 14:06 | 只看该作者
程序的SDK都有吗
回复

使用道具 举报

6#
ID:656179 发表于 2019-12-4 19:15 | 只看该作者
下载不了呢?
回复

使用道具 举报

7#
ID:689669 发表于 2020-2-5 11:11 | 只看该作者
UCOS + 红外控制+编码为志高空调遥控器编码
标记,方便查找.
回复

使用道具 举报

8#
ID:294886 发表于 2020-3-11 17:03 | 只看该作者
谢谢分享,下下来看看!
回复

使用道具 举报

9#
ID:294886 发表于 2020-3-11 17:24 | 只看该作者
果然有用,楼主V5!
回复

使用道具 举报

10#
ID:700459 发表于 2020-3-14 20:33 | 只看该作者
thank you
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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