编号:毕业设计(论文)说明书题目:基于单片机船体锅炉多点温度采集无线控制系统设计题目类型:理论研究实验研究工程设 计工程技术研究软件开发年月日摘要船体锅炉要想正常运行离不开温度这一重要参数,锅炉传热过程和设备效率都会受到温度的影响。因此 本课题研究基于单片机船体锅炉多点温度采集无线控制系统设计,对于确保锅炉的经济安全使用,增强锅炉的蒸汽质产量,让锅炉工人更方便快捷的 对锅炉温度进行检测有一定的意义。本设计采用STC89C52RC单片机芯片为主控芯片,DS18B20和K型热电偶作为温度传感器读取温 度信号,LCD1602作为显示屏用于显示温度数据,NRF24L01作为无线收发模块,主要由温度采集模块、温度收集模块和无线收发模块 三大部分构成。温度采集模块由四块温度采集板组成,可采集四路不同地方的温度,每块温度采集板可测该路的一点到四点温度并数据传输给无线收 发模块NRF24L01,同时还要把温度数据实时显示在显示屏上,最后无线收发模块再将数据发送到温度收集模块。温度收集模块接收四路发送 过来的多点温度数据,并把温度数据显示在显示屏上。本系统经过Keil软件编辑程序,通过仿真测试和硬件调试,证明本设计方案在理论和实践 上都能得到实现。关键词:船体锅炉;温度采集;STC89C52RC单片机;DS18B20;K型热电偶;MAX6675;NRF24L0 1AbstractIfthemarineboilerisindispensablefornormaloperati on,theimportantparameteroftemperature,theboilerheattrans ferprocessandequipmentefficiencywillbeaffectedbytemperat ure.Therefore,theresearchofthissubjectisbasedonthedesi gnofamulti-pointtemperatureacquisitionwirelesssystemform arineboilers,whichisofcertainsignificanceforensuringthe economicandsafeuseofboilers,enhancingtheboiler''ssteamqu alityoutput,andallowingboilerworkerstomoreeasilyandquic klydetectboilertemperatures.ThisdesignusestheSTC89C52RCmi crocomputerchipasthemaincontrolchip,DS18B20andK-typethe rmocouplesastemperaturesensorstoreadthetemperaturenumber, LCD1602asthedisplayscreenfordisplayingtemperaturedata,a ndNRF24L01asthewirelesstransceivermodule,whichismainlyc omposedoftemperatureacquisitionmoduleandtemperaturecollect ionmoduleAndthewirelesstransceivermoduleiscomposedofthr eeparts.Thetemperatureacquisitionmoduleiscomposedoffourt emperatureacquisitionboards,whichcancollectthetemperature offourdifferentplaces.Eachtemperatureacquisitionboardcan measurethetemperatureofonepointtofourpointsofthechanne landtransmitthedatatothewirelesstransceivermoduleNRF24L 01.Itisdisplayedonthedisplayscreeninrealtime,andfinal lythewirelesstransceivermodulesendsthedatatothetemperat urecollectionmodule.Temperaturecollectionmodulereceivesmult i-pointtemperaturedatasentfromfourchannels,Anddisplaythe temperaturedataonthedisplay.ThissystemhasbeeneditedbyKe ilsoftware,throughsimulationtestingandhardwaredebugging,w hichprovesthatthedesigncanberealizedintheoryandpractic e.Keywords:MarineBoiler;temperaturecollection;STC89C52microc ontroller;DS18B20;Ktypethermocouple;MAX6675;NRF24l01目录1绪论 11.1课题研究背景及意义11.2设计内容与要求12系统总体方案设计22.1船体锅炉多点温度采集无线控制系统方案的确定22 .2方案选择与论证22.2.1单片机芯片的选择22.2.2温度传感器的选择32.2.3显示部分的选择32.2.4无线收发模块的选 择42.2.5热电偶模数转换芯片的选择42.2.6按键控制部分52.2.7电源部分53船体锅炉多点温度采集无线控制系统硬件设计6 3.1无线收发模块电路设计63.1.1NRF24L01引脚介绍63.1.2NRF24L01与温度采集和温度收集模块的连接73.2 温度采集板电路设计83.2.1单片机最小系统电路83.2.2温度传感器DS18B20与单片机连接83.2.3K型热电偶+MAX6 675与单片机连接93.2.4LCD1602与单片机连接103.2.5电源电路设计113.2.6温度采集模块整体电路原理图123. 3温度收集模块电路设计123.3.1温度收集模块整体电路原理图124船体锅炉多点温度采集无线控制系统软件设计134.1软件 编写工具134.2系统整体软件框图134.3温度采集板软件设计144.3.1温度采集板主程序144.3.2DS18B20软件设 计144.3.3MAX6675软件设计174.3.4LCD1602软件设计184.4无线收发模块软件设计204.5温度收集模块软件 设计224.5.1温度收集模块主程序224.5.2KEY()按键函数234.5.3rx()温度显示函数235系统调试245.1 温度采集系统软件测试245.2硬件电路测试285.3NRF24L01无线通讯测试285.4实际温度采集结果306结论32 参考文献33附录34绪论课题研究背景及意义一艘船舶想要正常的在海上航行,它离不开锅炉这一重要的能量转换设备的辅助。在船舶上锅 炉用来给水加热、汽化和水汽分离,给船舶上的工作人员提供日常所需的生活用水,同时锅炉也可以提供热能或机械能供给船舶其他机械的正常运转 。在锅炉中温度太高和太低都会对锅炉的使用造成影响,甚至会影响到船舶的安全行驶和威胁到工作人员的生命健康。锅炉上一般有多个需要测温的 地方:(1)给水系统:温度一般在50~60℃左右,该温度能看出抽气系统是否正常和回热加热器是否适当。(2)主蒸汽系统:减温器出口的 温度一般在400℃左右,监测该点温度是为了控制高温段过热器管壁的温度范围和调节过热器的出口汽温;过热器的出口温度一般在450~55 0℃左右,该点的汽温要确保在其规定的范围内。(3)烟风系统:排烟温度一般在125~130℃左右,可以确保锅炉运行时的安全性和经济性 ;空气预热器出口处的风温一般在300~400℃左右,其温度高低能反映空气预热器的运行效果;过热器低温段一般在650℃左右,烟气温度 能反映空气预热器的密封情况和运行效果,以及说明过热器的积灰程度,还有一次和二次风的温度;过热器高温段的温度一般在1000℃左右,监 视它可说明炉膛燃烧得是否充分的燃烧工况。科技的日益进步,伴随着大量的集成电子技术随处可见,单片机的种类不断地增多,功能也不断地加 强,在自动化和监控领域的应用也不断增加。如今的单片机不仅功能强大,而且体积越来越小,开发周期也越来越短,各行各业在温度采集系统这一 领域运用最多的也是单片机,已经融入到了我们的日常生活中。鉴于温度在船体锅炉运行中有着重要的意义,以及单片机技术的不断发展,根据以上 这些思想设计一种基于单片机的船体锅炉多点温度采集无线系统,这一设计能采集船上多个锅炉中的温度,且温度数据实时显示在屏幕上并能无线传 输,方便工作人员随时进行监测和分析。1.2设计内容与要求本设计由温度采集模块、温度收集模块和无线收发模块三大部分构成。温度采集模 块能采集到四路温度信号,每路能读取四个点的温度值,并把温度数值实时显示在显示屏上,无线收发模块会将温度采集模块的四路各点的温度数据 传输给温度收集模块,并通过四个按键选择需要实时显示的温度数据。设计要求如下:温度采集范围-30℃~1000℃,温度数据允许误差%1 。采集四路温度数据,每路需采集四个点的温度。在显示屏中能显示实时温度数据。温度收集模块能通过无线模块接收到温度采集模块的温度信息。 系统总体方案设计2.1船体锅炉多点温度采集无线控制系统方案的确定船体锅炉多点温度采集无线控制系统由温度采集模块、温度收集模块和 无线收发模块三个部分组成:温度采集模块主要负责多路温度采集,通过无线收发模块把温度数据发送出去。温度收集模块通过无线收发模块接收发 送过来的各路温度数据。温度采集模块需要采集四路温度数据,由四块温度采集板构成,每块温度采集板由、温度传感器和显示屏以及无线收发模块 组成,温度传感器将采集到的温度信号转化为数字信号发送给单片机处理并显示温度数据在显示屏上,单片机再控制无线收发模块发送温度数据出去 。温度收集模块由单片机、显示屏和无线收发模块以及四个独立键盘组成,温度收集模块中的无线收发模块会接收到温度采集模块中的无线收发模块 发送过来的温度数据,并通过键盘KEY1、KEY2、KEY3、KEY4控制需要显示的四路温度数据到显示屏上。系统整体结构框图如图2- 1所示。图2-1系统整体结构框图2.2方案选择与论证在进行本设计元器件的选择时,不仅要满足其所要求应实现的功能,还要最大程度 的降低设计的成本,这样在市场上才能获得更大的竞争力。2.2.1单片机芯片的选择方案一:采用PIC16C74单片机芯片PIC16C7 4是Microchip公司生产的一种单片机芯片,它具有较强抵抗干扰的能力和很好的保存代码性能,同时有较强的的模拟接口,靠得住性能强 ,最突出的是相对于其他单片机芯片它的功耗低且精简指令集这些特点,可用在各类型电子产品中。具有以下标准功能:(1)I/O口数量充足有 32个通用I/O口;(2)4KB的ROM和192字节的RAN;(3)2个CCP模块;(4)3个8位定时器和11个中断源;(5)无需 外加模数转换,自带模数转换口。方案二:采用STC89C52RC单片机芯片STC89C52RC是STC公司生产的一种单片机芯片。它具 有较强抵抗干扰的能力,能耗低,功能性强等特点,最突出的是,系统Flash和8位CPU,让其在单芯片上大大的提高了嵌入式单片机的灵活 性。具有以下标准功能:(1)有32个通用I/O口;(2)512字节RAM;(3)6和12机器/时钟周期选择;(4)可利用转串口把程 序下载至单片机;(5)4个外部中断,3个16位定时器/计数器。综上所述,最终选择方案二。两种单片机芯片都能实现本设计所需功能,但S TC89C52RC单片机相比于PIC16C74单片机便宜很多,大大的节省了本设计的成本。2.2.2温度传感器的选择方案一:PT10 0热电阻PT100是铂热电阻,随温度变化阻值也会变化,列如当PT100为0℃时它对应的阻值就是100Ω,当它为100℃时它会升到1 38.5Ω,温度和阻值成正比且随温度值增加而增加。PT100的温度读取范围在-200~800℃,在工业测温中被广泛应用的一种测温检 测仪器,测量精度高,但成本较高。方案二:K型热电偶K型热电偶通常由两种不同的金属丝组成,测温范围比PT100更广,一般可测-50~ 1600℃,甚至可更换不同的金属材料,比如钨-铼温度最高可测达2800℃。K型热电偶的测温灵敏度很高,温度稍有变化热电偶的读温状态 也会跟随变化,而且抗氧化性能强特别适合锅炉中氧化性强的地方测温。方案三:DS18B20传感器DS18B20数字温度传感器,其可以直 接给出数字数据不需要外加模数转化,温度读取的范围较小,温度可读-55~125℃,精度高到0.005℃。DS18B20体积小有多种形 式封装,单总线模式只需一个I/O接线控制,使用起来方便,常常用在锅炉水测温中。综上所述,在温度传感器的选择中选择DS180B20和 K型热电偶来共同测温。在船体锅炉中进行测温,测温范围在0~1000℃左右,而PT100热电阻达不到1000℃,不符合本设计的测温要 求。锅炉中有多个测温点,可以选择用DS18B20来测量在锅炉中的低温区的温度(100摄氏度左右),K型热电偶可以用来测量高温区的温 度,使用两个温度传感器能更好的节省设计成本。2.2.3显示部分的选择方案一:使用LED动态数码管显示LED动态数码管想要能够更好的 显示要给它一个外部驱动来加大数码管的电流输出,电路简单,但需特定的编程来完成动态刷新。方案二:LCD1602液晶显示LCD1602 一次最多可以设置两行内容,每行最多可以设置16个ASCII字符。在单片机系统中应用中其显示画面清晰,程序编写简单,相对其他显示器而 言,功耗较低,而且成本低因此受众很多。方案三:LCD12864液晶显示LCD12864液晶显示屏,分辨率高,显示内容丰富且面积大, 可编程中文和ASCII字符显示,适合需要显示中文字符和显示内容较多的系统。综上所述,选择方案二LCD1602比较合适。在本设计中需 要进行多路测温LED动态数码管不能同时显示多路温度值,而LCD12864成本较高且在四路温度的采集中不需要显示中文字符,所以LCD 1602完全够用并且大大降低了设计的成本。2.2.4无线收发模块的选择表2-1无线收发模块比较功能参数方案一:NRF905方案 二:NRF24L01频段433MHz、868MHz、915MHz2.4GHz发射功率+10dBm0dBm接收灵敏度-100dBm- 85dBm通讯频率512个125个传输模式SchockBurstEnhancedSchockBurst,6个数据通道传输速率50 kbps1Mbps和2Mbps通信方式SPISPI综上表2-1所示,这两种无线收发模块在本设计中都能实现功能,选择NRF24L01 ,传输速率快,有多个传输数据通道而且比NR905便宜能更节省设计成本。2.2.5热电偶模数转换芯片的选择方案一:AD595模数转换 芯片AD595是完整的单芯片仪表放大器和热电偶冷结补偿器,它具有高阻抗差分输入和低阻抗电压输出10mV/℃,±5V~±15V工作 电压,自带热电偶故障报警设置,激光晶圆调整测温精度达1℃等特点。方案二:MAX6675模数转换芯片MAX6675自带热电偶开路检测 ,高阻抗差动输入,冷端补偿,温度值0℃~+1024℃SPI方式输出,+5V工作电压,带有线性矫正,12位的温度数字存储精度达0.2 5℃等特点的模数转换芯片,可以说是为K型热电偶量身定制的芯片。综上所述,选择MAX6675作为K型热电偶的模数转换芯片,不仅能实现 本设计所需的功能,相比于AD595精度更高还更便宜,大大节省了成本和提高了数据的精确度。2.2.6按键控制部分方案一:采用独立键盘 编程简单,每个按键都是相互独立的,适用于按键控制少的系统,一个键盘占用一个I/O口。方案二:采用矩阵键盘编程复杂,在需要按键控制较 多的系统相对于独立键盘所占用的I/O口数少。综上所述,最终决定采用方案一。本设计温度采集模块只测四路温度,温度接收模块只需设置四个 按键来控制四路温的显示即可。2.2.7电源部分方案一:利用LM2596直流可调电流LM2596,有固定的3.3V、5V、12V的输 出电压,也有可调节型小于37V的输出电压,能够满足单片机输出电压较高的需求,在需要电压超过5V的电路中比较常用。方案二:AMS11 17稳压器AMS1117,有固定的1.2V、2.5V、3.3V和5V等输出电压,能够满足单片机输出电压较低的需求,一般在系统中供电 电压为5V比较常用。综上所述,选择AMS1117稳压器。在本设计中需要提供两种不同电压的电源,一种供给单片机系统正常工作的+5V电 源,另一种为供给NRF24L01无线收发模块工作的+3.3V电源,AMS1117和LM2596都满足本设计的要求,但AMS1117 成本更低。船体锅炉多点温度采集无线控制系统硬件设计3.1无线收发模块电路设计3.1.1NRF24L01引脚介绍(1)如图3-1 为NRF24L01引脚图图3-1NRF24L01引脚图(2)如表3-1为NRF24L01引脚功能表3-1NRF24L01引脚功 能引脚名称引脚功能描述1CE数字输入RX或TX模式2CSN数字输入SPI片选信号3SCK数字输入SPI时钟4MOSI数字输入从SP I数据输入引脚5MISO数字输入从SPI数据输出引脚6IRQ数字输入可屏蔽中断脚7VDD电源电源(+3V)8VSS电源接地9XC1 模拟输入晶体振荡1脚10XC2模拟输出晶体振荡2脚11VDD-PA电源输出+1.8V供电给RF的功率放大器12ANT1天线天线接口 113ANT2天线天线接口214VSS电源接地15VDD电源电源(+3V)16IREP模拟输入参考电流17VSS电源接地18VDD 电源电源(+3V)19DVDD电源输出去耦电路正极端20VSS电源接地(3)如图3-2为互联网上买的NRF24L01模块图3-2 NRF24L01模块3.1.2NRF24L01在温度采集模块和温度收集模块的连接在温度采集模块中图如图3-3所示,NRF24L0 1的1引脚接地,2引脚接电源3.3V引脚,3~8号引脚分别接STC89C52RC单片机上的P3.2~P3.7引脚。图3-3NRF 24L01在温度采集模块的连接在温度收集模块如图3-4所示,NRF24L01的1引脚接地,2引脚接电源3.3V引脚,3~8号引脚分 别接STC89C52RC单片机上的P1.0~P1.5引脚。图3-4NRF24L01在温度收集模块的连接3.2温度采集板电路设 计3.2.1单片机最小系统电路单片机最小系统电路由,STC89C52RC单片机、晶振电路连接、和复位电路连接。(1)晶振电路:一个 系统采用同一个晶振源以保证整个系统的元件在同一个频率下工作,它由一块12MHz的无源晶振并入两个30pf的电容组成。晶振震荡会产生 谐波,谐波会对系统的稳态运行造成一定的干扰,为消除这种谐波带来的不稳定性,在晶体振荡器两端并入两个30pf的电容来消除震荡谐波的干 扰。(2)复位电路:在系统中有上电复位和按键复位这两种复位状态,来对单片机进行重启。STC89C52RC由RST引脚控制复位,RS T引脚为高电平状态且持续周期为两个机器周期(2us左右)以上时才会复位,在RST上连接上阻容有源电路可构成上电复位,在上电复位的电 容处接入一个复位开关按键就构成了按键复位,如图3-5所示。图3-5STC89C52RC单片机最小系统电路3.2.2温度传感器DS 18B20与单片机连接(1)DS18B20引脚功能如图3-6所示左为直插式封装右为贴片式封装,引脚功能如表3-2所示。表3-2 DS18B20引脚功能引脚DQNC(贴片)GNDVDD功能数字信号输入/输出端空引脚电源地外接电源供电图3-6DS18B 20封装(2)DS18B20与单片机接口电路本设计采用两个DS18B20温度传感器来测量锅炉中的两点低温区温度,DQ分别与STC8 9C52RC单片的P1.0口和P1.1口连接。虽然一个I/O口可与多个DS18B20的DQ连接,在编程过程中只要读取每一个DS18 B20的序列号即可,但如果某一个DS18B20损坏了,直接更换元件后还得重新读取元件序列号,这无形之中增加了代码大小和难度,如果在 单片机I/O口不紧张的情况,一个I/O口接一个DS18B20,这样在元件损坏需要更换时就不需要在进行编程操作,直接更换元件即可。如 图3-7所示。图3-7DS18B20与单片机接口电路3.2.3K型热电偶+MAX6675与单片机连接MAX6675引脚功能如表 格3-3所示。表3-3MAX6675引脚功能引脚名称功能1GND接地端2T-K型热电偶负极3T+K型热电偶正极4VCC正电源 端5SCK串行时钟输入6CSCS为低时启动串行接口7SO串行数据输出8N.C.空引脚(2)K型热电偶、MAX6675与单片机的接口 电路如图3-8所示是在互联网上所购买的K型热电偶+MAX6675模块,K型热电偶的红端和蓝端,分别与MAX6675的T+和T-引脚 连接。MAX6675的1引脚和4引脚分别接电源电路+5V和电源地,本设计每块温度采集板用到两个K型热电偶+MAX6675模块来测量 锅炉中的两点温度,两个MAX6675的SO、CS、SCK分别与单片机的P1.2~P1.4和P1.5~P1.7相连,可在MAX667 5电源引脚附近接入一只0.1uF的旁路电容来稳定电源电压。由于所买的元件是已经组合接好了,所以在画整体电路的时候只需要提供P5和P 7的这5引脚接口即可,如图3-9所示。图3-8K型热电偶+MAX6675模块图3-9K型热电偶+MAX6675与单片机的 接口电路3.2.4LCD1602与单片机连接表3-4为LCD1602引脚功能介绍表3-4LCD1602引脚功能介绍引脚名称功能 1VSS电源接地。2VDD电源正极。3V0液晶显示偏压,可连接一个10K电位器来进行对比度调整。4RS寄存器选择,高电平为数据寄存 器,低电平为指令寄存器。5RW读/写选择,高电平为读操作,低电平为写操作。6E使能信号,正跳变时,执行命令。7~14D0~D7双向 数据线。15A背光源正极。16K背光源负极。LCD1602与单片机接口电路如图3-10所示,LCD1602的1和16引脚接电源地, 2和15引脚接电源+5V,3引脚接10K电位器,1K电阻可防止电压过高烧坏显示屏,4~6号引脚接单片机P2.5~P2.7引脚,7~ 14引脚接单片机的P0.0~P0.7引脚,同时P0.0~P0.7要加上拉电阻。图3-10LCD1602与单片机接口电路3.2.5电 源电路设计本设计温度采集模块和温度收集模块采用同一种供电方式,本系统采用USB5V电压供电和电池接口5V电压供电,可直接连接5V 的电压电源充当电路板的电源。USB接口和电池接口与主电路之间,添加了一个六角开关来控制板子电路的通断,开关自带自锁功能,当我们把开 关按下去,电路就会接通,电路板可以通电。关闭也很简单,只需把开关按下去,板子的电路就会被切断。并且在六角开关通断处安装一个LED指 示灯,上电灯亮。由于NRF24L01需要用到3.3V的供电电压,在电源电路中还需接一个AMS1117稳压器来分出3.3V的电压给无 线模块。为了稳定AMS1117的电压,在+5V输入电压和接地处并上30uF的陶瓷电容和100uF的电解电容,同样+3.3V输出电压 也要并上30uF的陶瓷电容和100uF的电解电容。具体接线图如图3-11原理图所示。图3-11电源电路3.2.6温度采集模块整体 电路原理图图3-12温度采集模块整体电路原理图3.3温度收集模块电路设计3.3.1温度收集模块整体电路原理图由于温度收集模块 需要接收来自温度发送模块的温度信号,所以只需在温度采集板的基础上去掉温度传感器,增加四个可复位按键即可。单片机中的无线模块与温度采 集板的不一致,同时还增加了四个按键连接,整体电路原理图如图3-13所示。其中无线收发模块的3~8引脚分别接单片机的P1.0~P1. 5引脚。温度收集模块有四个按键控制KEY1~KEY4,分别接单片机的P2.3~P2.0引脚。图3-13温度收集模块整体电路原理图4 船体锅炉多点温度采集无线控制系统软件设计4.1软件编写工具C语言编程软件为KeiluVision4,由于本设计需要对DS18 B20、MAX6675、NRF24L01和LCD1602进行编译代码数量比较大,只放在一个.C文件里进行编写在调试的过程中很难找到 问题所在,为了方便进行代码的调试和管理,本设计生成多个.C文件,把每个部分都放在自己相应的.C文件中,把需要用到的函数放在各自的. h文件中,最后在把主函数需要用到的函数在头文件中用包含.h文件的方式进行调用即可完成编译,生成hex文件下载到单片机开始进行调试。 4.2系统整体程序框图在温度采集模块中,有四块温度采集板,每块温度采集板的工作模式都是一样的,先对LCD1602和NRF24L0 1进行初始化,然后进入死循环:温度传感器采集温度并显示到LC1602上,无线收发模块NRF24L01把四块温度采集板的温度数据先写 入发送缓冲区,在把数据打包发送出去。温度收集模块一开始也是先对LCD1602和NRF24L01进行初始化,然后通过按键选择要接收哪 号温度采集板发送过来的数据,最后LCD1602写入接收缓冲区的温度数据,如程序框图图4-1所示。图4-1系统整体程序框图4.3 温度采集板软件设计4.3.1温度采集板主程序温度采集板主函数中先调用了LCD1602初始化函数InitLcd1602(),然后在对 NRF24L01进行初始化函数init_io()调用,接着进入死循环。死循环中有两个DS18B20和两个K型热电偶的温度读取并显示 在LCD1602的函数(ds1820disp1()、ds1820disp2()、tempdisp1()、tempdisp2(),接 着是NRF24L01发送缓冲区写入温度传感器采集到的温度数据tx()函数,然后NRF24L01转换为发送模式发送数据函数TX_mo de(tx_buf),最是NRF24L01的发送检测函数Check_ACK(),发送失败则进行重发。死循环里一直进行着温度数据的读 取、显示和发送,所以就能做到温度数据的实时显示更新。4.3.2DS18B20软件设计DS18B20时序DS18B20只需DQ引脚接 单片机的一个I/O口即可,所以在程序的编写过程中对时序的要求十分严格,如图4-2所示。DS18B20初始化:初始化过程中单片机要先 把DQ从高电平拉低到低电平,在这里DQ低电平保持500us左右即可,然后单片机会被上拉电阻上拉为高电平持续60us~120us,同 时DS18B20给高电平持续15us-60us左右后会主动拉低引脚变为低电平持续60us-240us左右后,DQ会被上拉电阻拉高。 DS18B20读数据:单片机要先从高电平拉低到低电平至少保持1us,然后释放总线在15us内读取一个字节的数据,同时通过位运算把8 位数据返回到函数中。DS18B20写数据:写“0”时,单片机直接从高电平拉低到低电平保持60us-120us之间。单片机在拉低1 5us之后,DS18B20会从15us-60us之间读取,最早是在15us时刻读取,典型值在30us时刻,60us后就会读取完毕。 写“1”时,单片机从高电平到低电平,接着1us后就升回高电平,写“1”和写“0”一样,也需要60us才读取完成。图4-2DS18B 20时序图(2)DS18B20温度转换程序本设计一个DS18B20的DQ引脚只接一个I/O口,不用读序列号操作,在进行温度读取时只 需要进行以上程序程序流程即可。read_temp1()//读取温度值并转换函数{unsignedchara,b;ds1820r st1();//初始化ds1820wr1(0xcc);//跳过读序列号ds1820wr1(0x44);//启动温度转换ds1820 rst1();//初始化ds1820wr1(0xcc);//跳过读序列号ds1820wr1(0xbe);//读取温度a=ds18 20rd1();//温度数据低8位LSB赋给ab=ds1820rd1();//温度数据高8位MSB赋给bTemp1=b;Temp1 <<=8;Temp1=Temp1|a;//取温度数据if(Temp1>=0)//判断正负tflag1=0;else{Temp1=~ Temp1+1;tflag1=1;}TM1=Temp10.0625;//小数Temp1=TM110+0.5;//负温度数据re turn(Temp1);}接着就是对DS18B20进行温度转换,如表4-1所示,在DS18B20寄存器中一共2个字节16位温度数据 ,其中MSB为高字节,LSB为低字节。前五位为S用来判断温度的正负值,从表中看出当S全为0时温度为正数,当S全为1时温度为负数。低 11位全为2的次幂形式,用来表示温度数据。从表中可以看出从5-12位为温度的整数部分,最后四位为温度的小数部分,当温度二进制最低位 变化为1(十六进制为0X0001)时,温度变化0.0625℃,所以DS18B20读到的温度数据转换为实时温度只需要乘以0.0625 即可显示正数温度,例如+0.5摄氏度0000000000001000转为十进制就是8,8×0.0625=0.5。显示负温度从 表中可以看出,例如-0.5℃和+0.5℃,显示-0.5℃只要对-0.5℃取反后加1再乘以0.0625(111111111111 1000取反为0000000000000111转为十进制是7,再加1得8,8×0.0625=0.5),最后在LCD1602 显示中加个负号在前即可。表4-1DS18B20寄存器SSSSS262524MSB232221202-12-22-32-4LSB 表续(4-1)温度值二进制输出十六进制输出+125℃000001111101000007D0h+25.0625℃00000 001100100010191h+10.125℃000000001010001000A2h+0.5℃00000000 000010000008h0℃00000000000000000000h-0.5℃1111111111111000F FF8h-10.125℃1111111101011110FF5Eh-25.0625℃1111111001101111F F6Fh-55℃1111110010010000FC90h4.3.3MAX6675软件设计MAX6675读取温度和温度转换函 数unsignedintMAX6675Read1()//MAX6675串口模数转换读取温度函数{unsignedintV alue1;unsignedcharcount;CS1=1;//CS高电平SCK1=0;//SCK低电平CS1=0;// CS低电平开始读取Value1=0;//赋给温度值为0for(count=0;count<16;count++)//读取16 个输出位{//把值赋给SOValue1|=SO1;Value1=Value1<<1;SCK1=1;_nop_();S CK1=0;}CS1=1;_nop_();_nop_();//CS高电平读取完毕return(Value1);//返回温 度值}voidtempdisp1()//MAX6675温度转换函数{Temp3=MAX6675Read1();//把读到的 热电偶温度赋给TEMP3flagconnect1=MAX6675Read1()&0x04;//与0x04剩D2、D1、D0位 flagconnect1=flagconnect1>>2;//左移两位剩D2位,判断热电偶开路Temp3=Temp3<<1; //去掉D15位Temp3=Temp3>>4;//去掉低4位剩D14~D3位Temp3=Temp3/4-24;//得最终 温度值,-24为温度调试值}如图4-3和图4-4所示,单片机会把CS引脚从高电平拉低到低电平,并输出时钟信号到SCK引脚,在CS为 低电平的过程中,SCK会在16个时钟周期的下降沿读取16个输出位,并把读取值赋给SO输出。第一位D15为假信号,只读出0。位D14 -D3为温度数据,对应转换温度值得MSB到LSB,全为0就是0℃,全为1就是+1023.75℃(二进制为11111111111 1转为十进制就是4059,所以在软件编写时读到的12位温度要除以4,4059÷4=1023.75)。D2位是热电偶开路检测位,开路 则为1否则为0。D1位为0,用来提供器件的ID。D0位是三态。图4-3MAX6675通信时序SO输出假信号12位温度读取热电偶 开路器件ID状态BIT15141312111098765432100MSBLSB0三态图4-4SO输出数据格式4.3.4LCD 1602软件设计LCD1602指令控制在对LCD1602进行使用时要先对其进行初始化设置,如表4-2所示是LCD1602的指令控制 和各指令设置意义,本设计用到LCD1602初始化函数为:voidInitLcd1602()//LCD初始化显示{write_ com(0x38);write_com(0x0C);write_com(0x06);write_com(0x01); }表4-2LCD1602指令控制功能D7D6D5D4D3D2D1D0显示设置指令0011/01/01/000清屏指令0000 0001归零指令00000010输入方式指令0000011/01/0显示开关指令000011/01/01/0光标画面移动指令000 1/01/01/000(2)如表4-3所示为LCD1602读写设置表4-3LCD1602读写设置功能RSRWED0~D7读出控 制指令011输出的控制字写入控制指令00正跳变写入的控制字读出显示数据111读出的数据写入显示数据10正跳变写入的数据voidw rite_com(unsignedcharcom)//写入控制指令函数{RS=0;RW=0;E=0;P0=com;de lay(5);E=1;delay(5);E=0;}voidwrite_date(unsignedchardate) //写入显示数据函数{RS=1;RW=0;E=0;P0=date;delay(5);E=1;delay(5);E=0;}void tempdisp2()//温度显示函数{disdata[0]=Temp4/1000%10+0x30;//温度数据千位disd ata[1]=Temp4/100%10+0x30;//温度数据百位disdata[2]=Temp4/10%10+0x30;//温 度数据十位disdata[3]=Temp4%10+0x30;//温度数据个位write_com(0x80+0x048);writ e_date(''4'');//在第二行第九列显示“4”write_com(0x80+0x49);write_date('':'');w rite_com(0x80+0x4a);write_date(disdata[0]);write_com(0x80+0x4b);w rite_date(disdata[1]);write_com(0x80+0x4c);write_date(disdata[2]) ;write_com(0x80+0x4d);write_date(disdata[3]);write_com(0x80+0x4 e);write_date('''');}本设计是把温度数据的个、十、百、千、小数位拆分,再放到LCD1602需要显示的位置上。LC D1602写指令函数用来设置数据在LCD1602显示的位置,指令码为write_com(0x80+0x00~0x0f/0x80+0 x40~0x4f),第一行第一列到第九列/第二行第一列到第九列的显示位置。LCD1602写入显示数据函数用来显示温度传感器转换的温 度数据。4.4无线收发模块软件设计NRF24L01配置寄存器我们知道NRF24L01是通过SPI通信协议进行通信的,在对NRF24 L01进行程序编写之前要先对它的寄存器操作命令和寄存器地址进行宏定义,寄存器操作命令有8个,寄存器地址有24个,如表4-4所示。表 4-4寄存器操作命令和寄存器地址寄存器操作命令功能#defineREAD_REG0x00读寄存器指令#defineW RITE_REG0x20写寄存器指令#defineRD_RX_PLOAD0x61读取接收数据指令#defineWR_ TX_PLOAD0xA0写待发数据指令#defineFLUSH_TX0xE1清除发送FIFO缓冲器指令#define FLUSH_RX0xE2清除接收FIFO缓冲器指令#defineREUSE_TX_PL0xE3定义重复装载数据指 令#defineNOP0xFF保留字寄存器地址功能#defineCONFIG0x00设置工作模式#defineEN _AA0x01自动应答功能#defineEN_RXADDR0x02可用信道设置#defineSETUP_AW0x0 3收发地址宽度设置#defineSETUP_RETR0x04自动重发功能#defineRF_CH0x05工作频率设置# defineRF_SETUP0x06发射速率、功耗功能#defineSTATUS0x07状态寄存器#defineOB SERVE_TX0x08发送监测功能#defineCD0x09地址检测#defineRX_ADDR_P0~P50x0a ~0x0f设置接收通道地址#defineTX_ADDR0x10发送地址寄存器#defineRX_PW_P0~P50x1 1~0x16设置接收通道有效数据宽度#defineFIFO_STATUS0x17FIFO栈入栈出状态(2)设置工作模式发射模 式:voidTX_mode(uchartx_buf){CE=0;SPI_write_pload(WRITE_REG+TX_A DDR,TX_ADDRESS,TX_ADR_WIDTH);//写TX地址SPI_write_pload(WRITE_REG+RX_ ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//设置接收通道为P0SPI_write_pload(WR_TX _PLOAD,tx_buf,TX_PLOAD_WIDTH);//写待发送数据指令,数据,发送数据宽度SPI_RW_reg(WRIT E_REG+EN_AA,0X0F);//使能通道P0自动应答SPI_RW_reg(WRITE_REG+EN_RXADDR,0X0F );//使能通道P0的接收地址SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1A);//设置最大重发间隔:5 00us左右,最大自动重发次数:10次SPI_RW_reg(WRITE_REG+RF_CH,30);//设置发射频率SPI_RW _reg(WRITE_REG+RF_SETUP,0X0F);//设置发射参数,0db增益,2MbpsSPI_RW_reg(WRI TE_REG+CONFIG,0X0e);//设置工作模CE=1;}接收模式:voidRX_mode(){CE=0;本设计为1 收4发的NRF24L01通信,4块温度采集向1块接收板发送数据。多对一通信可以通过配置NRF24L01的地址不同或者设置NRF24 L01的发射频率不同来实现,本设计只需要1对4通信,从机量不是很大,采用设置发射频率的方式可以更简单的实现多机通信。只需在发射模式 和接收模式中改变NRF24L01发射频率,也就是设置RF_CH,4块温度采集板设置四个不同的发射频率(发射频率的间隔要尽可能的大, 不然容易产生干扰),温度接收模块设置4个按键来选择四种不同的发射频率的接收模式即可实现1对4的通信,而且不需要更改发射模式的发送地 址大大减少了程序代码的量。4.5温度收集模块软件设计4.5.1温度收集模块主程序voidmain(){lcd_init();// LCD1602初始化init_io();//NRF24L01初始化while(1){KEY();//按键函数RxPacket(r x_buf);//接收缓冲区温度数据rx();//温度显示}}温度接收模块和温度采集板一样一开始先是LCD1602和NRF24L0 1初始化(lcd_init()和init_io()),接着进入死循环。死循环里按键函数KEY(),通过按键的按下来执行NRF24L 01的接收模式,NRF2401把接收到的数据放在接收缓冲区函数RxPacket(rx_buf),最后rx()函数是把温度数据显示到 LCD1602上。4.5.2KEY()按键函数voidKEY(){if(KEY1==0)//按键1选择接收1号温度采集板{del ayms(1);if(KEY1==0){while(!KEY1);//按键消抖,松手检测RX_mode1();//接收模式1的发射 频率为RF_CH,10}}按键函数里一共有四个按键,这里用按键1来举例,当按下按键1时就会选择NRF24L01的接收模式1函数RX _mode1(),RX_mode1()函数里设置的发射频率RF_CH为10;当按下按键2时就会选择RX_mode2(),RX_mo de2()函数里设置的发射频率RF_CH为30;当按下按键3时就会选择RX_mode3(),RX_mode3()函数里设置的发射频 率RF_CH为50;当按下按键4时就会选择RX_mode3(),RX_mode3()函数里设置的发射频率RF_CH为80。NRF2 4L01接收模式只需要改发射频率,其他都保持一致。4.5.3rx()温度显示函数rx()温度显示函数是NRF24L01接收到了温度 采集板打包发送过来的数据(tx()函数),通过LCD1602的写入控制指令函数和写入数据显示指令函数,把打包的数据和温度采集板一样 显示出来。这样就做到了温度接收模块通过按键控制实时采集到四路四点的温度数据,并能把温度数据显示在自带的显示屏上了。5系统调试5. 1温度采集系统软件测试本设计对DS18B20和MAX6675先进行了软件仿真测试,确定实验的可行性。仿真软件用到的是Proteu s8Professional仿真软件,对各路温度随机取了7组值进行分析如图5-1~5-7和表5-1所示。图5-1第一组仿真 结果图5-2第二组仿真结果图5-3第三组仿真结果图5-4第四组仿真结果图5-5第五组仿真结果图5-6第六组仿真 结果图5-7第七组仿真结果表5-1温度数据误差分析组数序号温度传感器输入值LCD1602显示值误差第一组1DS18B20_ 10.00.002DS18B20_20.00.003MAX6675_10.000004MAX6675_20.00000第二组1DS 18B20_1-12.512.502DS18B20_20.00.003MAX6675_1555504MAX6675_2146146 0第三组1DS18B20_114.014.002DS18B20_224.024.003MAX6675_1268265-34MAX6 675_2388387-1第四组1DS18B20_135.635.602DS18B20_247.347.303MAX6675_14 62.1463+0.94MAX6675_2502.4505+2.6第五组1DS18B20_157.057.002DS18B20_2 68.068.003MAX6675_1643651+84MAX6675_2729738+9第六组1DS18B20_178.078. 002DS18B20_285.085.003MAX6675_1868877+94MAX6675_2983988+5表续(5-1)第 七组1DS18B20_198.098.002DS18B20_2122.0122.003MAX6675_11000999+14MAX 6675_21023999+24结论:在仿真软件中,DS18B20可测正负温度输入值等于输出值且可以保留一位小数,无误差。MAX6 675可测0到999℃,只能显示整数温度,所输入的温度越低误差范围越小,从600℃开始温度误差范围变大,最大可达±9℃。在软件仿真 中证明了DS18B20和MAX6675可用在船体锅炉多点温度采集模块中。5.2硬件电路测试在电路板焊接好之后,检查线路板外观是否 完整,所用元件正负极是否放置正确,元件引脚是否导通。上电检测各部分所需电压值是否达到,把程序编译进单片机检测显示屏LCD1602、 DS18B20、热电偶和按键以及无线模块是否工作。经检测和调试后硬件电路能正常使用。5.3NRF24L01无线通讯测试本设计做了 一块温度收集板和四块温度采集板,温度收集板能通过按键1、2、3、4(温度收集模块按键从左到右为KEY1、KEY2、KEY3、KEY 4)来对对应的温度采集板进行温度数据的接收,并把温度数据显示在LCD1602显示屏上,如图5-8所示。图5-8一块温度收集板和 四块温度采集板(左:温度收集模块右:4块温度采集板)当按下按键1时,温度收集模块接收到1号温度采集模块的温度数据,且温度收集模 块中的温度数据会随着1号温度采集模块的温度数据实时变化,1号温度采集模块接入了两路DS18B20温度传感器(1:31.0℃和2:3 1.1℃)和两路K型热电偶温度传感器(3:40℃和4:36℃),如图5-9所示。图5-9无线通信测试一(左:温度收集模块中:1 号温度采集板右:2号温度采集板)当按下按键2时,温度温度收集模块接收到2号温度采集模块的温度数据,且温度收集模块中的温度数据会 随着2号温度采集模块的温度数据实时变化,2号温度采集模块只接入了两路DS18B20温度传感器(1:30.0℃和2:30.6℃),没 有接入K型热电偶温度传感器(3和4为0,无温度数据),如图5-10所示。图5-10无线通信测试二(左:温度收集模块中:1号 温度采集板右:2号温度采板)本设计所使用的NRF24L01无线模块没有外加天线,所以无线通讯范围有限。经测试无墙阻隔100米直 径范围可正常通讯,大于100米小于150米无线通讯延迟3秒左右,超过150米接收端接收不到数据;有墙阻隔三层楼墙阻隔可正常通讯,大 于3层小于5层通讯延迟5秒左右,超过5层收端接收不到数据。本设计可实现短距离无线通讯,100米直径无墙阻隔通讯,有墙阻隔三层楼层墙 隔可正常通讯,想实现长距离无线通讯需要NRF24L01外加天线。5.4实际温度采集结果由于实验设备有限,在测量实际温度过程中,在 互联网上买了一个别人已经校准的测温计来进行对比测试。实际测量的温度有室温、热水温度、冰箱温度和电烙铁温度。室温:1和2是DS18B 20采集的温度,3和4是热电偶采集的温度,测温计温度为27.5℃,如图5-11所示。图5-11室温测试(左:测温计中:温度 收集模块右:温度采集板)热水温度:1是DS18B20放入热水的温度72.9℃,2是DS18B20采集的室温温度26.6℃,3是 热电偶采集的室温温度23℃,4是热电偶放入热水的温度70℃,测温计放入热水的温度为71.3℃,如图5-12所示。图5-12热水 测试(左:温度采集板右:测温计)冰箱温度:由于热电偶测不了负温度故舍掉。1是DS18B20放入冰箱采集的温度-1.7℃,2是D S18B20采集的室温25.7℃,测温计测冰箱的温度为-1.6℃,如图5-13所示。图5-13冰箱温度测试(上:测温计下: 温度采集板)电烙铁温度:由于DS18B20测温范围在-55摄氏度~125℃测不了电烙铁的温度,所以静置显示室温。3和4为热电偶采集 电烙铁的温度,分别为250℃和248℃,测温计测电烙铁温度为252℃,如图5-14所示。图5-14电烙铁温度测试(左:温度采集 板右:测温计)在实际的温度采集的过程中,由于实验设备有限,所采集的温度区间很小,高温度区间没有进行试验,温度变化是实时跳变的, 在低温度区间实际测量出来温度误差在本设计的允许范围内,误差不影响船体锅炉温度采集的使用。6结论本设计基于单片机船体锅炉多点温度 采集无线控制系统设计,主要利用了STC89C52RC单片机作为控制核心进行软件编程,并且DS18B20和K型热电偶有多种封装形式, 可在锅炉中任何需要采集温度的点进行安装,无须担心距离和形状的限制。该设计与传统的锅炉温度采集的创新点在于利用温度收集模块能够收集到 4路温度的数据,且每路温度最多可采集4个点的温度,一艘船舶上不只一个锅炉,该设计能把船上多个锅炉的多个温度点进行汇总,大大方便了船 体锅炉工作人员对船体锅炉温度数据的采集和监测。温度采集板用一个单片机控制两种不同的温度传感器DS18B20和K型热电偶,这两种温度 传感器都是独立工作的,在进行更换时无需再进行软件程序的配置,只需对温度传感元件进行更换即可,大大节省了成本和更换难度,也满足了本设 计所需的要求:(1)温度采集范围-30℃~1000℃,温度数据-30℃~100℃以内允许误差范围±0.5℃,100℃~400℃允许 误差范围±4℃,400℃~1000℃允许误差在±9℃。(2)采集四路温度数据,每路温度数据采集了四个点的温度。(3)温度接收模块和 温度采集模块都能在显示屏上显示实时温度数据,且显示数据一致。(4)温度收集模块通过按键选择接收温度采集模块各路的四点温度信息。参考 文献[1]魏鸿磊.单片机原理及应用:C语言编程[M].上海:同济大学出版社,2015:6~99.[2]陈立军,王涛.船舶辅机[ M].大连:大连海事大学出版社,2015:421~490.[3]谭浩强.C程序设计[M].北京:清华大出版社,2010:37~ 52.[4]李路.基于Proteus和KeilC51的DS18B20单总线多点测温实验综述报告[J].电子世界,2019,1 3:5~8.[5]祖一康,徐妙婧.基于单片机和nRF905的多点温度无线采集系统[J].电子科技,2017,07:99~102 +109.[6]吕胜杰,霍淑艳.用单片机实现DS18B20的远程无线温度检测[J].自动化应用,2010,09:67~68. [7]张翠云.温度自动控制系统的设计与实现[J].机电工程技术,2019,10:41~43.[8]李向荣,孟向海,范福海.基于 MAX6675高精度温控系统的研究与设计[J].计算机与数字工2019年,06期:1391~1394+1549.[9]钟自鸣,傅 前丰,杨春龙,等.一种基于MAX6675多路远程温度采集系统[J].电子世界,2017,06:100~101[10]Shelle yKemp,GaryProulx,MargaretAuerbach,etal.Thermalsensorperform anceandfirecharacterisationduringshortdurationengulfmentt ests.FireandMaterials,2020,2784:461~478.[11]XiZhu,WangqingAn ,LiuChang,etal.Researchofdigitaltemperaturemeasurementsy steminvacuumthermaltestbasedonDS18B20.MATECWebofConfere nces,2018,173.[12]TingWang,HaoWang.DesignofWaterHeatinga ndTemperatureControlSystemBasedonSTC89C52.AppliedMechanic sandMaterials,2015,3827:255-259.[13]邓世华,郑璞,赵勋,等.基于nRF24L01的无线 温度监控系统设计[J].科技创新与应用,2019,22:92~94.[14]杨帆,李富善.基于NRF24L01芯片的温室无线测控 系统设计[J].武汉工程大学学报,2019,03:90~295.[15]谢永,超杨利.基于STC89C52单片机土壤温湿度检测器 的设计[J].计算机测量与控制,2019,10:205~208+213.[16]唐菲.无线多点测温系统的设计与实现[D].南京: 南京理工大学,2014.[17]覃鲜艳.基于DS18B20的无线测温系统的研究与设计[D].武汉:武汉理工大学,2012.[18 ]高廓.基于nRF24E1的无线多点温湿度测量系统方案设计[D].长春:吉林大学,2005.[19]葛雅清.基于NRF24L0 1无线监控系统的设计[D].苏州:苏州大学,2015.[20]张瑜.烘炉温度追踪仪的研制[D].哈尔滨:东北林业大学,2007. [21]张磊.基于射频组网的农业数据采集系统[D].合肥:安徽大学,2019附录附录一:温度采集板PCB图附图1-1温度采集 板PCB图附录二:温度采集模块元件清单附表1-1温度采集模块元件清单名称参数原理图标号数量STC89C52RC单片机DIP40U1 4LCD1602液晶显示屏P14瓷片电容30pFC1、C3、C4、C816瓷片电容104pFC24晶振12MHzY14NRF24L 01U241/4W五色环电阻10KR1、R5、R6121/4W五色环电阻1KR1、R48电解电容10uFC64电解电容100uFC 5、C78六脚自锁开关S24USB-A型接口A母插座24排阻4K7PR14AMS11173.3V14DS18B203、48 K型热电偶MAX6675模块P2、P38可调电位器10KR34排针1×2P44LED灯3MM绿光D14按键开关4.5×4.5×3. 8MMS14附录三:温度收集模块PCB图附图1-2温度收集模块PCB图附录四:温度收集模块元件清单附表1-2温度收集模块元件清单名 称参数原理图标号数量STC89C52RC单片机DIP40U11LCD1602液晶显示屏P11瓷片电容30pFC1、C3、C5、C6 4瓷片电容104pFC81晶振12MHzY11NRF24L01U211/4W五色环电阻10KR411/4W五色环电阻1KR1、R3 2电解电容10uFC71电解电容100uFC2、C62六脚自锁开关S21USB-A型接口A母插座31排阻4K7PR11AMS11 173.3V21可调电位器10KR21排针1×2P11LED灯3MM绿光D11按键开关4.5×4.5×3.8MMS1、S3、S4 、S5、S65附录五:温度采集模块程序main.c文件程序#include#include"LCD1602. h"#include"DS18B20.h"#include"delay.h"#include"MAX6675.h"#incl ude"NRF24L01.h"uchartx_buf[18]={0};voidtx()//NRF24L01缓冲区数据函数{u chartx_buf[18]={0};//1号DS18B20温度数据if(tflag1==0){tx_buf[0]=(Temp 1/1000);tx_buf[1]=(Temp1%1000/100);tx_buf[2]=(Temp1%100/10);tx_bu f[3]=''.'';tx_buf[4]=(Temp1%10);}elseif(tflag1==1){tx_buf[0]=''-''; tx_buf[1]=(Temp1%1000/100);tx_buf[2]=(Temp1%100/10);tx_buf[3]=''.'' ;tx_buf[4]=(Temp1%10);}//2号DS18B20温度数据if(tflag2==0){tx_buf[5]=( Temp2/1000);tx_buf[6]=(Temp2%1000/100);tx_buf[7]=(Temp2%100/10);t x_buf[8]=''.'';tx_buf[9]=(Temp2%10);}elseif(tflag2==1){tx_buf[5]= ''-'';tx_buf[6]=(Temp2%1000/100);tx_buf[7]=(Temp2%100/10);tx_buf[8] =''.'';tx_buf[9]=(Temp2/1%10);}//1号K型热电偶MAX6675温度数据if(flagconnect1 ==0){tx_buf[10]=(Temp3/1000%10);tx_buf[11]=(Temp3/100%10);tx_buf[ 12]=(Temp3/10%10);tx_buf[13]=(Temp3%10);}//2号K型热电偶MAX6675温度数据if( flagconnect2==0){tx_buf[14]=(Temp4/1000%10);tx_buf[15]=(Temp4/10 0%10);tx_buf[16]=(Temp4/10%10);tx_buf[17]=(Temp4%10);}}voidmain( ){read_temp1();read_temp2();delay(1000);InitLcd1602(); //LCD1602初始化init_io();//NRF24L01初始化while(1){ds1820 disp1();//1号DS18B20温度显示函数ds1820disp2();//2号DS18B20温 度显示函数tempdisp1();//1号K型热电偶温度显示函数tempdisp2();/ /2号K型热电偶温度显示函数tx();//NEF24L01发送缓冲区写温度函数TX_mode(tx _buf);//NRF24L01设置为发送模式while(Check_ACK());//发送检测}}LCD1602. c文件程序#include#include"delay.h"#include"LCD1602.h"void write_com(unsignedcharcom)//写入控制指令函数{RS=0;RW=0;E=0;P0=com; delay(5);E=1;delay(5);E=0;}voidwrite_date(unsignedchardate) //写入显示数据函数{RS=1;RW=0;E=0;P0=date;delay(5);E=1;delay(5);E=0;}vo idInitLcd1602()//LCD初始化显示{write_com(0x38);//162显示,57 点阵,8位数据接口write_com(0x0C);//显示器开,光标关闭write_com(0x06);//文字不动, 地址自动+1write_com(0x01);//清屏}LCD1602.h文件程序#ifndef_LCD1602_H_#de fine_LCD1602_H_sbitRS=P2^5;sbitRW=P2^6;sbitE=P2^7;externv oidwrite_com(unsignedcharcom);//写命令externvoidwrite_date (unsignedchardate);//写数据externvoidInitLcd1602(); //LCD初始化显示#endifDS18B20.c文件程序#include#includeins.h>#include"DS18B20.h"#include"delay.h"#include"LCD1602.h"f loatTM1,TM2;//温度小数intTemp1,Temp2;//温度整数unsignedchartflag1,tfl ag2;//温度正负标志unsignedchardatadisdata1[5];//温度字型显示中间变量unsig nedchardatadisdata2[5];voiddelay_18B20(unsignedinti)//延时微秒{ while(i--);}voidds1820rst1()/ds1820复位函数/{unsignedchar x=0;DQ1=1;//DQ复位delay_18B20(4);//延时DQ1=0; //DQ拉低delay_18B20(80);//精确延时大于480us540usDQ1=1 ;//拉高总线15-60usdelay_18B20(20);x=DQ1;// 读总线状态为0复位成功,1复位不成功delay(30);DQ1=1;//释放总线}unsign edchards1820rd1()/读数据函数/{unsignedchari=0;unsignedchard at=0;for(i=8;i>0;i--){DQ1=0;//给脉冲信号dat>>=1;DQ1= 1;//给脉冲信号if(DQ1)dat|=0x80;//dat和0x80做“或”运算(最高位 1,其他位保持不变)delay_18B20(10);//延时15us}return(dat);}voidds1820wr1 (unsignedcharwdata)/写数据函数/{unsignedchari=0;for(i=8;i>0; i--){DQ1=0;DQ1=wdata&0x01;delay_18B20(10);//延时60us左右DQ1= 1;wdata>>=1;}}read_temp1()/读取温度值并转换/{unsignedchara,b;ds1820rs t1();//初始化ds1820wr1(0xcc);//跳过读序列号ds1820wr1(0x44); //启动温度转换ds1820rst1();//初始化ds1820wr1(0xcc);//跳过读序列号ds1 820wr1(0xbe);//读取温度a=ds1820rd1();//温度数据低8位LSB赋给 ab=ds1820rd1();//温度数据高8位MSB赋给bTemp1=b;Temp1<<=8;Temp1= Temp1|a;//取温度数据if(Temp1>=0)//判断正负tflag1=0;// 温度为正else{Temp1=~Temp1+1;tflag1=1;//温度为负}TM1=Temp10.0625;/ /小数Temp1=TM110+0.5;//负温度数据return(Temp1);}voidds1820disp1()//温 度值显示{read_temp1();disdata1[0]=Temp1/1000+0x30;//百位数disdata1[1]= Temp1%1000/100+0x30;//十位数disdata1[2]=Temp1%100/10+0x30;//个位数dis data1[3]=Temp1%10+0x30;//小数位if(disdata1[0]==0x30){disdata1[0]=0 x20;if(disdata1[1]==0x30){disdata1[1]=0x20;}}write_com(0x80+0x00 );write_date(''1'');write_com(0x80+0x01);write_date('':'');if(tflag1= =0){write_com(0x80+0x02);write_date(disdata1[0]);write_com(0x8 0+0x03);write_date(disdata1[1]);write_com(0x80+0x04);write_dat e(disdata1[2]);write_com(0x80+0x05);write_date(0x2e);write_com (0x80+0x06);write_date(disdata1[3]);write_com(0x80+0x07);write _date('''');}elseif(tflag1==1){write_com(0x80+0x02);write_date( ''-'');write_com(0x80+0x03);write_date(disdata1[1]);write_com(0x 80+0x04);write_date(disdata1[2]);write_com(0x80+0x05);write_da te(0x2e);write_com(0x80+0x06);write_date(disdata1[3]);write_co m(0x80+0x07);write_date('''');}}voidds1820rst2()/ds1820复位 /{unsignedcharx=0;DQ2=1;//DQ复位delay_18B20(4);/ /延时DQ2=0;//DQ拉低delay_18B20(80);//精确延时大于480us540us DQ2=1;//拉高总线15-60usdelay_18B20(20);x=DQ2; //读总线状态为0复位成功,1复位不成功delay(30);DQ2=1;//释放总线}unsigne dchards1820rd2()/读数据/{unsignedchari=0;unsignedchardat =0;for(i=8;i>0;i--){DQ2=0;//给脉冲信号dat>>=1;DQ2=1;//给脉冲信号if( DQ2)dat|=0x80;//dat和0x80做“或”运算(最高位1,其他位保持不变)delay_18B20(10);}ret urn(dat);}voidds1820wr2(unsignedcharwdata)/写数据/{unsignedc hari=0;for(i=8;i>0;i--){DQ2=0;DQ2=wdata&0x01;delay_18B20 (10);DQ2=1;wdata>>=1;}}read_temp2()/读取温度值并转换/{unsignedchara, b;ds1820rst2();ds1820wr2(0xcc);//跳过读序列号/ds1820wr2(0x44);//启动温度 转换/ds1820rst2();ds1820wr2(0xcc);//跳过读序列号/ds1820wr2(0xbe);//读 取温度/a=ds1820rd2();b=ds1820rd2();Temp2=b;Temp2<<=8;Temp2=Temp2|a; if(Temp2>=0)tflag2=0;else{Temp2=~Temp2+1;tflag2=1;}TM2=Temp20.06 25;Temp2=TM210+0.5;return(Temp2);}voidds1820disp2()//温度值显示{rea d_temp2();disdata2[0]=Temp2/1000+0x30;//百位数disdata2[1]=Temp2%1000 /100+0x30;//十位数disdata2[2]=Temp2%100/10+0x30;//个位数disdata2[3]=Tem p2%10+0x30;//小数位if(disdata2[0]==0x30){disdata2[0]=0x20;if(disdata 2[1]==0x30){disdata2[1]=0x20;}}write_com(0x80+0x08);write_date('' 2'');write_com(0x80+0x09);write_date('':'');if(tflag2==0){write_com( 0x80+0x0a);write_date(disdata2[0]);write_com(0x80+0x0b);write_dat e(disdata2[1]);write_com(0x80+0x0c);write_date(disdata2[2]);write _com(0x80+0x0d);write_date(0x2e);write_com(0x80+0x0e);write_date( disdata2[3]);write_com(0x80+0x0f);write_date('''');}elseif(tflag2 ==1){write_com(0x80+0x0a);write_date(''-'');write_com(0x80+0x0b);wr ite_date(disdata2[1]);write_com(0x80+0x0c);write_date(disdata2[2] );write_com(0x80+0x0d);write_date(0x2e);write_com(0x80+0x0e);writ e_date(disdata2[3]);write_com(0x80+0x0f);write_date('''');}}DS18B2 0.h文件程序#ifndef_DS18B20_H_#define_DS18B20_H_sbitDQ1=P1^0;sbitD Q2=P1^1;externfloatTM1,TM2;externintTemp1,Temp2;externunsi gnedchartflag1,tflag2;externunsignedchardatadisdata1[5];ext ernunsignedchardatadisdata2[5];externvoidds1820rst1();exter nread_temp1();externvoidds1820disp1();externunsignedchard s1820rd1();externvoidds1820wr1(unsignedcharwdata);externv oidds1820rst2();externread_temp2();externvoidds1820disp2(); externunsignedchards1820rd2();externvoidds1820wr2(unsigned charwdata);#endifMAX665.c文件程序#include#include.h>#include"LCD1602.h"#include"MAX6675.h"unsignedintTemp3;uns ignedintTemp4;unsignedcharflagconnect1;unsignedcharflagconn ect2;unsignedchardatadisdata[5];unsignedintMAX6675Read1()// MAX6675串口模数转换读取温度函数{unsignedintValue1;unsignedcharcount;CS1=1 ;//CS高电平SCK1=0;//SCK低电平_nop_();_nop_();//延时两个机器周期CS1=0;//CS低 电平开始读取Value1=0;//赋给温度值为0for(count=0;count<16;count++)//读取16个输出 位{//把值赋给SOValue1|=SO1;Value1=Value1<<1;SCK1=1;_nop_();SCK1=0;}C S1=1;//CS高电平读取完毕_nop_();_nop_();return(Value1);//返回温度值}voidte mpdisp1()//MAX6675温度转换和并显示函数{Temp3=MAX6675Read1();//把读到的热电偶温度赋 给TEMP3flagconnect1=MAX6675Read1()&0x04;//判断热电偶开路,与0x04剩D2、D1、D 0位flagconnect1=flagconnect1>>2;//左移两位剩D2位Temp3=Temp3<<1;//去掉D15 位Temp3=Temp3>>4;//去掉低4位剩D14~D3位Temp3=Temp3/4-32;//得最终温度值,-32为温度 调试值if(flagconnect1==0){disdata[0]=Temp3/1000+0x30;disdata[1]=Temp 3%1000/100+0x30;disdata[2]=Temp3%100/10+0x30;disdata[3]=Temp3%10+ 0x30;if(disdata[0]==0x30){disdata[0]=0x20;if(disdata[1]==0x30){di sdata[1]=0x20;}}write_com(0x80+0x040);write_date(''3'');write_com(0 x80+0x41);write_date('':'');write_com(0x80+0x42);write_date(disdata [0]);write_com(0x80+0x43);write_date(disdata[1]);write_com(0x80+0 x44);write_date(disdata[2]);write_com(0x80+0x45);write_date(disda ta[3]);write_com(0x80+0x46);write_date('''');}else{write_com(0x80 +0x040);write_date(''3'');write_com(0x80+0x41);write_date('':'');writ e_com(0x80+0x42);write_date('''');write_com(0x80+0x43);write_date( '''');write_com(0x80+0x44);write_date(''0'');write_com(0x80+0x45);wr ite_date(''0'');write_com(0x80+0x46);write_date('''');}}unsignedint MAX6675Read2(){unsignedintValue2;unsignedcharcount;CS2=1;SCK 2=0;_nop_();_nop_();CS2=0;Value2=0;for(count=0;count<16;count++) {Value2|=SO2;Value2=Value2<<1;SCK2=1;_nop_();SCK2=0;}CS2=1;_nop _();_nop_();return(Value2);}voidtempdisp2(){Temp4=MAX6675 Read2();//把读到的热电偶温度赋给TEMP3flagconnect2=MAX6675Read2()&0x04;// 判断热电偶开路,与0x04剩D2、D1、D0位flagconnect2=flagconnect2>>2;//左移两位剩D2位Te mp4=Temp4<<1;//去掉D15位Temp4=Temp4>>4;//去掉低4位剩D14~D3位Temp4=Temp4/ 4-32;//得最终温度值,-24为温度调试值if(flagconnect2==0){disdata[0]=Temp4/1000 %10+0x30;disdata[1]=Temp4/100%10+0x30;disdata[2]=Temp4/10%10+0x30 ;disdata[3]=Temp4%10+0x30;if(disdata[0]==0x30){disdata[0]=0x20;if (disdata[1]==0x30){disdata[1]=0x20;}}write_com(0x80+0x048);write_ date(''4'');write_com(0x80+0x49);write_date('':'');write_com(0x80+0x4 a);write_date(disdata[0]);write_com(0x80+0x4b);write_date(disdata [1]);write_com(0x80+0x4c);write_date(disdata[2]);write_com(0x80+0 x4d);write_date(disdata[3]);write_com(0x80+0x4e);write_date(''''); }else{write_com(0x80+0x048);write_date(''4'');write_com(0x80+0x49) ;write_date('':'');write_com(0x80+0x4a);write_date('''');write_com(0 x80+0x4b);write_date('''');write_com(0x80+0x4c);write_date(''0'');wr ite_com(0x80+0x4d);write_date(''0'');write_com(0x80+0x4e);write_dat e('''');}}MAX665.h文件程序#ifndef_MAX6675_H_#define_MAX6675_H_sbitS CK1=P1^2;sbitCS1=P1^3;sbitSO1=P1^4;sbitSCK2=P1^5;sbitCS2=P 1^6;sbitSO2=P1^7;externunsignedintTemp3;externunsignedint Temp4;externunsignedcharflagconnect1;externunsignedcharflag connect2;externunsignedintMAX6675Read1();externunsignedint MAX6675Read2();externvoidtempdisp1();externvoidtempdisp2();e xternunsignedchardatadisdata[5];#endifNRF24L01.c文件程序#include #include"NRF24L01.h"ucharTX_ADDRESS[5]={0x12,0x34,0x56 ,0x78,0x90};sbitCE=P3^2;sbitCSN=P3^3;sbitSCK=P3^4;sb itMOSI=P3^5;sbitMISO=P3^6;sbitIRQ=P3^7;ucharbdatasta; sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;voidinit_ io(void){CE=0;//待机CSN=1;//SPI禁止SCK=0;//SPI时钟置低IRQ= 1;//中断复位}ucharSPI_RW(ucharbyte)//发送指令,接受状态,返回值为状态值{uchar i;for(i=0;i<8;i++){MOSI=(byte&0x80);byte=(byte<<1);SCK=1;byte|=M ISO;SCK=0;}return(byte);}ucharSPI_RW_reg(ucharreg,ucharvalue){ ucharstatus;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return( status);}ucharSPI_read(ucharreg){ucharreg_val;CSN=0;SPI_RW(reg );//写指令reg_val=SPI_RW(0);//读reg的内容CSN=1;return(r eg_val);}ucharSPI_read_pload(ucharreg,ucharpBuf,ucharbytes){ ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;ii]=SPI_RW(0);CSN=1;return(status);}ucharSPI_write_pload(ucharre g,ucharpBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg );for(i=0;iTX_mode(uchartx_buf){CE=0;SPI_write_pload(WRITE_REG+TX_ADDR,TX_ ADDRESS,TX_ADR_WIDTH);//写TX地址SPI_write_pload(WRITE_REG+RX_ADDR_P0 ,TX_ADDRESS,TX_ADR_WIDTH);//设置接收通道为P0SPI_write_pload(WR_TX_PLOAD, tx_buf,TX_PLOAD_WIDTH);//写待发送数据指令,数据,发送数据宽度SPI_RW_reg(WRITE_REG+E N_AA,0X0F);//使能通道P0自动应答SPI_RW_reg(WRITE_REG+EN_RXADDR,0X0F);//使能 通道P0的接收地址SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1A);//设置最大重发间隔:500us左右 ,最大自动重发次数:10次SPI_RW_reg(WRITE_REG+RF_CH,30);//设置发射频率SPI_RW_reg(WR ITE_REG+RF_SETUP,0X0F);//设置发射参数,0db增益,2MbpsSPI_RW_reg(WRITE_REG+C ONFIG,0X0e);//设置工作模CE=1;}voidTxPacket(uchartx_buf){CE=0;SPI_wr ite_pload(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);CE=1;}ucharCheck_AC K(){sta=SPI_read(STATUS);if(TX_DS||MAX_RT){SPI_RW_reg(WRITE_REG+ STATUS,0xff);//清除TX_DS或MAX_RT中断标志CSN=0;SPI_RW(FLUSH_TX);CSN= 1;return(1);}elseIRQ=1;return(0);}NRF24L01.h文件程序#ifndef_NRF2 4L01_h#define_NRF24L01_h#defineucharunsignedchar#defineuint unsignedint//NRF24L01寄存器指令#defineREAD_REG0x00// 读寄存器指令#defineWRITE_REG0x20//写寄存器指令#defineRD_RX_PLOAD 0x61//读取接收数据指令#defineWR_TX_PLOAD0xA0//写待发数据指令#def ineFLUSH_TX0xE1//冲洗发送FIFO指令#defineFLUSH_RX0x E2//冲洗接收FIFO指令#defineREUSE_TX_PL0xE3//定义重复装载数据指令#def ineNOP0xFF//保留//SPI(nRF24L01)寄存器地址#define CONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA 0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置# defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0 x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF _SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07/ /状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD 0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defi neRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C //频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineR X_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F// 频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器#defineRX_PW_P 00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频 道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW _P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接 收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIF O_STATUS0x17//FIFO栈入栈出状态寄存器设置// #defineTX_ADR_WIDTH5#defineRX_ ADR_WIDTH5#defineTX_PLOAD_WIDTH18#defineTX_PLOAD_WIDTH18// 相关函数引用externvoidinit_io(void);externucharSPI_RW(ucharbyt e);externucharSPI_RW_reg(ucharreg,ucharvalue);externucharSP I_read(ucharreg);externucharSPI_read_pload(ucharreg,ucharpB uf,ucharbytes);externucharSPI_write_pload(ucharreg,ucharpBu f,ucharbytes);externvoidTX_mode(uchartx_buf);externucharCh eck_ACK();externucharbdatasta;// #endifdelay.c文件程序#include"delay.h"v oiddelay(unsignedintz){unsignedintx,y;for(x=z;x>0;x--)for(y= 110;y>0;y--);}delay.h文件程序#ifndef_DELAY_H_#define_DELAY_H_extern voiddelay(unsignedintz);#endif附录六:温度收集模块程序#include#i nclude#defineucharunsignedchar#defineuintunsigned int//NRF24L01寄存器指令#defineREAD_REG0x00// 读寄存器指令#defineWRITE_REG0x20//写寄存器指令#defineRD_RX_PLOAD 0x61//读取接收数据指令#defineWR_TX_PLOAD0xA0//写待发数据指令#def ineFLUSH_TX0xE1//冲洗发送FIFO指令#defineFLUSH_RX0x E2//冲洗接收FIFO指令#defineREUSE_TX_PL0xE3//定义重复装载数据指令#def ineNOP0xFF//保留//SPI(nRF24L01)寄存器地址#d efineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN _AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置# defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0 x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF _SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07/ /状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD 0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defi neRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C //频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineR X_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F// 频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器#defineRX_PW_P 00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频 道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW _P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接 收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIF O_STATUS0x17//FIFO栈入栈出状态寄存器设置// #defineTX_ADR_WIDTH5//发送端地址地址宽 度#defineRX_ADR_WIDTH5//接收端地址宽度#defineTX_PLOAD_WIDTH18//发送 字节数#defineRX_PLOAD_WIDTH18//接收字节数ucharRX_ADDRESS[5]={0x12, 0x34,0x56,0x78,0x90};ucharrx_buf[18]={0};ucharbdatasta;sbitRX _DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;sbitKEY1=P2^3;sb itKEY2=P2^2;sbitKEY3=P2^1;sbitKEY4=P2^0;sbitlcd_rs=P2^5;sbit lcd_rw=P2^6;sbitlcd_en=P2^7;sbitCE=P1^0;sbitCSN=P1^1;sb itSCK=P1^2;sbitMOSI=P1^3;sbitMISO=P1^4;sbitIRQ=P1^5 ;voiddelayms(uintx){uinti,j;for(i=x;i>0;i--)for(j=113;j>0;j--) ;}voidinit_io(void){CE=0;//待机CSN=1;//SPI禁止SCK=0;//S PI时钟置低IRQ=1;//中断复位}ucharSPI_RW(ucharbyte){uchari;for(i=0; i<8;i++){MOSI=(byte&0x80);byte=(byte<<1);SCK=1;byte|=MISO;SCK=0;} return(byte);}ucharSPI_RW_reg(ucharreg,ucharvalue){ucharstatu s;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);}uc harSPI_read(ucharreg){ucharreg_val;CSN=0;SPI_RW(reg);reg_val=S PI_RW(0);CSN=1;return(reg_val);}ucharSPI_read_pload(ucharreg,uc harpBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);fo r(i=0;iPI_write_pload(ucharreg,ucharpBuf,ucharbytes){ucharstatus,i; CSN=0;status=SPI_RW(reg);for(i=0;i1;return(status);}voidRX_mode1(){CE=0;SPI_write_pload(WRITE_REG+ RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);SPI_RW_reg(WRITE_REG+RX_PW_P0 ,RX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X3F);SPI_RW_reg( WRITE_REG+SETUP_RETR,0X1A);SPI_RW_reg(WRITE_REG+RF_CH,10);SPI_RW_ reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0F);CE =1;}voidRX_mode2(){CE=0;SPI_write_pload(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);SPI_RW_reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X3F);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1A);SPI_RW_reg(WRITE_REG+RF_CH,30);SPI_RW_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0F);CE=1;}voidRX_mode3(){CE=0;SPI_write_pload(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);SPI_RW_reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X3F);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1A);SPI_RW_reg(WRITE_REG+RF_CH,50);SPI_RW_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0F);CE=1;}voidRX_mode4(){CE=0;SPI_write_pload(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);SPI_RW_reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X3F);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1A);SPI_RW_reg(WRITE_REG+RF_CH,70);SPI_RW_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0F);CE=1;}ucharRxPacket(ucharrx_buf){ucharflag=0;sta=SPI_read(STATUS);if(RX_DR){CE=0;SPI_read_pload(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);flag=1;SPI_RW_reg(WRITE_REG+STATUS,sta);CSN=0;SPI_RW(FLUSH_RX);CSN=1;CE=1;}return(flag);}voidwrite_com(ucharcom){lcd_rs=0;lcd_rw=0;P0=com;lcd_en=1;delayms(1);lcd_en=0;}voidwrite_data(uchardate){lcd_rs=1;lcd_rw=0;P0=date;lcd_en=1;delayms(1);lcd_en=0;}voidlcd_init(){lcd_en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}voidrx(){//接收1号DS18B20的数据从第一行一列开始显示write_com(0x80+0x00);write_data(''1'');write_data('':'');if(rx_buf[0]==0){write_data('''');}elseif(rx_buf[0]==''-''){write_data(''-'');}else{write_data(rx_buf[0]+0x30);}if(rx_buf[1]==0){write_data('''');}else{write_data(rx_buf[1]+0x30);}write_data(rx_buf[2]+0x30);write_data(rx_buf[3]);write_data(rx_buf[4]+0x30);//接收2号DS18B20的数据从第一行九列开始显示write_com(0x80+0x08);write_data(''2'');write_data('':'');if(rx_buf[5]==0){write_data('''');}elseif(rx_buf[5]==''-''){write_data(''-'');}else{write_data(rx_buf[5]+0x30);}if(rx_buf[6]==0){write_data('''');}else{write_data(rx_buf[6]+0x30);}write_data(rx_buf[7]+0x30);write_data(rx_buf[8]);write_data(rx_buf[9]+0x30);//接收1号K型热电偶MAX6675的数据从第二行一列开始显示write_com(0x80+0x40);write_data(''3'');write_data('':'');if(rx_buf[10]==0){write_data('''');}else{write_data(rx_buf[10]+0x30);}if(rx_buf[11]==0){write_data('''');}else{write_data(rx_buf[11]+0x30);}write_data(rx_buf[12]+0x30);write_data(rx_buf[13]+0x30);write_data('''');//接收2号K型热电偶MAX6675的数据从第二行九列开始显示write_com(0x80+0x48);write_data(''4'');write_data('':'');if(rx_buf[14]==0){write_data('''');}else{write_data(rx_buf[14]+0x30);}if(rx_buf[15]==0){write_data('''');}else{write_data(rx_buf[15]+0x30);}write_data(rx_buf[16]+0x30);write_data(rx_buf[17]+0x30);write_data('''');}voidKEY(){//按键1选择接收1号温度采集板if(KEY1==0){delayms(1);if(KEY1==0){while(!KEY1);RX_mode1();}}//按键2选择接收2号温度采集板if(KEY2==0){delayms(1);if(KEY2==0){while(!KEY2);RX_mode2();}}//按键3选择接收3号温度采集板if(KEY3==0){delayms(1);if(KEY3==0){while(!KEY3);RX_mode3();}}//按键4选择接收4号温度采集板if(KEY4==0){delayms(1);if(KEY4==0){while(!KEY4);RX_mode4();}}}voidmain(){lcd_init();init_io();while(1){KEY();RxPacket(rx_buf);rx();}}第I页共IV页第IV页共IV页 |
|