📄 rf2272.c
字号:
/********** 用单片机代替PT2272解码PT2262的程序 **********
晶振: 12MHz
开始时间: 2007-09-07 15:20
最后修改:
*********************************** 说 明 ***********************************
接收到的信号为发送信号的反码因为每检测到按键有效一次PT2262 都发送四次编码我们可以
利用这一特点来解码先检测有没有接收到信息当有的时候我们就去掉第一次编码的信号检测5ms 的
高电平来检测编码的开始信号接收到5ms 的高电平后才开始解码我们可以发现每个码的长度都是1.2ms
左右每一个编码都是由低电平开始然后到高电平又到低电平又回到高电平我们从第一个高电平
的宽度可以把1 码区分出来剩下的悬空码和0 码可以从第二个高电平的宽度区分出来
具体的单片机译码方法如下
由高电平开始检测到下降沿时就延时300us 读取接收的状态记为A0 然后再检测下一个下降沿
降沿后又延时300us 读取接收的状态记为A1 这样就把一个编码给译出来了
A0 A1 和悬空1 码0 码的关系如下:
A0 A1 代码
0 0 1 码
0 1 错误
1 0 悬空
1 1 0 码
******************************************************************************/
#include <my_89x51.h>
#include <intrins.h>
#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char
uint key_high_low;
uint key1;
uchar key_data;
//位定义
sbit W_REM =P3^3; //遥控接收输入脚
sbit LEDR =P1^3;
sbit LEDG =P1^4;
bit bdata error;
bit bdata recv_flg, //接收正确位标志(1:正确 0:错误)
//因为当按住PT2262的按键不放的时候PT2262会把编码不断的送出
//设置lianji_flg位用来检测按键有没有放开过如果没有放开则不再响应
lianji_flg; //按键没有放开过标志(1:连击 0:点击)
uchar addr_user_a0; //设定的8位地址密码A0
uchar addr_user_a1; //设定的8位地址密码A1
//------------------------------------- sub functon ----------------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void d1ms (uint ljh_in) /*1mS延时函数*/
{
uint data ljh_i;
uchar data ljh_j;
for(ljh_i=0;ljh_i<ljh_in;ljh_i++){
for(ljh_j=0;ljh_j<108;ljh_j++){
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
}
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
void ledg()
{
d1ms(100);
LEDG=!LEDG;
d1ms(100);
LEDG=!LEDG;
d1ms(100);
LEDG=!LEDG;
d1ms(100);
LEDG=!LEDG;
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
void ledr()
{
d1ms(50);
LEDR=!LEDR;
d1ms(50);
LEDR=!LEDR;
d1ms(50);
LEDR=!LEDR;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void d50us(uchar n) //50uS延时
{
uchar data i,j;
for(j=n;j;j--) { //[1T+2T+(2i+2)T+1T+2T]*n+1T+2T+2T=(2i+8)*n+5T
for(i=21;i;i--) ;//延时2T+2T*i=(2i+2)T
}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PT2272_deco() //解码
{
uchar i;
uint j;
bit time;
bit Key_Low_Highbit;
error =0;
time = 0;
j =0;
recv_flg =0;
if(recv_flg) ;
else {//先找出接收码的开头即5ms左右的高电平 //设置高电平时间为4~6ms//检测和等待4ms的高电平
for(i=80;i;i--) { //延时4mS
if(!W_REM) i=80;
else d50us(1);
j++;
if(j>= 400 ) {time =1;break;}//超时退出5ms+25ms
}
//等待在2ms内接收到的低电平 --------------------------------------------
for(i=40;i;i--) { //延时4mS
if(!W_REM) break;
else d50us(1);
}
//4ms到6ms内接收到下降沿则跳去解码否则返回
//超出6ms接收错误返回
if(time|!i) {
// ledg();
recv_flg =0; //清按键没有放开过标志
error = 1;
}//干扰信号处理
//等待300us后采集接收信号
key_high_low = 0;
key_data = 0;
if (!error){
ledg();
//进入代码接收部分 24个码位 8位地址4位数据
/* for(i=0;i<12;i++) {
LEDG=!LEDG;
d50us(6);
if(W_REM) {
key_data |=0x01;
}
key_data <<=0x01;
//左移一位,从key_data 到key_high_low
Key_Low_Highbit = key_data & 0x80;
key_high_low <<= 1;
if(Key_Low_Highbit)
key_high_low += 0x01;
//等待第二个下降沿
while(!W_REM) ;
while(W_REM) ;
//等待300us后采集接收信号
d50us(6);
if(W_REM) {
key_data |=0x01;
}
//等待第二个码值的下降沿
key_data <<=0x01;
Key_Low_Highbit = key_data & 0x80;
key_high_low <<= 1;
if(Key_Low_Highbit)
key_high_low += 0x01;
while(!W_REM) ;
while(W_REM) ;//LEDG=~LEDG;
}//12次接收
*/ }
}
key1 = key_high_low;
if (key_high_low == 0xaaaa){
ledg();
recv_flg = 1;
lianji_flg =1;}
else {
recv_flg = 0;
lianji_flg = 0;}
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
void remote_2272_deco() //接收遥控码(解码程序)
{
uint i;
//检测50ms内有没有编码接收
for(i=1000;i;i--) {
if(!W_REM) {
PT2272_deco(); //解码
break;
}
else d50us(1); //50uS延时
}
recv_flg =0; //清按键没有放开过标志
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void work() //控制输出 //把选中的LED取反
{
if(recv_flg) { //接收不正确,退出
recv_flg=0; //清接收正确标志位
//LEDG = !LEDG;
d50us(200);
}
}
//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
// ==================================== main function ============================================
void main (void)
{
//上电初始化 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
P1 =0xff;
P3 =0xff;
d1ms(200);
//编码设定为:A0~A7地址编码为:悬空 +++++++++++++++++++++++++++++++++++++++++++++
addr_user_a0 =0xaa;
addr_user_a1 =0xaa;
ledr();
//start: //================================================================================
while(1) {
remote_2272_deco(); //接收遥控码
// work(); //控制输出
LEDR =!LEDR;
d1ms(200);
}
}
//==============================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -