关于单片机8个I/0口 实现36个按键功能
毕业设计2:传感器无线网络

毕业设计的开始:传感器无线网络——入手的几个模块

G-one posted @ 2010年4月05日 06:23 in program , 3401 阅读

话说这毕业设计到现在 竟然已经过了5周了,真恐怖啊~  时间过得真快,前面看资料竟然花了那么长时间,也是带很多懒惰吧 哈哈

弄了几个模块,还没工作赚钱 已经出血投资了 唉 唉~~

共4个nRF24L01,还真精致小巧,整个模块就一个拇指甲那么丁大,SPI的通讯接口 51单片机没又得要写虚拟接口程序

幸好手上有两块板,模拟仿真一下接收机 跟发射机,这里红的做接收,懒散那块做法送

SPI接口虚拟倒是容易,但这无线模块的发射 接收控制倒是不好弄 7条命令,25个寄存器 ..........30个配置字

带地址 数据校验 可设置频道 ...............  功能看上去还不错,我等菜鸟怎么都觉得有难度哟

代码怎么都飞到底下了?? 弄不上来,上面的是定义,下面的是部分函数,挺绕的

 今天还要 基本把示例程序 理解透,半抄半写的弄出了这些代码,单通道通讯也 成功的弄出来了,可是换个通道就不通了~还要加把劲呢,还有网络 哈哈 哈哈。

另外早几天还买了几个液晶 15一个,后来SBB的发现了 手上老师要来的那个单片机运行比一般51快N多,还以为液晶问题出不了东西。高速MCU... 我火星了  

 

 

 

 

 

 

#include<reg51.h>
#include<intrins.h>


#define uchar unsigned char
#define uint unsigned int

uchar code NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//公阳
		//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71	公阴

#define LED P0
#define TX_ADR_WIDTH    5   	 //地址长度
#define TX_PLOAD_WIDTH  20 		 //数据长度
uchar const TX_ADDRESS1[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};  //地址1
uchar const TX_ADDRESS2[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x02}; //地址2

uchar tx_Data[TX_PLOAD_WIDTH];
uchar rx_Data[TX_PLOAD_WIDTH];
uchar DATA;
uchar bdata sta;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;

sbit CE=P2^0;
sbit SCK=P2^1;
sbit CSN=P2^3;
sbit IRQ=P2^5;
sbit MOSI=P2^4;
sbit MISO=P2^2;	   
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;

//********************nRF24L01 指令**********************************
#define READ_REG        0x00  // 读配置寄存器
#define WRITE_REG       0x20  // 写配置寄存器
#define RD_RX_PLOAD     0x61  // 读RX有效数据
#define WR_TX_PLOAD     0xA0  // 写RX有效数据
#define FLUSH_TX        0xE1  // 清除TX FIFO寄存器(发射模式应用)
#define FLUSH_RX        0xE2  // 清除TX FIFO寄存器(接收模式应用)
#define REUSE_TX_PL     0xE3  // 重新使用上一包有效数据
#define NOP             0xFF  // 空操作

//******************nRF24L01寄存器地址*******************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测           
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道1接收数据长度
#define RX_PW_P2        0x13  // 接收频道2接收数据长度
#define RX_PW_P3        0x14  // 接收频道3接收数据长度
#define RX_PW_P4        0x15  // 接收频道4接收数据长度
#define RX_PW_P5        0x16  // 接收频道5接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置

 

 

/***********************************************************
//	SPI_Read_Buf()
// 写入地址reg 读出数据*pBuf 数据长度bytes
***********************************************************/
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
	uchar status,byte_ctr;
	CSN=0;
	status=SPI_RW(reg);

	for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
		pBuf[byte_ctr]=SPI_RW(0);

	CSN=1;

	return(status);
}

/***********************************************************
//	SPI_Read_Buf()
// 写入地址reg 写入数据*pBuf 数据长度bytes
***********************************************************/
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
{
	uchar status,byte_ctr;

	CSN=0;
	status=SPI_RW(reg);
	for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
		SPI_RW(*pBuf++);
	CSN=1;
	return(status);
}

/***********************************************************
// RX_Mode();
//读模式
***********************************************************/
void RX_Mode(void)
{
	CE=0;
	SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS1,TX_ADR_WIDTH);

	SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
	SPI_RW_Reg(WRITE_REG+EN_AA,0X0f);
	SPI_RW_Reg(WRITE_REG+RF_CH,40);
	SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);
	SPI_RW_Reg(WRITE_REG+RF_SETUP,0X05);
	CE=1;
}

/***********************************************************
//TX_Mode();
//写模式
***********************************************************/
void TX_Mode(void)
{
	CE=0;

	SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS1,TX_ADR_WIDTH);
	SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS1,TX_ADR_WIDTH);
	SPI_Write_Buf(WR_TX_PLOAD,tx_Data,TX_PLOAD_WIDTH);

	SPI_RW_Reg(WRITE_REG+CONFIG,0X0E);
	SPI_RW_Reg(WRITE_REG+EN_AA,0X01);
	SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
	SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);
	SPI_RW_Reg(WRITE_REG+RF_CH,40);
	SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
	
	CE=1;
}
Avatar_small
TLHL28 说:
2010年4月10日 10:27

什么时候毕业答辩阿?!
我去参观!!!

Avatar_small
G-one 说:
2010年4月11日 03:22

不知道,协议部分还在烦着呢

Avatar_small
TLHL28 说:
2010年4月11日 10:39

= =. 快.
快毕业了都.还不知道什么时候答辩.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter