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  单片机 引用地址:STM8单片机无线315&433脉宽自适应_通用解码程序

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

推荐阅读最新更新时间:2024-11-08 11:07

8051单片机中断系统结构及中断控制原理
当几个中断源同时向CPU请求中断时,按所发生的实时事件的轻重缓急排队,优先处理最紧急事件的中断请求,于是单片机规定每个中断源的优先级别。 当CPU正在处理一个中断请求,又发生另一个优先级比它高的中断请求,CPU暂时中止对前一中断处理,转而去处理优先级更高的中断请求,待处理完后,再继续执行原来的中断处理程序,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。 由于外界异步事件中断CPU正在执行的程序时随机的,CPU转向去执行中断服务程序时,除了硬件会自动把断电地址,即16位PC程序计数器的值压入堆栈之外,用户还得注意保护有关工作寄存器,累加器,标志位等信息,这个过程通常称为保护现场 。以便在完成中断服务程序后,恢复原工
[单片机]
面向快速嵌入式MCU设计的仿真
  调试嵌入式应用有很多种方法。设计者利用包含电路内置仿真器(in-circuit emulator,ICE)和电路内置调试器(in-circuit debugger,ICD)的调试工具可以快速构建出系统原型,帮助设计者在建立原型阶段和最终测试阶段查找硬件和软件中的问题。在调试过程中,成本和易用性是人们主要关心的问题,相比ICE工具,设计者可能更喜欢使用仿真器来调试代码段,因为仿真器可以直接在PC上运行,不需要映射到目标硬件上。   仿真器使用起来非常方便,通过它们开发人员可以了解一款新型的MCU,或者熟悉一套新的集成开发环境(integrated development environment ,IDE)工具包,而不需要接触目标
[单片机]
面向快速嵌入式<font color='red'>MCU</font>设计的仿真
基于单片机的高精度倾角测量系统的设计
在地质石油勘探、设备安装、道路桥梁建设等工程应用以及机器人控制、坦克和舰船火炮平台控制、飞机姿态控制等系统的自动水平调节中,都需要高精度的倾角测量。但高精度的倾角,测量设备通常体积较大,成本高,使许多工程应用受到限制。本文从倾角的高精度测量出发,着重介绍了倾角传感器输出稳定性处理、温度补偿、非线性处理(正弦曲线拟合)、信号调理及其测量电路的特殊处理等。  1 倾角测量系统的硬件设计   倾角测量系统硬件部分主要由MEMS传感器(含双轴倾角传感器和温度传感器)、SOC电路、数据处理及传输和其他辅助电路等模块组成。倾角测量系统的组成框图如图1所示。 2011-3-12 00:03:45 上传 下载附件 (13.09
[单片机]
基于<font color='red'>单片机</font>的高精度倾角测量系统的设计
基于ATmega16单片机的实时温度采集与分析系统
随着 计算机 技术尤其是单片微型机技术的发展,温度对人们的生活与工作影响很大,所以要实时采集温度并且对其进行分析。为此,实现实时准确的测量监控。采用串口传送数据并且在PC机上进行分析。由于单片机的控制方便、简单和灵活等优点,采用了高性能avr单片机来控制GTJ4-10A固态继电器,最总实现温度的控制。从而最总在PC机上绘制温度曲线并保存数据和分析温度的数据。 1 系统组成及基本原理 本系统由温度采集模块,固态继电器控制模块,单片机模块,PC机软件处理模块。4个模块加起来实现温度的控制,以及温度采集和温度经过软件处理的分析。它们的逻辑关系如图1所示。 图1 逻辑关系图 本系统的任务是对某种特定环境的温度进行采集并进行保存
[单片机]
51单片机学习笔记———7.按键法配置定时器
如果用延时函数来对按键进行检测的话,会消耗单片机的内存,不是很好,于是我们有以下方法: unsigned char cnt1 = 0XFF; cnt1 = (cnt1 1)|KEY1; if(cnt1!=0x00) { KeyLock = 0; } else if (KeyLock==0) { KeyNum = 1; KeyLock = 1;//防止按键触发 }
[单片机]
AVR单片机多路ADC转换程序
AVRAD转换使用注意: 绝对的应用经验! 1、注意采样保持时间要足够长 最少62us 2、注意AREF的稳定性 3、注意悬空的引脚无意义 4、注意切换通道后首次测量结果应该舍弃 AVR各种学习开发工具 搜索 SHOP AVRVI 给你一个tiny13写的多路AD采集的例子。 仅提供思路的主要部分,其余部分暂不方便提供,ICC编写。 程序自动采集并放入数组中,需要使用前调用GetAD将结果存到多维数组搜索的最后,四个数取平均。 volatile unsigned char time_count=0,AD_datai=0,channer=0; volatile unsigned char AD_d
[单片机]
单片机 MSP430 串口 计算 波特率
软件计算波特率地址: http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html MSP430怎么计算波特率在各手册都有提到,但始终不清楚,直到看了官网的一篇文章: https://processors.wiki.ti.com/index.php/USCI_UART_Baud_Rate_Gen_Mode_Selection The formulas for calculating USCI UART Baud Rate Register Values are basically available
[单片机]
<font color='red'>单片机</font> MSP430 串口 计算 波特率
利用微控制器简化电子镇流器的设计
目前,设计工程师在设计荧光灯或HID电子镇流器时面临着许多新的挑战。除了一般的成本、可靠性与寿命压力之外,设计师还必须实现一些增强的终端用户功能,例如远程亮度控制,同时还要满足日益严格的国内与国际照明规范。 虽然传统的离散模拟设计技术仍然能够实现很多新的功能需求,但是,采用新一代的基于Flash的低成本8位微控制器(MCU)对于实现满足规范要求的低成本、高分辨率、数字电子镇流控制的设计,具有多种系统优势。尤其是,这些MCU简化了数字反相控制功能,并集成了PFC功能。 电子镇流控制 图1给出了大多数电子镇流控制应用中采用的基本模块结构。主要模块包括EMI(电磁干扰)滤波器、全波整流器、有源PFC前端、数字控制部分和共振灯管
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved