433和315无线模块的软件编解码遥控程序
射频解码433流程

射频解码433流程步骤和流程射频解码433是指通过接收和解码433MHz射频信号,将其转换为可读取的数据。
这种技术广泛应用于无线遥控器、智能家居系统等场景中。
本文将详细描述射频解码433的步骤和流程,确保流程清晰且实用。
1. 硬件准备首先,我们需要准备一些硬件设备来进行射频解码433。
一般需要以下设备:•射频接收器模块:用于接收433MHz射频信号。
•微控制器或单片机:用于控制射频接收器模块和处理解码后的数据。
•电源:为射频接收器模块和微控制器供电。
•连接线和电路板:用于连接各个硬件设备。
2. 硬件连接接下来,我们需要将硬件设备连接起来,以便进行射频解码433的操作。
具体的连接方式取决于所使用的硬件设备,一般需要按照以下步骤进行连接:1.将射频接收器模块的信号引脚连接到微控制器或单片机的输入引脚。
2.将射频接收器模块的电源引脚连接到电源。
3.将微控制器或单片机的电源引脚连接到电源。
4.连接其他必要的引脚,如地线等。
确保连接正确无误后,我们可以开始进行射频解码433的操作。
3. 射频信号接收在进行射频解码433之前,我们首先需要接收到射频信号。
射频信号一般由遥控器等设备发出,包含了一些特定的编码信息。
为了接收射频信号,我们需要进行以下步骤:1.配置射频接收器模块:根据所使用的射频接收器模块的规格和说明,配置接收器的参数,如接收频率、解码方式等。
2.监听射频信号:通过微控制器或单片机的程序,监听射频接收器模块的输入引脚,以判断是否接收到射频信号。
3.接收射频信号:一旦接收到射频信号,将其存储到微控制器或单片机的内存中,以便后续的解码操作。
4. 射频信号解码接收到射频信号后,我们需要对其进行解码,以获取其中的编码信息。
解码的过程一般包括以下步骤:1.数据预处理:对接收到的射频信号进行预处理,如滤波、放大等。
这一步骤可以根据具体的需求进行调整。
2.解码算法选择:根据接收到的射频信号的特点,选择合适的解码算法。
关于无线遥控315模块的发射与接收

关于无线遥控315模块的发射与接收最近为了开发无线数据传输项目,看了不少无线数据发送与接收的资料,其中无线遥控315模块比较便宜和应用比较广泛,以下是单片机模拟2272软件解码;在无线遥控领域,PT2262/2272是目前最常用的芯片之一,但由于芯片要求配对使用,在很大程度上影响了该芯片的使用,笔者从PT2262波形特征入手,结合应用实际,提出软件解码的方法和具体措施。
一、概述PT2262/2272是一种CMOS工艺制造的低功耗低价位通用编解码电路,是目前在无线通讯电路中作地址编码识别最常用的芯片之一。
PT2262/2272最多可有12位(A0-A11)三态地址端管脚(悬空,接高电平,接低电平),任意组合可提供531441地址码,PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚串行输出。
PT2262/2272必须用相同地址码配对使用,当需要增加一个通讯机时,用户不得不求助于技术人员或厂家来设置相同地址码,客户自己设置相对比较麻烦,尤其对不懂电子的人来说。
随着人们对操作的要求越来越高,PT2262/2272的这种配对使用严重制约着使用的方便性,人们不断地要求使用一种无须请教专业人士,无须使用特殊工具,任何人都可以操作的方便的手段来弥补PT2262/2272的缺陷,这就是PT2262软件解码。
二、解码原理上面是PT2262的一段波形,可以看到一组一组的字码,每组字码之间有同步码隔开,所以我们如果用单片机软件解码时,程序只要判断出同步码,然后对后面的字码进行脉冲宽度识别即可。
2262每次发射时至少发射4组字码,2272只有在连续两次检测到相同的地址码加数据码时才会把数据码中的“1”驱动相应的数据输出端为高电平和驱动VT端同步为高电平。
因为无线发射的特点,第一组字码非常容易受零电平干扰,往往会产生误码,所以程序可以丢弃下面我们来仔细看一下PT2262的波形特征:振荡频率f=2*1000*16/Rosc(kΩ) kHz 其中Rosc为振荡电阻这里我们选用的是一种比较常用的频率f≈10 kHz, Rosc=3.3MΩ(以下同)。
315遥控解码模块

315遥控解码模块(同步头的范围5-11MS )315遥控解码模块通电后,指示灯慢闪(灭3S,亮1S )循环闪烁,此状态为正常待机,可接收并处理已编码遥控按键信号。
指示灯状态提示: 慢闪(灭3S,亮1S ):正常待机按“编码”键后常亮:提示操作有效快闪(灭1S,亮1S ):编码状态按遥控按键后亮2秒:编码成功编码说明:按住“编码”键不放直至指示灯常亮,放开“编码”键,这时指示灯快闪(灭1S,亮1S )循环闪烁,此时进入编码状态,可接收并储存遥控按键码。
本解码模块可存储1~16个遥控按键码,1~16个按键码对应输出四个电平,分别是: 第1个、第5个、第9个、 第13个 对应输出端(D0)第2个、第6个、第10个、第14个 对应输出端(D1)第3个、第7个、第11个、第15个 对应输出端(D2)第4个、第8个、第12个、第16个 对应输出端(D3)模块进入编码状态后,按下第1个遥控按键指示灯亮,按下“编码”键(在接收到数据10秒内没按下“编码”键不保存),指示灯灭10秒,提示第1个按键编码成功;随即回到编码状态;再按住第2个遥控按键指示灯亮,按下“编码”键(在接收到数据10秒内没按下“编码”键不保存),指示灯灭10秒,提示第2个按键编码成功,随即回到编码状态... ... 直到完成要编码的所有遥控按键了。
退出编码说明:1.在编码状态下,无操作5秒后,储存已编码遥控按键并回到正常待机状态。
2.断开电源再重新通电,指示灯慢闪,进入待机状态。
3.在编码的状态下,按下“编码”键直至指示灯常亮后,放开“编码”键, 指示灯慢闪,进入待机状态。
初始化高低电平选择:(图示:H-L )电阻开路:通电后输出为高电平,按下遥控按键对应输出端为低电平。
电阻短路:通电后输出为低电平,按下遥控按键对应输出端为高电平。
2272-L4或2272-M4的选择说明:(图示:L4-M4)电阻开路:输出不锁存。
电阻短路:输出锁存。
基于51单片机315MHz无线收发模块调试程序

315Mhz 无线通信程序原理:第一块单片机p1.0 口输出脉冲方波提供给无线发射模块,无线发射模块将信号以电磁波的形式传到无线接收模块。
无线接收模块会根据这个电磁波还原出脉冲方波提供给第二块单片机,第二块单片机进行进一步的解算处理。
通信协议:根据这个原理和315模块的特性。
我决定以900us 高电平和2000us 底电平表示1;450us 高电平和2000us 低电平表示0。
而8个1或0组成一个字节。
为了防止误码,所以在每个字节的前面加一个2ms 高电平和2ms 低电平的起始码。
每个5S 发送一个字符,一个字符发送20 遍*******************************//****************************315Mhz 无线通信程序发送程序11.0592M 晶振 1 机器周期=1.0851us定时器产生2MS 定时TH0=0XF8;TL0=0XCD;900us 定时TH0=0XFC;TL0=0XC3;450us 定时TH0=0XFE;TL0=0X61;*******************************/#include<reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned charsbit WXSEND=P1^0;uchar timedata[8]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd,0xea,0x66};// 450us, 900us,2MS,6ms/*************************************11.0592MHZ 下500 毫秒延时,还准***************************************/void delay500ms(uint i)uint j;uchar k;while(i--){for(j=0;j<750;j++)for(k=0;k<200;k++);}}void time0init(){TMOD=0x01;//}void sendset(uchar senddata);// 发送数据程序void sendstartbit();// 数据发送起始信号2ms 高电平和2ms 低电平的起始码void sendlowbit();// 发送低电平void sendhighbit();// 发送高电平void main(){uchar senddata,i;time0init();// 定时器初始化senddata=0x55;while(1) {for(i=0;i<20;i++){sendset(senddata);// 发送数据程序}delay500ms(10);senddata++;}}// 发送数据程序void sendset(uchar senddata){uchar i,sendbit;sendstartbit();// 发送开始信号for(i=0;i<8;i++){sendbit=senddata&0x80;if(sendbit==0)sendlowbit(); // 发送低电平else sendhighbit();// 发送高电平senddata=senddata<<1;}// 数据发送起始信号6ms 高电平和2ms 低电平的起始码void sendstartbit(){WXSEND=1;TH0=timedata[4];TL0=timedata[5];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}void sendlowbit() // 发送低电平{WXSEND=1;TH0=timedata[0];TL0=timedata[1];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}void发送高电平sendhighbit()//{WXSEND=1;TH0=timedata[2];TL0=timedata[3];TR0=1;while(TF0==0);TR0=0;TF0=0;TH0=timedata[4];TL0=timedata[5];WXSEND=0;TR0=1;while(TF0==0);TR0=0;TF0=0;}/****************************315Mhz 无线通信程序接收程序11.0592M 晶振 1 机器周期=1.0851us用中断0 边沿触发中断,开启接收程序由于接收模块平时大部分时间是低电平,有信号时是高电平,而中断以,0 是负边沿触发,所硬件电路中接收模块的信号输出端经过非门后接到单片机P3.2接收到数据,用串口传到上位机的串口调试软件显示*******************************/#include<reg52.h>#include "intrins.h" #define uint unsigned int#define uchar unsigned char sbit WXrecep=P3^2;//uchar code timedata[6]={0xfe,0x61,0xfc,0xc3,0xf8,0xcd};// 450us,900us,2MS uchar wxrecepda;void time0init(){TMOD=0x21;// 定时器0TH0=0;TL0=0;//TMOD=0x20;/*TMOD:timer1,mode2,8-bitreload*/TH1=0xFD;/*TH1 11.0592MHz*/TL1=0XFD;EA=1;EX0=1;ET0=1;IE0=0;}void uartinit(){SCON=0x50;/*SCON: 模式1,8-bitUART, 使能接收*/ TR1=1;/*TR1:timer1run*/void receivewx();// 接收子程序void main(){time0init();// 定时器初始化uartinit();while(1) ;}void receivewx()// 接收子程序{uint i;uchar j,recedata;while(WXrecep==0);TR0=0;i=TH0*256+TL0;TH0=0;TL0=0;if((i>=1800)&&(i<=1890)){ recedata=0;for(j=0;j<8;j++){while(WXrecep==1);TR0=1;while(WXrecep==0);TR0=0;i=TH0*256+TL0;if((i>=390)&&(i<=450)) recedata=recedata&0xfe;else if((i>=800)&&(i<=860)) recedata=recedata|0x01;recedata=recedata<<1;TH0=0;TL0=0;}wxrecepda=recedata>>1 ;SBUF=wxrecepda;while(TI==0);TI=0;}}void wxrecint() interrupt 0{TH0=0;TL0=0;TR0=1;EX0=0;receivewx();EX0=1;}。
315M无线遥控C51解码程序

