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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

紅外調(diào)制解調(diào)協(xié)議stm32源碼

[復(fù)制鏈接]
ID:366223 發(fā)表于 2018-7-6 12:40 | 顯示全部樓層 |閱讀模式
紅外通信源碼
  1. #include "include.h"

  2. /********************************************************************
  3. 發(fā)送紅外數(shù)據(jù)的邏輯協(xié)議在"ir.c"里面         -->   _deflag處查找                        *                                                                                                                                                                                                                                                                                                               
  4. *********************************************************************/

  5. u16 tempi = 0;
  6. u8 IR_val = 0;

  7. int main(void)
  8. {
  9. //        u8 i;
  10.        
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級(jí)分組2       
  12.         uart_init(9600);
  13.         delay_init();
  14.        
  15.         ir_re_init(); //IR接收初始化        PA1--TIM5--CH2
  16.         TIM3_2PWM_Init(1893,0);//不分頻。PWM頻率=38Khz //IR -- PWM發(fā)射初始化  PA7--TIM3--CH2
  17.        
  18.         KEY_Init();
  19.         LED_Init();
  20.        
  21.         LED0=0;

  22.         while(1)
  23.         {       
  24.                 if(tempi >= 250)
  25.                 {
  26.                         tempi = 1;                               
  27.                 }
  28.                 IR_sent(tempi);
  29.                 printf("1:%d\r\n",tempi);

  30.                 if(IR_receive_finish(&IR_val) == 0)
  31.                 {
  32.                         LED1=0;
  33.                         if(tempi==IR_val)
  34.                         {
  35.                                 tempi += 1;
  36.                                
  37.                                 printf("2:%d\r\n",IR_val);

  38.                         }
  39.                         delay_ms(100);

  40. //                        uart1_printf("recev",IR_RXBUff,16);  //串口1打印出數(shù)組tab內(nèi)的16個(gè)數(shù)據(jù)
  41.                 }
  42.                 LED1=1;
  43.                 LED0=1;               
  44.         }
  45. }
