打印
[经验分享]

软解码接收

[复制链接]
808|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布谷鸟2015|  楼主 | 2015-12-13 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近写的一个关于315Mhz无线模块单片机软解码接收程序,分享给大家。。:)
# include<reg52.h>
# define uint unsigned int
# define uchar unsigned char

sbit DATA=P3^2;
sbit rs=P2^6;          //1602引脚定义
sbit rw=P2^5;
sbit e=P2^7;
uchar dat,num;

uchar code table[]="0123456789ABCDEF";
uchar code table1[]="Receive:";        //液晶固定部分显示
uchar code table2[]="Re_data:0x";

void write_data (uchar dat);         //1602写数据
void write_com (uchar com);         //1602写命令
unsigned char pow(unsigned char n,unsigned char m);        //n的m次方函数
uchar receive(void);                          //接收处理函数  
void gd();                        //液晶固定部分显示

void delay (uint xms)        //1602延时
{
uint i,j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}

void delay1(unsigned char t)//延时程序
{
unsigned char n;
for(;t>0;t--)
for(n=40;n>0;n--);  
}

unsigned char pow(unsigned char n,unsigned char m)//n的m次方函数
{
unsigned  char t,result=1;
for(t=0;t<m;t++){result=n*result;}
return result;
}

void init_1602()
{
    e = 0;        //1602初始化
write_com (0x38);
    write_com (0x0c);
write_com (0x06);
write_com (0x01);
gd();
}

/*1602液晶代码部分        ------------------------------ */
void write_com (uchar com)        //写命令
{
rs = 0;
rw = 0;
P0 = com;
delay (5);
e = 1;
delay (5);
e = 0;
}

void write_data (uchar dat)         //写数据
{
rs = 1;
rw = 0;
P0 = dat;
delay (5);
e = 1;
delay (5);
e = 0;
}

void gd()        //液晶固定部分显示
{
    write_com(0x80);
for(num=0;num<8;num++)
{
   write_data(table1[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<10;num++)
{
   write_data(table2[num]);
delay(5);
}
}

uchar receive(void)//接收处理函数
{
unsigned char guid=0,result[12],i,key=0,res=0,t,time=0;
while(1)//捕获前导命令
{
while(DATA==1){t++;if(t>=90){delay1(100);return 0;}}//防止错误数据导致的死循环
if(t>=60&&t<95){t=0;key++;time=0;if(key>3)break;}//获得前导命令跳出循环,清除计时信号
else if(time>100){delay1(100);return 0;}//长0,错误信号返回0
else {t=0;time++;}//计时垒加,清除t
}  
t=0;
time=0;
for(i=1;i<13;)             //校验码及数据的接收共12位数据
{
while(DATA==1){t++;if(t>=95){delay1(100);return 0;}}//防止错误信号导致的死循环
if(t>=60&&t<95){t=0;i=1;time=0;}//去除多余的前导命令
else if(t>=28&&t<60){result[i-1]=1;i++;time=0;}//捕获数据1
else if(t>0&&t<27){result[i-1]=0;i++;time=0;}//捕获数据0
if(time>100)return 0; //消除长0的干扰确保数据正确
t=0;   //清零
time++;//计时        
}
if(result[0]==1&&result[1]==0&&result[2]==1&&result[3]==0)//判断校验码
for(i=0;i<8;i++){res+=pow(2,i)*result[11-i];}//将结果转换为十进制数据
return res;//返回得到的结果
}

void display(uchar dat)        //液晶数据显示
{
    uchar a,b;
a=dat/16;
b=dat%16;
if(a>9)
a=a+0;
if(b>9)
b=b+0;
write_com(0x80+0x4A);
write_data(table[a]);delay(5);
write_data(table[b]);delay(5);
}

void main()
{
init_1602();        //1602初始化
while(1)
{
dat=receive();
if(dat)                                  //显示
{
      write_com(0x80+0x08);
  write_data('O');delay(5);
  write_data('K');delay(5);
  write_data('!');delay(5);
  display(dat);
}
else
{
      write_com(0x80+0x08);
  write_data('N');delay(5);
  write_data('O');delay(5);
  write_data('!');delay(5);
  write_com(0x80+0x4A);
  write_data(' ');delay(5);
  write_data(' ');delay(5);
}
}
}
沙发
全速前行| | 2015-12-13 16:59 | 只看该作者
unsigned char pow(unsigned char n,unsigned char m)//n的m次方函数
{
unsigned  char t,result=1;
for(t=0;t<m;t++){result=n*result;}
return result;
}
??这个干吗用的啊??

使用特权

评论回复
板凳
xia00| | 2015-12-13 17:04 | 只看该作者
呵呵,先收藏了,马上要弄这个,屯资料!

使用特权

评论回复
地板
handleMessage| | 2015-12-13 19:23 | 只看该作者
请问楼主接受灵敏度如何,怎么样保证远距离接收的可靠性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

189

帖子

0

粉丝