STC89C52单片机驱动的低功耗无线温度计设计

需积分: 10 5 下载量 186 浏览量 更新于2024-07-23 2 收藏 3.48MB DOC 举报
"基于STC89C52无线温度计的设计" 本文主要介绍了一种基于STC89C52单片机的无线温度计设计方案,旨在提供一种低功耗、实时性强且成本低廉的远程温度监测系统。系统采用了nRF24L01无线射频模块进行数据通信,并利用DS18B20温度传感器进行温度测量,通过LCD1602液晶显示屏显示温度读数。 1. 系统方案选择与分析 - 系统方案设计:设计了一个无线温度测量系统,能够实现实时温度监测和远程控制。 - 主控芯片方案:选用STC89C52单片机,因其功能强大、性价比高、易于编程。 - 无线通信模块方案:采用nRF24L01模块,它具有2.4GHz的无线通信能力,适合短距离、低功耗的无线传输。 - 温度传感方案:使用DS18B20数字温度传感器,它能提供精确的温度数据并支持一线总线通信。 - 显示模块方案:LCD1602液晶显示屏用于直观地显示测量的温度值。 2. 主要芯片介绍和系统模块硬件设计 - STC89C52:是一款8位微控制器,具有512字节RAM和8KB闪存,适用于多种嵌入式应用。 - nRF24L01:这款无线收发器芯片支持SPI接口,工作在2.4GHz ISM频段,具备多种工作模式,可灵活配置以适应不同功耗需求。 - DS18B20:具有内置温度传感器,能够直接输出数字信号,无需额外ADC转换。 - LCD1602:16x2字符型液晶显示器,用于显示温度信息,通过I2C或SPI接口与单片机通信。 3. 系统软件设计 - 单片机软件设计包括发送端和接收端程序,负责采集温度数据、无线传输以及接收和显示温度值。 - 发送端软件设计:主要任务是读取DS18B20的温度数据,并通过nRF24L01发送至接收端。 - 接收端软件设计:接收来自发送端的无线信号,解析温度数据并在LCD1602上显示。 4. 系统仿真 - 对电源电路进行了仿真,确保系统正常供电。 - 发送端仿真了温度采集和无线发射的过程。 - 接收端仿真了LCD1602接收到无线信号并显示温度数据的流程。 5. 硬件电路板设计 - 设计了完整的电路板布局,包括单片机、无线模块、温度传感器和显示模块,确保所有组件之间的连接正确无误。 该设计着重于系统的实用性和经济性,通过巧妙地结合各种硬件组件,实现了稳定、低功耗的无线温度测量。对于需要远程监控温度的应用场景,如工业环境、医疗设备或智能家居,这样的系统提供了理想的解决方案。
2011-07-18 上传
温度计的程序,基于c8051.#include<reg51.h> #define uchar unsigned char typedef unsigned char unchar; typedef unsigned int unint; Init_DS18B20(void) //DS18B20温控芯片初始化 { unchar x = 0; DQ = 1; //DQ复位信号 CDelay(8); //延时 DQ = 0; //将DQ电平拉低 CDelay(80); //延时大于480us DQ = 1; //将DQ电平拉高 CDelay(14); //延时 x = DQ; //如果x=0则初始化成功,x=1则初始化失败 CDelay(20); //延时 } unint ReadTemperature(void) //读取温度 { unchar L = 0; //定义温度低八位 unchar H = 0; //定义温度高八位 unint temp = 0; Init_DS18B20(); //温度传感器DS18B20初始化 WriteOneChar(0xCC); // 忽略ROM指令 WriteOneChar(0x44); // 温度转换指令 Init_DS18B20(); WriteOneChar(0xCC); //忽略ROM指令 WriteOneChar(0xBE); //读暂存器指令 读取9字节 前两个就是温度 L = ReadOneChar(); //读取温度值低位 H = ReadOneChar(); //读取温度值高位 temp=H; temp<<=8; temp = temp|L; return(temp); } ReadOneChar(void) //读一个字节 { unchar i = 0; unchar dat = 0; for(i=8;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) { dat |= 0x80; } CDelay(4);//延时 } return(dat); //返回dat值 } WriteOneChar(unchar dat) //写一个字节 { unchar i = 0; for(i=8;i>0;i--) { DQ = 0; //低电平脉冲信号 DQ = dat&0x01; CDelay(5);//延时 DQ = 1; //高电平脉冲信号 dat >>= 1;//dat右移一位 } CDelay(4); } JudTemp(unint tem) //判定温度 { unchar temp=tem>>4; if(temp>=31) { Bee=0; P0=0x40; P1=6; CDelay(100); P0=0x76; P1=7; P1_6=1; } else { Bee=1; P0=0x40; P1=6; CDelay(100); P0=0x38; P1=7; } } void DisplayTemperture(unint tem) //温度显示 { unchar t2=(tem>>4)&0xff; unchar t1=tem&0xff; P0 = Code[t2/10]; P1 =2; CDelay(100); P0=Code[(t2%10)]; DT=1; P1=1; CDelay(100); P0=Code[t1%10]; P1=0; CDelay(100); } //温度显示 if(i==2) { unint temp; temp = ReadTemperature(); DisplayTemperture(temp); JudTemp(temp); }