用51单片机解码的12通道315M遥控器DIY

合集下载

51单片机编码控制315无线模块传送指令

51单片机编码控制315无线模块传送指令

无线电编码程序设计思想该项目利用单通道无线电实现了多路遥控功能。

遥控距离100m左右。

单通道无线电路若想实现多路遥控,必须对无线电进行编码,该项目利用单片机进行编解码,实现了16路无线电控制。

在进行无线电编码前必须先定义一个协议规则。

现定义如下:下降沿:1ms的高电平,随后500us的低电平。

起始位:4ms的高电平,随后4ms的低电平。

数据1:2ms的高电平,随后500us的低电平。

数据0:1ms的高电平,随后500us的低电平。

结束位:4ms的低电平。

以上就是通信协议规则,只要无线电收发双方都遵循该协议规则,则实现对小车的多路控制将非常容易。

//发射模块c程序#include<reg52.h>#define uchar unsigned charsbit key0=P3^4;sbit key1=P3^5;sbit key2=P3^6;sbit key3=P3^7;sbit TX=P2^0;uchar m;void v0();void v1();void v2();void v3();void delay_315();void main(){uchar i;bit dong=0; //开定时器0中断TMOD=0X01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;ET0=1;TR0=1;TX=0;while(1) //发送指令0{if(key0==0){delay_315();while(key0==0){v3();v2();v0();v0();v0();m=0;while(m<40);}dong=1;}if(key1==0) //发送指令1{delay_315();while(key1==0){v3();v2();v0();v0();v1();m=0;while(m<40);}dong=1;}if(key2==0){delay_315();while(key2==0){v3();v2();v0();v1();v0();m=0;while(m<40);}dong=1;}if(key3==0){delay_315();while(key3==0){v3();v2();v0();v1();v1();m=0;while(m<40);}dong=1;}if(dong==1){dong=0;for(i=0;i<5;i++){v3();v2();v1();v0();v0();m=0;while(m<40);} }}}void timer0() interrupt 1{TH0=(65536-100)/256;TL0=(65536-100)%256;m++;TF0=0;}void v0() // 1MS高电平500us低电平{m=0;while(m<10)TX=1;m=0;while(m<5)TX=0;}void v1() // 2MS高电平500us低电平{m=0;while(m<20)TX=1;m=0;while(m<5)TX=0;}void v2() // 4MS高电平4ms低电平{m=0;while(m<40)TX=1;m=0;while(m<40)TX=0;}void v3() // 1MS高电平500us低电平{m=0;while(m<10)TX=1;m=0;while(m<5)TX=0;}void delay_315(){uchar i,j;for(i=0;i<10;i++)for(j=0;j<110;j++);}//接收程序#include"reg52.h"#define uchar unsigned charsbit RX=P3^3;sbit red0=P0^0;sbit red1=P0^1;sbit red2=P0^2;sbit red3=P0^3;sbit red4=P0^4;uchar m;bit n;void main(){uchar a,b,c,p,x,y; //定义存取的数据TMOD=0X01;TH0=(65536-100)/256; //开定时器0TL0=(65536-100)%256;EA=1;ET0=1;TR0=1;EX1=1;IT1=1;P0=0XFF;p=5;x=0;while(1){if(n==1){while(RX==0); //读取协议下降沿m=0;EX1=0;while(RX==1);if(m>35&&m<45) //读取协议起始位高电平{m=0;while(RX==0);if(m>35&&m<45) //读取协议起始位低电平{m=0;while(RX==1); //读取数据1if(m>5&&m<15)a=0;if(m>15&&m<25)a=4;while(RX==0);m=0;while(RX==1); //读取数据2if(m>5&&m<15)b=0;if(m>15&&m<25)b=2;while(RX==0);m=0;while(RX==1); //读取数据3if(m>5&&m<15)c=0;if(m>15&&m<25)c=1;while(RX==0);m=0;p=a+b+c;x++;if(x==1)y=p;if(x==2) //连续收到两次数据才进入匹配{x=0;if(y==p){switch(p){case 0:red0=0;red1=1;red2=1;red3=1;red4=1;break;case 1:red0=1;red1=0;red2=1;red3=1;red4=1;break;case 2:red0=1;red1=1;red2=0;red3=1;red4=1;break;case 3:red0=1;red1=1;red2=1;red3=0;red4=1;break;case 4:red0=1;red1=1;red2=1;red3=1;red4=0;break;}}}}}}}}void INT_1() interrupt 2{n=1;}void timer0() interrupt 1{TH0=(65536-100)/256;TL0=(65536-100)%256;m++;TF0=0;}。