315M无线遥控C51解码程序发布时间: 2008-11-03 ,阅读: (1041) ,来源:/*315M无线解码程序*//*无线码宽电平脉冲时间1.8ms,低电平脉冲时间600us,同步码低电平时间18.6ms P1口接LED显示接收到的无线码的最后一字节数据MCU:STC12C4052,12MHzOSC,调试通过*/#include <stc12c4052.h>#define uchar unsigned char#define WUXIAN P3_2 //无线信号输入脚#define _rlcar_(RX) CY=RX&0X80 //RX带进位左移1位,数据放入ACCuchar bdata wx_data0,wx_data1,wx_data2; //存储24位无线数据uchar data wx_code0,wx_code1,wx_code2;uchar data wx_count,wxcount_buf; //低电平时间计数器uchar data wx_bit; //无线码位数uchar data t_10ms;uchar data t_500ms;bit tb_flag; //同步码接收成功标志bit wx_ok; //无线码接收成功标志bit wx_sta; //无线信号输入脚的高低电平状态void mcu_initialize() {WDT_CONTR=0x00; //关闭看门狗AUXR=0; //定时器0和1设为传统8051速度,12分频P1M0=0;P1M1=0x0; //P1为准双向口P1=0;P3M0=0x04;P3M1=0x00; //P3.2设置成输入脚TR0=0;TH0=0x9c;TL0=0x00; //100us中断一次TMOD|=0x02; //设置T0为自动装入的8位定时器ET0=1; //允许T0中断EA=1;TR0=1; //启动T0}void main() {mcu_initialize();while(1);}void decode() {if(WUXIAN) { //检测无线I/O口为高if(!wx_sta) {wx_sta=1; //无线信号从低变高wxcount_buf=wx_count;if(tb_flag) { //同步码标志为1if((0x02<wxcount_buf)&&(wxcount_buf<0x08)){ //低电平脉宽范围在200us 到800us之间CY=1;}else if((0x0d<wxcount_buf)&&(wxcount_buf<0x14)){ //低电平脉宽范围在1.3ms到2ms之间CY=0;}else{ //干扰码loop2:wx_count=0;wx_bit=0;wxcount_buf=0;tb_flag=0;return;}_rlcar_(wx_data0); //移位寄存器,接收一位数据wx_data0=ACC;_rlcar_(wx_data1);wx_data1=ACC;_rlcar_(wx_data2);wx_data2=ACC;if(++wx_bit==24){ //接收完24位码,接收成功标志wx_ok置1tb_flag=0;wx_bit=0;wx_ok=1;wx_code0=wx_data0;wx_code1=wx_data1;wx_code2=wx_data2;P1=wx_code0; //p1口接LED显示数据}}else {if((0x87<wxcount_buf)&&(wxcount_buf<0xc8))tb_flag=1; //抵电平脉宽范围在13.5ms到20ms之间,把同步码标志置1 elsegoto loop2;}}}else {if(wx_sta) {wx_count=0; //无线信号从高变低,清零低电平脉宽计数器wx_sta=0;}elsewx_count++; //无线信号为低电平,低电平脉宽计数器加1}}void timer0_isr() interrupt 1 {decode();if(++t_10ms>=100){ //P3.7口接的LED以0.5s的速度闪烁t_10ms=0;if(++t_500ms>=50){P3_7=!P3_7;t_500ms=0;}} }。
315M无线通讯模块

315M/433M接收解码模块说明
-关键词:遥控器,编码器,解码器,解码模块,滚动码解码器,固定码解码器,学习码解码器,智能家居灯控解码器,安防解码器,嵌入式解码器,嵌入式解码模块。
1.特性说明
●采用高灵敏度的接收芯片,接收灵敏度可达-107dBm
●可解12bit固定码,20bit学习码,滚动码
●透明转换传输,标准UART接口,
●功耗低
●宽压供电
●结构简单,安装方便
2.应用领域
●智能家居
●遥控键盘
●遥控玩具
●远距离RFID
●遥控门
3.模块结构图
模块板框尺寸:
模块实物图:
4.引脚功能说明引脚图:
5.电气特性
6.典型应用电路
以上是RF-315M-1的模块跟其他类型的MCU标准TTL电平串口通讯,注意需要交叉。
以上是RF-315M-1的模块跟PC电脑之间的通讯,需要使用232的电平转换芯片,注意信号线需要交叉。
8.封装尺寸图
9.支持与服务
9.1.针对产品如何使用,提供技术指导;用户无需了解射频知识和编码知识,即可快速开发产品推上市场
9.2.如果在运输中造成损坏,请第一时间与我们联系,请返回并无条件免费更换9.3.产品保质一年,永久保修,期间如因人为损坏(短路),请返回仅收成本费即可更换
9.4.遇到问题,请及时向我们反馈细节,欢迎在线交流,必要时会主动电话技术交流9.5.提供定制化服务,电路定制化和程序定制化。
9.6.技术扣扣:二七四九七六三六五一
158+58=216。
433MHz(315MHz)无线接收芯片中文规格书介绍

