NRF24L01、DHT22程序_第1页
NRF24L01、DHT22程序_第2页
NRF24L01、DHT22程序_第3页
NRF24L01、DHT22程序_第4页
NRF24L01、DHT22程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include "DELAY.h"#include "stc15f2k61s2.h"#include "intrins.h"void Delay10us()/11.0592MHzunsigned char i;_nop_();i = 25;while (-i);void Delay1000ms()/11.0592MHzunsigned char i, j, k;_nop_();_nop_();i = 43;j = 6;k = 203;dodowhile (-k); while (-j); while (-i);void Delay_

2、N1ms(unsigned int i)unsigned int m,n;for(m=i;m>0;m-)for(n=110;n>0;n-);#include "config.h"#include"DELAY.h"unsigned char bdata sta;sbit RX_DR=sta6;sbit TX_DS=sta5;sbit MAX_RT=sta4;/=硬件SPI初始化=void SPI_Init(void) /空闲时钟高电平 第二边沿采样 第一位为最高位 速率 CPU_CLK/4 SPSTAT=0XC0; /清零传输完成标注及写冲突标

3、志 SPCTL=SPI_NRF24L01; /NRF24L01 空闲时钟低电平 第一边沿采样 第一位为最高位 速率 CPU_CLK/4 未开启SPI SPCTL|=SPI_STAT; /开启SPIunsigned char SPI_WRITE_READ(unsigned dat) /SPI 读写字节 SPDAT =dat; /写入寄存器 while(!(SPSTAT & 0X80); /等待传输完成 SPSTAT=0XC0; /清零标志 return SPDAT;void SPI_SPEED(unsigned char num) /设置SPI 速度 03 0为最大速度 num=num&

4、amp;0x03; /约束范围 SPCTL&=0x03; /清零之前操作 SPCTL|= num; SPCTL|=SPI_STAT; /开启SPI/=/发送地址-code unsigned char TX_ADDRESSTX_ADR_WIDTH=0x00,0x43,0x10,0x10,0x01; /发送地址 一次只能向一个地址发送 5字节地址独立 发送时必须与/RX_ADDR_P0地址相同/接收通道地址-code unsigned char RX_ADDRESS5=0x00,0x43,0x10,0x10,0x01; /5字节地址完全独立 /SPI写寄存器/reg:指定寄存器地址/val

5、ue:写入的值unsigned char NRF24L01_Write_Reg(unsigned char reg,unsigned char value) unsigned char status; NRF24L01_CSN=0; /使能SPI传输 status =SPI_WRITE_READ(reg);/发送寄存器号 SPI_WRITE_READ(value); /写入寄存器的值 NRF24L01_CSN=1; /禁止SPI传输 return(status); /返回状态值/读取SPI寄存器值/reg:要读的寄存器unsigned char NRF24L01_Read_Reg(unsign

6、ed char reg)unsigned char reg_val; NRF24L01_CSN = 0; /使能SPI传输 SPI_WRITE_READ(reg); /发送寄存器号 reg_val=SPI_WRITE_READ(0);/读取寄存器内容 NRF24L01_CSN = 1; /禁止SPI传输 return(reg_val); /返回状态值/在指定位置读出指定长度的数据/reg:寄存器(位置)/*pBuf:数据指针/len:数据长度/返回值,此次读到的状态寄存器值 unsigned char NRF24L01_Read_Buf(unsigned char reg,unsigned c

7、har *pBuf,unsigned char len) unsigned char status,u8_ctr; NRF24L01_CSN = 0; /使能SPI传输 status=SPI_WRITE_READ(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0;u8_ctr<len;u8_ctr+)pBufu8_ctr=SPI_WRITE_READ(0XFF);/读出数据 NRF24L01_CSN=1; /关闭SPI传输 return status; /返回读到的状态值/在指定位置写指定长度的数据/reg:寄存器(位置)/*pBuf:数据指针/len:数据长度/

8、返回值,此次读到的状态寄存器值unsigned char NRF24L01_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char len)unsigned char status,u8_ctr; NRF24L01_CSN = 0; /使能SPI传输 status = SPI_WRITE_READ(reg);/发送寄存器值(位置),并读取状态值 for(u8_ctr=0; u8_ctr<len; u8_ctr+)SPI_WRITE_READ(*pBuf+); /写入数据 NRF24L01_CSN = 1; /关闭SP

9、I传输 return status; /返回读到的状态值void NRF24L01_Init(void) SPI_Init(); /初始化SPISPI_SPEED(0); /约束速度 NRF24L01最大速度10M NRF24L01_CSN=0; /使能NRF24L01_IRQ=1; /中断IO 输出高电平 类似上拉效果NRF24L01_CE=0; /进入待机模式 允许设置 NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); /写TX通道地址 写发送通道地址 NRF24L01_Write_Buf(WRITE_RE

10、G_NRF+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); /设置TX通道地址,主要为了使能ACK 必须与发射地址一致NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); /使能通道0的自动应答 NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); /使能通道0的接收地址 NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);/500us+86us,10次重发 NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0

11、); /设置RF通道为40 发射与接收必须一致 NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07); /设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);/设置接受数据长度,本次设置位32字节 /启动NRF24L01发送一次数据/txbuf:待发送数据首地址/返回值:发送完成状况unsigned char NRF24L01_TxPacket(unsigned char *txbuf)NRF24L01_CE=0; /使能拉低NRF

12、24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH); NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);/写数据到TX BUF 32个字节NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0e);/配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF24L01_CE=1;/启动发送 Delay10us();while(NRF24L01_IRQ!=0);/等待发送完成sta=NRF24L01

13、_Read_Reg(STATUS); /读取状态寄存器的值 NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); /清除TX_DS或MAX_RT中断标志if(MAX_RT)/达到最大重发次数NRF24L01_Write_Reg(FLUSH_TX,0xff);/清除TX FIFO寄存器 return MAX_TX;if(TX_DS)/发送完成return TX_OK;return 0xff;/其他原因发送失败 /mian函数#include "config.h"#include"DELAY.h"#include&quo

14、t;DHT22.h" /unsigned char buf_tx32=3;unsigned char Sensor_Data5=0x00,0x00,0x00,0x00,0x00;unsigned char Sensor_Check; /校验和unsigned char Sensor_AnswerFlag; /收到起始标志位unsigned char Sensor_ErrorFlag; /读取传感器错误标志unsigned int Sys_CNT;unsigned int Tmp;sbit Sensor_SDA = P11;unsigned char Sensor_flag,num;u

15、nsigned char Read_SensorData(void) /读一位数据 unsigned char i,cnt;unsigned char buffer,tmp;buffer = 0;for(i=0;i<8;i+)cnt=0;while(!Sensor_SDA)/检测上次低电平是否结束 if(+cnt >= 300) break; /延时Min=26us Max50us 跳过数据"0" 的高电平Delay10us(); /延时30us Delay10us();Delay10us();/判断传感器发送数据位tmp =0;if(Sensor_SDA) t

16、mp = 1; cnt =0;while(Sensor_SDA)/等待高电平 结束 if(+cnt >= 200) break;buffer <<=1;buffer |= tmp;return buffer; unsigned char Read_Sensor(void)/读全部数据 unsigned char i;/主机拉低(Min=800US Max=20Ms) Sensor_SDA = 0;Delay_N1ms(2); /延时2Ms /释放总线 延时(Min=30us Max=50us)Sensor_SDA = 1; Delay10us();/延时30usDelay10

17、us();Delay10us();/主机设为输入 判断传感器响应信号 Sensor_SDA = 1; Sensor_AnswerFlag = 0; / 传感器响应标志 /判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(Sensor_SDA =0) Sensor_AnswerFlag = 1;/收到起始信号 Sys_CNT = 0; /判断从机是否发出 80us 的低电平响应信号是否结束 while(!Sensor_SDA) if(+Sys_CNT>300) /防止进入死循环 Sensor_ErrorFlag = 1; return 0; Sys_CNT = 0; /判

18、断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(Sensor_SDA) if(+Sys_CNT>300) /防止进入死循环 Sensor_ErrorFlag = 1; return 0; / 数据接收传感器共发送40位数据 / 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和 / 校验和为:湿度高位+湿度低位+温度高位+温度低位 for(i=0;i<5;i+) Sensor_Datai = Read_SensorData(); else Sensor_AnswerFlag = 0; / 未收到传感器响应 return 1; void main() /* STC15W系列单片机的IO口上电默认为高阻状态 下面的配置是必须的。*/ P0M1=0x00; P0M0=0X00;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论