51单片机红外遥控解码程序

51单片机红外遥控解码程序

51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。

解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。

315Mhz、433Mhz无线遥控信号的解码分析和模拟

315Mhz、433Mhz无线遥控信号的解码分析和模拟

315Mhz、433Mhz⽆线遥控信号的解码分析和模拟摘要前段时间学习⽆线电的同时了解到arduino是作为技能尚未成熟技术宅的我继树莓派⼜⼀个不错的选择。

于是花了200元购得3块arduino开发板(2*nano&1*uno)和其他传感器等,同时看到了315M超再⽣模块,因为玩⽆线电的都知道315M是汽车遥控器,防盗闸门,路桥系统等最常⽤的信号频率,所以我就毫不犹豫的下单了。

然后就有了今天的成果。

Freebuf也有不少此类⽂章,关于315,433的解码我已掌握很多⽅法(其实使⽤SDR是个不错的选择),对滚码我也有⼀定研究和破解,本⽂步骤详细,思路明确,希望对⼤家有⽤。

对arduino和315模块熟悉的可以直接进⼊第三步。

关键词:315M超再⽣模块、arduino。

引⾔:315MHz遥控器使⽤⼴泛,学习和深⼊了解其原理和实际操作,在获得⽆限乐趣的同时,可以学会防⽌⾃⼰的车被盗,并可以⾃⼰开发更安全的遥控锁设备,在做本项⽬的过程中我深刻体会到315M遥控系统的不安全性是个严重的问题,主要表现在315遥控系统解码简单,发射条件简单,易拷贝。

下⾯是我在此次学习研究中得到的⼀些浅陋知识,在此详细描述。

以下是本次学习的原理框架:框图说明:接收端接收信号,由arduino单⽚机解码,并将解码信息通过蓝⽛发送到⼿机,在⼿机蓝⽛串⼝监视器显⽰(解码过程);⼿机发送24位遥控码到单⽚机,单⽚机将24位遥控码通过发射端发出,⽤于遥控模拟接收端通过接收端PT2272芯⽚解码后在LED信号灯得到反馈,模拟接收端由单⽚机直接供电,发射端发出的信号也可直接有其他遥控接收端接收达到其他⽬的。

⼀、基础知识介绍:1、Arduino介绍:Arduino是⼀款便捷灵活、⽅便上⼿的开源电⼦原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。

由⼀个欧洲开发团队最早于2005年冬季开发。

其成员包括Massimo Banzi,David Cuartielles,Tom Igoe,Gianluca Martino,David Mellis和Nicholas Zambetti。

基于51单片机315MHz无线收发模块调试程序

基于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解码程序

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无线遥控C51解码程序

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遥控电路设计

315M遥控电路设计OOK调制尽管性能较差,然而其电路简单容易实现,工作稳定,因此得到了广泛的应用,在汽车、摩托车报警器,仓库大门,以及家庭保安系统中,几乎无一例外地使用了这样的电路。

早期的发射机较多使用LC振荡器,频率漂移较为严重。

声表器件的出现解决了这一问题,其频率稳定性与晶振大体相同,而其基频可达几百兆甚至上千兆赫兹。

无需倍频,与晶振相比电路极其简单。

以下两个电路为常见的发射机电路,由于使用了声表器件,电路工作非常稳定,即使手抓天线、声表或电路其他部位,发射频率均不会漂移。

