STC51单片机解码433M程序说明

这篇具有很好参考价值的文章主要介绍了STC51单片机解码433M程序说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近需要用到433M的单片机解码,上网搜了一下。大部分的程序都是基于定时器定时检测。感觉逻辑不够严谨。对于新手理解起来也比较困难。

查看EV1527手册

STC51单片机解码433M程序说明

STC51单片机解码433M程序说明

我是用的240K电阻。得到了每个数据宽度是1.29MS,每个数据宽度为16个LCK,每个LCK宽度大约为80us,

可以算出同步位的高电平时间大约为:320us,低电平持续时间为:9.9ms

数据1的高电平持续时间为:960us,  数据1的低电平持续时间为320us

数据0的高电平持续时间为:320us,数据0的低电平持续时间为960us。

已经知道了数据0和1还有同步信号的持续时间,我们来说一下思路

我首先开了一个us级的定时器,持续计数。不需要打开中断。

然后配置好对应的接收芯片的管脚。配置为外部中断。触发方式为上升沿,下降沿都触发。

在外部中断函数里面,记录当前定时器的计数值,然后清零计数器。

定义一个状态机

state = 0时:默认状态,检测是否为高电平。如果为高电平代表为上升沿,判断同步信号。

state = 1时:检测是否为低电平,如果为低电平,表示为下降沿,此时记录的时间为高电平的持续时间。判断是否符合同步信号的高电平时间要求。符合进入下一状态

state = 2时:检测管脚是否为高电平,如果为高电平,表示为上升沿,此时记录的时间为低电平持续时间。判断是否符合同步信号的低电平时间要求。符合进入接收状态。不符合,回到初始状态。

以此类推....具体可以看代码

//这里有优化。一搬同步信号只需要判断低电平持续时间就可以了。所以这个高电平范围可以大一点。
#define SYNC_H_MIN   0           //同步信号高电平持续时间 最低范围
#define SYNC_H_MAX   600       //同步信号高电平持续时间 最高范围


#define SYNC_L_MIN  8000       //同步信号低电平持续时间的最小值
#define SYNC_L_MAX  10997    //同步信号高电平持续时间的最大值,符合这个范围都判定有效。


#define DAT1_H_MIN     800    //数据1的高电平持续时间最小值  
#define DAT1_H_MAX   1063   //数据1的高电平持续时间最大值
#define DAT1_L_MIN      220    //数据1的低电平持续时间最小值
#define DAT1_L_MAX    400     //数据1的低电平持续时间最大值   

#define DAT0_H_MIN     220
#define DAT0_H_MAX    400
#define DAT0_L_MIN      800
#define DAT0_L_MAX    1063
uint32_t bitNums  = 0;    //已经接收的位数。
uint32_t valueTmp = 0;    //接收的数据。
uint32_t value = 0;  

void Ext_INT1 (void) interrupt INT1_VECTOR		//进中断时已经清除标志
{
		uint8_t  de = 0;						    //管脚的状态
		uint32_t holdTime  = 0;				    //持续的时间
		
		Timer1_Stop();
		holdTime  = (TH1<<8) | TL1;
		TH1= 0;TL1 =0;
		de = P33;	    //读取IO口状态
		Timer1_Run();
		

		switch(state)
		{
			case 0:		
				if(de == 1) 	//如果是高电平,那么是上升沿
					state= 1;
			break;
			case 1:		        //同步头高电平时间结束的时候
				if( de == 0		//检测到下降沿,并判断持续的时间 
					&& holdTime  >= SYNC_H_MIN 
					&& holdTime  <= SYNC_H_MAX)
				{
					state = 2;
				}
				else
				{
					state = 1;
				}
					
			break;
			case 2:		//同步信号低电平时间结束时,上升沿
			{
				if( de == 1 
					&& holdTime >= SYNC_L_MIN
					&& holdTime <= SYNC_L_MAX)    //判断同步低电平时间是否符合要求
				{
                    //符合要求,清0接收到的位数和数据。准备开始接收
					bitNums = 0;    
					valueTmp= 0;
					state = 3;
				}
				else
				{
                    //不符合要求直接回到状态1,不用回到状态0,因为不需要判断同步信号的高电平
                    //持续时间,低电平满足需求即可
					state = 1;
				}
			}
			break;
			case 3:		//信号高电平结束时
				if(de == 0)
				{
					valueTmp <<= 1;
					
					if(holdTime >= DAT1_H_MIN && holdTime <= DAT1_H_MAX)
					{
						valueTmp += 1;		//符合数据1的高部分
						state = 4;
					}
					else if(holdTime >= DAT0_H_MIN && holdTime <= DAT0_H_MAX)
					{
									//符合数据0的高部分
						state = 5;
					}
					else
					{
						state = 1;
						break;
					}
					bitNums += 1;
					if(bitNums >= 24)
					{    
                        value = valueTmp;       //保存接收到的数据。
						state = 1;
					}
				}
				else
				{

					state = 1;
				}
			break;
			case 4:		//判断数据1的低电平时间是否符合要求
			{
				if( de == 1
					&& holdTime >= DAT1_L_MIN
					&& holdTime <= DAT1_L_MAX)
				{
                    //符合数据1的低电平时间要求,回到3重新接收下一个数据。
					state = 3;
				}
				else
				{
					state = 1;	
				}
			}
			break;
			case 5:	//判断数据0的低电平时间是否符合要求
			{
				if( de == 1 
					&& holdTime >= DAT0_L_MIN
					&& holdTime <= DAT0_L_MAX)
				{
                    //符合要求,接收下一个数据。
					state = 3;
				}
				else
				{
					state = 1;
				}
			}			
			break;
			default:
				state = 0;
			break;
		}
	
}

 文章来源地址https://www.toymoban.com/news/detail-500098.html

