51单片机编码控制315无线模块传送指令
- 格式:doc
- 大小:38.50 KB
- 文档页数:6
/*无线码宽电平脉冲时间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置1 tb_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;}}}。
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;}。
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();}。
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;}} }。
基于51单片机的无线数据收发系统设计(带电路图和代码)1 引言伴随着短距离、低功率无线数据传输技术的成熟,无线数据传输被越来越多地应用到新的领域。
与有线通信方式相比,无线通信以其不需铺设明线,使用便捷等一系列优点,在现代通信领域占重要地位。
但以往的无线产品存在范围和方向上的局限。
例如,一些无线产品在使用时,无法将信息反馈给控制者;还有一些无线产品不能很好地显示参数或状态信息,如果能在系统中增加一块小型液晶显示电路,产品不仅能向用户显示其状态或状态的改变,而且可以大大降低成本。
正如人们所发现的,只要建立双向无线通信-双工通信并且选择成本低的收发芯片,就会出现许多新应用。
本次设计主要是利用无线收发电路,加上单片机控制与液晶显示制成一套完整的数据收发系统。
考虑到目前市场上的一些需求,设计的主要要求是方案成本低,体积小,低功耗,集成度高,尽量无需调外部元件,传输时间短,接口简单。
nRF401是国外最新推出的单片无线收发一体芯片,它在一个20脚的芯片中包括了高频发射、高频接收、PLL 合成、FSK 调制、多频道切换等功能,并且外围元件少,便于设计生产,功耗极低,集成度高,是目前集成度较高的无线数传产品,它为低速率低成本的无线技术提出了解决方案。
2 无线数据收发系统2.1 系统组成无线数据传输系统有点对点,点对多点和多点对多点三种。
本系统由于实际应用的需要,接收器和数据终端之间的数据传输通过nRF401进行,构成点对点无线数据传输系统。
整个系统中,两数据终端之间的无线通信采用433MHz 的频段作为载波频率,收发通过串口通信。
无线数据收发系统可以分为无线收发控制电路、单片机控制电路、显示电路和按键电路四部分组成,系统原理如图2-1所示:图2-1 无线数据收发系统原理图无线收发 按键 单片机系 无线收发液晶显示单片机系2.2 实现过程当我们需要发送数据时,使用按键来输入所需发送的信息。
按键与单片机AT89S52的P3.2-P3.5口相接,单片机的 P1.0口控制信息的发送与接收,并且TXD 端与收发器输入端相连,通过TXD 将数据传入收发器,收发器接收到数据后,通过FSK 调制,将信号发送出去;接收端的收发器通过解调,将载波信号转换为数字信号,完成信息传输过程;收发器的输出端通过RXD 端将数字信号输入到单片机;单片机将数据传送到显示器,这样就完成了一次数据发送与接收并显示的过程。
315无线模块技术原理1. 引言无线通信技术在现代社会中扮演着重要的角色,它为人们提供了便捷的通信方式。
而315无线模块作为一种常用的无线通信模块,广泛应用于遥控、安防、智能家居等领域。
本文将详细解释315无线模块技术的基本原理。
2. 315无线模块概述315无线模块是一种基于射频(Radio Frequency, RF)技术的无线通信模块,其工作频率为315MHz。
该模块通常由发射器和接收器两部分组成,可以实现远距离的数据传输。
3. 发射器工作原理发射器是将待发送数据转换为无线信号并发送出去的设备。
它主要由以下几个部分组成:编码芯片、射频发射电路和天线。
3.1 编码芯片编码芯片是发射器中的核心部件,它负责将待发送数据进行编码,并生成与之对应的数字信号。
常见的编码方式有AM(振幅调制)和ASK(振幅移键调制)。
这些数字信号经过编码后,会以一定的模式进行调制,从而形成射频信号。
3.2 射频发射电路射频发射电路是将数字信号转换为射频信号的关键部件。
它主要由振荡器、放大器和滤波器等组成。
•振荡器:振荡器是发射器中的一个重要组件,它能够产生特定频率的振荡信号。
在315MHz无线模块中,通常采用压控晶体振荡器(VoltageControlled Crystal Oscillator, VCXO)作为振荡源。
•放大器:放大器负责将来自振荡器的低功率信号进行放大,以便能够达到较远距离的传输。
常用的放大器有功率放大器和电流驱动放大器等。
•滤波器:滤波器主要用于去除无关频率的干扰信号,确保发送出去的射频信号纯净、稳定。
常见的滤波方式有低通滤波和带通滤波等。
3.3 天线天线是将发射出来的无线信号辐射到空间中的装置。
在315无线模块中,一般采用半波长天线或四分之一波长天线。
这些天线能够有效地将射频信号传输到接收器。
4. 接收器工作原理接收器是将接收到的无线信号转换为数字信号并输出的设备。
它主要由以下几个部分组成:射频接收电路、解调芯片和解码芯片。
目录第一章阶段任务第二章基于WIFI模块的无线数据传输的原理1.1 时钟模块1.2 最小单片机系统的原理1.3 温度传感器DS18B201.4 串口1.5 WIFI模块第三章基于WIFI模块的无线数据传输的实现2.1 WIFI模块设置2.2 串口部分设置2.3 调试与运行过程第四章程序与框图第五章小结第二章基于WIFI模块的无线数据传输的原理1.1时钟DS1302模块:电路原理图:DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O 串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
读写时序说明:DS1302是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
数据读写时序如图1.2单片机最小系统的原理:说明复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)单片机:一片AT89S51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行.1.3温度传感器DS18B20的原理(连接到单片机最小系统,并将温度发送给WIFI模块):3.1.1 DS18B20性能特点(1) 独特的单线接口方式,只需一个接口引脚即可通信;(2) 每一个DS18B20都有一个唯一的64位ROM 序列码; (3) 在使用中不需要任何外围元件;(4) 可用数据线供电,电压范围:+3.0V-+5.5 V ;(5) 测温范围:-55℃ -+125℃,在-10℃-+85℃范围内精度为+0.5℃,分辨率为0.0625℃; (6) 通过编程可实现9-12位的数字读数方式。
无线电编码程序设计思想
该项目利用单通道无线电实现了多路遥控功能。
遥控距离100m左右。
单通道无线电路若想实现多路遥控,必须对无线电进行编码,该项目利用单片机进行编解码,实现了16路无线电控制。
在进行无线电编码前必须先定义一个协议规则。
现定义如下:
下降沿:1ms的高电平,随后500us的低电平。
v0
起始位:4ms的高电平,随后4ms的低电平。
v2
数据1:2ms的高电平,随后500us的低电平。
v1
数据0:1ms的高电平,随后500us的低电平。
v3
结束位:4ms的低电平。
以上就是通信协议规则,只要无线电收发双方都遵循该协议规则,则实现对小车的多路控制将非常容易。
//发射模块c程序
#include<reg52.h>
#define uchar unsigned char
sbit 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 char
sbit 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; //开定时器0
TL0=(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); //读取数据1
if(m>5&&m<15)a=0;
if(m>15&&m<25)a=4;
while(RX==0);
m=0;
while(RX==1); //读取数据2
if(m>5&&m<15)b=0;
if(m>15&&m<25)b=2;
while(RX==0);
m=0;
while(RX==1); //读取数据3
if(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;
}。