STM8_无线315&433通用解码
单片机源程序如下:
/*
*********************************************************************************************************
*
*模块名称 : EV1527遥控解码
*上升沿触发 触发中断后延时一段时间后检测引脚电平从而判断0 1
采集上升沿触发后第6 10 14 个振荡周期时的引脚电平 RF98
PT2262 连续触发是每个周期的间隔在15MS左右
EV1527 宽电平时间 500US 窄 250us 同步码 5.7MS
*********************************************************************************************************
*/
#include "EV1527.h"
#include "led.h"
#include "tim1.h"
u8 EV1527_Status=0; //接收处理状态
u8 EV1527_Receive_Count=0; //接收数据位计数
Receive_Data EV1527_Receive_Data[48]; //24位的脉冲
u8 EV1527_receive_ok=0; //接收完成标志
//u8 EV1527_gather_count=3; //每个码位采集3次
//u8 EV1527_code[3]; //用来暂时存储采集3次得到的值
//u8 EV1527_repeat; //重复触发计数
u8 EV1527_check_level_bit; //外部中断触发(上升沿)标志。有外部中断触发后则开始检测引脚电平是否有变化。
u16 Interval_tim_high=0; //上升沿触发后高电平时间
u16 Interval_tim_low=0; //上升沿触发后低电平时间
u8 EV1527_pin_state_buf; //引脚定义缓存
u16 EV1527_time_out_buf; //定时器超时时间缓存
u16 TongBuMa_low=0;
u16 a_count=0;
bool LearningModel=FALSE; //学习模式
bool INT_bit=FALSE;
// 定时器2配置函数
void EV1527_TIM1_Config(void)
{
TIM1_TimeBaseInit(8,TIM1_COUNTERMODE_UP,50000,0); //8分频,定时50MS,1uS的分辨率
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
TIM1_Cmd(ENABLE);//DISABLE
}
/*
初始化
*/
void EV1527_Init()
{
/* 输入模式 */
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //配置浮空输入。
/* 将GPIOD端口设置为下降沿触发中断-*/
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
GPIO_Init(LED_PORTD, (LED_2|LED_3), GPIO_MODE_OUT_PP_HIGH_FAST );
EV1527_TIM1_Config();
}
/*
********************************************************************************
定时器溢出中断内处理
********************************************************************************
*/
void EV1527_TIM_IT_Updata_Handdle(void)
{
TIM1_SetCounter(0);
EV1527_Status=0;
EV1527_Receive_Count=0;
//EV1527_repeat=0;
//EV1527_Receive_Data=0;
Interval_tim_low=0;
EV1527_time_out_buf=0;
// TIM1_Cmd(DISABLE);
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
/*
外部中断触发函数
开始接收地址码跟数据码
*/
void EV1527_ChuLi(void)
{
//for(EV1527_Receive_Count=0;EV1527_Receive_Count<48;EV1527_Receive_Count++)
EV1527_Receive_Count=0;
while(EV1527_Receive_Count<48)
{
while((EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是高电平就等待
Interval_tim_high=TIM1_GetCounter(); //记录高电平时间
TIM1_SetCounter(0);
EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_high;
EV1527_Receive_Data[EV1527_Receive_Count].Level=1; //保存到数组中
EV1527_Receive_Count++;
while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是低电平就等待
Interval_tim_low=TIM1_GetCounter(); //记录高电平时间
TIM1_SetCounter(0);
EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_low;
EV1527_Receive_Data[EV1527_Receive_Count].Level=0; //保存到数组中
EV1527_Receive_Count++;
if(EV1527_Status==0)
{
EV1527_Receive_Count=49;//超时退出
}
}
if(EV1527_Status==0)
{
EV1527_receive_ok=0;
EV1527_Receive_Count=0;
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦输入。
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
TIM1_SetCounter(0);
}
else
{
EV1527_receive_ok=1;
}
}
void EV1527_Receive_Handle(void)
{
if(INT_bit==TRUE)
{
INT_bit=FALSE;
/* 开启定时器 0 记录低电平持续的时间,并检测是否为同步码 */
a_count=0;
TongBuMa_low=0;
EV1527_Status=1;
while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是低电平就等待
if(EV1527_Status==TRUE) TongBuMa_low=TIM1_GetCounter(); //记录低电平时间
TIM1_SetCounter(0); //从新计时。
/* 检测是否为同步码*/
if((TongBuMa_low>=5000)&&(TongBuMa_low<=38000)) //检测前一个低电平时间,是否符合同步码标
//是同步码 关闭外部中断,并开始接收地址码跟数据码
{
EV1527_ChuLi();
}
else //不是,则重新打开中断,继续检测同步码
{
EV1527_Status=0;
EV1527_Receive_Count=0;
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //配置上啦输入。
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发。
TIM1_SetCounter(0); //定时器计数值清零
}
}
}
/*
数据处理
*/
u8 EV1527_Process()
{
u8 EV1527_Data=0;
if(EV1527_receive_ok>=1)
{
u8 i=0;
u8 beishu=0;
u8 EV1527_DataTemp[24]={0};
u8 EV1527_addTemp_high=0;
u8 EV1527_addTemp_low=0;
// High_Low Level_0,Level_1; //电平
u16 Width_0,Width_1; //宽度
while(i<48)
{
// Level_0= EV1527_Receive_Data[i].Level;
Width_0=EV1527_Receive_Data[i].Width;
i++;
// Level_1= EV1527_Receive_Data[i].Level;
Width_1=EV1527_Receive_Data[i].Width;
beishu=(Width_0>Width_1)?(Width_0/Width_1):(Width_1/Width_0);
if(beishu>=2)//如果两个宽度的倍数大于等于2说明是有效电平
{
EV1527_DataTemp[i/2]= (Width_0>Width_1)?1:0;
}
else
{
i=50;
}
i++;
// if(i>=46)
// {
// Level_0= EV1527_Receive_Data[i].Level;
// }
}
if(i<49)
{
//解析地址
for(i=0;i<20;i++)
{
if(i<10)//解析高位 EV1527_address_high
{
if(EV1527_DataTemp[i]==1) // 置一
{
EV1527_addTemp_high<<=1;
EV1527_addTemp_high=EV1527_addTemp_high|0x01;
}
else if(EV1527_DataTemp[i]==0) //置零
{
EV1527_addTemp_high<<=1;
}
}
else //解析低位
{
if(EV1527_DataTemp[i]==1) // 置一
{
EV1527_addTemp_low<<=1;
上一篇:STM8S005K6单片机点亮流水灯程序
下一篇:最后一页
推荐阅读
史海拾趣
Hanghsing Enterprise Co., Ltd. 的五个发展故事
故事一:初创与起步
Hanghsing Enterprise Co., Ltd.(以下简称“Hanghsing”)成立于台湾,起初是一家专注于精密零部件制造的小型公司。公司位于No. 1, Lane 39, Seuwe St., Tali City, Taichung Hsien, Taiwan 412,凭借对品质的不懈追求和对市场的敏锐洞察,Hanghsing逐渐在行业内崭露头角。公司初期主要生产Valve Shafts、Nuts、Screws等精密不锈钢部件,这些产品广泛应用于电子、机械等多个领域。通过不断优化生产工艺和质量控制体系,Hanghsing逐渐建立了良好的市场口碑。
故事二:技术突破与产品升级
随着电子行业的快速发展,Hanghsing意识到技术创新的重要性。公司加大了对研发的投入,引进了一批高素质的技术人才,致力于新产品的开发和现有产品的升级。经过不懈努力,Hanghsing成功推出了一系列高精度、高可靠性的电子产品零部件,如Sleeve Barrels、Toggles和Mandrels等。这些产品不仅满足了市场对高品质零部件的需求,还进一步巩固了公司在电子行业供应链中的地位。
故事三:市场拓展与国际合作
随着产品质量的不断提升和市场份额的逐步扩大,Hanghsing开始将目光投向国际市场。公司积极参加各类国际展会,与全球知名电子企业建立合作关系,将产品销往世界各地。同时,Hanghsing还注重与国际技术标准的接轨,确保产品符合国际市场的严格要求。通过不断的市场拓展和国际合作,Hanghsing在国际上的知名度和影响力得到了显著提升。
故事四:产业升级与多元化发展
面对电子行业的快速发展和市场竞争的日益激烈,Hanghsing积极寻求产业升级和多元化发展的路径。公司开始涉足电子元器件的制造和研发领域,通过引进先进的生产设备和工艺技术,不断提升产品的附加值和市场竞争力。同时,Hanghsing还积极拓展上下游产业链,与原材料供应商和终端客户建立紧密的合作关系,形成了完整的产业生态体系。
故事五:绿色生产与可持续发展
在追求经济效益的同时,Hanghsing始终不忘履行社会责任。公司积极响应国家环保政策,致力于绿色生产和可持续发展。通过引进环保设备和工艺技术,减少生产过程中的污染物排放和资源消耗。同时,Hanghsing还加强了对员工的环保教育和培训,提高员工的环保意识和责任感。这些举措不仅有助于提升公司的社会形象和市场竞争力,还为推动电子行业的绿色发展做出了积极贡献。
当涉及到采用算术逻辑单元(ALU, Arithmetic Logic Unit)组成的二进制加减电路时,网友们可能会提出多种问题,这里列举一些常见问题及其解答:
1. ALU 如何实现二进制加法?
回答:
在二进制加法中,ALU 使用全加器(Full Adder)或一系列的全加器(对于多位二进制数)来实现。每个全加器接受三个输入:两个加数位(A 和 B)以及一个来自低位的进位(Cin)。它产生两个输出:一个和位(Sum)和一个向高位的进位(Cout)。通过级联多个全加器,可以完成多位二进制数的加法。
2. ALU 如何实现二进制减法?
回答:
二进制减法可以通过加法来实现,利用“补码”的概念。具体地,将减数取反加一(即求其二进制补码),然后将该补码与被减数相加。结果的正负由最高位(符号位)决定,其余位表示数值大小。ALU 内部可以包含专门的电路来处理这种补码加法,从而间接实现减法。
3. ALU 如何处理进位和借位?
回答:
在加法中,进位(Carry)是从低位向高位传递的,每个全加器都会输出一个进位信号给下一个高位的全加器。在减法(通过补码加法实现)中,由于使用了加法器,进位的概念仍然适用,但在某些情况下,它可能被视为“借位”的相反操作,尤其是在直观理解减法过程时。不过,从电路设计的角度来看,ALU 内部处理的是加法操作,包括进位。
4. ALU 如何支持更复杂的算术运算,如乘法和除法?
回答:
ALU 通常支持基本的算术运算(加、减)和逻辑运算。对于乘法和除法,ALU 可能不支持直接计算,或者仅支持部分乘法和除法的简化版本(如移位操作,可以视为乘以2的幂或除以2的幂的简化形式)。复杂的乘法和除法运算通常需要额外的硬件单元(如乘法器和除法器)来执行,这些单元可能作为ALU的补充或与之并行工作。
5. ALU 的设计如何影响计算机的性能?
回答:
ALU 的设计对计算机的性能有直接影响。更快的ALU 能够更快地完成算术和逻辑运算,从而提高整个计算机的处理速度。此外,ALU 的指令集和设计的灵活性也会影响其能够执行的操作种类和效率。现代CPU中的ALU通常非常高效且灵活,能够执行多种复杂的算术和逻辑操作,以满足现代应用程序的需求。
在第二次世界大战期间,Belden公司积极响应国家号召,将生产重心转向战争材料。其产品被广泛应用于坦克、飞机、移动无线电、潜艇、船舶、吉普车等各种军事机械中,为战争的胜利做出了重要贡献。这一时期的生产转型不仅展现了公司的社会责任感,也进一步提升了其在行业内的地位和影响力。
Emhiser Research非常注重创新管理和人才培养。公司建立了一套完善的研发流程和激励机制,鼓励员工提出创新性的想法和解决方案。同时,公司还积极与高校和研究机构合作,引进和培养了一批高素质的研发人才。这些人才不仅为公司带来了源源不断的创新动力,也为公司的长期发展奠定了坚实的基础。
随着全球经济的不断融合和发展,Bussmann公司也开始了其全球化战略。公司在全球范围内设立生产基地和研发中心,吸引和培养了大量的优秀人才。同时,公司也加大了对新技术和新产品的研发投入,不断推出具有竞争力的新产品。在全球市场上,Cooper Bussmann的电路保护方案广泛应用于各行各业,并获得了UL、CE、CSA等认证机构的认可。
这些故事展示了BUSSMANN公司在电子行业中的发展历程和取得的成就。从创业初期的艰辛与坚持,到汽车熔断器的崛起,再到库柏工业的收购与融合,以及芯片保险丝的创新突破和全球化战略的实施,BUSSMANN公司始终秉持着创新、质量和服务的理念,不断推动电子行业的发展和进步。
请注意,以上故事是基于BUSSMANN公司的历史和发展情况创作的,具体细节可能并不完全准确。如需了解更多关于BUSSMANN公司的信息,建议查阅相关的历史资料或访问其官方网站。
1945年,一位名叫Harry Hoffman的年轻人凭借对工厂安全的深刻关注,发明了压力机安全保护装置。这一装置能够在操作人员的手处于危险区域时迅速停止机器,有效保护了工人的安全。这一创新不仅为Hoffman公司奠定了技术基础,也标志着公司正式步入工业电气机柜和温控产品的研发与制造领域。Harry Hoffman的这项发明不仅解决了当时工厂安全的一大难题,也为公司后续的发展奠定了坚实的基础。
请大家看下下面打问号几行代码,抛开其功能不说,真的是奇怪了,我都看了又看,头都大了,就是不知道为什么,请朋友们指点下 #include<reg52.h> &nbs ...… 查看全部问答∨ |
|
STM32的驱动库好用吗?效率高吗?优化的吗?准备上STM32 N多年没买过开发板了,也没用过仿真器了。都是用软件编译调试好,直接ISP,然后通过串口命令开启调试信息的输出。 昨天买了块STM32F103全功能型开发板,他们的办事效率真低(深圳到广州通常当 ...… 查看全部问答∨ |
请问用哪款TI的DSP板做图像处理比较好,要可以和Matlab连接使用,且可通过Real Time Work Shop工具箱自动生成代码,要是版本新一些就更好了 最近需要买一块板子,请大家多多给建议啊 谢谢… 查看全部问答∨ |
求IAR Embedded Workbench for MCS-51 完整版 各位高手,小弟求IAR Embedded Workbench for MCS-51完整版,有哪位高人有,能否分享一下。我的邮箱jinghongchen@126.com… 查看全部问答∨ |