復(fù)制代碼
  1. #include "ir.h"

  2. //[7]:保留
  3. //[6]:保留
  4. //[5]://標(biāo)記下降沿是否已經(jīng)被捕獲
  5. //[4]://標(biāo)記上升沿是否已經(jīng)被捕獲                                                                  
  6. //[3:0]:溢出計(jì)時(shí)器
  7. u8 key_sta=0;
  8. u16 LOW_value=0;
  9. u16 HIGH_value=0;
  10. u16 ii=0;

  11. u16 tab[500];
  12. u16 IR_RXBUff[500];
  13. //u16 IR_TXBUff[500];

  14. u8 num_b[8] = {0};                      //十進(jìn)制轉(zhuǎn)二進(jìn)制數(shù)組
  15. u16 num_val[16] = {0};                        //發(fā)送數(shù)組



  16. void ir_re_init(void)                   //IR接收初始化        PA1--TIM5--CH2
  17. {
  18.         GPIO_InitTypeDef GPIO_InitStructure;
  19.         NVIC_InitTypeDef NVIC_InitStructure;
  20.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  21.         TIM_ICInitTypeDef TIM_ICInitStructure;
  22.        
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  24.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
  25.        
  26.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
  27.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入
  28.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  29.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  30.        
  31.         TIM_TimeBaseStructure.TIM_Period = 0XFFFF; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 最大10ms溢出  
  32.         TIM_TimeBaseStructure.TIM_Prescaler =(72-1);         //預(yù)分頻器,1M的計(jì)數(shù)頻率,1us加1.          
  33.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  34.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式

  35.         TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
  36.        
  37.         TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
  38.         TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling;//下降沿觸發(fā)
  39.         TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
  40.         TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
  41.         TIM_ICInitStructure.TIM_ICFilter=0x00;
  42.         TIM_ICInit(TIM5,&TIM_ICInitStructure);
  43.        
  44.         TIM_Cmd(TIM5,ENABLE);
  45.        
  46.         NVIC_InitStructure.NVIC_IRQChannel= TIM5_IRQn;
  47.        
  48.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  49.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  50.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  51.         NVIC_Init(&NVIC_InitStructure);
  52.        
  53.         TIM_ITConfig( TIM5,TIM_IT_CC2,ENABLE);
  54. }



  55. void TIM5_IRQHandler(void)              //IR接收中斷
  56. {
  57.   if(TIM_GetFlagStatus(TIM5, TIM_FLAG_CC2) == SET)//觸發(fā)中斷                    
  58.         {               
  59.                 if(R_DATA==1)
  60.                 {
  61.                         if(key_sta&0x20)
  62.                         {
  63.                                 LOW_value=TIM_GetCapture2(TIM5);
  64.                                 IR_RXBUff[ii]=LOW_value;
  65.                                 ii++;
  66.                                 TIM_SetCounter(TIM5, 0);//清零計(jì)數(shù)器的值
  67.                                 TIM_OC2PolarityConfig(TIM5, TIM_ICPolarity_Falling);
  68.                                 key_sta&=0xdf;//下降沿捕獲清除             清除 0x20
  69.                         }
  70.                         key_sta|=0x10;//上升沿被成功捕獲              標(biāo)記0x10       
  71.                 }
  72.                 else if(R_DATA==0)
  73.                 {
  74.                         if(key_sta&0x10)
  75.                         {
  76.                                 HIGH_value=TIM_GetCapture2(TIM5);
  77.                        
  78.                                 IR_RXBUff[ii]=HIGH_value;
  79.                                 ii++;       
  80.                                 key_sta&=0xef;//上升沿捕獲清除            清除0x10
  81.                         }
  82.                         TIM_SetCounter(TIM5, 0);//清零計(jì)數(shù)器的值
  83.                         TIM_OC2PolarityConfig(TIM5, TIM_ICPolarity_Rising);
  84.                         key_sta|=0x20;//下降沿被成功捕獲            標(biāo)記 0x20       
  85.                 }               
  86.         }
  87.          TIM_ClearFlag(TIM5,TIM_IT_CC2);
  88. }

  89. //0為成功
  90. u8 IR_receive_finish(u8 *p)     //IR接收完成標(biāo)志  (此處給的10ms等待)
  91. {
  92.         u8 i,j;
  93.         u8 val_t = 0;
  94.         u16 k=0;
  95.        
  96.         while(ii<=10 && k<50000)   //等待開始接收數(shù)據(jù),50ms沒(méi)有收到數(shù)據(jù)就跳出
  97.         {
  98.                 k++;
  99.                 delay_us(1);
  100.         }
  101.         delay_ms(30);
  102. //        printf("%d\r\n",ii);
  103.     if(ii>20)
  104.         {
  105.                 delay_ms(500);
  106.         }
  107. //        printf("%d\r\n",ii);
  108.         if(ii>=15 && k<50000)
  109.         {
  110.                 for(i=0;i<16;i+=2)                       //把38k波解調(diào)成邏輯0|1   存到一個(gè)字節(jié)的各個(gè)位
  111.                 {
  112.                         if((IR_RXBUff[i]>=Half_IR)||(IR_RXBUff[i+1]>=Half_IR))
  113.                         {
  114.                                 num_b[i/2] = 1;
  115.                         }
  116.                         else if((IR_RXBUff[i]<Half_IR)&&(IR_RXBUff[i+1]<Half_IR))
  117.                         {
  118.                                 num_b[i/2] = 0;
  119.                         }
  120.                 }
  121.                
  122.                 for(j=0;j<8;j++)                       //把2進(jìn)制數(shù)變?yōu)槭M(jìn)制數(shù)
  123.                 {
  124.                         if(num_b[j]==1)
  125.                         {
  126.                                 val_t |= 1<<j;
  127.                         }
  128.                 }
  129.                 *p = val_t;
  130.                 ii = 0;
  131.                 key_sta = 0;
  132.                 return 0;
  133.         }
  134.         return 1;
  135. }



  136. //PWM輸出初始化
  137. //arr:自動(dòng)重裝值
  138. //psc:時(shí)鐘預(yù)分頻數(shù)
  139. void TIM3_2PWM_Init(u16 arr,u16 psc)    //IR -- PWM發(fā)射初始化  PA7--TIM3--CH2
  140. {  
  141.         GPIO_InitTypeDef         GPIO_InitStructure;
  142.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  143.         TIM_OCInitTypeDef        TIM_OCInitStructure;

  144.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
  145.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外設(shè)時(shí)鐘使能
  146.                                                                                     
  147.    //設(shè)置該引腳為復(fù)用輸出功能,輸出TIM1 CH1的PWM脈沖波形
  148.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7--TIM3--CH2
  149.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
  150.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  151.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  152.         TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值         80K
  153.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值  不分頻
  154.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  155.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  156.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位

  157.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
  158.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  159.         TIM_OCInitStructure.TIM_Pulse =0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
  160.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High  ; //輸出極性:TIM輸出比較極性高
  161.        
  162.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //☆注意這塊的通道數(shù)的選擇☆

  163.         TIM_Cmd(TIM3, ENABLE);  //使能TIM4
  164. }





  165. void IR_sent(u8 val)                                                                                //IR發(fā)射   (5ms發(fā)完16位)
  166. {
  167.         u8 jj=0;
  168.         u8 i,j,k=0;
  169.        
  170.         //IR發(fā)射前要關(guān)閉紅外接收,防止干擾頻繁進(jìn)中斷導(dǎo)致單片機(jī)hard fuilt
  171.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,DISABLE);   //IR接收初始化 PA1--TIM5--CH2
  172.         //IR發(fā)射前要關(guān)閉紅外接收,防止干擾頻繁進(jìn)中斷導(dǎo)致單片機(jī)hard fuilt
  173.        
  174.         for(i=0;i<8;i++)       //把十進(jìn)制數(shù)字變?yōu)槎M(jìn)制數(shù)字  
  175.         {
  176.                 if( ( val&(1<<i) ) )     
  177.                 {
  178.                         num_b[i] = 1;   
  179.                 }
  180.                 else
  181.                 {
  182.                         num_b[i] = 0;
  183.                 }
  184.         }
  185. //調(diào)制數(shù)據(jù)
  186.         for(k=0;k<16;k+=2)      //把將二進(jìn)制的各個(gè)位的邏輯0|1加載到38k紅外波上 _deflag
  187.         {
  188.                 j=k/2;
  189.                 if(num_b[j]==1)
  190.                 {
  191.                         num_val[k]   = L_IR;
  192.                         num_val[k+1] = H_IR;
  193.                 }
  194.                 else if(num_b[j]==0)  //為0
  195.                 {
  196.                         num_val[k]   = L_IR;
  197.                         num_val[k+1] = L_IR;
  198.                 }       
  199.         }
  200.        
  201.         LED0 = 0;
  202.        
  203.         for(jj=0;jj<16;jj+=2)    //PWM發(fā)射初始化  PA7--TIM3--CH2
  204.         {
  205.                 if(num_val[jj]==0)
  206.                 {
  207.                         TIM_SetCompare2(TIM3,0);
  208.                 }
  209.                 else
  210.                 {
  211.                         if(num_val[jj]!=0)
  212.                         {
  213.                                 TIM_SetCompare2(TIM3,(1893/3));                                                       
  214.                                 delay_us(num_val[jj]);       
  215.                                 TIM_SetCompare2(TIM3,0);
  216.                                 if(num_val[(jj+1)]!=0)
  217.                                 {
  218.                                         TIM_SetCompare2(TIM3,0);                                       
  219.                                         delay_us(num_val[(jj+1)]);//程序死在這里了                                                               
  220.                                 }       
  221.                         }
  222.                 }
  223.         }
  224.         TIM_SetCompare2(TIM3,(1893/3));       
  225.         delay_us(200);
  226.         TIM_SetCompare2(TIM3,0);

  227.         //IR發(fā)射前要關(guān)閉紅外接收,防止干擾頻繁進(jìn)中斷導(dǎo)致單片機(jī)hard fuilt
  228.         delay_ms(1);        //延時(shí)1毫秒下面這句時(shí)鐘使能才會(huì)有效.
  229.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  //IR接收初始化 PA1--TIM5--CH2
  230.         //IR發(fā)射前要關(guān)閉紅外接收,防止干擾頻繁進(jìn)中斷導(dǎo)致單片機(jī)hard fuilt
  231.        
  232.         LED0 = 1;
  233. }