和图一相比,图二的发射功率更大一些。

可达200米以上。

图一图二接收机可使用超再生电路或超外差电路,超再生电路成本低,功耗小可达100uA左右,调整良好的超再生电路灵敏度和一级高放、一级振荡、一级混频以及两级中放的超外差接收机差不多。

然而,超再生电路的工作稳定性比较差,选择性差,从而降低了抗干扰能力。

下图为典型的超再生接收电路。

超外差电路的灵敏度和选择性都可以做得很好,美国Micrel公司推出的单片集成电路可完成接收及解调,其MICRF002为MICRF001的改进型,与MICRF001相比,功耗更低,并具有电源关断控制端。

MICRF002性能稳定,使用非常简单。

与超再生产电路相比,缺点是成本偏高(RMB35元)。

下面为其管脚排列及推荐电路。

align=left> ICRF002使用陶瓷谐振器,换用不同的谐振器,接收频率可覆盖300-440 MHz。

MICRF002具有两种工作模式:扫描模式和固定模式。

扫描模式接受带宽可达几百K Hz,此模式主要用来和LC振荡的发射机配套使用,因为,LC发射机的频率漂移较大,在扫描模式下,数据通讯速率为每秒2.5KBytes。

固定模式的带宽仅几十KHz,此模式用于和使用晶振稳频的发射机配套,数据速率可达每秒钟10KBytes。

工作模式选择通过MICRF002的第16脚(SWEN)实现。

正常315M无线遥控C51解码程序

正常315M无线遥控C51解码程序

可以正常使用315M无线遥控C51解码程序/*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位,数据放入ACC uchar 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;}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用51单片机解码的12通道315M遥控器DIY
2011-06-21 18:22:28| 分类:单片机| 标签:遥控单片机解码 12通道|字号大中小订阅N久前作的一个遥控插座,通过单片机进行12通道解码。

原理图
PCB
内部结构
面板:红色指示灯为巡检指示灯,绿色指示灯为通道工作指示灯。

程序代码:
#include <REG51.H>
sfr WDT_CONTR=0xe1;//看门狗初始化
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
sbit run=P3^7;
sbit out=P3^2;
sbit out1=P3^3;
sbit out2=P3^4;
sbit out3=P3^5;
bit bzw;
bit bzw1;
bit bzw2;
bit bzw3;
void jsdb();
void shuchu();
void delay(uint k);
/*********************************************************/
void main()
{
P1=0xff;
out=1;
out1=1;
out2=1;
out3=1;
WDT_CONTR=0x35; //启动看门狗
while(1)
{
run=1;
delay(1000);
delay(1000);
delay(1000);
delay(1000);
delay(1000);
delay(1000);
run=0;
delay(200);
jsdb();
shuchu();
WDT_CONTR=0x35;
}
}
/********************************************************/
void jsdb()
{
switch(P1)
{
case 0x1f:bzw=1;break;//out 1号键
case 0x2f:bzw1=1;break;//out1 2号键
case 0x3f:bzw2=1;break;//out2 3号键
case 0x4f:bzw3=1;break;//out3 4号键default:{bzw=0;bzw1=0;bzw2=0;bzw3=0;}break;
}
}
void shuchu()
{
if(bzw)
{ delay(100); out=~out;
run=1; delay(500);
run=0; delay(500);
run=0; delay(500);
bzw=0;
}
if(bzw1)
{ delay(100); out1=~out1;
run=1; delay(500);
run=0; delay(500);
run=1; delay(500); bzw1=0;
}
if(bzw2)
{ delay(100); out2=~out2;
run=1; delay(500);
run=0; delay(500);
run=1; delay(500); bzw2=0;
}
if(bzw3)
{ delay(100); out3=~out3;
run=1; delay(500);
run=0; delay(500);
run=1;
delay(500);
bzw3=0;
}
}
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}。

相关文档
最新文档