您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 用单片机代替PT2272解码PT2262的程序
**********用单片机代替PT2272解码PT2262的程序**********晶振:12MHz说明***********************************接收到的信号为发送信号的反码因为每检测到按键有效一次PT2262都发送四次编码我们可以利用这一特点来解码先检测有没有接收到信息当有的时候我们就去掉第一次编码的信号检测5ms的高电平来检测编码的开始信号接收到5ms的高电平后才开始解码我们可以发现每个码的长度都是1.2ms左右每一个编码都是由低电平开始然后到高电平又到低电平又回到高电平我们从第一个高电平的宽度可以把1码区分出来剩下的悬空码和0码可以从第二个高电平的宽度区分出来具体的单片机译码方法如下由高电平开始检测到下降沿时就延时300us读取接收的状态记为A0然后再检测下一个下降沿降沿后又延时300us读取接收的状态记为A1这样就把一个编码给译出来了A0A1和悬空1码0码的关系如下:A0A1代码001码01错误10悬空110码******************************************************************************/#includeSTC516AD.H#defineucharunsignedchar#defineuintunsignedint//定义共用体union{uintword;struct{//结构bytesucharbyte_addr;ucharbyte_data;}bytes;}a_0,a_1;//位定义sbitW_REM=P3^3;//遥控接收输入脚sbitLED0=P1^0;sbitLED2=P1^2;bitbdatarecv_flg,//接收正确位标志(1:正确0:错误)//因为当按住PT2262的按键不放的时候PT2262会把编码不断的送出//设置lianji_flg位用来检测按键有没有放开过如果没有放开则不再响应lianji_flg;//按键没有放开过标志(1:连接0:点击)uchar//addr_a0,//接收的8位地址编码A0//addr_a1,//接收的8位地址编码A1//data_a0,//接收的4位数据编码A0//data_a1,//接收的4位数据编码A1addr_user_a0,//设定的8位地址密码A0addr_user_a1;//设定的8位地址密码A1//led_out;//输出控制//-------------------------------------subfuncton----------------------------------------------//-------------------------------------subfuncton----------------------------------------------//-------------------------------------subfuncton----------------------------------------------//-------------------------------------subfuncton----------------------------------------------//-------------------------------------subfuncton----------------------------------------------////voidd1ms(uintljh_in)/*1mS延时函数*///{//uintdataljh_i;//uchardataljh_j;//for(ljh_i=0;ljh_iljh_in;ljh_i++){//for(ljh_j=0;ljh_j108;ljh_j++){//_nop_();_nop_();//_nop_();_nop_();//_nop_();_nop_();//}//}//}//--------------------------------------------//voidd50us(ucharn)//50uS延时{uchardatai,j;for(j=n;j;j--){//[1T+2T+(2i+2)T+1T+2T]*n+1T+2T+2T=(2i+8)*n+5Tfor(i=21;i;i--);//延时2T+2T*i=(2i+2)T}}//--------------------------------------------//PT2272_deco()//解码{uchari,cnt;if(recv_flg);else{//清除上次解码内容cnt=12;//接收12位编码//解码------------------------------------------------------------------------//先找出接收码的开头即5ms左右的高电平----------------------------------//设置高电平时间为4~6ms//检测和等待4ms的高电平for(i=80;i;i--){//延时4mSif(!W_REM)i=80;elsed50us(1);}//等待在2ms内接收到的低电平--------------------------------------------for(i=40;i;i--){//延时4mSif(!W_REM)break;elsed50us(1);}//4ms到6ms内接收到下降沿则跳去解码否则返回//超出6ms接收错误返回if(i){recv_flg=0;//清按键没有放开过标志gotoPT2272_deco_exit;//返回--------------------------------}//等待300us后采集接收信号d50us(6);//采集接收信号并记录a_0.word=a_1.word=0;for(i=0;i6;i++){if(W_REM){a_0.word|=0x01;}a_0.word=1;//MOVC,W_REM//读A0数据//MOVA,DATA_A0//RLCA//MOVDATA_A0,A//保存相应位的A0//MOVA,ADD_A0//RLCA//MOVADD_A0,A//高位转移//等待第二个下降沿while(!W_REM);while(W_REM);//JNBW_REM,$//JBW_REM,$//等待300us后采集接收信号d50us(6);//MOV40H,#150//2T//DJNZ40H,$//2T延时:2T+2T*150=302Tif(W_REM){a_1.word|=0x01;}a_1.word=1;//MOVC,W_REM//读A1数据//MOVA,DATA_A1//RLCA//MOVDATA_A1,A//保存相应位的A1//MOVA,ADD_A1//RLCA//MOVADD_A1,A//高位转移//等待第二个码值的下降沿while(!W_REM);//___wd___while(W_REM)LED2=~LED2;//JNBW_REM,$//JBW_REM,$//DJNZ34H,REMOTE6//接收12位编码--------------------------------}//把接收的编码左移4位将8位密码放在同一字节上----------------------------a_0.word=4;a_1.word=4;//MOV40H,#4//REMOTE7://CLRC//MOVA,DATA_A0//RLCA//送出低8位的bit7//MOVDATA_A0,A//低8位的A0左移1位//MOVA,ADD_A0//RLCA//接收低8位的bit7//MOVADD_A0,A//高8位的A0左移1位//CLRC//MOVA,DATA_A1//RLCA//送出低8位的bit7//MOVDATA_A1,A//低8位的A1左移1位//MOVA,ADD_A1//RLCA//接收低8位的bit7//MOVADD_A1,A//高8位的A1左移1位//DJNZ40H,REMOTE7//左移4位////把4位数据编码由高4位移到低4位上---------------------------------//MOVA,DATA_A0//SWAPA//MOVDATA_A0,A//把4位数据编码A0由高4位移到低4位?//MOVA,DATA_A1//SWAPA//MOVDATA_A1,A//把4位数据编码A1由高4位移到低4位?//比较密码--------------------------------------------------------------if((a_0.bytes.byte_addr==addr_user_a0)&&(a_1.bytes.byte_addr==addr_user_a1)){recv_flg=1;lianji_flg=1;}else{recv_flg=0;lianji_flg=0;}//MOVA,ADD_A0//XRLA,ADD_USER_A0//JNZREMOTE8//密码不正确则跳转////MOVA,ADD_A1//XRLA,ADD_USER_A1//JNZREMOTE8//密码不正确则跳转////置接收正确位---------------------------------------------------------//SETBRECEIVE////置ENABLE用于检测按键有没有放开--------------------------------//SETBENABLE//RET//接收正确返回-----------------------------------------//REMOTE8://CLRENABLE//CLRRECEIVE//RET//接收不正确返回---------------------------------------}PT2272_deco_exit:return;}//--------------------------------------------//voidremote_2272_deco()//接收遥控码(解码程序){uinti;//检测50ms内有没有编码接收for(i=1000;i;i--){if(!W_REM){PT2272_deco();//解码break;}elsed50us(1);//50uS延时}recv_flg=0;//清按键没有放开过标志}//---------------------------------
本文标题:用单片机代替PT2272解码PT2262的程序
链接地址:https://www.777doc.com/doc-1391154 .html