基于nrf24l01的多点温度采集系统设计内容摘要:

//DQ 复位,稍微延时 DQ=0。 //拉低总线 delay1(80)。 //延时 500us,时序图上有说明控制器复位脉冲范围 DQ=1。 //释放总线 delay1(9)。 //延时 60us,等待 temp=DQ。 //读 DS18B20 反馈信号 ( 2) DS18B20 写时序程序设计 写时序图如图 所示。 图 DS18B20 的写时序 主要 程序如下: for(i=8。 i0。 i) { DQ=1。 _nop_()。 _nop_()。 DQ=0。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 DQ=valueamp。 0x01。 //从最低位开始写 delay1(9)。 value=1。 低位在前,右移 第 15 页 共 40 页 } ( 3) DS18B20 读时序程序设计 读时序图如图 示。 图 DS18B20 的读时序 主要 程序如下: for(i=8。 i0。 i) { DQ=1。 _nop_()。 _nop_()。 value1=1。 DQ=0。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 DQ=1。 //释放总线之后 采样 _nop_()。 _nop_()。 _nop_()。 _nop_()。 if(DQ) //是否 1 value1|=0x80。 delay1(9)。 } ( 4) DS18B20 读取温度及温度处理 在这一块程序中编写了 void read_temp()( 读取温度 )和 void work_temp()( 温度处理 )两个函数。 DS18B20 中的温度传感器可完成对温度的测量,当温度转换命令发布后,转换后的温度以补码形式存放在调整暂存存储器的第 0 和第 1个字节中。 DS18B20 温度值格式表如表。 第 16 页 共 40 页 表 DS18B20 温度值格式表 本设计显示的温度为正温度,两位整数和一位小数。 分两部分进行操作:整数和小数。 整 数部分的“ table[6]=((temp_data[0]amp。 0xf0)4)|((temp_data[1]amp。 0x0f)4)”语句把整数整合到一起,并且默认为正温度。 小数部分是将测到的数值再乘以 ,取近似值作为第一小数位。 比如测到的是 0x02,通过 2*=,取近似值为 1。 nRF24L01 程序设计 ( 1) nRf24L01 初始化程序设计 void init_NRF24L01()是 最基本的函数,完成 GPIO 模拟 SPI 的功能。 将输出字节( MOSI) 从 MSB 循环输出,同时 将输入字节( MISO)从 LSB 循环移入。 上升沿读入,下降沿输出。 (从 SCK 被初始化为低电平可以判断出)。 ( 3) nRF24L01 读写寄存器函数 uint SPI_RW_Reg(uchar reg, uchar value)寄存器访问函数:用来设置 24L01 的寄存器的值。 基本思路就是通过 WRITE_REG 命令(也就是 0x20+寄存器地址)把要设定的值写到相应的寄存器地址里面去,并读取返回值。 对于函数来说也就是把 value 值写到 reg寄存器中。 需要注意的是,访问 NRF24L01 之前首先要 enable 芯片 ( CSN=0; ),访问完了以后再 disable 芯片( CSN=1;)。 ( 4) nRF24L01 的 SPI 时序 uchar SPI_Read(uchar reg)读取寄存器值的函数:基本思路就是通过 READ_REG 命令(也就是 0x00+寄存器地址),把寄存器中的值读出来。 对于函数来说也就是把 reg寄存器的值读到 reg_val 中去。 ( 5) nRF24L01 读数据 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)接收缓冲区访问函数:主要用来在接收时读 取 FIFO 缓冲区中的值。 基本思路就是通过 READ_REG 命令把数据从接收 FIFO( RD_RX_PLOAD)中读出并存到数组里面去。 ( 6) nRF24L01 写数据 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)发射缓冲区访问函数:主要用来把数组里的数放到发射 FIFO 缓冲区中。 基本思路就是通过 WRITE_REG 命令把数据存到发射 FIFO( WR_TX_PLOAD)中去。 ( 7) nRF24L01 数据接收 发送 配置 第 17 页 共 40 页 void SetRX_Mode()函数是用于设置为本块无线通信模块为接收模块,里面包含了两块采集电路的地址,当地址配对成功之后方可接收数据。 void SetRX_Mode()函数则是用来设置本块无线通信模块为发射模块,里面包含了自己的本地地址,这个地址是它与其它模块区分的标志。 ( 8) nRF24L01 接收缓冲区 unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)函数的功能是数据读取后放如 rx_buf 接收缓冲区中。 字符型液晶显示模块程序设计 ( 1) LCD1602 初始化程序设 计 LCD1602 的初始化的过程如下: ① 延时 15ms; ② 写指令 38H(不检测忙信号); ③ 延时 5ms; ④ 写指令 38H(不检测忙信号); ⑤ 延时 5ms; ⑥ 写指令 38H(不检测忙信号); ⑦ (以后每次写指令、读 /写数据操作之前均需要检测忙信号) ⑧ 写指令 38H:显示模式设置; ⑨ 写指令 08H:显示关闭; ⑩ 写指令 01H:显示清屏; ⑪ 写指令 06H:显示光标移动位置; ⑫ 写指令 0CH:显示开及光标设置。 主要 程序如下: delay_50us(300)。 //延时 15ms write_(0x38)。 //写指令 0x38 delay_50us(100)。 //延时 5ms write_(0x38)。 //写指令 0x38 delay_50us(100)。 //延时 5ms write_(0x38)。 //写指令 0x38 write_(0x38)。 //写指令 0x38 write_(0x08)。 //写指令 0x08,显示关闭 write_(0x01)。 //写指令 0x01,显示清屏 write_(0x06)。 //写指令 0x06,显示光标移动设置 write_(0x0c)。 //写指令 0x0c,显示开及光标设置 ( 2) LCD1602 写指令程序设计 第 18 页 共 40 页 写操作时序图如图 所示。 图 LCD1602 写操作时序图 LCD1602 的写指令基本操作时序为: RS=L,RW=L,D0~D7=指令码, E=高脉冲。 根据这个格式可以进行对 LCD1602 写指令 进行编程。 写 void write_(uchar )写指令函数的时候要注意使能端拉高或拉低都要进行延时。 ( 3) LCD1602 写数据程序设计 LCD1602 的写数据基本操作时序为: RS=H,RW=L,D0~D7=数据, E=高脉冲。 根据这个格式可以进行对 LCD1602 写 数据 进行编程。 ( 4) LCD1602 显示函数程序设计 程序如下: void disdignit(uchar *y) { uchar i。 write_(y)。 //LCD1602 显示行 for(i=0。 i6。 i++) { write_data(tab_temp[i])。 } write_data(0x30+RxBuf[2])。 //0x30 的 10进制表示为 48,即 ASCII 码字符 0 write_data(0x30+RxBuf[1])。 write_data(39。 .39。 )。 write_data(0x30+RxBuf[0])。 write_data(0xDF)。 第 19 页 共 40 页 write_data(39。 C39。 )。 } 在这里需要补充一点,在程序的开头已经定义了 tab_temp[6]=” Temp: ” ,在显示数字 温度前注明一下看起来比较严谨。 显示函数里的 RxBuf[2]、 RxBuf[1]、 RxBuf[0]分别代表接收到的温度的十位、个位、小数位。 加上 0x30 可以让它转换成 ASCII 码。 函数还用了指针 *y,是因为本设计为多点温度采集,为了方便温度显示,让第一个温度显示在液晶第一行,第二个温度显示在液晶第二行,因此加入个指针,在主函数里分别赋值 0x80( LCD1602 第一行第一个位置)和 0x80+0x40( LCD1602 第二行第一个位置)。 第 20 页 共 40 页 4 调试及结果 本系统实现的是无线多点温度采集 ,在两个地方检测温度,然后 发射到接收端。 经过实践得出本系统可以接收到 100 米之内的数据,并且可以正常显示和正常报警。 温度采集板如图。 板上的发光二极管是电源指示灯,电源接通后即可正常工作。 图 温度采集板 温度接收显示板如图 所示。 1602 液晶第一行 和第二行 分别 显示的 是第二块和第二块采集板发射过来的温度。 从液晶显示来看, 温度显示清晰并且稳定。 本系统还设置了一个温度报警上限温度 32 摄氏度,当温度达到警报温度时,报警系统开始工作:蜂鸣器会一直叫,并且报警指示灯也跟着亮;当温度下降到警报温度时,报警系统停止工作。 现 象如图 所示 ,在 1602 液晶上方的 LED 即报警指示灯。 由此可见,报警系统可以正常工作。 图 温度接收板 第 21 页 共 40 页 图 报警系统演示 第 22 页 共 40 页 参考文献 [1] 余永权 : 单片机原理及应用 , 电子工业出版社 , [2] 诸 邦田 : 电子电路实用抗干扰技术 , 人民邮电出版社, [3] 曲喜 新: 电子元件材料手册 .电子工业出版社 , [4] 黄贤武 、郑筱霞、曲 波、刘文杰: 传感器实际应用电路设计 , 电子科技大学出版社, [5] 刘君华 : 智能传感 器系统 , 西安电子科技大学出版社, [6] 汪 吉鹏 、 马云峰 : 微机原理与接口技术 , 高等教育出版社 , [7] 贾 振国 : DS1820 及高精度温度测量的实现 , 电子技术应用, [8] 伟 正 : 单线数字温度传感器的原理与应用 , 电子技术应用, [9] 周月霞 、 孙传友 : DS18B20 硬件连接及软件编程 , 传感器世界, [10] 单线数字温度传感器资料 , 武汉力源电子有限公司, [11] 王琳,商周,王学伟 .数据采集的发展及应用 .电测与仪表, 2020, [12] V. Schmidt, Control, data acquisition, and remote participation for fusion research, Fusion Eng. Des. 81 (2020) 1702– 1712. [13] , FiresignalData acquisition and control system and Design 82(2020)13591364. 第 23 页 共 40 页 附 录 第 24 页 共 40 页 ( 1) 接收 部分程序如下: include include define LCDIO P0 //液晶数据端口 void disdignit1()。 void disdignit2()。 typedef unsigned char uchar。 typedef unsigned char uint。 uchar code tab_temp1[6]=Temp1:。 uchar code tab_temp2[6]=Temp2:。 //****************************************端口定义 sbit LCD1602_RS = P3^5。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。