产品特征●300MHz到440MHz的频率范围●工作电压:2.2V-3.6V●接受灵敏度高:-108dBm●数据传输速率达10kbps(固定模式)●低功耗⏹315MHz下,最大工作电流2.5mA433MHZ下,最大工作电流3.5mA⏹关闭时的电流为0.9uA⏹扫描操作时(10:1任务周期操作)电流为300uA●唤醒输出标记用来启动解码器和微处理器●天线处的射频辐射非常低●集成度高,外部器件需求少应用领域●汽车远程无钥匙进入(RKE)●远程控制●远程风扇和电灯控制●车库门和门禁控制XC4366是一个ASK/OOK(开关键控)的单晶片射频接收集成电路设备。
它是一个真正的“从天线接收到数据输出”的单片电路。
所有的射频和中频的调谐都在集成电路里完成,这样可以无须手动调整并且降低成本。
实现了一个高度可靠且低成本的解决方案。
XC4366是一个采用16引脚封装且功能齐全的芯片,XC4366A/B/C/DL采用了8引脚封装,功能稍有减少。
XC4366提供了两种附加的功能,(1)一个关闭引脚,在任务周期操作时可以用来关闭设备;(2)一个唤醒输出引脚,当接收到射频信号时,它可以提供一个输出标记。
这些特点使得XC4366可以用在低功耗的应用上,比如RKE和远程控制。
XC4366上提供了所有的中频滤波和数据解调滤波器,所以,不需要外部的滤波器了。
四个解调滤波器的带宽可以由用户从外部控制。
XC4366提供了两种工作模式:固定模式(FIX)和扫描模式(SWP)。
在固定模式中,XC4366用作传统的超外差接收器。
在扫描模式下,XC4366在一个较宽的射频范围内进行扫描。
固定模式提供了更有选择性和针对性的工作模式,并且使得XC4366可以与低成本,精确度较低的发射器一起使用。
1.目录1.目录 (2)2.典型的应用 (3)3.订货须知 (4)4.引脚框图 (4)5.引脚的选择性 (5)6.引脚定义 (5)7.极限最大值(注释1) (6)8工作额定值(注释2) (6)9.电气特性 (7)10.功能框图 (9)11.应用说明和功能描述 (9)12.设计步骤 (9)12.1步骤1:选择工作模式 (10)12.2步骤2:选择参考晶振 (10)12.3步骤3.选择CTH电容 (12)12.4步骤4:选择CAGC电容 (13)12.5步骤5:选择解调器的带宽 (14)13.其他应用程序信息 (15)13.1天线阻抗匹配 (15)13.2关机功能 (17)13.3电源旁路电容 (18)13.4可选带通滤波器可增加选择性 (18)13.5数据噪声控制 (18)13.6唤醒功能 (19)14.封装信息 (20)14.1 16引脚的SOP封装 (20)14.2 8引脚的SOP封装 (21)14.3 16引脚的SOP顶层标志 (21)14.4 8引脚的SOP顶层标志 (22)2.典型的应用315MHz 800bps的开关键控接收器433.92MHz 800bps的开关键控接收器3.订货须知4.引脚框图标准的16引脚或者8引脚的封装5.引脚的选择性标准的16引脚允许完整的可配置型的控制。
315M433M无线发射接收模块超详细版

