无线模块nrf905的发送模块
时间:01-15 09:46 阅读:1336次
*温馨提示:点击图片可以放大观看高清大图
简介:本文介绍的主要是无线模块nrf905的发送模块
//数传发送2007/8/1 AT89C2051 11.0592MHz
//Module nRF905_TX
#include <reg51.H>
#include <intrins.h>//_nop_()
typedef unsigned char uchar;
typedef unsigned int uint;
//配置口定义//
sbit TXEN = P1^7;
sbit TRX_CE = P1^6;
sbit PWR = P1^5;
//SPI口定义//
sbit MISO = P1^1;
sbit MOSI = P1^0;
sbit SCK = P3^7;
sbit CSN = P3^3;
//状态输出口//
sbit CD = P1^4;
sbit AM = P1^3;
sbit DR = P3^2;
sbit LED1 = P3^4;
sbit LED2 = P3^5;
//控制按钮
sbit AN2 = P3^1;
//传感器
sbit DQ =P3^0; //DS18B20接在P30
//-------------------------------------------------
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
0x00, //配置命令//
0x6C, //CH_NO,配置频段在433.2MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为4字节
0xE7,0xE7,0xE7,0xE7, //接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};
uchar dis_buf[4]; //温度传感器发射数据缓存
//--------------------------------------
void DelayMs(uint n) //j=115@F=11.0592MHz
{ uchar j;
while(n--)
{for(j=0;j<115;j++);}
}
//---------------------------
void delayUs(uchar us)//15us延时
{
for(;us>0;us--);
}
//---------------------------
uchar reset(void)//DS18B20复位
{
uchar yes;
DQ = 0;
delayUs(29); //延时 480us
DQ = 1;
delayUs(3);
yes = DQ;
delayUs(25);
return(yes); //yes=0有芯片,
}
//---------------------------
uchar read_byte(void)//从单总线上读一个字节
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delayUs(1); //延时15us
if(DQ)value|=0x80;
delayUs(6);
}
return(value);
}
//---------------------------
void write_byte(uchar val)//向单总线上写一个字节
{
uchar i;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = val&0x01;
delayUs(5);
DQ = 1;
val=val/2;
}
delayUs(5);
}
//---------------------------
uint Read_Temp(void)//读取温度
{
union{
uchar tc[2];
uint tx;
}temp;
reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp.tc[1]=read_byte();
temp.tc[0]=read_byte();
reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); //Start Conversion
return temp.tx;
}
void Do_Temp(void) //温度数据处理
{
uint tx;
tx=Read_Temp();
if (tx>=0x0800) //温度为负值
{
tx=~(tx)+1;
dis_buf[3]=(tx&0x000f)*625/1000;//小数部分
tx=tx>>=4; //负值符号和整数部分
dis_buf[0]=0x13;
dis_buf[1]=tx/10;
dis_buf[2]=tx%10;
}
else
{
dis_buf[3]=(tx&0x000f)*625/1000;//小数部分
tx=tx>>=4; //正值整数部分
dis_buf[0]=tx/100;
dis_buf[1]=(tx%100)/10;
dis_buf[2]=(tx%100)%10;
}
}
//延时
void Delay(uint x)
{
uint i;
for(i=0;i<x;i++){
_nop_();
}
}
//用SPI口写数据至NRF905
void SpiWrite(uchar b)
{
uchar i=8;
while (i--)
{
Delay(10);
SCK=0;
MOSI=(bit)(b&0x80);
b<<=1 ;
Delay(10);
SCK=1;
Delay(10);
SCK=0;
}
SCK=0;
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{
TXEN=1;
CSN=0;
SpiWrite(0x22); //写发送地址,后面跟4字节地址//
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
CSN=1;
_nop_();_nop_();
CSN=0;
SpiWrite(0x20); //写发送数据命令
SpiWrite(dis_buf[0]); //四字节数据,符号位或百位
SpiWrite(dis_buf[1]); //十位
SpiWrite(dis_buf[2]); //个位
SpiWrite(dis_buf[3]); //小数位
CSN=1;
_nop_();_nop_();
TRX_CE=1; //使能发射模式//
Delay(50); //等待发送完成
TRX_CE=0;
while(!DR);
LED1=0; //发送完成LED亮一秒
Delay(10000);
LED1=1;
}
//初始化配置寄存器
void Ini_System(void)
{
uchar i;
CSN=1;
SCK=0;
PWR=1;
TRX_CE=0;
TXEN=0;
_nop_();
CSN=0;
for(i=0;i<11;i++){
SpiWrite(RFConf);
}
CSN=1;
PWR=1;
Delay(1000);
}
//-----------------------------------------------
void main(void)
{
DelayMs(100);
LED1=0;
DelayMs(1000);
LED1=1;
Do_Temp();
LED2=0;
DelayMs(1000);
LED2=1;
Ini_System();
while(1)
{
Do_Temp();
TxPacket();
DelayMs(10000);//10秒定时发送数据
}
}