OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 22018|回复: 9

我的AVR资料[程序篇] AVR的315M无线模块通讯源码(源码2)

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2010-12-17 09:05:50 | 显示全部楼层 |阅读模式

     这是第二个源码.利用mega8做发射,mege16做接收.无线模块用的是很便宜的315M模块,大概10元一对.协议是自己定的.

     协议格式是参考PT2226/PT2227的,为:前导码+地址+数据+地址反码.

发送端代码:

#include <mega8.h>
#include <delay.h>
#define OUT PORTC.0
void sendbyte(uchar add,uchar data)
{
    uchar t,temp;
    temp=~add;
    for(t=0;t<4;t++)//发送前导命令
    {
        OUT=1;
        delay_us(150);
        OUT=0;
        delay_us(250);
    } 
    for(t=0;t<4;t++) //发送地址
    {
        if(add&0x01)
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(100);
        }
        else
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(175);
        }
        add>>=1;
    }               
    for(t=0;t<8;t++)//发送数据
    {
        if(data&0x01)
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(100);
        }
        else
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(175);
        }
        data>>=1;
    } 
    for(t=0;t<4;t++)//发送地址反码
    {
        if(temp&0x01)
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(100);
        }
        else
        {
            OUT=1;
            delay_us(150);
            OUT=0;
            delay_us(175);
        }
        temp>>=1;
    }
    OUT=1;
    delay_us(150);
    OUT=0;
    delay_us(250);//发送结束帧 
    OUT=1;
}
void main()
{
    uchar t,i; 
    t=0;
    DDRC=0XFF;
    PORTC=0XFF;      
    while(1)
    {
        for(i=0;i<10;i++)
        sendbyte(0x0a,t);
        t++; 
        //delay_ms(1000);
    }
}

接收端代码:

#include <mega16.h>
#include<delay.h> 
#define IN PIND.2 //无线数据输入端口 