315M/433M无线发射接收模块一对模块10元左右,两块匹配主要参数1、通讯方式:调幅AM2、工作频率:315/433MHZ3、频率稳定度:±75KHZ4、发射功率:≤500MW5、静态电流:≤0.1UA6、发射电流:3~50MA7、工作电压:DC 3~12V接收模块等效电路图:该高频接收模块采用进口SMD器件, 6.5G高频三极管, 高Q值电感生产, 性能稳定可靠, 灵敏度高, 功耗低, 质优价廉, 广泛应用于各种防盗系统,遥控控制系统。
适用于各种低速率数字信号的接收;工业遥控、遥测、遥感;防盗报警器信号接收, 各种家用电器的遥控等。
超再生接收模块的中间两个引脚都是信号输出是连通的,超再生接收模块的等效电路图如下:主要技术指标1、通讯方式:调幅AM2、工作频率:315/433MHZ3、频率稳定度:±200KHZ4、接收灵敏度:-105dbm5、静态电流:≤3mA(DC5V)6、工作电流:≤5MA7、工作电压:DC3C-5V8、输出方式:TTL电平9、体积:30x13x8mm模块的工作电压为5伏,静态电流3毫安,它为超再生接收电路,接收灵敏度为-105dbm,接收天线最好为25~30厘米的导线,最好能竖立起来。
接收模块本身不带解码集成电路,因此接收电路仅是一种组件,只有应用在具体电路中进行二次开发才能发挥应有的作用,这种设计有很多优点,它可以和各种解码电路或者单片机配合,设计电路灵活方便。
DF数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~+85度之间变化时,频飘仅为3ppm/度。
特别适合多发一收无线遥控及数据传输系统。
声表谐振器的频率稳定度仅次于晶体,而一般的LC振荡器频率稳定度及一致性较差,即使采用高品质微调电容,温差变化及振动也很难保证已调好的频点不会发生偏移。
DF发射模块未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便地和其它固定编码电路、滚动码电路及单片机接口,而不必考虑编码电路的工作电压和输出幅度信号值的大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1:单片机软件解码PT22402:选用PIC16F877A作为软件解码芯片3:单片机时钟频率选用外部4MHZ晶振4:选用外部中断脚作为编码信号脚输入脚5:可解PT2240芯片(8脚的学习型编码芯片编码地址位:2的20次方重复几率100万分之一)6:功能有:遥控器学习(DEMO上的S9作为学习按纽)清除记忆(长按DEMO上的S9即可清除遥控器地址的记忆)7:学习遥控器数量可以设定(可根据EEPROM的大小随便设定)8:输出功能(有三路是单击遥控器双稳,可以通过PORTC上的LED可以看到结果.还有一路是双击遥控器双稳)9:可选用315MHZ/433MHZ的超再生/超外差接收模块/****************************************************************************** //****************************** 遥控器接收程序********************************//****************************************************************************** /#include <>#include <>#define remote_geshu 10/****************************************************************************** /union BIT_16{int TIMER1_REG;unsigned char REG[2];}union BIT_32{unsigned long data_temp_long;unsigned char data_temp_byte[4];}/****************************************************************************** /static union BIT_16 TIMER1_TEMP;//16位定时器1static union BIT_32 data_temp;/****************************************************************************** /static volatile unsigned char rec_status @ 97;static unsigned char data_cout;//接收的遥控器码位数static unsigned char data;//接收的4位数据static unsigned int h_pulse;//高电平宽度static unsigned int l_pulse;//低电平宽度static unsigned char remote_cout;//遥控器数量static unsigned char remote_numb;//遥控器编号/****************************************************************************** /static unsigned char TIMER15S1;//清除学习码按键长按时间static unsigned char TIMER15S2;//学习等待时间static unsigned char TIMER15S3;//遥控器数据缓冲时间static unsigned char TIMER15S4;//LED显示时间static unsigned char TIMER15S5;//static unsigned char TIMER15S6;//static unsigned char TIMER15S7;//static unsigned char TIMER15S8;///****************************************************************************** /static bit head @ ((unsigned)(&rec_status)*8+(0));//同步头标志位static bit learn @ ((unsigned)(&rec_status)*8+(1));//学习标志位static bit recieved @((unsigned)(&rec_status)*8+(2));//接收完成标志位static bit remote_button_status @((unsigned)(&rec_status)*8+(3));//遥控器按键标志位static bit first_click_status @((unsigned)(&rec_status)*8+(4));//遥控器按键单击标志位/****************************************************************************** //********************************** 数据接收**********************************//****************************************************************************** /unsigned char data_read(void){if(h_pulse>l_pulse){if((l_pulse>200)&&(l_pulse<1000)){if(h_pulse<(l_pulse<<2)) return 1;//数据为1}return 2;//无效的数据}else if(h_pulse<l_pulse){if((h_pulse>200)&&(h_pulse<1000)){if(l_pulse<(h_pulse<<2)) return 0;//数据为0}return 2;//无效的数据}}/****************************************************************************** /void clr_head(void)//清除寄存器{data_cout=0;head=0;}/****************************************************************************** /#pragma interrupt_level 1void check_data(void)//检测数据是否正确{if(head){switch (data_read()){case 0:<<=1;;data_cout++;break;case 1:<<=1;++;;data_cout++;break;default:clr_head();break;}if(data_cout>23){INTE=0;recieved=1;clr_head();//}}}/****************************************************************************** /#pragma interrupt_level 1void check_head(void){if((!head)&&(!recieved))//{if ((h_pulse>300)&&(h_pulse<1000)){if((l_pulse>h_pulse*27)&&(l_pulse<h_pulse*35)) {head=1;}}}} //end******************>>/****************************************************************************** /#pragma interrupt_level 1void interrupt level_h_l(void){/* if(RAIF)//如果是电平中断{ PORTA=PORTA;RAIF=0;//[0]=TMR1L;[1]=TMR1H; TMR1H=0;TMR1L=0;if(RA4)//如果是低电平中断{ l_pulse=;check_data();check_head();}else//如果是高电平中断{h_pulse=;}}*/if(INTF){INTF=0;[0]=TMR1L;[1]=TMR1H;TMR1H=0;TMR1L=0;if(INTEDG)//低电平宽度{INTEDG=0;l_pulse=;check_data();check_head();}else{INTEDG=1;h_pulse=; }}if(T0IF)//{T0IF=0;TIMER15S1++;TIMER15S2++;TIMER15S3++; TIMER15S4++; TIMER15S5++;TIMER15S6++;TIMER15S7++;TIMER15S8++;} }/****************************************************************************** //********************************* 遥控器学习**********************************//****************************************************************************** /void clr_learn_reg(void){unsigned char n;di();for (n=1;n==remote_cout*4;n++){eeprom_write(n,0);}eeprom_write(70,0); eeprom_write(71,0);ei(); }/****************************************************************************** /unsigned char compare_data(unsigned char eep_addr){unsigned char n;union BIT_32 addr_data; for(n=0;n<4;n++){[n]=eeprom_read(eep_addr+n);} if(&0x00fffff0)==&0x00fffff0)) {return 1;//地址匹配返回1}return 0;//地址不匹配返回0 }/****************************************************************************** /unsigned char compare_all_data(void){unsigned char n;for (n=0;n<remote_cout;n++)//在已经学习好的遥控器地址里比较有没有相同的{if (compare_data(n*4+1))//如果有相同的遥控器 {return 1;}}return 0;//没有一个地址是相同的 }/****************************************************************************** ///读遥控器的数量void read_remote_cout(void){remote_cout=eeprom_read(71);//读出已经学习的遥控器总数量if(remote_cout>20)remote_cout=0; //如果EEPROM是空的则为0 }/****************************************************************************** /void check_learn_pro(void){unsigned char n;if(learn){learn=0; remote_numb=eeprom_read(70);//读出现在可以覆盖掉哪个遥控器的编号read_remote_cout();////读遥控器的数量if(remote_numb>(remote_geshu-1))remote_numb=0;//如果遥控器的编号已经是最大的了则从小开始if((remote_cout==0)||!compare_all_data())//如果还没有遥控器学习或没有相同地址的遥控器学习{di(); for(n=0;n<4;n++){eeprom_write (remote_numb*4+n+1,[n]);} remote_numb++;if(remote_cout<remote_geshu+1)remote_cout++;//已经学习好的遥控器数量eeprom_write(71,remote_cout);//保存已经学习好的遥控器总数量eeprom_write(70,remote_numb);//保存已学习的遥控起编号ei(); }} }/****************************************************************************** /void check_out_pro(void){read_remote_cout();//读遥控器的数量if(compare_all_data()){ data=[0]&0x0f;//TIMER15S3=0;TIMER15S4=0;RC4=1;} }/****************************************************************************** /void decode_init(void)//接收初始化{OPTION=0x87;RBPU=0;TMR0=0;T0IE=1;//使能定时器0中断 INTE=1;TMR1ON=1;//PORTC=0x00;//TRISC=0x00;//ei();//开放全局中断 }/****************************************************************************** /void check_remote_recieved(void)//检测有无新的数据{if(!RB1)//{if(TIMER15S1>30)//是否长按了3秒{learn=0;//clr_learn_reg();RC4=0;}else{ learn=1;//TIMER15S2=0;TIMER15S4=0;RC4=1;}}else{ TIMER15S1=0;if(TIMER15S2>60){learn=0;//}}if(TIMER15S3>2)//数据保持时间 {data=0; TIMER15S3=0; }if(TIMER15S4>3)//LED显示时间 {RC4=0;}if(recieved){TIMER15S3=0;recieved=0;TIMER15S4=0;RC4=1;check_learn_pro(); check_out_pro();}INTE=1; }/****************************************************************************** //********************************* 控制部分程序*******************************//****************************************************************************** /void control_init(void){; }/****************************************************************************** //*********************************声音部分程序*********************************//****************************************************************************** //****************************************************************************** /unsigned char delay(unsigned int nus){for(;nus>0;nus--){if (recieved==1) return 0;asm("nop"); } }/****************************************************************************** /unsigned char soud_one_fre(unsigned int cout,unsigned int delay_time)//发音程序 {if(recieved==1) return 0;INTE=0;for (;cout>0;cout--){RC6=!RC6;delay(delay_time);} RC6=0;INTE=1; }/****************************************************************************** //*********************************急促的声音***********************************//****************************************************************************** /unsigned char soud_one_fre0(unsigned int time,unsigned int delay_time){for (;time>0;time--){if(recieved==1) return 0;soud_one_fre (1000,10);delay(delay_time);} }/****************************************************************************** //*********************************救护的声音***********************************//****************************************************************************** /unsigned char soud_tow_fre0(unsigned int time)//{for (;time>0;time--){if(recieved==1) return 0;soud_one_fre(900,10); soud_one_fre(800,30);} }/****************************************************************************** //************************************低-高音***********************************//****************************************************************************** /unsigned char soud_many_fre0(unsigned int time,unsigned int cout){for (;time>0;time--){unsigned int delay_time;for(delay_time=50;delay_time>10;delay_time--){if(recieved==1) return 0; soud_one_fre(cout,delay_time);} }/****************************************************************************** //************************************低-高音1**********************************//****************************************************************************** /unsigned char soud_many_fre2(unsigned int time,unsigned int cout){for (;time>0;time--){unsigned int delay_time;for(delay_time=30;delay_time>20;delay_time--){if(recieved==1) return 0;soud_one_fre(cout,delay_time);}} }/****************************************************************************** //**********************************高—低音************************************//****************************************************************************** /unsigned char soud_many_fre1(unsigned int time,unsigned int cout){ for (;time>0;time--)unsigned int delay_time;for (delay_time=10;delay_time<50;delay_time++){if(recieved==1) return 0;soud_one_fre(cout,delay_time);}} }/****************************************************************************** //**********************************高—低音1***********************************//****************************************************************************** /unsigned char soud_many_fre3(unsigned int time,unsigned int cout){for (;time>0;time--){unsigned int delay_time;for(delay_time=20;delay_time<30;delay_time++){if(recieved==1) return 0;soud_one_fre(cout,delay_time);}} }/****************************************************************************** //**********************************汽车报警声**********************************//****************************************************************************** /unsigned char soud_low_high_low(unsigned int cout){for (;cout>0;cout--){if(recieved==1) return 0;soud_many_fre0(1,10);soud_many_fre2(1,10);} }/****************************************************************************** /unsigned char remote_check(void)//遥控器按键检测{if(data)//{if(remote_button_status) {return 0;}else{ remote_button_status=1;return data;//遥控器数据有效}}else{ remote_button_status=0;return 0;} }/****************************************************************************** /void check_remote_command(void){if(TIMER15S5>10){first_click_status=0;//}switch (remote_check()){case 0x01:{ RC0=!RC0; //soud_one_fre0(1,6000);soud_tow_fre0(5);delay(10000);soud_many_fre0(5,40);delay(10000);soud_many_fre2(10,100);delay(10000); soud_many_fre1(5,40);delay(10000);soud_many_fre3(10,150);delay(10000);soud_low_high_low(5);delay(10000);soud_one_fre0(2,10000); break;}case 0x02:RC1=!RC1;break;case 0x04:RC2=!RC2;break;case 0x08:{if(first_click_status==1){RC3=!RC3;first_click_status=0;// break;}else{first_click_status=1;TIMER15S5=0; break;}}default:break;}}/****************************************************************************** /void control_pro(void){check_remote_command();}。