|
7黑币
本帖最后由 2013yu 于 2015-1-24 13:27 编辑
51hei开发板上的一个315M无线遥控程序,我想利用每个遥控器地址码的不同来区分不同的遥控器,遥控器的地址码我已经焊接好设置成1FFF FFF0,
我想在程序中设置一个地址码,用来和接收到的地址码作比较,如果设置的地址码和接收到的相同就解码,1FFF FFF0转换成16进制是11101010和10101000,大家帮我看看红字部分如何改,谢谢大家了
#include"AT89x52.h"
//#include"global.h"
#include"intrins.h"
#include"51hei.H"
#define uchar unsigned char
#define uint unsigned int
uchar Rem_Code[3];
uchar Addr_Code_H=?
uchar Addr_Code_L=?
uint TimeCount;
sbit Get_Rem=P3^2;
/* //延时函数
void Delay100us(void)
{
uchar i;
for(i=0;i<55;i++)
{
_nop_();
}
}
*/
void delay8(uint t)
{
while(--t);
}
void Delay100us(void)
{
delay8(13); //8-18
}
//因为他的格式是00表示"0"11表示"1"01表示"F"所以我们要把12位乘以2等于24位刚好是3个字节
//第一二个字节是地址码,第三个字节是数据码
//发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射
//遥控我们全部默认地址码是 FFFFFFFF 单片机解码出来就是0x55 0x55
//遥控处理函数
void Remote_Process(void)
{
uchar i,j,Count=0;
Delay100us();
if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0
{//等于0后表示按键释放
TimeCount--;
}
if(Get_Rem==0)//如果有低电平就进入解码
{
for(Count=0;Count<100;Count++)//判断12毫秒左右的引导码
{
Delay100us();//100us*100=10ms
if(Get_Rem==1)//如果在延时10毫秒期间有高电平出现就是干扰信号退出解码
{
return;
}
}
while(Get_Rem==0);//等待低电平结束
for(j=0;j<3;j++)//8位地址码加4位数据码
{
for(i=0;i<8;i++)
{
Count=0;
do
{
Delay100us();
Count++;
if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码
{//理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差
return;
}
}while(Get_Rem==1);//计算高平时间并等待结束
Count=0;
do
{
Delay100us();
Count++;
if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码
{
return;
}
}while(Get_Rem==0);//计算低电平时间并等待结束
Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位
if(Count<8)//如果低电平时间小于800毫秒认为该位为1
{
Rem_Code[j]++;
}
}
}
if(TimeCount==0) //为0表示是新的一次按下对其进行处理
{ // 如过该值大于0表示已经按下不在处理,保证按下一次只做一次处理
if((Rem_Code[0]==Addr_Code_H)&&(Rem_Code[0]==Addr_Code_L)) //把接收到的地址码与程序中设置的地址码作比较如果相同就执行数据码
{
if(Rem_Code[2]==Key_A) //如果数据与A键的值相等表示A键按下对其处理
{//试验用A键来控制继电器的开关
Com_Relay;//继电器取反
Nokia3310();//显示继电器的状态
Bz_Out();//蜂鸣器响一声
}
}
//P2_2=0;
}
TimeCount=1000;//按键按下标志
}
}
void main()
{
AUXR=0x01;
P1_4=0;
guandz();
guanled();
while(1)
{
Remote_Process();//遥控处理
}
}
|
|