如何实现软控改变PT2262的地址码,并实现一(PT2262)对多(PT2272)的无线通信?

2020-06-10 科技 221阅读
以上的问题是我借同学的号提的,最终决定还是全部通过软件实现模拟PT2262发射吧。代码如下,希望能帮到有需要的朋友:(基于51单片机STC12C5A60S2)
#include
//#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define TH1_12a 0xfa
#define TL1_12a 0x24
#define TH1_4a 0xfe
#define TL1_4a 0x0c
//500us(4a)在12M晶振下,a=125us,应该是65536-500= 65036
//,换算成二进制 1111 1110 0000 1100(减去一个df_data=1指令时间) 0xfe 0x0c
//12a=125*12=65536-1500= 64036 1111 1010 0010 0100 fa 24
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
sbit key1=P2^3;
sbit key2=P2^2;
sbit key3=P2^1;
sbit key4=P3^2;
sbit df_data=P3^0;
uchar table[]={"test s1 set s3"};
uchar table1[]={"send INIT DF s2"};
uchar table2[]={"testing"};
//uchar table3[]={"press S2 if ok"};
uchar failed[]={"test failed"};
uchar success[]={"the addr is:"};
uint shuzu[8];
uchar tableset[]={"DF in user addr:"};
uint shuzu2[4]={1,1,1,0};
uint stop;
uchar stop1;
//uchar button=0;
void disp();
void dis_dat();
void delayus(uint t) //stc8952 1mhz
{
uint i;
// uchar j;
for(i=t;i>0;i--);
// for(j=12;j>0;j--);
}
void delayms(uint t)
{
uint i;
uint j;
for(i=t;i>0;i--)
for(j=1000;j>0;j--);
}
void w_data(uchar wdata)
{
RW=0;
RS=1;
EN=0;
P0=wdata;
delayus(100);
EN=1;
delayus(200);
EN=0;
delayus(100);
}
void w_cmd(uchar cmd)
{
RW=0;
RS=0;
P0=cmd;
delayus(100);
EN=1;
delayus(200);
EN=0;
delayus(100);
}
void timer1() interrupt 3
{
TR1=0;
}
void bit_1() //此函数执行完毕即发送了一个AD码“1”
{
df_data=1;
TH1=0xfa;
TL1=0xb9;//1350us在12M晶振下,应该是65536-1350= 64186
//,换算成二进制 1111 1010 1011 1010(减去一个df_data=1指令时间)
TR1=1;
while(TR1); //高电平
df_data=0;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //低电平
df_data=1;
TH1=0xfa;
TL1=0xb9;
TR1=1;
while(TR1); //高电平

df_data=0;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //低电平

}
void bit_0() //此函数执行完毕即发送了一个AD码“0”
{
df_data=1;
TH1=TH1_4a;
TL1=TL1_4a;//500us(4a)在12M晶振下,a=125us,应该是65536-500= 65036
//,换算成二进制 1111 1110 0000 1100(减去一个df_data=1指令时间) 0xfe 0x0c
//12a=125*12=65536-1500= 64036 1111 1010 0010 0100 fa 24
//
TR1=1;
while(TR1); //高电平
df_data=0;
TH1=TH1_12a;
TL1=TL1_12a;
TR1=1;
while(TR1); //低电平
df_data=1;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //高电平

df_data=0;
TH1=TH1_12a;
TL1=TL1_12a;
TR1=1;
while(TR1); //低电平

}
void bit_f() //此函数执行完毕即发送了一个AD码“f”
{
df_data=1;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //高电平
df_data=0;
TH1=TH1_12a;
TL1=TL1_12a;
TR1=1;
while(TR1); //低电平
df_data=1;
TH1=TH1_12a;
TL1=TL1_12a;
TR1=1;
while(TR1); //高电平

df_data=0;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //低电平

}
void bit_s() //此函数执行完毕即发送了一个同步码
{
df_data=1;
TH1=TH1_4a;
TL1=TL1_4a;
TR1=1;
while(TR1); //高电平
df_data=0;
TH1=0xc1;
TL1=0x08; //125us*128T=16000us 65536-16000=49536 c108 1100 0111 1100 0010
TR1=1;
while(TR1); //低电平

}
/////设计一个算法。将十进制数转换为两个二进制数表示的三进制
//
void tran()
{
//uchar shuzu3[8];
uint i,j;
for(i=0;i<8;i++)
{
if(i==7)
{
if(shuzu[i]==3)
for(j=0;j<8;j++)
shuzu[j]=0;
}
else if(shuzu[i]==3)
{
shuzu[i]=0; shuzu[i+1]++;
}
}
}
void DF(uint d1) //01f0 101f 101f
{
//uchar tempdf1,tempdf2;
//tempdf1=d1; tempdf2=d2;
switch(d1)
{
case 0:
bit_0();
break;
case 1:
bit_1();
break;
case 2:
bit_f();
break;
default:break;
}
}
void send_data()
{
uchar i,j;
for(j=0;j<4;j++) //一次四组
{
for(i=0;i<8;i++)
DF(shuzu[i]); // 8位地址码
for(i=0;i<4;i++)
DF(shuzu2[i]); //4位数据码
bit_s(); //1位同步码
}
shuzu[0]++;
tran();
}
void send_data1()
{
uchar i,j;
for(i=0;i<4;i++) //一次四组
{
for(j=0;j<8;j++)
DF(shuzu[j]); // 8位地址码
for(j=0;j<4;j++)
DF(shuzu2[j]); //4位数据码
bit_s(); //1位同步码
}
}
void keyscan() // 键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描
{ // 键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描
// 键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描
uchar i; // 键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描键盘扫描
// uint j;
if(key1==0)
{
delayms(10);
if(key1==0)
{
uint ti=6562;
EX0=1;// 允许外部中断
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
w_cmd(0x80);
w_cmd(0x80+0x04); //testing
for(i=0;i<7;i++)
{
w_data(table2[i]);
}
shuzu[0]=0; shuzu[1]=0; shuzu[2]=0; shuzu[3]=0 ;shuzu[4]=0;
shuzu[5]=0; shuzu[6]=0; shuzu[7]=0;
while(ti--)
send_data();
w_cmd(0x01);
w_cmd(0x80+0x40); //test failed
for(i=0;i<11;i++)
{
w_data(failed[i]);
}
}
}
//////////////////////////////////////////////
if(key2==0)
{
//button++;
delayms(60);
if(key2==0)
{
// j=4;
w_cmd(0x01);
w_cmd(0x80);
w_cmd(0x80+0x40); //
for(i=0;i<16;i++)
{
w_data(tableset[i]);
}
send_data1();
/* while(j--)
{
send_data1();
} */
//发送结束
//w_cmd(0x01);
w_cmd(0x80);
//w_cmd(0x80+0x43); //
disp();
dis_dat();
// key2=1;
}

}

}
void init()
{
uchar i;
df_data=0;
key1=1; key2=1; key3=1; key4=1;
shuzu2[0]=1; shuzu2[1]=1; shuzu2[2]=1; shuzu[3]=0; //数据位为1010
shuzu[0]=1; shuzu[1]=0; shuzu[2]=2; shuzu[3]=1 ;shuzu[4]=0;
shuzu[5]=2; shuzu[6]=1; shuzu[7]=0;
stop=1;
PX0=0;//设置外部中断的优先级降低,要比定时器1中断要低,0为低,默认为高,1时为高
PT1=1;//设置定时器中断优先级,1表示优先级高,通过这两个设置,定时器1中断优先级高于外部中断 ///////////////////////////////
TMOD=0x11; ////////初始化初始化初始化////////
/////初始化始化初始化初始化////////
EA=1; ////初始化初始化初始化///////

ET1=1;
IT0=1;//0为低电平触发外部中断,1为下降沿触发 1可锁存 0不可
//EN=0;
EX0=0;//外部中断允许,优先级最高,其次是定时器1
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
w_cmd(0x80);
w_cmd(0x01);
w_cmd(0x80);
w_data('B');w_data('y');
w_data('@');
w_data('1'); w_data('1'); w_data('0'); w_data('0'); w_data('2'); w_data('3'); w_data('0'); w_data('1'); w_data('2'); w_data('4');
delayms(255); delayms(255); delayms(255);

w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
w_cmd(0x80);
w_cmd(0x01);
w_cmd(0x80);
for(i=0;i<14;i++)
{
w_data(table[i]);
}
w_cmd(0x80+0x40); //set df
for(i=0;i<15;i++)
{
w_data(table1[i]);
}
}
void disp()
{
uchar j;
w_cmd(0x80+0x42);
for(j=0;j<8;j++)
{
switch(shuzu[j])
{
case 0:
w_data('0');
break;
case 1:
w_data('1');
break;
case 2:
w_data('f');
break;
default:break;
}
}
}
void dis_dat()
{
uchar j;
for(j=0;j<4;j++)
{
switch(shuzu2[j])
{
case 0:
w_data('0');
break;
case 1:
w_data('1');
break;
case 2:
w_data('f');
break;
default:break;
}
}
}
void tran2()
{
if(shuzu[0]!=0)
shuzu[0]--;
else if(shuzu[1]!=0)
{ shuzu[1]--; shuzu[0]=2;}
else if(shuzu[2]!=0)
{
shuzu[2]--; shuzu[1]=2; shuzu[0]=2;
}
else if(shuzu[3]!=0)
{
shuzu[3]--; shuzu[2]=2; shuzu[1]=2;shuzu[0]=2;
}
else if(shuzu[4]!=0)
{
shuzu[4]--; shuzu[3]=2; shuzu[2]=2; shuzu[1]=2; shuzu[0]=2;
}
else if(shuzu[5]!=0)
{
shuzu[5]--; shuzu[4]=2;shuzu[3]=2; shuzu[2]=2; shuzu[1]=2; shuzu[0]=2;
}
else if(shuzu[6]!=0)
{
shuzu[6]--;shuzu[5]=2;shuzu[4]=2; shuzu[3]=2; shuzu[2]=2; shuzu[1]=2; shuzu[0]=2;
}
else if(shuzu[7]!=0)
{
shuzu[7]--; shuzu[6]=2;shuzu[5]=2;shuzu[4]=2;shuzu[3]=2; shuzu[2]=2; shuzu[1]=2; shuzu[0]=2;
}
else
{
shuzu[7]=2; shuzu[6]=2;shuzu[5]=2;shuzu[4]=2;shuzu[3]=2; shuzu[2]=2; shuzu[1]=2; shuzu[0]=2;
}
}
/****************************************************************************************/
void keyscan2()
{
if(key1==0) //减法1
{
delayms(60);
if(key1==0)
{uchar i,j;
tran2();
disp();

for(i=0;i<4;i++) //一次四组
{
for(j=0;j<8;j++)
DF(shuzu[j]); // 8位地址码
for(j=0;j<4;j++)
DF(shuzu2[j]); //4位数据码
bit_s(); //1位同步码
}
}
}
//......................................../
if(key3==0) //加1
{
delayms(60);
if(key3==0)
{uchar i,j;
shuzu[0]++;
tran();
disp();

for(i=0;i<4;i++) //一次四组
{
for(j=0;j<8;j++)
DF(shuzu[j]); // 8位地址码
for(j=0;j<4;j++)
DF(shuzu2[j]); //4位数据码
bit_s(); //1位同步码
}
}
}
}
void main()
{

P1=0xaa;
init();
// _nop();
while(stop)
{
keyscan();
}
}
void stop_test()interrupt 0
{

uchar i;
w_cmd(0x01);
delayms(1);
w_cmd(0x80);
w_cmd(0x80+0x02); // the code is:
for(i=0;i<12;i++)
{
w_data(success[i]);
}
disp();
TMOD=0x11; /////初始化始化初始化初始化////////
ET1=0;
EA=0;
ET1=1;
EA=1;
key1=1; key2=1; key3=1;
while(1)
keyscan2();
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com