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

最新更新时间:2021-11-25来源: eefocus关键字:STM8  单片机 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:


/*

RFINT不能用PA1 要改板 改在PC6

*/

/* Includes ------------------------------------------------------------------*/

#define MAIN_C


#include "ALL.h"


void Delay(u16 nCount)

{

  /* Decrement nCount value */

  while (nCount != 0)

  {

    nCount--;

  }

}



//10ms定时中断初始  在PWM时可更改

void TIME1_CONFIG(void)

{

/* Init TIMER 1 */

CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);

TIM1->IER = 0x00;//??????????? // 禁止中断

TIM1->EGR = 0x01;//??????????? // 允许产生更新事件

TIM1->PSCRH = 0x0;//

TIM1->PSCRL = 0x4;// 2@2MHZ  4@4MHZ

TIM1->ARRH = 0x27; // 设定重装载时的寄存器的高8位 2710=10ms  

TIM1->ARRL = 0x10;

//TIM2->CNTRH = 0xEA; // 设定计数器的初值

//TIM2->CNTRL = 0x60; // 定时周期=1*60000=60000uS=60ms

TIM1->CR1 = 0x01;// b0 = 1,允许计数器工作 ?// b1 = 0,允许更新 设置控制器,启动定时器

TIM1->IER = 0x01;// 允许更新中断

}


//5ms定时中断初始  CPU主频2Mhz

void TIME2_CONFIG(void)

{

/* Init TIMER 4 */

  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);

TIM2->IER = 0x00;//??????????? // 禁止中断

TIM2->EGR = 0x01;//??????????? // 允许产生更新事件

#ifdef FREQ_2M

TIM2->PSCR = TIM2_PRESCALER_2;// 2@2M  4@4M 取决于CPU频率

#else

TIM2->PSCR = TIM2_PRESCALER_4;// 2@2M  4@4M 取决于CPU频率

#endif

#if 0//def GUDINGMA//临时为固定码增加用

TIM2->PSCR = TIM2->PSCR/2;// 让定时器速度再快一倍出来

#endif



TIM2->ARRH = 0xc3; // 设定重装载时的寄存器的高8位  c350=50ms

TIM2->ARRL = 0x50; //本参数配合无线

//TIM2->CNTRH = 0xEA; // 设定计数器的初值

//TIM2->CNTRL = 0x60; // 定时周期=1*60000=60000uS=60ms

TIM2->CR1 = 0x01;// b0 = 1,允许计数器工作 ?// b1 = 0,允许更新 设置控制器,启动定时器

TIM2->IER = 0x01;// 允许更新中断

}


//5ms定时中断设置  CPU主频2Mhz

void TIM4_Config(void)

{

/* Init TIMER 4 */

  CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);

/* Init TIMER 4 prescaler: / (2^6) = 64/ */

#ifdef FREQ_2M

  TIM4->PSCR = TIM4_PRESCALER_64;//// 4M=128  2M=64

#else

  TIM4->PSCR = TIM4_PRESCALER_128;//// 4M=128  2M=64

#endif

/* HSI div by 1 --> Auto-Reload value: 16M/16 /64  = 1/64M, (1/64M) / 100 = 156.25*/

  TIM4->ARR = 156;

/* Counter value: 2, to compensate the initialization of TIMER*/

  //TIM4->CNTR = 2;

/* clear update flag */

  TIM4->SR1 &= ~TIM4_SR1_UIF;

/* Enable Counter */

  TIM4->CR1 = TIM4_CR1_CEN;

  TIM4->IER=1;

}





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



void INITIAL_ALL_PIN(void)

{

//CFG->GCR |= CFG_GCR_SWD;/*disable SWIM interface*/

/*

GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯

GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯

GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯

GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_OD_LOW_SLOW);//关SET LED灯

*/


//GPIO_Init(GPIOA,GPIOA_OUT_L,GPIO_MODE_OUT_PP_HIGH_SLOW);//关SET LED灯

GPIO_Init(GPIOB,GPIOB_OUT_H,GPIO_MODE_OUT_OD_HIZ_SLOW); //关ALARM LED灯

GPIO_Init(GPIOC,GPIOC_OUT_L,GPIO_MODE_OUT_PP_LOW_SLOW);//PWM

GPIO_Init(GPIOC,GPIOC_IN_PU,GPIO_MODE_IN_PU_NO_IT);//按键中断


GPIO_Init(GPIOD,GPIOD_OUT_H,GPIO_MODE_OUT_PP_HIGH_FAST);//串口发送

GPIO_Init(GPIOD,GPIOD_IN_PU,GPIO_MODE_IN_PU_NO_IT);//i2c



EXTI->CR1 =(EXTI_SENSITIVITY_RISE_FALL<<4);

GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_IN_FL_IT);//无线接收


}




void UART_CONFIG(void )

{

UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

UART1_ITConfig(UART1_IT_TC, DISABLE);

UART1_Cmd(ENABLE);


}



void PUT_CHAR(uchar Data)

{

int i=10000;


UART1->SR&=~UART1_FLAG_TC;//COM_USART[COM1]->SR&~USART_FLAG_TC;

UART1->DR = Data;

while((UART1->SR & UART1_FLAG_TC) == 0x00)

        {if(--i==0)break;

        }// 若发送寄存器不空,则等待        

}


