找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5789|回复: 5
收起左侧

学习型315M无线遥控器学习与发送的STM32程序源码

  [复制链接]
ID:318233 发表于 2018-10-20 09:12 | 显示全部楼层 |阅读模式
能够进行315m无线信号的学习与发送,需要配合相应的硬件
0.png

单片机源程序如下:
  1. #include "delay.h"
  2. #include "key.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "exti.h"
  6. #include "timer.h"
  7. #include "IR_SendData.h"
  8. /************************************************
  9. 接收315无线模块数据

  10. 1、输入脚PA15
  11. 2、PA15下降沿触发外部中断
  12. 3、采用定时器TIM3计算脉宽
  13. ************************************************/
  14. extern u8 USART_RX_BUF[USART_REC_LEN];
  15. extern u8 WiRecBuff[5];
  16. int main(void)
  17. {               
  18.   unsigned char i=0,t=0,len=0;
  19.         delay_init();                     //延时函数初始化         
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  21.         uart_init(115200);         //串口初始化为115200
  22.         EXTIX_Init();                         //外部中断初始化
  23.         TIM3_Int_Init(49999,71);//10Khz的计数频率,计数到5000为500ms  
  24.         TIM7_Int_Init(59999,71);
  25.          send_init();
  26.          KEY_Init();
  27.         while(1)
  28.         {         
  29. //按键315发送数据
  30.                  if(KEY0==0)
  31.                  {
  32.                                 EXTI->IMR &= ~(EXTI_Line15);         //315无线关闭接收中断      
  33.                                 EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中断标志位         
  34.                                 delay_ms(10);     //按键消抖
  35.                                 senddata();       //发送315无线信号
  36.                         for(i=0;i<3;i++)
  37.                         {
  38.                         printf("\r\n发送数据:%x \r\n\r\n",WiRecBuff[i]);
  39.                         }
  40.                  }
  41.                  else
  42.                  {
  43.                                 EXTI->IMR |= EXTI_Line15;            //开启315无线接手卸险
  44.                                 EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中断标志位         
  45.                  }
  46.                 /**     315无线发送数据           **/                    
  47.                 if(USART_RX_STA&0x8000)
  48.                 {                                          
  49.                         len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  50.                         if((USART_RX_BUF[0]!=0x30))   //判断首位不等于0x30,以及接收数据完成
  51.                         {
  52.                                 for(i=0;i<3;i++)
  53.                                 {
  54.                                         WiRecBuff[i]=USART_RX_BUF[i];
  55.                                         delay_ms(10);     //按键消抖
  56.                                 }
  57.         //                        
  58.                                 EXTI->IMR &= ~(EXTI_Line15);         //315无线关闭接收中断      
  59.                                 EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中断标志位         

  60.                                 senddata();                           //发送315无线信号
  61.                         }
  62.                         else
  63.                          {
  64.                                 EXTI->IMR |= EXTI_Line15;            //开启315无线接手卸险
  65.                                 EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE0上的中断标志位         
  66.                          }
  67.                         
  68.                         USART_RX_STA=0;
  69.                         memset(USART_RX_BUF, '\0', sizeof(USART_RX_BUF));  //清除串口接收数组
  70.                 }
  71.                
  72.    

  73.                  
  74.         }
  75. }
复制代码

