单片机温度采集显示系统.docx
《单片机温度采集显示系统.docx》由会员分享,可在线阅读,更多相关《单片机温度采集显示系统.docx(20页珍藏版)》请在冰豆网上搜索。
![单片机温度采集显示系统.docx](https://file1.bdocx.com/fileroot1/2023-6/8/99dfde15-2a29-4c05-bd5d-6e59f1200ddb/99dfde15-2a29-4c05-bd5d-6e59f1200ddb1.gif)
单片机温度采集显示系统
考试序列号____
单片机课程设计论文
论文题目:
温度采集显示系统
课程名称:
单片机课程设计
学院物理与光电工程学院
专业班级08电子3班
学号3108009223
姓名梁辉浩
联系方式
任课教师
20年月日
温度采集显示系统
一、功能和要求:
(1)温度测量范围0-99℃。
(2)温度分辨率±1℃。
(3)选择合适的温度传感器。
(4)使用键盘输入温度的最高点和最低点,温度超出范围时候报警。
(报警温度不需要保存)
二、系统方案:
方案一:
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二:
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
三、核心元件的功能
1、AT89C51
AT89S51美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4KBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元。
单片机AT89S51强大的功能可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89C51芯片的引脚结构如图1所示:
1.1功能特性概括:
AT89S51提供以下标准功能:
40个引脚、4KBytesFlash片内程序存储器、128Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编图1程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。
此外,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式,空闲模式,CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。
掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求
1.2管脚说明:
P0口:
P0口为一个8位漏级开路双向I/O口,也即地址/数据总线复用口。
作为输出口用时,能驱动8个TTL逻辑门电路。
对端口写“1”时,被定义为高阻输入。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1口是一个带内部上拉电阻的8位双向I/O口,P1口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I
)。
在Flash编程和程序校验期间,P1接收低8位地址。
部分端口还有第二功能,如表1所示:
端口引脚
第二功能
P1.5
MOSI(用于ISP编程)
P1.6
MISO(用于ISP编程)
P1.7
SCK(用于ISP编程)
表1P1口部分引脚第二功能
P2口:
P2口是一个带有内部上拉电阻的8位双向I/O口,P2口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I
)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据寄存器(例如执行MOVX@Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。
在Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3口:
P3口是一个带有内部上拉电阻的双向8位I/O口,P3口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写“1”时,它们被内部的上拉电阻拉高并可作为输入端口。
作输入口使用时,被外部信号拉低的P3口将用上拉电阻输出电流(I
)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2所示:
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外中断0)
P3.3
(外中断1)
P3.4
T0(定时/计数器0)
P3.5
T1(定时/计数器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
表2P3口引脚第二功能
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上的高电平时间将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFRAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
ALE/:
当访问外部存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
即使不访问外部寄存器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。
值得注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只要一条MOVX和MOVC指令才会激活ALE。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
:
程序存储允许(
)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次
有效,即输出两个脉冲。
当访问外部数据存储器时,没有两次有效的
信号。
EA/VPP:
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需要注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端保持高电平(接VCC端),CPU则执行内部程序存储器中的指令。
Flash存储器编程期间,该引脚用于施加+12V编程电压(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入端。
XTAL2:
反向振荡放大器器的输出端。
2、DS18B20
美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持"一线总线"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
现在,新一代的DS18B20体积更小、更经济、更灵活。
使你可以充分发挥“一线总线”的优点。
新的"一线器件"DS18B20体积更小、适用电压更宽、更经济。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!
性能价格比也非常出色!
继"一线总线"的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20也支持"一线总线"接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3.0V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
2.1DS18B20的主要特性
(1)适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
(9)负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.2DS18B20的内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20引脚定义:
(1)GND为电源地;
(2)DQ为数字信号输入/输出端;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
2.3DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
2.4DS1820使用中注意事项
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。
在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。
2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。
当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
3)连接DS1820的总线电缆是有长度限制的。
试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。
当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。
这种情况主要是由总线分布电容使信号波形产生畸变造成的。
因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。
这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接
四、理论分析与计算
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图8所示。
图8程序流程图
4.2读出温度子程序流程图
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,验有错时
不进行温度数据的改写。
其程序流程图如图9所示
4.3温度转换命令子程序流程图
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图9所示
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。
五、电路与程序设计
5.1、电路图
5.2、程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
bitDS18B20_IS_OK=1;
sbitDQ=P1^4;
sbitBEEP=P1^2;
sbitTEST=P1^7;
sbitjian_di=P1^5;
sbitjia_gao=P1^6;
//数码管位选
sbitge=P1^0;
sbitshi=P1^1;
//设置报警高低温时的按键次数
intkey_counts=0;
//正常读取DS18B20的处理温度
ucharT;
//数码管显示程序,0-空显示的段码,低电平显示
ucharduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
//暂存DS18B20的初始温度值
ucharTemp_Value[2]={0x00,0x00};
//平常温度段缓存
ucharduan_hc[2]={0x00,0x00};
//设置报警温度时的段缓存
ucharcounts_hc[2]={0x00,0x00};
//报警低(20)、高(70)温度
ucharAlarm_Temp[2]={0x14,0x46};
//DS18B20_延迟
voidDelay(intx)
{
while(x--);
}
//延迟一秒
voidDelay_ms(inti)
{
uchart;
while(i--)
{
for(t=0;t<180;t++);
}
}
//初始化DS18B20
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;Delay(8);
DQ=0;Delay(90);
DQ=1;Delay(8);
status=DQ;
Delay(100);
DQ=1;
returnstatus;//成功时返回值为0
}
//读一个字节
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;Delay(30);DQ=1;
}
returndat;
}
//写一个字节
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
}
}
//没设置报警高低温平常温度显示
voidShow()
{
ucharj;
T=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);
duan_hc[1]=T%100/10;
duan_hc[0]=T%10;
for(j=0;j<24;j++)
{
P0=duan[duan_hc[0]];
ge=1;shi=0;
Delay(150);
P0=0XFF;
P0=duan[duan_hc[1]];
ge=0;shi=1;
Delay(150);
P0=0XFF;
}
}
//读取DS18B20的实时温度值
voidRead_Temperature()
{
ucharj;
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
Show();
}
}
//设置报警高低温度时的温度显示
voidShow_Temperature()
{
ucharj;
counts_hc[1]=key_counts%100/10;
counts_hc[0]=key_counts%10;
for(j=0;j<24;j++)
{
P0=duan[counts_hc[0]];
ge=1;shi=0;
Delay(150);
P0=0XFF;
P0=duan[counts_hc[1]];
ge=0;shi=1;
Delay(150);
P0=0XFF;
}
}
//设置报警高低温
voidgao_di()
{
ucharkey;
P3=0xFF;
key=0xFF;
key=P3;
Show_Temperature();
if(key!
=0xFF)
{
Show_Temperature();
if(key!
=0xFF)
{
switch(key)
{
case0xFD:
if(key_counts<99)key_counts++;break;
case0xFB:
if(key_counts<99){Alarm_Temp[1]=key_counts;jia_gao=1;}break;
case0xF7:
if(key_counts<99)key_counts--;break;
case0xEF:
if(key_counts<99){Alarm_Temp[0]=key_counts;jian_di=1;}break;
}
}
}
}
//报警
voidAlarm()
{
if((Alarm_Temp[0]>=T)||(T>=Alarm_Temp[1]))
{BEEP=0;TEST=1;}
else
{BEEP=1;TEST=0;}
}
voidmain()
{
while
(1)
{jia_gao=0;jian_di=0;
while
(1)
{
Read_Temperature();
Alarm();
P3=0XFF;
if((P3&0XFF)==0XFE)
{Delay(50);
if((P3&0XFF)==0XFE)
{
while((P3&0XFF)==0XFE);
break;
}
}
}
BEEP=1;
while
(1)
{
gao_di();
P3=0XFF;
if((P3&0XFF)==0XFE)
{Delay(50);
if((P3&0XFF)==0XFE)
{
while((P3&0XFF)==0XFE);
break;
}
}
}
}
}
六、总结
本系统采用采用单片机和数字温度转换器DS18B20来实现,具有主机接口简单,结构灵活,调试方便等特点,实验结果表明这种测温系统转换速度快、精度高。
回顾起此次课程设计,我们感慨颇多,从选题到定稿,从理论到实践,在整整这些日子里,可以说得是苦多于甜,但是可以学到很多东西。
这次实习不仅巩固了以前所学过的知识,而且学到了很多在书本上没有的知识。
通过这次课程设计,我们得到了一些工程项目知识,懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中,我们经常遇到问题,可以说是困难重重,这毕竟第一次做,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
虽然课程设计过去了,但此次课程设计暴露了我不少问题,虽然在课堂上我学了不少东西,但当付诸于实际时却摸不着头脑,所以我们不但要学习知识,还要在实践中运用知识,做到游刃有余。
不管是在以后的工作或学习中,我都会全力以赴,积极思考,勇于探索,不断创新。
我想在以后我会继续查找各方面资料、请教老师、与同学共同探讨,一起来解决更加更深的问题。
同时在以后的日子里我会慢慢改正并提升在这次课程设计的功能、把学过的知识掌握的更加牢固。