//无线数据传输辅助变量
uchar mark,i,result[16]; 
/*--------------n的m次方计算-----------------
返回值:n^m
  参数:n 底数
        m 指数
    注:n^m不能超过255!!!
--------------------------------------------*/
unsigned char pow(unsigned char n,unsigned char m)
{
 unsigned  char t,BACK=1;
 for(t=0;t<m;t++){BACK=n*BACK;}
 return BACK;

/*--------------检查低电平的时间-----------------
返回值:低电平持续时间(单位:10uS)
  参数:无
    注:错误时返回0
-------------------------------------------------*/
uchar check(void)
{
    uchar jud=0;
    while(!IN)//检测低电平持续时间
    {
        delay_us(5);jud++;
        if(jud>54)return 0;//排除长0的干扰
    }
    if(jud<15)return 0;//排除短0的
    return jud;
}
/*--------------检查低电平的时间-----------------
返回值:无
  参数:无
-------------------------------------------------*/
void Clear(void)
{
    uchar t;
    i=mark=0;
    for(t=0;t<16;t++)result[t]=0;
}
/*---------数据检测接收函数(中断函数)----------
返回值:无
  参数:无
  注意:识别0:15-19,识别1:8-14,此区间内稳定性最好
    test data
    if(juder>19&&juder<31)(200-340us)1
    if(juder>30&&juder<41)(340-500us)0
    if(juder>40&&juder<54)(500-600us)guide
    if(juder>53&&juder<63)(600-700us)start
-------------------------------------------------*/
interrupt [EXT_INT0] void ext_int0_isr(void)//接收处理函数
{
    uchar juder;
    juder=check();//获得低电平脉宽
    if(juder>44&&juder<54)mark++;//识别前导
    else if(mark>3)//条件强弱判定
    {
        if(juder>31&&juder<45){result=0;i++;}//识别0
        else if(juder>14&&juder<32){result=1;i++;}//识别1
        else {Clear();return;} //清除杂波 
    }
    else mark=0;//排除短0的干扰
}
/*--------------无线数据处理程序-----------------
返回值:0  未获得数据
        1  获得数据
  参数:*Cmd    地址暂存(或者命令\低四位有效)
        *Numb   数据暂存(0-255)
-------------------------------------------------*/ 
uchar Get_Radio(uchar *Cmd,uchar *Numb)
{
    uchar k;
    if(result[0]==!result[12]&&result[1]==!result[13]
    &&result[2]==!result[14]&&result[3]==!result[15])
    {
        *Cmd=*Numb=0;
        for(k=0;k<4;k++)*Cmd+=pow(2,k)*result[k];
        for(k=0;k<8;k++)*Numb+=pow(2,k)*result[k+4];
        Clear();
        return 1; 
    }         
    return 0 ;
}
/*----------------数码管显示程序-----------------
返回值:无
  参数:number   要显示的数字(0-9)
        position 要显示的位置(1-8)
-------------------------------------------------*/
void display(unsigned char number,unsigned char position)//digtial show function
{  
    DDRA=0Xff;//set PORTA output
 ORTA=0XFF;//set PORTA output in high level
    switch(position)//choice the position
 {
  case 1:{PORTA&=0xf8;break;}
  case 2:{PORTA&=0xf9;break;}
  case 3:{PORTA&=0Xfa;break;}
  case 4:{PORTA&=0Xfb;break;}
  case 5:{PORTA&=0Xfc;break;}
  case 6:{PORTA&=0Xfd;break;}
  case 7:{PORTA&=0Xfe;break;}
  case 8:{PORTA&=0Xff;break;}
  } 
    switch(number)//show number
 {
  case 0:{PORTA&=0x87;break;}    //0
  case 1:{PORTA&=0x8f;break;}    //1
  case 2:{PORTA&=0x97;break;}    //2
  case 3:{PORTA&=0x9f;break;}    //3
  case 4:{PORTA&=0xa7;break;}    //4
     case 5:{PORTA&=0xaf;break;}    //5
  case 6:{PORTA&=0xb7;break;}    //6
  case 7:{PORTA&=0xbf;break;}    //7
  case 8:{PORTA&=0xc7;break;}    //8
     case 9:{PORTA&=0xcf;break;}    //9
  default:{PORTA=0xff;break;}    //null
 }       
}

void main(void)
{  
    uchar res=0,*number,*add; 
    DDRD&=0XFB; 
    DDRB=0XFF;
    PORTB=0XFF;
    PORTD|=0x04;//INT0开启上拉电阻  
    GICR|=0x40;//开启中断0
    MCUCR=0x02;//下降沿触发
    //GIFR=0x40;
    #asm("sei")                      
   
    while (1)
    {  
        if(Get_Radio(add,number))res=*number;
        display(res/100,5);delay_us(50);
        display((res%100)/10,6);delay_us(50);
        display(res%10,7);delay_us(50);
    }
}  
     以上是快速版本.还有一个慢速版本的.这里不贴出来了,见附件.

     总结一下,像这种自己定义协议的无线通信,示波器是必不可少的工具,另外要花大力气才能写出稳定可靠的传输协议,我这个仅仅是比较简单的,还有很多需要完善.有时间的朋友,可以去研究一下.

slow.rar

2.22 KB, 下载次数: 1769

fast.rar

4.36 KB, 下载次数: 1723

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2010-12-17 09:25:48 | 显示全部楼层

 又找到一个51版本的.上传了.

 

无线 通讯程序.rar

3.43 KB, 下载次数: 2311

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-8-13
在线时间
0 小时
发表于 2012-8-13 17:21:15 | 显示全部楼层
这张贴就是个神啊,有助
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-8-7
在线时间
0 小时
发表于 2012-8-17 16:17:06 | 显示全部楼层
顶。。。
回复 支持 反对

使用道具 举报

36

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2012-1-21
在线时间
12 小时
发表于 2012-8-18 12:26:10 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2013-5-3
在线时间
7 小时
发表于 2014-3-17 11:02:43 | 显示全部楼层
顶  顶顶
回复 支持 反对

使用道具 举报

4

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-10-17
在线时间
9 小时
发表于 2014-4-23 17:41:31 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

30

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2013-8-27
在线时间
8 小时
发表于 2014-7-17 20:55:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,你的硬件是什么样子的啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-7-17 23:16:51 | 显示全部楼层
回复【8楼】小z:
---------------------------------
自己设计的,现在已经作古了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2015-4-26
在线时间
173 小时
发表于 2016-1-29 14:04:11 | 显示全部楼层
这个能直接移植到mini吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表