温度采集存储显示.docx
- 文档编号:16250613
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:46
- 大小:270.33KB
温度采集存储显示.docx
《温度采集存储显示.docx》由会员分享,可在线阅读,更多相关《温度采集存储显示.docx(46页珍藏版)》请在冰点文库上搜索。
温度采集存储显示
单片机课程设计
设计课题:
基于单片机实现数据存储器
专业班级:
电子信息工程11级
(2)班
小组组号:
第12组
小组成员:
崔红娟2011508208
宋月2011508209
赵旭2011508210
钟兴凯2011508211
单卓2011508212
指导老师:
刘恩博
设计时间:
2014年7月1日—10日
信息科学与技术学院
2014年7月10日
目录
一、设计任务与要求3
二、方案设计与论证3
2.1总体分析3
2.2原理框图3
2.3主要元器件4
三、单元电路设计与参数计算8
3.2时钟模块8
3.3显示模块9
3.4存储模块10
3.5控制模块10
3.6温度模块10
四、总原理图,元器件清单11
4.1总原理图11
4.2元件清单12
五、软件设计与调试12
六、结论与心得32
6.1总结32
6.2实训心得32
七、参考文献33
附录:
34
PCB图:
34
实物照片:
35
基于单片机实现数据存储器
一、设计任务与要求
1、通过DS18B20采集当前温度
2、通过键盘设置采集次数(>=10),间隔时间合理
3、将采集温度数据和采集时间显示在液晶屏上,第一行显示采集时间,第二行显示采集温度
4、具有休眠状态,即采集时间(次数)结束后,不在采集数据和显示。
二、方案设计与论证
2.1总体分析
通过DS18B20温度传感器采集温度,DS1302进行计数,采集次数的数据存储在24C02B中,用开关进行控制。
将采集温度数据和采集时间显示在液晶屏上,第一行显示采集时间,第二行显示采集温度。
2.2原理框图
图2.1原理框图
2.3主要元器件
A.DS18B20(数字温度传感器):
引脚说明:
GND:
电源地
DQ:
数字信号输入/输出端
VDD:
外接供电电源输入端(在寄生电源接线方式时接地)
图2.2DS18B20
DS18B20概述:
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
DS18B20工作原理:
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的特点:
(1)只要求一个I/O 口即可实现通信。
(2)在DS18B20 中的每个器件上都有独一无二的序列号。
(3)实际应用中不需要外部任何元器件即可实现测温。
(4)测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃;
(5)数字温度计的分辨率用户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;
(6)内部有温度上、下限告警设置。
DS18B20测温操作:
DS18B20的核心功能是它的直接读数字的温度传感器。
温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。
在上电状态下默认的精度为12位。
DS18B20启动后保持低功耗等待状态;当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。
在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。
当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”,DS18B20正在温度转换中返回0,转换结束返回1。
如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。
B.DS1302:
各引脚的功能为:
X1X2:
32.768KHz晶振管脚
GND:
地
RST:
复位脚
Vcc1:
主电源
Vcc2:
备份电源
图2.3DS1302
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:
串行时钟,输入,控制数据的输入与输出
I/O:
三线接口时的双向数据线
CE:
输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。
DS1302概述:
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
DS1302的工作原理:
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。
数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。
时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
C.AT24C02:
各引脚的功能为:
A0 A1 A2:
器件地址选择
SDA:
串行数据/地址
SCL:
串行时钟
WP:
写保护
Vcc:
+1.8V—6.0V 工作电压
GND:
地
图2.4AT24C02
引脚说明:
串行时钟信号引脚行时钟信号引脚(SCL):
在SCL输入时钟信号的上升沿将数据送入EEPROM器件,并在时钟的下降沿将数据读出。
串行数据输入串行数据输入//输出引脚输出引脚(SDA):
SDA引脚可实现双向串行数据传输。
该引脚为开漏输出,可与其它多个开漏输出器件或开集电极器件线或连接。
器件器件//页地址脚地址脚(A2,A1,A0):
A2、A1和A0引脚为24C01与24C02的硬件连接的器件地址输入引脚。
24C01在一个总线上最多可寻址八个1K器件,24C02在一个总线上最多可寻址八个2K器件,A2、A1和A0内部必须连接
写保护(WP)引脚:
具有用于硬件数据写保护功能的引脚。
当该引脚接GND时,允许正常的读/写操作。
当该引脚接VCC时,芯片启动写保护功能
AT24C02概述:
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过IC总线接口进行操作,有一个专门的写保护功能。
三、单元电路设计与参数计算
3.1最小系统模块
图3.1最小系统模块
3.2时钟模块
通过DS1302对系统进行计数,与晶振X2,LED-BIGY及地,最后连接在单片机的P1口。
图3.2时钟模块
3.3显示模块
用LED显示器显示时间及温度,电源,地及一个排阻,连接在单片机的
P0口。
图3.3显示模块
3.4存储模块
用一个24C02B实现次数的存储,SDA和SCK连接两个电阻R3和R4到单片机的P2.0和P2.1口。
图3.4存储模块
3.5控制模块
用四个开关实现功能的控制,K1实现采集次数加1,K2实现采集次数减1,K3实现开始采集,K4实现查看结果的功能。
K1~K4分别连接到单片机的P3.0~P3.3口。
图3.5控制模块
3.6温度模块
通过DS18B20度传感器实现温度的采集,连接电源,地,及电阻到单片机的P3.7口。
图3.6温度模块
四、总原理图,元器件清单
4.1总原理图
图4.1总原理图
4.2元件清单
序号
型号
主要参数
数量
备注
1
AT89C51
1
cpu
2
DS18B20
1
温度传感器
3
DS1302
1
时钟模块
4
AT24C02B
1
存储器
5
LCD1602
1
显示器
6
RESPACK-8
10k
1
排阻
7
Res
10k,5k,
4
电阻
8
CAP
15pf,20uf
3
电容
9
CRYSTAL
12MHZ
1
晶振
10
BUTTON
4
按键开关
表4.1元件清单
五、软件设计与调试
1.LCD头文件
#ifndef__LCD_H_
#define__LCD_H_
#defineLCD1602_4PINS
#include
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
#defineLCD1602_DATAPINSP0
sbitLCD1602_E=P2^7;
sbitLCD1602_RW=P2^5;
sbitLCD1602_RS=P2^6;
/*在51单片机12MHZ时钟下的延时函数*/
voidLcd1602_Delay1ms(uintc);//误差0us
/*LCD1602写入8位命令子函数*/
voidLcdWriteCom(ucharcom);
/*LCD1602写入8位数据子函数*/
voidLcdWriteData(uchardat);
/*LCD1602初始化子程序*/
voidLcdInit();
#endif
2.LCD驱动程序
#include"lcd.h"
voidLcd1602_Delay1ms(uintc)//误差0us
{
uchara,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能
LCD1602_RS=0;//选择发送命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//放入命令
Lcd1602_Delay1ms
(1);//等待数据稳定
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_E=0;//使能清零
LCD1602_RS=0;//选择写入命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
//Lcd1602_Delay1ms
(1);
LCD1602_DATAPINS=com<<4;//发送低四位
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E=0;
}
#else
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_E=0;//使能清零
LCD1602_RS=1;//选择写入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
LCD1602_DATAPINS=dat<<4;//写入低四位
Lcd1602_Delay1ms
(1);
LCD1602_E=1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif
#ifndefLCD1602_4PINS
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
}
#else
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点
}
#endif
3.温度传感器头文件
#ifndef__TEMP_H_
#define__TEMP_H_
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
//--定义使用的IO口--//
sbitDSPORT=P3^7;
//--声明全局函数--//
voidDelay1ms(uint);
ucharDs18b20Init();
voidDs18b20WriteByte(ucharcom);
ucharDs18b20ReadByte();
voidDs18b20ChangTemp();
voidDs18b20ReadTempCom();
intDs18b20ReadTemp();
#endif
4.温度传感器驱动程序
#include"temp.h"
voidDelay1ms(uinty)
{
uintx;
for(;y>0;y--)
{
for(x=110;x>0;x--);
}
}
ucharDs18b20Init()
{
uchari;
DSPORT=0;//将总线拉低480us~960us
i=70;
while(i--);//延时642us
DSPORT=1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
i=0;
while(DSPORT)//等待DS18B20拉低总线
{
i++;
if(i>5)//等待>5MS
{
return0;//初始化失败
}
Delay1ms
(1);
}
return1;//初始化成功
}
voidDs18b20WriteByte(uchardat)
{
uinti,j;
for(j=0;j<8;j++)
{
DSPORT=0;//每写入一位数据之前先把总线拉低1us
i++;
DSPORT=dat&0x01;//然后写入一个数据,从最低位开始
i=6;
while(i--);//延时68us,持续时间最少60us
DSPORT=1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat>>=1;
}
}
ucharDs18b20ReadByte()
{
ucharbyte,bi;
uinti,j;
for(j=8;j>0;j--)
{
DSPORT=0;//先将总线拉低1us
i++;
DSPORT=1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi=DSPORT;//读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。
*/
byte=(byte>>1)|(bi<<7);
i=4;//读取完之后等待48us再接着读取下一个数
while(i--);
}
returnbyte;
}
voidDs18b20ChangTemp()
{
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0x44);//温度转换命令
Delay1ms(100);//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
}
voidDs18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
}
intDs18b20ReadTemp()
{
inttemp=0;
uchartmh,tml;
Ds18b20ChangTemp();//先写入转换命令
Ds18b20ReadTempCom();//然后等待转换完后发送读取温度命令
tml=Ds18b20ReadByte();//读取温度值共16位,先读低字节
tmh=Ds18b20ReadByte();//再读高字节
temp=tmh;
temp<<=8;
temp|=tml;
//temp=2500;
returntemp;
}
5.时钟模块头文件
#ifndef__DS1302_H_
#define__DS1302_H_
//---包含头文件---//
#include
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
//---定义ds1302使用的IO口---//
sbitDSIO=P3^4;
sbitRST=P3^5;
sbitSCLK=P3^6;
//---定义全局函数---//
voidDs1302Write(ucharaddr,uchardat);
ucharDs1302Read(ucharaddr);
voidDs1302Init();
intDs1302ReadTime();
//---加入全局变量--//
externucharTIME[7];//加入全局变量
#endif
6.时钟模块驱动程序
#include"ds1302.h"
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年最低位读写位;-------//
ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
---//
//---存储顺序是秒分时日月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 存储 显示
![提示](https://static.bingdoc.com/images/bang_tan.gif)