久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6208|回復(fù): 3
收起左側(cè)

stm32單片機(jī)萬能遙控器,親測可用控制空調(diào)

  [復(fù)制鏈接]
ID:251082 發(fā)表于 2020-5-9 18:40 | 顯示全部樓層 |閱讀模式
紅外接收頭收到紅外碼后馬上發(fā)送一個(gè)一樣的紅外碼出去,需要做萬能遙控的自行保存紅外碼再發(fā)出去即可

單片機(jī)源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "Infrared.h"


  6. int main(void)
  7. {        
  8.         u8 t;
  9.         u8 len;        
  10.         u16 times=0;

  11.         delay_init();                     //延時(shí)函數(shù)初始化        
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級(jí)分組2
  13.         uart_init(9600);         //串口初始化為9600
  14.         TIM2_PWM_Init(1895,0);
  15.         Infrared_GPIO_Configuration();
  16.         Infrared_EXTI_Configuration();
  17.         while(1)
  18.         {

  19.         }         
  20. }
復(fù)制代碼
  1. /***************************************************************************************
  2. *        FileName                                        :                Infrared.c
  3. *        CopyRight                                        :
  4. *        ModuleName                                :       
  5. *
  6. *        CPU                                                        :
  7. *        RTOS                                                :
  8. *
  9. *        Create Data                                        :        2015/04/21
  10. *        Author/Corportation                        :        Ray
  11. *
  12. *        Abstract Description                :       
  13. *
  14. *--------------------------------Revision History--------------------------------------
  15. *        No        version                Data                        Revised By                        Item                        Description
  16. *        1                v1.0                        2015/4/21        Ray                                                                                                Create this file
  17. *        2                v2.0                        2015/4/23        Ray                                                                                                Sucessfully control the air conditioner
  18. *        3                v2.1                        2015/4/24 Ray                                                                                                Packaging the Infrared Module
  19. *
  20. ***************************************************************************************/



  21. /**************************************************************
  22. *        Debug switch Section
  23. **************************************************************/


  24. /**************************************************************
  25. *        Include File Section
  26. **************************************************************/
  27. #include "Infrared.h"


  28. /**************************************************************
  29. *        Macro Define Section
  30. **************************************************************/

  31. //debug調(diào)試宏定義,根據(jù)表達(dá)式a的真假執(zhí)行has_bug或no_bug
  32. #define BUG_DETECT_PRINT(a,has_bug,no_bug) { if(a) \
  33. printf("%s",has_bug); \
  34. else \
  35. printf("%s",no_bug);}


  36. /**************************************************************
  37. *        Struct Define Section
  38. **************************************************************/


  39. /**************************************************************
  40. *        Prototype Declare Section
  41. **************************************************************/


  42. /**************************************************************
  43. *        Global Variable Declare Section
  44. **************************************************************/
  45. u8 Flag_LearnState = 0;
  46. u16 PulseTab[MAX_PULSE_LEN];


  47. /**************************************************************
  48. *        File Static Variable Define Section
  49. **************************************************************/


  50. /**************************************************************
  51. *        Function Define Section
  52. **************************************************************/

  53. #ifdef INFRARED_RECEIVE
  54. /**
  55. *  @name                                                void Infrared_GPIO_Configuration()
  56. *        @description                紅外接收端GPIO口設(shè)置
  57. *        @param                                        PA.01 作外部中斷接收口
  58. *        @return               
  59. *  @notice
  60. */
  61. void Infrared_GPIO_Configuration()
  62. {
  63.         GPIO_InitTypeDef GPIO_InitType;
  64.        
  65.         RCC_APB2PeriphClockCmd(INFRARED_RCC_GPIOx,ENABLE);
  66.         GPIO_InitType.GPIO_Mode = GPIO_Mode_IPU;                        //上拉輸入
  67.         GPIO_InitType.GPIO_Pin = INFRARED_GPIO_Pinx;
  68.         GPIO_InitType.GPIO_Speed = GPIO_Speed_50MHz;
  69.         GPIO_Init(INFRARED_GPIOx,&GPIO_InitType);
  70.         GPIO_EXTILineConfig(INFRARED_EXTI_GPIOx,INFRARED_EXTI_Line);
  71. }



  72. /**
  73. *  @name                                                void Infrared_EXTI_Configuration()
  74. *        @description                紅外線接受端外部中斷初始化設(shè)置,設(shè)置為 線路1,使用PA.1作為外部中斷的輸入端
  75. *        @param                                       
  76. *        @return               
  77. *  @notice                                        若改變外部中斷的輸入端,此函數(shù)內(nèi)的線路設(shè)置也需改變s
  78. */
  79. void Infrared_EXTI_Configuration()
  80. {
  81.         EXTI_InitTypeDef EXTI_InitType;
  82.         NVIC_InitTypeDef NVIC_InitType;
  83.        
  84.         EXTI_InitType.EXTI_Line = EXTI_Line1;
  85.         EXTI_InitType.EXTI_Mode = EXTI_Mode_Interrupt;
  86.         EXTI_InitType.EXTI_Trigger = EXTI_Trigger_Falling;
  87.         EXTI_InitType.EXTI_LineCmd = ENABLE;
  88.         EXTI_Init(&EXTI_InitType);
  89.        
  90.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                        //NVIC 中斷設(shè)置
  91.         NVIC_InitType.NVIC_IRQChannel = EXTI1_IRQn;
  92.         NVIC_InitType.NVIC_IRQChannelPreemptionPriority = 0;
  93.         NVIC_InitType.NVIC_IRQChannelSubPriority = 0;
  94.         NVIC_InitType.NVIC_IRQChannelCmd = ENABLE;
  95.         NVIC_Init(&NVIC_InitType);
  96. }


  97. /**
  98. *  @name                                        void EXTI1_IRQHandler()
  99. *        @description        外部中斷1中斷處理程序,用于采集紅外波形
  100. *        @param                       
  101. *        @return                                全局變量Flag_LearnState可以用于返回是否有學(xué)習(xí)到波形
  102. *  @notice
  103. */
  104. void EXTI1_IRQHandler()
  105. {
  106.         u16 pulseWidth = 0;
  107.         u16 i = 0;
  108.        
  109.         Flag_LearnState = 0;
  110.         //中斷指示
  111.        
  112.         while(1)
  113.         {
  114.                 if(IR_RDATA)                                                //有高脈沖出現(xiàn),代表空閑信號(hào)
  115.                 {
  116.                         pulseWidth = 0;
  117.                         while(IR_RDATA)
  118.                         {
  119.                                 pulseWidth++;
  120.                                 delay_us(19);
  121.                                 if(pulseWidth >= 2000)                        // >40ms 則結(jié)束記錄
  122.                                         break;
  123.                         }
  124.                        
  125.                         if(pulseWidth<=15 || pulseWidth>=2000)                // >40ms || <300us 則結(jié)束記錄
  126.                                 break;
  127.                         PulseTab[i] = pulseWidth*20;
  128.                         i++;
  129.                 }               
  130.                 else                                                                                //載波信號(hào),偶數(shù)位為低電平(載波),奇數(shù)位為高電平(空閑)
  131.                 {       
  132.                         pulseWidth = 0;
  133.                         while(IR_RDATA == 0)                       
  134.                         {
  135.                                 pulseWidth++;
  136.                                 delay_us(19);
  137.                         }
  138.                         if(pulseWidth<=15 || pulseWidth>=2000)                 // >40ms || <300sus  則結(jié)束記錄
  139.                                 break;
  140.                         PulseTab[i] = pulseWidth*20;
  141.                         i++;               
  142.                 }
  143.         }
  144.         PulseTab[i++] = pulseWidth;
  145.         PulseTab[i] = 0xffff;
  146.        
  147.         Flag_LearnState = 1;
  148.         Infrared_Send();
  149.         EXTI_ClearITPendingBit(EXTI_Line1);

  150.         return;
  151. }

  152. #endif




  153. #ifdef INFRARED_SEND
  154. /**
  155. *  @name                                                void Infrared_Send()
  156. *        @description                紅外發(fā)射,根據(jù) PulseTab[]內(nèi)的數(shù)據(jù)發(fā)波形
  157. *        @param                       
  158. *        @return               
  159. *  @notice
  160. */
  161. void Infrared_Send()
  162. {
  163.         u16 i;
  164.        
  165.         EXTI->IMR &= ~(0x00000002);                        //關(guān)中斷,避免發(fā)送的紅外線被自己接受
  166.         for(i=0; i<MAX_PULSE_LEN && PulseTab[i]!=0xffff; i++)
  167.         {
  168.                 if(i%2 == 0)
  169.                 {
  170.                         TIM_Cmd(TIM2,ENABLE);
  171.                         delay_us(PulseTab[i]);
  172.                         TIM_Cmd(TIM2,DISABLE);
  173.                         GPIO_SetBits(GPIOA,GPIO_Pin_0);
  174.                 }
  175.                 else
  176.                 {
  177.                         GPIO_SetBits(GPIOA,GPIO_Pin_0);
  178.                         delay_us(PulseTab[i]);
  179.                 }
  180.         }
  181.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  182.        
  183.         EXTI->IMR |= (0x00000002);                //開中斷
  184. }


  185. /**
  186. *  @name                                        void TIM2_PWM_Init(u16 arr,u16 psc)
  187. *        @description        初始化定時(shí)器2的設(shè)置,將定時(shí)器2用于PWM調(diào)制,PWM輸出口為 PA.0
  188. *        @param                                arr --        u16,定時(shí)器重裝值
  189.                                                                         psc --        u16,定時(shí)器分頻值                                                       
  190. *        @return               
  191. *  @notice                                PWM頻率 = 72M/((arr+1)*(psc+1)),這里用作紅外發(fā)射的載波,需要生成38kHz的方波,故取arr = 1895,psc = 0。
  192. */
  193. void TIM2_PWM_Init(u16 arr,u16 psc)
  194. {
  195.         /* 初始化結(jié)構(gòu)體定義 */
  196.         GPIO_InitTypeDef GPIO_InitStructure;
  197.         TIM_TimeBaseInitTypeDef        TIM_TimeBaseInitStructure;
  198.         TIM_OCInitTypeDef         TIM_OCInitStructure;
  199.         /* 使能相應(yīng)端口的時(shí)鐘 */
  200.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定時(shí)器2時(shí)鐘
  201.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIO外設(shè)時(shí)鐘
  202.        
  203.         /* GPIOA.0初始化 */
  204.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                        // TIM2 CH1
  205.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // PA.0 復(fù)用推挽輸出
  206.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  207.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  208.         GPIO_SetBits(GPIOA,GPIO_Pin_0);
  209.         /* TIM2 初始化*/
  210.         TIM_TimeBaseInitStructure.TIM_Period = arr;         //下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
  211.         TIM_TimeBaseInitStructure.TIM_Prescaler = psc;        //作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
  212.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;  //時(shí)鐘分割:TDTS = Tck_tim
  213.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上計(jì)數(shù)模式
  214.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  215.         /* 定時(shí)器TIM2 Ch1 PWM模式初始化 */
  216.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //選擇定時(shí)器模式:TIM PWM1
  217.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //比較輸出使能
  218.         //TIM_OCInitStructure.TIM_Pulse = (arr+1)/2;          //占空比 50%
  219.         TIM_OCInitStructure.TIM_Pulse = (arr+1)/3;          //占空比1:3
  220.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //輸出極性:TIM輸出比較極性高
  221.         TIM_OC1Init(TIM2, &TIM_OCInitStructure);

  222.         /* 使能TIM2在CCR1上的預(yù)裝載寄存器 */
  223.         TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
  224.         /* 使能定時(shí)器 */
  225. //        TIM_Cmd(TIM2,ENABLE);
  226. }

  227. #endif

  228.        

  229. /**
  230. *  @name
  231. *        @description
  232. *        @param                       
  233. *        @return               
  234. *  @notice
  235. */






  236. #ifdef  DEBUG
  237. /*******************************************************************************
  238. * Function Name  : assert_failed
  239. * Description    : Reports the name of the source file and the source line number
  240. *                  where the assert_param error has occurred.
  241. * Input          : - file: pointer to the source file name
  242. *                  - line: assert_param error line source number
  243. * Output         : None
  244. * Return         : None
  245. *******************************************************************************/
  246. void assert_failed(u8* file, u32 line)
  247. {
  248.           /* User can add his own implementation to report the file name and line number,
  249.              ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  250.         
  251.           while (1)
  252.           {}
  253. }
  254. #endif
復(fù)制代碼


所有資料51hei提供下載:
空調(diào).7z (195.4 KB, 下載次數(shù): 129)
回復(fù)

使用道具 舉報(bào)

ID:128463 發(fā)表于 2020-5-12 18:32 | 顯示全部樓層
好東西,學(xué)習(xí)一下!!
回復(fù)

使用道具 舉報(bào)

ID:12816 發(fā)表于 2020-5-23 23:24 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:712479 發(fā)表于 2020-5-24 15:17 | 顯示全部樓層
好東西。。《嘀x
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧洲成人午夜免费大片 | 欧美一级片在线观看 | 男女羞羞的网站 | 国产日韩一区二区 | 久久久久久亚洲欧洲 | 午夜精品影院 | 久久久久久免费毛片精品 | 毛片一区二区三区 | 国产特级毛片 | 中文二区| 毛片免费视频 | 国产精品久久在线 | 日韩免费在线 | 涩爱av一区二区三区 | 国产高清视频一区 | 免费a级毛片在线播放 | 91精品一区二区三区久久久久 | 久久久久久99 | 日本精品一区二区 | 熟女毛片| 美女爽到呻吟久久久久 | 一区二区三区视频免费看 | 夜夜爽99久久国产综合精品女不卡 | 黄色毛片在线看 | 欧美日韩一区二区三区四区 | 欧洲国产精品视频 | 亚洲国产一区在线 | 99re热精品视频 | 国产精品久久久久久久久污网站 | 欧美成人激情 | 欧美日本在线观看 | 亚州国产 | 亚洲成人av一区二区 | 亚洲综合久久网 | 国产日韩欧美一区二区在线播放 | 欧美成人一区二免费视频软件 | av中文字幕在线 | 一区二区三区av | 一级毛片在线播放 | 99精品一区二区三区 | 日本一区二区三区精品视频 |