51单片机编码控制315无线模块传送指令
无线wifi模块-51单片机-C语言程序
![无线wifi模块-51单片机-C语言程序](https://img.taocdn.com/s3/m/a43b06a9941ea76e59fa0416.png)
}
void us_delay(uchar t)
{
while(t--);
}
/********************************************************************
名称:波特率发生器函数
作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器,
TL1=TH1;
EA=1;//总中断打开
ES=0;//关闭串口中断
TR1=1;//启动定时器1
}
/*
void Uart_Init()//使用独立的波特率发生器(STC12C560S2或带有独立波特率发生器//、//的单片机均可)
{
SCON=0x50;//设置为串行口以方式1工作,8位异步通讯,允许接收中断。
AUXR1=0x80;//切换到P1口
ES=1;//开启串口中断
EA=1;//开启总中断
}
*/
/********************************************************************
名称:串口发送函数
功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266)
//define RELOAD_COUNT (256-(((11520000/16)/12)/9600))也可以或波特率9600 //256-晶振频率/波特率x16=BRT
/*****************LED灯对应P0口的1个端口*************/
sbit LED0=P3^2;
/************波特率发生器相关功能寄存器的定义****************/
MCS51单片机指令系统
![MCS51单片机指令系统](https://img.taocdn.com/s3/m/f2deed16814d2b160b4e767f5acfa1c7ab008211.png)
第一条指令为远查表指令,可以在64K的程序存储器空间寻 址。基地址寄存器为DPTR,其意思为,DPTR里面存放的是 程序存储器中数据表格的首地址,A为数据地址的偏移量。
这条指令执行以后,以 (A)+(DPTR)的数值为地址数 据就送进A里面来了,也就是从表格首地址开始以后的第(A) 个数据被送进A了。(举例子说明)
编写好的程序都放在程序存储器中,由于一个存储地址所 指示的存储单元只能存放一字节的数据。所以,在存放指令时, 必须将指令拆分成一个一个字节进行连续存放。
比如: 实现“累加器加10H”这条指令,其机器语言为 0111010000010000, 占用了两个字节,就必须拆成两个字节 进行连续存储。
但是,用二进制来表示比较麻烦,因此,也常用十六进制来 表示如:74H 10H来表示以上这条机器语言。可见,用十六进 制表示指令比较简单,但是,指令系统有上百条指令,不易记 住。所以,一般采用容易记住的一些缩写符号来表示机器语言,
2. 在指令中直接给出操作数的地址, 这种寻址方式就属
于直接寻址方式。在这种方式中, 指令的操作数部分直接 是操作数的地址。
比如:MOV A,30H;将30H里面的数送到A里面 MOV 21H,30H;将30H里面的数存放到21H里面 在MCS -51 单片机指令系统中, 直接寻址方式中可
以访问 3 种存储器空间: (1) 内部数据存储器的低 128 个字节单元(00H~
7. 位寻址 指按照位进行的寻址操作,(前面讲的都是按字节进
行的寻址操作)。该种寻址方式中, 操作数是内部RAM单元 中20H到2FH的128个位地址以及SFR中的11个可进行 位寻址的寄存器中的位地址寻址。
比如:MOV C,20H;就是将RAM中位寻址区中20H位地 址中的内容送给C。区别与MOV A,20H;这个是将内部 RAM中20H单元的内容送给A。
315M无线遥控C51解码程序
![315M无线遥控C51解码程序](https://img.taocdn.com/s3/m/27cf3a6a011ca300a6c390fa.png)
/*无线码宽电平脉冲时间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;}}}。
基于51单片机315MHz无线收发模块调试程序
![基于51单片机315MHz无线收发模块调试程序](https://img.taocdn.com/s3/m/f3c5ede243323968001c9202.png)
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;}。
433和315无线模块的软件编解码遥控程序
![433和315无线模块的软件编解码遥控程序](https://img.taocdn.com/s3/m/8c3106910b4e767f5bcfce06.png)
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解码程序
![315M无线遥控C51解码程序](https://img.taocdn.com/s3/m/347ca62f192e45361066f56c.png)
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单片机的无线数据收发系统设计带电路图和代码
![基于51单片机的无线数据收发系统设计带电路图和代码](https://img.taocdn.com/s3/m/cf47fcb777232f60dccca110.png)
基于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无线模块技术原理
![315无线模块技术原理](https://img.taocdn.com/s3/m/7065ce772f3f5727a5e9856a561252d380eb20de.png)
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. 接收器工作原理接收器是将接收到的无线信号转换为数字信号并输出的设备。
它主要由以下几个部分组成:射频接收电路、解调芯片和解码芯片。
51单片机按键等控制代码
![51单片机按键等控制代码](https://img.taocdn.com/s3/m/7eeb2f0c6ad97f192279168884868762caaebbab.png)
8 位立即数带进位加到累加器 累加器带借位减去寄存器内容 累加器带借位减去直接地址单元 累加器带借位减去间接 RAM 内容 累加器带借位减去 8 位立即数 累加器加 1 寄存器加 1 直接地址单元内容加 1 间接 RAM 内容加 1 DPTR 加 1 累加器减 1 寄存器减 1 直接地址单元内容减 1 间接 RAM 内容减 1 A 乘以 B A 除以 B 累加器进行十进制转换
3、 逻辑操作类指令 助记符 ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data8 ANL direct,A ANL direct,#data8 ORL A,Rn ORL A,direct ORL A,@Ri ORL A,#data8 ORL direct,A ORL direct,#data8 XRL A,Rn XRL A,direct XRL A,@Ri XRL A,#data8 XRL direct,A XRL direct,#data8 CLR A CPL A RL A RLC A RR A
进位位和直接地址位相“与”
ANL C,/bit
进位位和直接地址位的反码相“与”
ORL C,bit
进位位和直接地址位相“或”
ORL C,/bit
进位位和直接地址位的反码相“或”
MOV C,bit
直接地址位送入进位位
MOV bit,C
进位位送入直接地址位
字节数 1 2 1 2 1 2 2 2 2 2 2 2
功能说明 寄存器内容加到累加器 直接地址单元内容加到累加器 间接 RAM 内容加到累加器 8 位立即数加到累加器 寄存器内容带进位加到累加器 直接地址单元内容带进位加到累加器 间接 RAM 内容带进位加到累加器
字节数 1 2 1 2 1 2 1
基于WIFI模块和单片机的无线数据传输(附代码)
![基于WIFI模块和单片机的无线数据传输(附代码)](https://img.taocdn.com/s3/m/e62ef53aaf45b307e8719767.png)
目录第一章阶段任务第二章基于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位的数字读数方式。
51单片机汇编指令表
![51单片机汇编指令表](https://img.taocdn.com/s3/m/ad180f25c381e53a580216fc700abb68a982add3.png)
以下是一些常见的51单片机(如8051系列)的汇编指令:
1. 数据传送指令:
- MOV:将一个数据或寄存器的值移动到另一个寄存器或存储器位置。
- MOVC:将数据从外部代码存储器复制到累加器或寄存器。
2. 算术运算指令:
- ADD:将累加器与另一个寄存器或存储器中的值相加。
- SUB:从累加器中减去另一个寄存器或存储器中的值。
- INC:将累加器或寄存器的值加1。
- DEC:将累加器或寄存器的值减1。
3. 逻辑运算指令:
- ANL:对累加器和另一个寄存器或存储器中的值进行逻辑与操作。
- ORL:对累加器和另一个寄存器或存储器中的值进行逻辑或操作。
- XRL:对累加器和另一个寄存器或存储器中的值进行逻辑异或操作。
- CPL:对累加器或寄存器中的值进行按位取反操作。
4. 条件分支指令:
- CJNE:比较两个值,并在不相等时跳转到指定的地址。
- DJNZ:递减累加器或寄存器,并在结果不为零时跳转到指定的地址。
5. 跳转指令:
- JMP:无条件跳转到指定的地址。
- SJMP:短跳转,跳转到相对于当前地址的指定偏移量。
- AJMP:绝对跳转,跳转到指定的地址。
- LCALL:长调用,将当前地址入栈并跳转到指定的子程序地址。
6. 位操作指令:
- SETB:将某个位设置为1。
- CLR:将某个位清零。
- JB:如果某个位为1,则跳转到指定地址。
- JNB:如果某个位为0,则跳转到指定地址。
315Mhz、433Mhz无线遥控信号的解码分析和模拟
![315Mhz、433Mhz无线遥控信号的解码分析和模拟](https://img.taocdn.com/s3/m/f09c9b18591b6bd97f192279168884868762b8d9.png)
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单片机对315M、443M无线遥控波形分析
![51单片机对315M、443M无线遥控波形分析](https://img.taocdn.com/s3/m/96722f730b1c59eef8c7b475.png)
最近想做无线遥控,在网上没有找到好的资料,要想做好无线遥控,就要清楚无线遥控的波形,最好用示波器,但太贵了,自己动手先做一简单的示波器,利用声卡当示波器,很好用,对红外遥控、315M/443M无线遥控、51单片机串口分析等足够用了。
下面是我做的图片:1、硬件(音频线1根,万用表表笔1付);2软件。
这就是硬件,一根音频线各和两只表笔。
(10元钱不到)双通示波器表笔接测式端,屏蔽线接地。
音频线插头插入“话筒输入端”这是软件CoolEdit2.0值得注意的是接收到的波形图是通过声卡后反了相的,可以通过软件编辑反相,能接收到发送的波形图,就好办了,对波形图分析,就可以解码,可以根据对波形图分析理解,找到你自己的解码方式。
这是用声卡示波器对315M/443M无线遥控接收到的波形图:通过对波形的分析,好像是很乱,这就是为什么很多初学者无线遥控解码失败的原因,在没有接收到无线遥控信号时,也有一些乱的波形,有些朋友想用315M/443M无线遥控模块做串口通信,结果发现接收到很多乱码,而且不停的接收到。
你会看到波形有突然的变化,放大后,你就会发现有一定的规律,首先有一段比较长的波形,通过软件可以看出有多少ms(大概13ms),这就是同步码,后面有25短的波形,这就是PT2262的编码格式。
首先要识别出同步码,这个很关键,我们在做发射编码时也要做这个,一般为10-20ms,这是区别于乱码的标志。
下面说说我是怎样解码的,利用51单片机,接收信号接到P3.2,用下降沿外部中断。
检测每2次下降沿中断的时间,用T1计时;每2次下降沿之间的高电平段的时间,用T0计时;这是常用的PT2262的格式,首先要检测到同步码,每两次中断的时间大于(T1计时)12ms;检测到同步码后才开始解码,如果接收到的高电平在450us左右为“0”;如果接收到的高电平在1300us左右为“1”;这样我们就能解码了。
这是我的解码程序:#include <STC12C5A60S2.h>#include <intrins.h>#include<stdlib.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intuint INT0_H_timer=0;//两个下降沿之间的高电平宽度uint INT0_L_timer=0;//两个下降沿总宽度bit DBM =0;//同步码标志long DATA=0;//取得24位数据(暂存);long DATAZ=0;//取得24位数据(比较暂存);long DATAX=0;//取数据uchar DATA_x=0;//取数据次数;//uint INT0_H[24]={0,};uchar TY=0;//连续取数标志void InitTimer0(void)//T0用于计两个下降沿之间的高电平宽度{TMOD |= 0x09;//T0加门控计高电平宽度TH0 = 0x00;TL0 = 0x00;ET0 = 0;//关T0定时中断TR0 = 1;TF0=0;//溢出清0}void InitTimer1(void)//T1用于计两个下降沿总宽度{TMOD |= 0x10;TH1 = 0x00;TL1 = 0x00;ET1 = 0;//关T1定时中断TR1 = 1;TF1=0;//溢出清0}void INT0_int()//外部中断初始化{IT0=1;//下降沿EX0=1;EA=1;}void main(void){uchar x=12,y=0;// AUXR &= 0x7F; //定时器时钟12T模式InitTimer0();InitTimer1();INT0_int();TH0=10;TL0=10;while (1){P0=DATAX;}}void INT0Interrupt(void) interrupt 0{INT0_L_timer=TH1*256+TL1;//两个下降沿总宽度INT0_H_timer=TH0*256+TL0;//两个下降沿之间的高电平宽度TH0 = 0x00;TL0 = 0x00;TH1 = 0x00;TL1 = 0x00;if (TF0)//有溢出不取值出错{INT0_L_timer=0;//两个下降沿总宽度INT0_H_timer=0;//两个下降沿之间的高电平宽度TF0=0;TF1=0;DBM=0;DATA_x=0;// P0=0xfe;}//晶振22.1184、12分频,13~15ms为同步码if (INT0_L_timer>24000&&INT0_L_timer<27000)//晶振22.1184、12分频{DBM=1;//P0=0;}if (DBM)//取第3次同步码后的数据{if ((INT0_H_timer>600)&&(INT0_H_timer<1000))//350~500us为0{DATA &= 0xfffffe;if (DATA_x<23){DATA_x++;DATA=DATA<<1;}else{if (TY>=1){TY=0;if (DATAZ==DATA)//如果2次取数一致,读出数{DATAX=DATA;}else{INT0_L_timer=0;//两个下降沿总宽度INT0_H_timer=0;//两个下降沿之间的高电平宽度TF0=0;TF1=0;DBM=0;DATA_x=0;}}else{DATAZ=DATA;TY++;}DATA=0;DBM=0;DATA_x=0;// P0=0x7f;}}else if ((INT0_H_timer>2200)&&(INT0_H_timer<2600))//1200~1400us为1 {DATA |= 0x000001;if (DATA_x<23){DATA_x++;DATA=DATA<<1;}else{if (TY>=1){TY=0;if (DATAZ==DATA)//如果2次取数一致,读出数{DATAX=DATA;}else{INT0_L_timer=0;//两个下降沿总宽度INT0_H_timer=0;//两个下降沿之间的高电平宽度TF0=0;TF1=0;DBM=0;DATA_x=0;}}else{DATAZ=DATA;TY++;}DATA=0;DBM=0;DATA_x=0;// P0=0x7f;}}else//出错{INT0_L_timer=0;//两个下降沿总宽度INT0_H_timer=0;//两个下降沿之间的高电平宽度TF0=0;TF1=0;DBM=0;DATA_x=0;//P0=0xfd;}}}。
单片机指令表汇总
![单片机指令表汇总](https://img.taocdn.com/s3/m/09c7a6377ed5360cba1aa8114431b90d6c8589fd.png)
51单片机指令表汇总51单片机是一种广泛应用的微控制器,其指令集是进行编程的基础。
下面将51单片机的指令表进行汇总,以帮助初学者更好地理解其指令集。
一、数据传输指令1、MOV指令:将源操作数的内容传送到目标操作数。
2、XCH指令:将两个操作数的内容互换。
3、MOVC指令:从外部存储器将数据传送到目标操作数。
4、MOVX指令:将外部存储器中的数据传送到目标操作数。
5、PUSH指令:将数据压入堆栈。
6、POP指令:从堆栈中弹出数据。
二、算术运算指令1、ADD指令:将两个操作数相加,并将结果存放在目标操作数中。
2、SUB指令:从目标操作数中减去源操作数,并将结果存放在目标操作数中。
3、MUL指令:将两个操作数相乘,并将结果存放在目标操作数中。
4、DIV指令:将目标操作数除以源操作数,并将结果存放在目标操作数中。
5、ANL指令:对目标操作数和源操作数进行按位与运算,并将结果存放在目标操作数中。
6、ORL指令:对目标操作数和源操作数进行按位或运算,并将结果存放在目标操作数中。
7、XRL指令:对目标操作数和源操作数进行按位异或运算,并将结果存放在目标操作数中。
8、CPL指令:对目标操作数进行按位取反运算,并将结果存放在目标操作数中。
9、INC指令:将目标操作数加1。
10、DEC指令:将目标操作数减1。
11、ASR指令:将目标操作数右移n位,最高位用符号位补齐。
12、LSR指令:将目标操作数右移n位,最低位用0补齐。
13、ROL指令:将目标操作数循环左移n位,最高位移入最低位。
14、ROR指令:将目标操作数循环右移n位,最低位移入最高位。
单片机汇编指令表一、概述在单片机的世界里,汇编语言扮演着举足轻重的角色。
它是一种低级语言,能够直接与硬件进行交互,提供高效的代码执行效率。
下面,我们将详细列出一些常见的单片机汇编指令,以及它们的功能。
二、指令表1、MOV指令:用于将数据从一个寄存器移动到另一个寄存器。
例如,MOV R1, R2将把 R2的内容移动到 R1中。
MCS-51单片机指令系统-数据传送类指令
![MCS-51单片机指令系统-数据传送类指令](https://img.taocdn.com/s3/m/b36c406d336c1eb91a375d4a.png)
MOV SP,#70H PUSH 20H PUSH 21H PUSH 22H
MOV SP,#60H PUSH 22H PUSH 21H PUSH 20H
ห้องสมุดไป่ตู้
1FFDH 1FFEH 1FFFH 2000H 2001H
83H
2009H
0 1 4 9 16 25 36 49 64 81
(2) 读、写片外RAM 指令 • MCS-51单片机CPU对片外扩展的数据存储器 RAM或I/O口进行数据传送,必须采用寄存 器间接寻址的方法,通过累加器A来完成。 这类指令共有以下4条单字节指令,指令 操作码助记符都为MOVX。
• 前一条指令采用DPTR作基址寄存器,因此可以很方便地把 一个16位地址送到DPTR,实现在整个64 KB程序存储器单 元到累加器A的数据传送。即数据表格可以存放在程序存 储器64 KB地址范围的任何地方。 • 后一条指令以PC作为基址寄存器,CPU取完该指令操作码 时PC会自动加1,指向下一条指令的第一个字节地址,即 此时是用(PC)+1作为基址的。另外,由于累加器A中的内 容为8位无符号数,这就使得本指令查表范围只能在256个 字节范围内(即(PC)+1H~(PC)+100H),使表格地址空间分 配受到限制。同时编程时还需要进行偏移量的计算,即 MOVC A,@A+PC指令所在地址与表格存放首地址间的距离 字节数的计算,并需要一条加法指令进行地址调整。偏移 量计算公式为: • 偏移量 = 表首地址-(MOVC指令所在地址+1)
4) 以@Ri为目的操作数的指令
A
MOV @Ri,
direct #data
例 若(R1)=56H,(A)=35H 执行 MOV @R1,A 指令 结果:(56H)=35H
315M无线解码程序(精准)
![315M无线解码程序(精准)](https://img.taocdn.com/s3/m/c304ce04f12d2af90342e600.png)
for(j=0x12;j>0;j--);
}
/*-------------------------------250us精确延时---------------------------------*/
void delay_250(void)
{
uchar i,j;
f;3;i++)
{
if((~(ReadCode[i]|0x55))&((ReadCode[i]&0x55)<<1)!=0x00) goto kk; //校验
}
GetCode=0x00;
for(i=0;i<8;i++)
{
GetCode |=((ReadCode[2]>>i)&(ReadCode[2]>>(i+1))&0x01<<i); //运算
void delay_131(void);//131ms精确延时
void init(void);//初始化子程序
void INT0_intrupt();//中断处理子程序(解码程序)
/*-----------------------------主程序入口--------------------------------------*/
:
;----------------------------315M无线遥控解码程序------------------------------*/
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
433和315无线模块的软件编解码遥控程序
![433和315无线模块的软件编解码遥控程序](https://img.taocdn.com/s3/m/3b1b6fc40d22590102020740be1e650e52eacf72.png)
433和315无线模块的软件编解码遥控程序1:单片机软件解码pt22402:选择PIC16F877A作为软件解码芯片3:选择外部4MHz晶体振荡器作为单片机的时钟频率4:选择外部中断引脚作为编码信号引脚的输入引脚5:可解pt2240芯片(8脚的学习型编码芯片编码地址位:2的20次方重复几率100万分之一)6:功能是:遥控学习(演示上的S9用作学习按钮)清除内存(长按演示上的S9以清除遥控地址的记忆)7:可设置学习遥控器数量(可根据EEPROM大小任意设置)8:输出功能(有三路是单击遥控器双稳,可以通过portc上的led可以看到结果.还有一路是双击远程控制(双稳态)9:可选用315mhz/433mhz的超再生/超外差接收模块/***************************************************************************** *//******************************遥控器接收程序********************************//***************************************************************************** */#include#包括#定义远程uGeshu10/***************************************************************************** */联合比特16{inttimer1_reg;unsignedcharreg[2];}联合比特u32{unsignedlongdata_temp_long;unsignedchardata_temp_byte[4];}/***************************************************************************** */staticunionbit_16timer1_temp;//16位定时器1staticunionbit_32data_temp;/***************************************************************************** */staticvolatileunsignedcharrec_status@97;staticunsignedchardata_uCout;//遥控器接收到的代码号为staticunsigned chardata//received 4位数据staticunsigned_uuUpulse;//高电平宽度静态无符号整数脉冲;//低电平宽度staticunsignedcharremote_cout;//遥控器数量staticunsignedcharremote_numb;//遥控器编号/***************************************************************************** */staticunsignedchartimer15s1;//清除学习码按键长按时间staticunsignedchartimer15s2;//学习等待时间staticunsignedchartimer15s3;//遥控器的数据缓冲时间为StaticUnsignedChartTimer15s4//LED显示时间staticunsignedcharttimer15s5//StaticUnsignedChartTimer15s6;//静态无符号图表15s7;//静态无符号图表15S8///***************************************************************************** */staticbithead@((未签名)(&rec_状态)*8+(0));//同步头标志位staticbitlearn@((无符号)(&rec_状态)*8+(1))//学习标志位staticbitrecieved@((unsigned)(&rec_status)*8+(2));//接收完成标志位staticbitremote按钮状态@((未签名)(&rec_状态)*8+(3));//远程控制键标志位staticbitfirst_uu单击状态@((未签名)(&rec_状态)*8+(4));//按遥控器上的键单击标志位/***************************************************************************** *//**********************************数据接收**********************************//***************************************************************************** */未签名字符数据读取(无效){if(h_pulse>l_pulse){如果((左脉冲>200)和&(左脉冲<1000)){if(h_pulse返回2;//无效数据}。
基于51单片机的无线抢答器设计
![基于51单片机的无线抢答器设计](https://img.taocdn.com/s3/m/8433ff5169eae009581bec53.png)
基于51单片机的无线抢答器设计【摘要】抢答器是为参赛者答题时进行抢答而设计的一种优先判决器。
本次采用STC89C51单片机作为主机与终端控制单元,采用315M无线收发模块为从机控制单元。
315M无线收发模块是通过红外遥控的专用芯片SC2262、SC2272来实现的。
设计结果表明无线抢答器成功实现设计的基本功能,能满足校园竞赛抢答的需求。
【关键词】抢答器;STC89C51;无线收发模块抢答器能够运用于校园的知识竞赛抢答、社团的文娱活动等场合。
本次设计我们做的是无线八路抢答器,以STC89C51单片机的控制电路、存储器接口电路及显示电路为控制系统。
以单片机系统为核心,负责控制和协调各个部分的工作。
在外围接上了复位电路、上拉电阻、数码管、无线模块、按钮及扬声器[1]。
采用红外遥控的专用芯片SC2262、SC2272组成的315M无线收发模块实现无线信号的抢答,这种无线抢答器性能更稳定,适合我们学生的使用。
1.设计方案整个设计分为主机和从机两个大模块。
主机以主控模块为核心,以无线接收模块、显示模块、输入模块、控制模块为外围电路一起组成的,从机由无线发射模块组成,如图1所示。
图1 系统设计总体框图主控模块:是由STC89C51单片机组成,是整个系统控制的核心。
通过检测输入模块中的有线抢答按键或者无线接收模块传来的信息可作出相应的处理,并送到显示模块显示抢答选手。
显示模块能显示抢答选手以及作答时间。
主持人可通过控制模块对整个抢答流程的控制。
输入模块:通过按键可进行有线抢答,并且有声音提示。
控制模块:可控制修改选手抢答时间跟作答时间,并且通过复位按键,可使整个系统复位。
显示模块:由4位的七段数码管构成。
显示抢答选手以及抢答时间和作答时间。
无线发射模块:通过SC2262的编码后,以无线的方式发射出去。
无线接收模块:从无线发射模块那边采集信号,通过SC2272的解码,把信号传递给单片机。
图2 原理图2.硬件电路的设计硬件电路原理图如图2所示,包括显示电路、复位电路、按键电路、时钟电路、报警电路以及红外接收电路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无线电编码程序设计思想
该项目利用单通道无线电实现了多路遥控功能。
遥控距离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;
}。