復(fù)制代碼


全部資料51hei下載地址:
紅外調(diào)制解調(diào)協(xié)議源碼.rar (364.8 KB, 下載次數(shù): 40)

回復(fù)

使用道具 舉報(bào)

ID:391196 發(fā)表于 2019-7-25 11:03 | 顯示全部樓層
找了好久,非常感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久亚洲精品 | 精品国产一区二区三区久久 | 欧美日韩精品一区二区三区视频 | 天天躁日日躁aaaa视频 | 欧美一级片 | 四虎影 | 国产成人综合久久 | 欧美激情久久久 | 国产成人在线一区 | 亚洲一二三在线 | 成人亚洲精品久久久久软件 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 成人乱人乱一区二区三区软件 | 这里有精品 | 麻豆av免费观看 | 国产日韩欧美一区 | 欧美中文在线 | 日韩av三区| 成人精品在线观看 | 91精品国产乱码久久久久久久久 | 99热精品久久 | 日本精品视频在线 | 日韩在线观看网站 | h小视频 | 国产99久久久国产精品 | 国产欧美视频一区二区 | 久久aⅴ乱码一区二区三区 91综合网 | 最近中文字幕免费 | 欧美11一13sex性hd | 欧美在线色| 欧美黑人国产人伦爽爽爽 | 欧美成人h版在线观看 | 亚洲精品一区av在线播放 | 日韩www | 亚洲第一天堂 | 亚洲高清视频一区二区 | 午夜男人的天堂 | 91久久综合 | 午夜寂寞福利视频 | 罗宾被扒开腿做同人网站 | 免费a v网站 |