找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1845|回复: 0
收起左侧

STM8单片机无线315&433脉宽自适应_通用解码程序

[复制链接]
ID:137590 发表于 2021-7-18 11:12 | 显示全部楼层 |阅读模式
单片机源程序如下:

  1. /*
  2. RFINT不能用PA1 要改板 改在PC6
  3. */
  4. /* Includes ------------------------------------------------------------------*/
  5. #define MAIN_C

  6. #include "ALL.h"

  7. void Delay(u16 nCount)
  8. {
  9.   /* Decrement nCount value */
  10.   while (nCount != 0)
  11.   {
  12.     nCount--;
  13.   }
  14. }


  15. //10ms定时中断初始  在PWM时可更改
  16. void TIME1_CONFIG(void)
  17. {
  18. /* Init TIMER 1 */
  19. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);
  20. TIM1->IER = 0x00;//??????????? // 禁止中断
  21. TIM1->EGR = 0x01;//??????????? // 允许产生更新事件
  22. TIM1->PSCRH = 0x0;//
  23. TIM1->PSCRL = 0x4;// 2@2MHZ  4@4MHZ
  24. TIM1->ARRH = 0x27; // 设定重装载时的寄存器的高8位 2710=10ms  
  25. TIM1->ARRL = 0x10;
  26. //TIM2->CNTRH = 0xEA; // 设定计数器的初值
  27. //TIM2->CNTRL = 0x60; // 定时周期=1*60000=60000uS=60ms
  28. TIM1->CR1 = 0x01;// b0 = 1,允许计数器工作 ?// b1 = 0,允许更新 设置控制器,启动定时器
  29. TIM1->IER = 0x01;// 允许更新中断
  30. }

  31. //5ms定时中断初始  CPU主频2Mhz
  32. void TIME2_CONFIG(void)
  33. {
  34. /* Init TIMER 4 */
  35.   CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);
  36. TIM2->IER = 0x00;//??????????? // 禁止中断
  37. TIM2->EGR = 0x01;//??????????? // 允许产生更新事件
  38. #ifdef FREQ_2M
  39. TIM2->PSCR = TIM2_PRESCALER_2;// 2@2M  4@4M 取决于CPU频率
  40. #else
  41. TIM2->PSCR = TIM2_PRESCALER_4;// 2@2M  4@4M 取决于CPU频率
  42. #endif
  43. #if 0//def GUDINGMA//临时为固定码增加用
  44. TIM2->PSCR = TIM2->PSCR/2;// 让定时器速度再快一倍出来
  45. #endif


  46. TIM2->ARRH = 0xc3; // 设定重装载时的寄存器的高8位  c350=50ms
  47. TIM2->ARRL = 0x50; //本参数配合无线
  48. //TIM2->CNTRH = 0xEA; // 设定计数器的初值
  49. //TIM2->CNTRL = 0x60; // 定时周期=1*60000=60000uS=60ms
  50. TIM2->CR1 = 0x01;// b0 = 1,允许计数器工作 ?// b1 = 0,允许更新 设置控制器,启动定时器
  51. TIM2->IER = 0x01;// 允许更新中断
  52. }

  53. //5ms定时中断设置  CPU主频2Mhz
  54. void TIM4_Config(void)
  55. {
  56. /* Init TIMER 4 */
  57.   CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);
  58. /* Init TIMER 4 prescaler: / (2^6) = 64/ */
  59. #ifdef FREQ_2M
  60.   TIM4->PSCR = TIM4_PRESCALER_64;//// 4M=128  2M=64
  61. #else
  62.   TIM4->PSCR = TIM4_PRESCALER_128;//// 4M=128  2M=64
  63. #endif
  64. /* HSI div by 1 --> Auto-Reload value: 16M/16 /64  = 1/64M, (1/64M) / 100 = 156.25*/
  65.   TIM4->ARR = 156;
  66. /* Counter value: 2, to compensate the initialization of TIMER*/
  67.   //TIM4->CNTR = 2;
  68. /* clear update flag */
  69.   TIM4->SR1 &= ~TIM4_SR1_UIF;
  70. /* Enable Counter */
  71.   TIM4->CR1 = TIM4_CR1_CEN;
  72.   TIM4->IER=1;
  73. }




  74. #define CFG_GCR_SWD ((u8)0x01) /*!< Swim disable bit mask */


  75. void INITIAL_ALL_PIN(void)
  76. {
  77. //CFG->GCR |= CFG_GCR_SWD;/*disable SWIM interface*/
  78. /*
  79. GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯
  80. GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯
  81. GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯
  82. GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯
  83. */

  84. //GPIO_Init(GPIOA,GPIOA_OUT_L,GPIO_MODE_OUT_PP_HIGH_SLOW);//关SET LED灯
  85. GPIO_Init(GPIOB,GPIOB_OUT_H,GPIO_MODE_OUT_OD_HIZ_SLOW); //关ALARM LED灯
  86. GPIO_Init(GPIOC,GPIOC_OUT_L,GPIO_MODE_OUT_PP_LOW_SLOW);//PWM
  87. GPIO_Init(GPIOC,GPIOC_IN_PU,GPIO_MODE_IN_PU_NO_IT);//按键中断

  88. GPIO_Init(GPIOD,GPIOD_OUT_H,GPIO_MODE_OUT_PP_HIGH_FAST);//串口发送
  89. GPIO_Init(GPIOD,GPIOD_IN_PU,GPIO_MODE_IN_PU_NO_IT);//i2c


  90. EXTI->CR1 =(EXTI_SENSITIVITY_RISE_FALL<<4);
  91. GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_IN_FL_IT);//无线接收

  92. }



  93. void UART_CONFIG(void )
  94. {
  95. UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
  96. UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
  97. UART1_ITConfig(UART1_IT_TC, DISABLE);
  98. UART1_Cmd(ENABLE);

  99. }


  100. void PUT_CHAR(uchar Data)
  101. {
  102. int i=10000;

  103. UART1->SR&=~UART1_FLAG_TC;//COM_USART[COM1]->SR&~USART_FLAG_TC;
  104. UART1->DR = Data;
  105. while((UART1->SR & UART1_FLAG_TC) == 0x00)
  106.         {if(--i==0)break;
  107.         }// 若发送寄存器不空,则等待        
  108. }

  109. const char hex[] = "0123456789ABCDEF";
  110. //********************************************************
  111. PRINT_DEC_OR_HEX(uchar format,uchar d)
  112. {
  113. uchar i;
  114. switch(format)
  115.         {case 'd':
  116.                 i=d/100;
  117.                 if(i!=0)PUT_CHAR(hex[i]);
  118.                 i=(d%100)/10;
  119.                 if(d>=100||i!=0)PUT_CHAR(hex[i]);
  120.                 PUT_CHAR(hex[d%10]);
  121.                 break;
  122.         case 'D':                                
  123.                 PUT_CHAR(hex[d/10]);
  124.                 PUT_CHAR(hex[d%10]);
  125.                 break;               
  126.         case 'x':
  127.                 PUT_CHAR(hex[d>>4]);
  128.                 PUT_CHAR(hex[d&0x0f]);
  129.                 break;
  130.         }
  131. }


  132. //********************************************************
  133. void PRINTF (uchar *pstring,uchar *arg)
  134. {
  135. uchar str;
  136. char count=0;
  137. uchar i;
  138. uint t;
  139. //PUT_CHAR ('\r');
  140. //PUT_CHAR ('\n');
  141. while(1)     /* until full pstring string read */
  142.         {
  143.         str = *pstring++;       /* until '%' or '\0' */
  144.         if(str=='%')
  145.                 {str = *pstring++;
  146.                 if(str=='i')        
  147.                                 {t=(arg[count]<<8)+arg[count+1];
  148.                                 if(t>=10000)
  149.                                         {str=t/10000;PRINT_DEC_OR_HEX('d',str);}
  150.                                 if(t>=1000)
  151.                                         {str=t%10000/1000;PRINT_DEC_OR_HEX('d',str);}
  152.                                 if(t>=100)
  153.                                         {str=t%1000/100;PRINT_DEC_OR_HEX('d',str);}
  154.                                 if(t>=10)
  155.                                         {str=t%100/10;PRINT_DEC_OR_HEX('d',str);}
  156.                                         {str=t%10;    PRINT_DEC_OR_HEX('d',str);}
  157.                                 count++;        
  158.                                 }
  159.                 else
  160.                                 PRINT_DEC_OR_HEX(str,arg[count++]);
  161.                 }
  162.         #if 0
  163.         else if(str=='
  164. )//打印数组        
  165.                 {
  166.                 str = *pstring++;
  167.                 count=0;
  168.                 while(1)
  169.                         {
  170.                         if(str=='x')        
  171.                                 {i=arg[count]>>4;                                
  172.                                 if(i==0x0b)PUT_CHAR('G');
  173.                                 else if(i==0x0A)PUT_CHAR('+');
  174.                                 else if(i>9)break;                        
  175.                                 else PUT_CHAR(hex[i]);                                
  176.                                 
  177.                                 i=arg[count]&0x0f;
  178.                                 if(i==0x0b)PUT_CHAR('G');
  179.                                 else if(i==0x0A)PUT_CHAR('+');                                
  180.                                 else if(i>9)break;                        
  181.                                 else PUT_CHAR(hex[i]);
  182.                                 }
  183.                         
  184.                         else{
  185.                                 PRINT_DEC_OR_HEX('x',arg[count]);
  186.                                 }                        
  187.                         count++;
  188.                         
  189.                         if(count>=16)break;                        
  190.                         }

  191.                
  192.                 }
  193.         #endif
  194.         else if(str==0)return;
  195.         //else if(str==0XFF)return;
  196.         else
  197.                 {
  198.                    PUT_CHAR (str);
  199.                   
  200.                 }
  201.         }
  202. }




  203. void DELAY(uint T)
  204. {
  205. while(T--);
  206. }

  207. void RF_STUDY_START(void)
  208. {
  209. SYS.study_sec=30;
  210. LED_STA_CONVER(led_study);
  211. DEBUG_COM_STREAM("\r\n等待学习",NULL);
  212. }

  213. void RF_STUDY_EXIT(void)
  214. {
  215. SYS.study_sec=0;
  216. LED_STA_CONVER(led_standby);
  217. DEBUG_COM_STREAM("\r\n退出学习",NULL);
  218. }

  219. void PER_SECOND_EXE(void)
  220. {
  221. if(TIME.b_second==0)return;
  222. TIME.b_second=0;

  223. CHECK_RF_CONTINUE_TIME();

  224. if(0!=SYS.study_sec){if(--SYS.study_sec==0)LED_STA_CONVER(led_standby);}
  225. //DEBUG_COM_STREAM("\r\n我是秒测试",NULL);
  226. }



  227. void CHECK_KEY_STUDY(void)
  228. {
  229. uchar t_50ms=0;
  230. uint i;
  231. if(p_key1==1)return;
  232. WAIT_5ms(10);
  233. if(p_key1==1)return;

  234. #ifdef DEBUG_TX
  235. RF.pulse_us=400;
  236. i=RF.pulse_us*32;
  237. DEBUG_COM_STREAM("\r\n同步%i",(u8*)&i);
  238. TX1527(&SYS_SAVE.ini_flag);
  239. return;
  240. #endif

  241. while(1)
  242.         {
  243.         if(p_key1==1)break;
  244.         WAIT_5ms(10);
  245.         if(++t_50ms>70)////3.5 sec
  246.                 {
  247.                 RF_STUDY_EXIT();                                
  248.                 RESET_EEPROM();               
  249.                 DEBUG_COM_STREAM("\r\n清空配件",NULL);
  250.                
  251.                 LED_STA_CONVER(led_key);
  252.                 LED_ALL_FLASH(1,200);//全灯长亮一次
  253.                 while(p_key1==0);
  254.                 LED_STA_CONVER(led_standby);
  255.                 return;
  256.                 }        
  257.         }

  258. if(0!=SYS.study_sec)
  259.         {RF_STUDY_EXIT();
  260.         }
  261. else
  262.         {
  263.         RF_STUDY_START();
  264.         }
  265. }


  266. void Flash_OFF_act_halt(void)
  267. {
  268.   FLASH->CR1 |= 0x04;
  269. }

  270. //启用LPVR 如果HALT时不启用LPVR 耗电增加140uA
  271. /*Configure the MVR to be OFF during the halt phase of HALT mode*/
  272. void MVReg_OFF_act_halt(void)
  273. {
  274.   CLK->ICKR |= 0x20;
  275. }

  276. //t必须小于50
  277. void WAIT_5ms(uchar t)
  278. {
  279. TIME.ms5_ex=0;
  280. while(TIME.ms5_ex<t);//wfi();
  281. }

  282. const uchar reg_key[]={1,9,7,8,2,0,0,8};
  283. void main(void)
  284. {
  285. #ifdef FREQ_2M
  286. CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
  287. #else
  288. CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);
  289. #endif

  290. //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  291. INITIAL_ALL_PIN();

  292. TIM4_Config();
  293. TIME2_CONFIG();
  294. UART_CONFIG();
  295. READ_SYS_SAVE();

  296. RF_ARRAY_INI();
  297. enableInterrupts();        
  298. CHECK_CPU_REG();

  299. LED_STA_CONVER(led_standby);
  300. LED_ALL_FLASH(1,100);//500ms

  301. while (1)        
  302.   {
  303.     wfi();
  304.           PER_SECOND_EXE();
  305.         RF_CHECK_QUEUE();
  306.           RF_DECODE();
  307.         CHECK_KEY_STUDY();
  308.     if(UART.b_rxonoff)
  309.                   {
  310.                 UART.b_rxonoff=0;
  311.                 DEBUG_COM_STREAM("\r\n串口收到:",NULL);
  312.                 DEBUG_COM_STREAM(UART.rxbuff,NULL);
  313.                 if(memcmp(UART.rxbuff,reg_key,8)==0)
  314.                         {
  315.                         EXE_CPU_REG();
  316.                         CHECK_CPU_REG();
  317.                         }
  318.                 else if(memcmp(UART.rxbuff,"SYS?",4)==0)
  319.                         PRINT_SYS();
  320.                   }  
  321.         //TEST_TIM2();
  322.   }

  323. }

复制代码

全部资料51hei附件下载:
脉宽自适应_通用解码.7z (3.95 MB, 下载次数: 39)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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