IR_SendData.c
  1. /*******************************************************************
  2.         使用定时器发送315无线数据
  3. *******************************************************************/
  4. #include "IR_SendData.h"
  5. #include "delay.h"
  6. #include "led.h"
  7. #include "usart.h"
  8. /********************************************************************

  9. 1、315发送: 24位 数据
  10. 2、A: 0x0c
  11. 3、B:0xc0
  12. 4、C:0x03
  13. 5、D:0x30

  14. *********************************************************************/
  15. u8 WiRecBuff[5];

  16. extern unsigned char send_bit;     //定时器溢出中断标志位
  17. unsigned char  REM_Table[14]={1,0,1,0,1,0,1,0,1,0,1,0,1,0};//发送高低电缓冲区

  18. /********************************************************************
  19. 1、 14ms  :0x36af   14000-1
  20. 2、 1.2ms :0x4af    1200-1
  21. 3、 600us :0X257    600-1
  22. *********************************************************************/
  23. unsigned int Time_Table[14]={0x36af,0x36af,0x4af,0X257,0x4af};//  14ms  1`2ms   600us


  24. extern u8  USART_RX_BUF[USART_REC_LEN];

  25. /*串口接收数据    转为发送*/
  26. //void RecBuff_change(void)
  27. //{
  28. //        unsigned char i=0;
  29. //        if(USART_RX_BUF[0]!=0x30)
  30. //        {
  31. //                for(i=0;i<3;i++)
  32. //                {
  33. //                        WiRecBuff[i]=USART_RX_BUF[i];
  34. //                        delay_us(100);
  35. //                }
  36. //        }
  37. //}
  38. /********************************************************************

  39. 315无线发送IO口初始化

  40. *********************************************************************/
  41. void send_init(void)
  42. {
  43. GPIO_InitTypeDef  GPIO_InitStructure;
  44.          
  45. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能PC端口时钟
  46.         
  47. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //PC.0 端口配置
  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  50. GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOC.0
  51. GPIO_SetBits(GPIOC,GPIO_Pin_0);                                                 //PC.0 输出高

  52. }

  53. void send_foot(void)    //发送14ms的引导吗
  54. {
  55.                 unsigned char i;

  56.                 for(i=0;i<2;i++)
  57.         {
  58.                 Send=REM_Table[i];         //发送高低电
  59.                 send_bit=0;                //定时器溢出中断标志位清零
  60.                 TIM7->CNT = 0;             //计数器数值清零
  61.                 TIM7->ARR = Time_Table[i]; //设置定时器计数值
  62.                 TIM7->CR1 |= 0x01;         //开启TIM3定时器
  63.     while(send_bit==0);               //等待溢出中断
  64.                 //TIM3->CR1 &= ~(0x01);           //关闭定时器3        
  65.         }

  66. }

  67. void bit_1(void)       //高电平1.2ms+低电平500us表示:逻辑1
  68. {
  69.                 unsigned char i;
  70.         for(i=0;i<2;i++)
  71.         {
  72.                 Send=REM_Table[i];
  73.                 send_bit=0;
  74.                 TIM7->CNT = 0;
  75.                 TIM7->ARR = Time_Table[i+2];
  76.                 TIM7->CR1 |= 0x01;     //开启TIM3定时器
  77.                 while(send_bit==0);        
  78. //    while(TIM_GetITStatus(TIM3, TIM_IT_Update) == RESET);               
  79.         }
  80. }

  81. void bit_0(void)      //高电平500us+低电平1.2ms 表示:逻辑0
  82. {
  83.         unsigned char i;
  84.         for(i=0;i<2;i++)
  85.         {
  86.                 Send=REM_Table[i];
  87.                 send_bit=0;
  88.                 TIM7->CNT = 0;
  89.                 TIM7->ARR = Time_Table[i+3];
  90.                 TIM7->CR1 |= 0x01;     //开启TIM3定时器
  91.                 while(send_bit==0);        
  92. //    while(TIM_GetITStatus(TIM3, TIM_IT_Update) == RESET);               
  93.                
  94.         }

  95. }

  96. void senddata(void)      //发送引导码+24数据
  97. {
  98.         u8 i,j;
  99. //        RecBuff_change();
  100.         send_foot();          //发送引导码
  101.         for(i=0;i<25;i++)
  102.         {
  103. //                for(j=0;j<8;j++)
  104.                 {
  105.                         if(((WiRecBuff[i/8]<<i%8)&0x80))   //从高位到低位,判断逻辑0还是逻辑1
  106.                         {
  107.                                 bit_1();    //发送逻辑1脉冲
  108.                         }
  109.                         else
  110.                         {
  111.                                 bit_0();    //发送逻辑0脉冲
  112.                         }
  113.                 }
  114.         }







  115. }
复制代码


所有资料51hei提供下载:
315学习 315发送.zip (330.6 KB, 下载次数: 133)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-10-20 14:18 | 显示全部楼层
能分享下原理图吗?
回复

使用道具 举报

ID:138119 发表于 2018-11-28 10:57 | 显示全部楼层
用STM32制作,成本略高,但作为学习,还是有价值的!
回复

使用道具 举报

ID:483019 发表于 2019-3-16 22:36 | 显示全部楼层
有STC的示例吗?我已经读出了数据串,怎样发射出去?
RAW signal: 4860 1516 375 739 375 738 735 381 735 380 736 380 735 380 376 738 375 753 375 738 736 380 375 739 375 738 375 739 375 739 375 738 375 753 735 380 375 739 375 738 376 738 375 739 375 738 735 381 375 752 375 738 736 380 735 380 735 380 376 738 375 738 428 739 735 390 375 738 375 739 735 380 736 380 375 738 376 738 735 381 735 4806 1516 375 792 375 738 735 381 735 380 735 380 735 380 375 738 375 752 376 738 735 380 376 738 375 739 375 738 375 738 376 738 375 753 735 380 375 739 375 739 375 738 375 739 375 738 735 380 375 753 375 738 735 380 735 380 735 380 375 738 375 739 375 738 734 391 375 738 375 738 375 738 375 738 788 380 735 380 735 380 735 8411
回复

使用道具 举报

ID:450244 发表于 2019-10-29 18:45 | 显示全部楼层
有接受程序吗
回复

使用道具 举报

ID:518278 发表于 2019-11-28 17:10 | 显示全部楼层
学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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