结束写 SPI 操作,在这种情况下没有写完的高字节保持原有内容不变。例如:RX_ADDR_P0寄存器的最低字节可以通过写一个字节给寄存器RX_ADDR_P0 来改变。在CSN 状态由高变低后可以通过MISO 来读取状态寄存器的内容。 中断:
NRF24L01 的中断引脚(IRQ)为低电平触发,当状态寄存器中TX_DS、RX_DR 或MAX_RT 为高时
触发中断。当 MCU 给中断源写‘1’时,中断引脚被禁止。可屏蔽中断可以被IRQ中断屏蔽。通过设置可屏蔽中断位为高,则中断响应被禁止。默认状态下所有的中断源是被禁止的。 3.4 本章小结
本章介绍了modbus通讯协议、RS485接口、NRF24L01通讯模块的具体内容,为硬件、软件设计铺平道路。
9
第4章 通讯系统实现的硬件设计
4.1硬件系统结构
该硬件系统主要包括电源模块、单片机最小系统模块、按键、温度采集、数码管和液晶显示模块、RS232转RS485接口模块、NRF24L01无线通讯模块,结构方框图如图所示,
4.2 单片机最小系统模块
主控MCU如图4-1所示,A、B都采用STC89C52为主控MCU,晶振频率为12.0M,C3(10uf),R1(10K)组成上电复位电路。
图4-1 最小系统
4.3温度采集、独立按键、液晶和数码管显示模块
⑴液晶显示模块如图4-2所示,采用字符型液晶1602,其具有操作简单显示字符多特点,并接R0(104)进行对比度调节,P0为数据接口,P2.0,P2.1,P3.2为控制线。
10
图4-2液晶 图4-3数码管 图4-4按键
⑵数码管显示单元 如图4-3所示,数码管采用四位一体的共阴数码管,由于单片机的I/O输出电流较小,故采用三极管进行放大驱动,当位选为高时三极管饱和导通,对应位的数码管选中。
⑶独立按键单元
如图4-4,独立按键用来对系统工作控制,例如调时间,发命令等作用。
⑷温度采集单元
温度采集单元采用达拉斯公司生产的数字温度传感器DS18B20进行数据采集,其采用单总线数据传输,具有硬件简单的优势,而且数据采集周期短,精度高,量程大,可以达到室温计的要求,其数据总线与P2.6相接。 4.4无线收发单元模块
如图4-5所示,在设计NRF24L01无线通讯模块中要注意的是该芯片低工作电压在(1.9~3.6V),而普通5v电压会降低芯片寿命甚至将其烧坏,所以需要对其电平转换,在本设计中采用LM1117-3.3V三端稳压管,该芯片输出电压稳定在NRF24L01的工作电压范围内、输出电流800mA满足无线通讯芯片供应电源。
图4-5 NRF24L01
4.5 RS-232转RS-485通讯接口模块
如图4-6所示:RS232-485转换器主要包括了电源、232电平转换、485电路三部分。本电路的232电平转换电路采用MAX232集成电路,485电路采用了MAX485集成电路。为了使用方便,电源部分设计成无源方式,整个电路的供电直接从PC机的RS232
11
接口中的DTR(4脚)和RTS(7脚)窃取。PC串口每根线可以提供大约9mA的电流,因此两根线提供的电流足够供给这个电路使用了。经实验,本电路只使用其中一条线也能够正常工作。使用本电路需注意PC程序必须使串口的DTR和RTS输出高电平,经过D3稳压后得到VCC,经过实际测试,VCC电压大约在4.7V左右。因此,电路中要说D3起的作用是稳压还不如说是限压功能。
MAX485是通过两个引脚RE(2脚)和DE(3脚)来控制数据的输入和输出。当RE为低电平时,MAX485数据输入有效;当DE为高电平时,MAX485数据输出有效。在半双工使用中,通常可以将这两个脚直接相连,然后由PC或者单片机输出的高低电平就可以让MAX485在接收和发送状态之间转换了。由于本电路DTR和RTS都用于了电路供电,因此使用TX线和MAX232的另外一个通道及Q1来控制MAX485的状态切换。平时MAX232的9脚输出高电平,经Q1倒相后,使MAX485的RE和DE为低电平而处于数据接收状态。当PC机发送数据时,MAX232的9脚输出低电平,经Q1倒相后,使MAX485的RE和DE为高电平而处于数据发送状态。
图4-6 RS232-485
4.6 本章小结
本章主要包括电源模块、单片机最小系统模块、按键、温度采集、数码管和液晶显示模块、RS232转RS485接口模块、NRF24L01无线通讯模块的硬件设计,介绍了设计的基本原理和一些注意事项。
12
第5章 通讯系统实现的软件设计
本设计要实现无线通讯系统对温度的实时采集与显示功能,除硬件外,还需要软件来控制。本章主要介绍报文处理的软件实现,并简要介绍整体A机时钟和B机温度信号无线交换的软件流程图。
5.1 基于MODBUS协议处理报文的软件设计:
5.1.1主机发送数据包和从机响应数据包具体格式:
B机作为从机在本次设计中需要读出从机的温度、从机的小时和分钟信号所以采用读模拟寄存器(即03)这个功能。
⑴计算机发送的数据包:[设备地址] [命令号03] [起始寄存器地址低8位] [高8位] [读取的寄存器数低8位] [高8位] [CRC校验的低8位] [CRC校验的高8位] 即:[01][03][01][00][01][00][CRC低][CRC高] 注释:读从机温度
[01][03][02][00][01][00][CRC低][CRC高] 注释:读从机时钟的小时 [01][03][03][00][01][00][CRC低][CRC高] 注释:读从机时钟的分钟 具体意义如下:
1.设备地址:本次设计中设备地址为0x01。 2.命令号:读模拟量的命令号固定为03。
3.起始地址低8位、高8位:表示想读取的模拟量的逻辑地址,本次设计中的温度逻辑地址为0x01;小时的逻辑地址为0x02;分钟的逻辑地址为0x03。 4.寄存器数低8位、高8位:表示从起始地址开始读多少个模拟量(即逻辑地址长度)。本次设计中每个逻辑地址只需读出一个模拟量。(在返回的信息中一个模拟量需要返回两个字节)。
5.最后16位为CRC校验。 ⑵从机响应回主机的数据包:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8位] [CRC校验的高8位]
即 :[01][03][02][00][AC][CRC低][CRC高] 注释:温度值回应给主机(17.2℃)
[01][03][02][00][0B][CRC低][CRC高] 注释:小时值回应给主机(11小时) [01][03][02][00][24][CRC低][CRC高] 注释:分钟值回应给主机(36分钟) 具体意义如下:
1.设备地址和命令号和上面的相同。
2.返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。设计中返回了1个模拟量的数据,因为一个模拟量需要2个字节所以共2个字节。
3.数据1...n:其中[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。设计中只返回了[数据1][数据2],本次设计中若第一个返回的值是[AC]转化为十进制为172即17.2°C ;第二个值[0B]表示11小时;第三个值[24]表示36分钟。 4.CRC校验同上。
5.1.2主机发送报文和从机响应报文软件具体实现 ⑴提高通讯稳定性的程序设计:
Modbus通信协议设计中为了预防干扰,提高系统稳定性,防止系统程序跑飞而造成不可预测的错误(虽然概率比较低,一旦出现将会出现很大的问题),所以有必要经常重新置485为接受状态并将接受地址偏移器(即接收到的字节个数)清零。在此次程序设计中设置了一个1ms定时中断,在中断程序中定义一个1ms标志位,在定时
13