到了这里,关于STC51单片机解码433M程序说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STC89C51系列单片机与ADC0832通信

    ADC0832是一种常用的8位模数转换器,它可以将模拟信号转换为数字信号,以供单片机进行处理。STC89C51系列单片机是一款常见的8位单片机,具有强大的处理能力和丰富的外设资源,可以与ADC0832通信,实现模拟信号采集的功能。 本文将介绍如何使用STC89C51单片机与ADC0832通信,并

    2024年02月13日
    浏览(32)
  • 433M遥控器无线解码1527协议

    433M遥控器无线解码1527协议,定时器轮询法 1527协议,最前面是引导码,紧接着前20位为地址码,每个遥控器不一样,后4位是按键码,每个遥控器都是一样的, 逻辑分析仪捕捉图形如下图: 分别按下遥控器的四个按键结果如下图: ev1527.c文件 ev1527.h文件

    2024年02月15日
    浏览(28)
  • STC51单片机学习9--DS18B20温度传感器

    DS18B20是Dallas半导体公司的一款数字温度传感器芯片; DS18B20是一款支持 1-wire总线接口的温度传感器; DS18B20能测量的温度范围-55℃--125℃,精度是±0.5℃; DS18B20可以将分辨率设定为9到12位; DS18B20的工作电压范围3--5.5V 单片机的P4.1引脚用来接DS18B20的数据引脚 以下是友台半导体

    2024年02月12日
    浏览(39)
  • 基于51单片机的四种波形信号发生器仿真设计(仿真+程序源码+设计说明书+讲解视频)

    本设计 (仿真+程序源码+设计说明书+讲解视频) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0015 1、本设计采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和LCD1602液晶显示电路。 2、电路采用单

    2024年02月05日
    浏览(34)
  • 【STC89C52】学习51单片机的必备电子电路知识基础

    电子电路是学习51单片机的基础, 如果能把以下几个模块弄清楚学习51单片机就不成问题啦。 目录 1.电平 2.单片机IO口 3.电阻 4.电容  5.电路原理图 ​编辑 6.单片机最小系统结构  7.单片机工作的基本时序 单片机是一种数字集成芯片,数字电路中只有高电平和低电平。 单片

    2023年04月26日
    浏览(46)
  • STC 51单片机54——气压水压计HX710B 串口显示均值滤波+滑窗滤波

        //气压模块为红色模块,传感器型号未知,其信号放大器型号为HX710B // STC15W408AS 11.0592MHz 波特率9600,串口输出大气压强值 // STC15W408AS没有定时器1,所以用定时器2做波特率发生器 // 采用电脑USB供电会有很大的干扰,建议采用电池或者充电宝 #include \\\"reg52.h\\\" #define Download_co

    2024年02月05日
    浏览(28)
  • 初学51单片机(STC89C52)一个倒计时显示器和大家分享

      想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。   通过加一,减一,乘2三个操作,

    2024年02月10日
    浏览(41)
  • 51单片机(80951系列)引脚功能说明

    1.0.1 中断源 AT89C51一共有5个中断源 (1) :外部中断0,外部中断请求信号由 引脚输入,低电平或下降沿有效,中断请求标志位IE0。 (2) :外部中断1,外部中断请求信号由引脚 输入,低电平或下降沿有效,中断请求标志位IE1。 (3)T0:定时/计数溢出时发出中断请求信号,

    2024年02月06日
    浏览(32)
  • 学习51单片机引脚及功能说明

    1.输出/输入引脚 (1)P0口:不接外部存储器和不扩展I/O口时,作为双向输入/输出口,在接有外部存储器和扩展I/O口时,P0口分时复用为低8位地址总线和双向数据总线。 (2)P1口:作为双向I/O口使用。 (3)P2口:作为双向I/O口使用,在扩展片外寄存器时,作为高8位地址总线

    2024年02月05日
    浏览(25)
  • 【51单片机】STC-ISP软件保姆级烧录教程(以普中A2开发板为例)

            本章节实验到此已经完毕,考虑到大家的基础差异较大,刚接触51单片机的小伙伴可能对烧录过程有些困惑,作者便在篇末给大家提供保姆级烧录教程,帮助大家快速掌握单片机程序烧录技巧,希望对大家有所帮助! 本教程所需软件下载(win系统)         

    2023年04月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包