const char hex[] = "0123456789ABCDEF";

//********************************************************

PRINT_DEC_OR_HEX(uchar format,uchar d)

{

uchar i;

switch(format)

        {case 'd':

                i=d/100;

                if(i!=0)PUT_CHAR(hex[i]);

                i=(d%100)/10;

                if(d>=100||i!=0)PUT_CHAR(hex[i]);

                PUT_CHAR(hex[d%10]);

                break;

        case 'D':                                

                PUT_CHAR(hex[d/10]);

                PUT_CHAR(hex[d%10]);

                break;               

        case 'x':

                PUT_CHAR(hex[d>>4]);

                PUT_CHAR(hex[d&0x0f]);

                break;

        }

}



//********************************************************

void PRINTF (uchar *pstring,uchar *arg)

{

uchar str;

char count=0;

uchar i;

uint t;

//PUT_CHAR ('r');

//PUT_CHAR ('n');

while(1)     /* until full pstring string read */

        {

        str = *pstring++;       /* until '%' or '' */

        if(str=='%')

                {str = *pstring++;

                if(str=='i')        

                                {t=(arg[count]<<8)+arg[count+1];

                                if(t>=10000)

                                        {str=t/10000;PRINT_DEC_OR_HEX('d',str);}

                                if(t>=1000)

                                        {str=t%10000/1000;PRINT_DEC_OR_HEX('d',str);}

                                if(t>=100)

                                        {str=t%1000/100;PRINT_DEC_OR_HEX('d',str);}

                                if(t>=10)

                                        {str=t%100/10;PRINT_DEC_OR_HEX('d',str);}

                                        {str=t%10;    PRINT_DEC_OR_HEX('d',str);}

                                count++;        

                                }

                else

                                PRINT_DEC_OR_HEX(str,arg[count++]);

                }

        #if 0

        else if(str=='

)//打印数组        

                {

                str = *pstring++;

                count=0;

                while(1)

                        {

                        if(str=='x')        

                                {i=arg[count]>>4;                                

                                if(i==0x0b)PUT_CHAR('G');

                                else if(i==0x0A)PUT_CHAR('+');

                                else if(i>9)break;                        

                                else PUT_CHAR(hex[i]);                                

                                

                                i=arg[count]&0x0f;

                                if(i==0x0b)PUT_CHAR('G');

                                else if(i==0x0A)PUT_CHAR('+');                                

[1] [2]
关键字:STM8  单片机 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic555608.html

上一篇:STM8S驱动OLED12864
下一篇:车载屏的STM8单片机驱动 128x16点阵屏输出汉字

推荐阅读

车载屏的STM8单片机驱动 128x16点阵屏输出汉字
STM8单片机源程序:/*PE6  信号选择  0:控制卡   1: CPUPB7  5V电源控制  O:关   1:开*/#include <iostm8s105s4.h>#define        uint         unsigned    int#define        uchar        unsigned   
发表于 2021-11-25
STM8单片机+EV1527无线315&433通用遥控解码程序
单片机源程序如下:/************************************************************************************************************        模块名称 : EV1527遥控解码*                  上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1采集上升沿触发后第6 10 14    
发表于 2021-11-25
stm8的18b20温度显示程序
单片机源程序如下:#include"stm8s.h"#include"Cry12864.h"#include"temp.h"#include"tim1.h"void LcdDisplay(int temp) ;uint a;void main( void ){ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部时钟1分频16m  Ini_Lcd();//液晶初始化  Tim1_Init();//时钟初始化  while(1)  
发表于 2021-11-25
STM8单片机+EV1527无线315&433通用遥控解码
STM8_无线315&433通用解码单片机源程序如下:/************************************************************************************************************模块名称 : EV1527遥控解码*上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1采集上升沿触发后第6 10 14     个振荡周期时的引脚电平 RF98PT2262 连续触发是每个周期的间隔在15MS左右EV1527   宽电平时间 500US 窄 250us 同步码 5.7MS
发表于 2021-11-12
stm8 stm8s stm8af 485接口 modbus协议代码
本人使用stm8af62a6,stm8s和stm8af大多数是互通的,只用一个库函数62a6只能使用uart3!485接口是硬件,不需要管,任何硬件接线都可以实现代码见附件,已实现通信主函数代码,主要为初始化函数,以及modbus帧接收处理函数,帧接收处理按自己的需求自行修改,本例的处理函数为接收数据再多输出一点数据单片机源程序如下:/******************************************************************mian.c文件部分******************************************************************/void mai
发表于 2021-11-12
stm8s105k4单片机PWM波配置
//ccr = 0~499void setPWM1(unsigned short ccr){//PC1  TIM1_CCR1H = (unsigned char)(ccr>>8);  TIM1_CCR1L = (unsigned char)(ccr & 0xff);}void setPWM2(unsigned short ccr){//PC2  TIM1_CCR2H = (unsigned char)(ccr>>8);  TIM1_CCR2L = (unsigned char)(ccr & 0xff);}void setPWM3(unsigned sho
发表于 2021-11-25
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved