单片机基于AT89C51的温度采集与显示系统设计.docx
- 文档编号:8115320
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:14
- 大小:97.90KB
单片机基于AT89C51的温度采集与显示系统设计.docx
《单片机基于AT89C51的温度采集与显示系统设计.docx》由会员分享,可在线阅读,更多相关《单片机基于AT89C51的温度采集与显示系统设计.docx(14页珍藏版)》请在冰豆网上搜索。
单片机基于AT89C51的温度采集与显示系统设计
基于AT89C51的温度采集与显示系统设计
摘要:
以AT89C51单片机为核心控制元件介绍了与DS18B20和MAX7219显示驱动组成的温度采集系统的设计方案利用单片机空余I/O口以及上述元件的特性,构成该系统。
通过Proteus进行仿真。
关键词:
温度采集,AT89C51,DS18B20,MAX7219
目录
1、系统概述……………………………………………………………….
2、硬件介绍……………………………………………………………….
3、软件设计……………………………………………………………….
4、仿真结果……………………………………………………………….
5、小结…………………………………………………………………….
6、参考文献……………………………………………………………….
1、系统概述
温度传感器选用目前常用的数字温度传感器DS18B20,采用数码LED显示,显示驱动为MAX7219,
首先设计系统的总体原理图如下:
系统可以简单地分为为5个模块,由外部提供8V-24V直流电源供电。
电源模块将输入8-24V的电源电压转换为5V,为系统中的芯片供电,可以使用7805等常用的三端稳压器芯片;温度传感器采集温度信号,温度传感器有模拟输出和数字输出两种形式,这里选择具有数字输出的DS18B20;单片机是系统的核心,选用AT89C51;系统采用LED数码显示器显示温度值,LED显示屏采用独立的显示驱动芯片MAX7219,单片机将待显示的字符写入MAX7219后,MAX7219将会动态的刷新显示内容,无需占用单片机过多的资源。
尽管DS18B20的分辨率可已达到0.0625°C,但测量精确度为0.5°C,因此设计4位数的LED数码显示管就可以了,显示3位整数,1位小数。
2、硬件介绍:
1、数字温度传感器DS18B20
DS18B20数字温度计提供9位-24位(二进制)温度读数,以指示器件的温度,数据经过单线接口送入DS18B20或从DS18B20送出,因此从主机CPU到DS18B20仅需要一条DQ。
DS18B20的电源可以外部提供从芯片的VDD输入,也可以有数据线本身提供而无需再接外部电源,
每一个DS18B20都有唯一的64位长的序号,因此可以将多个DS18B20接到同一根单线总线上,独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
测温范围-55℃~+125℃,固有测温分辨率0.5℃。
支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温,工作电源:
3-5V/DC,在使用中不需要任何外围元件,测量结果以9-12位数字量方式串行传送,PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
温度传感器可编程的分辨率为9-12位温度转换为12位数字格式最大值为750毫秒,DS18B20的数字温度计提供9至12位,信息从DS18B20通过1线接口,中央微处理器与DS18B20只有一个一条口线连接。
为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个DS18B20可以同时存在于一条总线。
这使得温度传感器放置在许多不同的地方。
它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
8引脚封装TO-92封装,51接地接地,42数字信号输入输出,一线输出:
源极开路,33电源可选电源管脚。
DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
主要首先提供以下功能命令之一:
1)读ROM,2)ROM匹配,3)搜索ROM,4)跳过ROM,5)报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。
一个控制功能指挥指示DS18B20的演出测温。
测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。
温度报警触发器TH和TL都有一字节EEPROM的数据。
如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。
在片上还载有配置字节以理想的解决温度数字转换。
写TH,TL指令以及配置字节利用一个记忆功能的指令完成。
通过缓存器读寄存器。
所有数据的读,写都是从最低位开始。
DS18B20的存储器包括高速暂存器RAM和可电擦除RAM,可电擦除RAM又包括温度触发器TH和TL,以及一个配置寄存器。
存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。
当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中。
当修改过寄存器中的数时,这个过程能确保数字的完整性。
主CPU经DQ向DS18B20发送温度测量等命令,DS18B20将测量的温度值存放在DS18B20的ARM的字节0和字节1中,命令CCh,跳过ROM。
该命令ROM中的64位长序号,再用时对其简化编程。
命令44h是温度转换。
命令BEh,读RAM存储器
2、AT89C51单片机与DS18B20的接口:
在AT89C51单片机和DS18B20的连接过程中,单片机的任一I/O接口都可与DS18B20连接,设计中是将DS18B20的数据引线DQ与单片机的P1.7相连DS18B20使用外接电源,R1为上拉电阻。
只占用单片机的一个I/O接口,每个DS18B20都可以设置成数据总线和外部供电两种供电方式,采用总线供电可以减少一根导线,但测量时间较长,而外部供电测量速度较快。
AT89C51与DS18B20连接的电路原理图
DS18B20的初始化是由单片机控制的,主机发出一个复位脉冲接着释放总线并进入接收状态,DS18B20会在检测到的上升沿后等待15-60us,然后发送一个低电平的脉冲响应主机,接下来初始化完成。
接下来在对DS18B20进行写时序和读时序操作即完成对DS18B20的设置。
3、AT89C51单片机读取DS18B20温度值的编程操作
DS18B20使用外部供电方式,在转换进行时DS18B20会占用总线,完成后在释放,因此可直接检测总线的状态即可,在读数时只需读出存储器的前两个字节。
单片机对DS18B20写入的第一个字节的程序为write_18B20(unsignedchardat).待写入的字节定义为dat.单片机向DS18B20写入命令字节从最低为开始,逐位写入。
先令P1.7口味高电平,即保证总线处于高电平状态,延迟一段时间后开始进行写数据的操作,令P1.7为低电平开始向DS18B20写入数据。
Dat的最低位是否为1,若为1则让P1.7口为高电平及传送1否则保持低电平状态出送0,然后将dat的字节右移一位为下次传送做好准备,重复8次就可将命令写入了。
在对DS18B20的程序读取时的第一个字节为unsignedcharread_18B20(void),返回一个字节数据,DS18B20的输出也是从最低位开始的,逐位输出,先定义一个无符号变量dat存储来自DS18B20的数据,然后开始读取,先令P1.7口为高电压,延迟一段时间后开始进行读操作,将dat清0,判断总线状态,如为1则最高位存放1,否则不对dat操作,当下一次dat右移时存放0,同样重复8次即可完成一个字节的读取,
单片机采集DS18B20中温度值的操作顺序:
1、初始化DS18B20
2、跳过ROM[CCh]
3、温度转换[44h]
4、等待温度转换的完成
5、初始化DS18B20
6、跳过ROM[CCh]
7、读暂存存储器[Beh]
程序段如下:
Init18B20();//初始化18B20
Write_18B20(0xCC);//执行skip命令,直接进入功能命令
Write_18B20(0x44);//温度转换
While(P1_7=0);//等待18B20转换完成
Init18B20();//复位
Write_18B20(0xCC);//执行skip命令,直接进入功能命令
Write_18B20(0xBE);//读取温度寄存器
Lowbyte=read_18B20();//读取温度值低字节
Highbyte=read_18B20();//读取温度高字节
在使用读取温度值命令[BEh],读入温度存储器[Beh]TH、TL前,应使用温度转换命令启动DS18B20的温度转换[44h],才能保证读入的是当前的温度值,在转换完成后用skipROM[CCh]命令直接进入readTemperature[BEh]命令,读取温度值。
然后将读取的温度值存入设置好的lowbyte和highbyte中。
4、显示驱动芯片MAX7219
该设计中使用的是七段LED数码显示器来显示温度值,LED采用MAX7219进行驱动,将显示的温度值通过单片机处理后送到MAX7219驱动LED进行显示,MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
MAX7221与SPI™、QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。
一个方便的四线串行接口可以联接所有通用的微处理器。
每个数据可以寻址在更新时不需要改写所有的显示。
MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。
整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
在应用时要求3V的操作电压或segmentblinking,
MAX7219封装图
MAX7219是共阴极显示驱动器,ISET通过一个电阻与电源相连,以提供给LED段的峰值电流,V+接+5V电源端,为MAX7219供电。
SEGA-SEGG和SEGDP为LED七段显示器段和小数点驱动端,SEGA-SEGG分别对应LED七段显示器的A-G段的显示,SEGDP对应小数点的显示
DIG0-DIG7为8位数字驱动线,输出位选信号分别连接8个LED数码管,用于动态扫描8个LED数码管的显示。
本设计选用LED显示是因为它的内在特征决定了它是最理想显示材料,LED基本上是一块很小的晶片被封装在环氧树脂里面,所以它非常的小,非常的轻。
LED耗电相当低,一般来说LED的工作电压是2-3.6V。
工作电流是0.02-0.03A。
它消耗的电能不超过0.1W。
LED使用冷发光技术。
直流驱动,超低功耗(单管0.03-0.06瓦)。
LED是低压微电子产品,可成功融合计算机技术、网络通信技术、图像处理技术、嵌入式控制技术等,具有在线编程,灵活多变的特点。
MAX7219提供串行接口与单片机相连,DIN为串行数据输入端,CLK为串行时钟输入端,DOUT为串行数据输出端,在级联时传到下一片MAX7219的DIN端,LOAD为装入数据控制端,单片机每次用串行方式向MAX7219传送16位信息。
可以设置MAX7219的每一个位码工作在BCD译码或非BCD译码两种方式,BCD译码方式适用于驱动LED数码管;非BCD译码方式适用于驱动条形显示器,采用BCD码时,编程相对简单,在采用BCD码方式时,要在指定的位码上显示字符,只要按照BCD码字符表将字符代码写入相应的位码寄存器就可以了,在扫描范围寄存器设置显示数据位的个数。
在该寄存器的低3位(D0-D2)指定要扫描的位码数,高5位(D3-D7)取任意值,在关断寄存器中D1-D7任意,D0为0关闭显示器,寄存器数据不变D1为1,正常显示,在采用数字控制方式时,可通过寄存器D3-D0来控制LED段电流的平均值从而控制LED的亮度。
显示器测试寄存器用于检测个LED段的好坏。
5、AT89C51单片机与MAX7219的接口与编程
MAX7219提供串行接口与单片机相连,DIN为串行数据输入端,CLK为时钟输入端,单片机与MAX7219使用同步串行方式进行通信,直接使用AT89C51的I/O与MAX7219相连。
连线原理图如下:
AT89C51的LED显示电路
每次向MAX7219传送16bit的数据,其中高8bit是地址信息,低8bit是相应的寄存器中要写入的数据,在使用MAX7219之前要对其初始化,设置MAX7219的译码方式、扫描范围等寄存器参数,显示的数据为4位的十进制数,包含一位小数,为了避免浮点数,将该数乘以10后在子程序display7219(bit neg,unsigned int dis_dat)中进行显示,当变量neg等于1代表dis_dat的数为负值,相反当变量neg等于0时代表dis_dat的数据为正值,dis_dat为绝对值,是显示数据的10倍,使用LED数码管的digit0-digit3位码显示dis_dat的4位十进制数据,digit1位码一定有小数,当neg等于0,则LED的digit3位码显示-,否则显示dis_dat的最高位,显然数据范围是-99.9――999.9
6、温度的采集处理与显示程序
lowbyte和highbyte中包含了检测温度的信息需要在编写数据处理程序从lowbyte和highbyte的二进制数据中求得温度的十进制数据,保留一位小数,处理的过程分为符号为处理和小数位、整数位处理,温度值采用绝对值加符号位的表示方法,用整数数据变量存放温度的绝对值的10倍,用符号位变量来存放温度的符号,以区分正负温度。
其中在符号为的处理过程中只要判断highbyte的高4位的数据就可得符号位,若高4位是1则符号位为负,在全局位变量neg_mark中标记1,由于lowbyte和highbyte的数据为其补码将其转换为绝对温度值的形式,若高4位全为0则符号位正,
DS18B20实现显示功能的原理图
程序段如下:
if((highbyte&0xF0)==0xF0)//判断符号位
{
neg_mark=1;//标记为负数
highbyte=-highbyte+1;//若为负数取原码
lowbyte=-lowbyte+1;
}
else{
neg_mark=0;}
在处理小数部分的时候,lowbyte变量中存储了DS18B20的byte0中的数据,低4位表示温度值的小数用加权法求出温度值的小数部分四舍五入。
程序如下:
if(lowbyte&0x01!
=0)temfrac=6;//bit0的权为0.06°C
lowbyte=lowbyte>>1;//右移1位为判断bit1做准备
if(lowbyte&0x01!
=0)temfrac+=13;//bit1的权为0.13°C
lowbyte=lowbyte>>1;
if(lowbyte&0x01!
=0)temfrac+=25;//bit2的权为0.25°C
lowbyte=lowbyte>>1;
if(lowbyte&0x01!
=0)temfrac+=50;//bit3的权为0.5°C
temfrac+=5;//对小数四舍五入
temfrac=temfrac/10;//只保留一位小数
整数部分可以直接使用
3、软件设计
程序如下:
#include
unsignedinttem;
bitneg_mark;
sbitmax7219_load=P1^4;
sbitmax7219_din=P1^5;
sbitmax7219_clk=P1^6;
sbitDQ18B20=P1^7;
voiddelay(unsignedchari)
{unsignedcharj;
while(i--)j++;
}
voidwrite7219_data(unsignedcharcomm,unsignedchardat)
{unsignedchari,j;
#definehigh_V1;
#definelow_V0;
max7219_load=high_V;
max7219_clk=low_V;
max7219_load=low_V;
for(i=0;i<2;i++)
{
if(i==1)comm=dat;
for(j=0;j<8;j++)
{delay(5);
max7219_clk=low_V;
if(comm&0x80)
{max7219_din=high_V;
}
else
{max7219_din=low_V;
}
delay(5);
max7219_clk=high_V;
delay(5);
comm=comm<<1;
}
}
max7219_load=high_V;
}
voidinit_7219(void)
{write7219_data(0x0f,0x00);
write7219_data(0x0b,0x07);
write7219_data(0x0c,0x01);
write7219_data(0x0a,0x08);
write7219_data(0x09,0xff);
}
voiddisplay7219(bitneg,unsignedintdis_dat)
{unsignedchardis_b;
if(neg==1)
{write7219_data(0x04,0x0a);
}
else
{dis_b=dis_dat/1000;
dis_dat=dis_dat%100;
write7219_data(0x04,dis_b);
}
dis_b=dis_dat/100;
dis_dat=dis_dat%100;
write7219_data(0x03,dis_b);
dis_b=dis_dat/10;
dis_b=dis_b|0x80;
write7219_data(0x02,dis_b);
dis_b=dis_dat%10;
write7219_data(0x01,dis_b);
}
voidInit18B20()
{unsignedchari=0;
EA=0;
DQ18B20=1;
delay
(1);
DQ18B20=0;
delay(49);
DQ18B20=1;
i=0;
while(DQ18B20==1);
EA=1;
}
voidwrite_18B20(unsignedchardat)
{chari,j;
EA=0;
DQ18B20=1;
delay
(1);
for(i=0;i<8;i++)
{DQ18B20=0;
j=0;
if(dat%2==1)
{DQ18B20=1;
}
dat=(dat>>1);
delay(22);
DQ18B20=1;
delay
(1);
}
EA=0;
}
unsignedcharread_18B20(void)
{unsignedchari,j;
unsignedchardat;
EA=0;
dat=0x00;
for(i=0;i<8;i++)
{DQ18B20=1;
delay
(1);
dat=(dat>>1);
DQ18B20=0;
j=0;
DQ18B20=1;
j++;
if(DQ18B20==1)dat=dat|0x80;
delay
(1);
DQ18B20=1;
}
return(dat);
}
unsignedintread_temperature(void)
{unsignedcharlowbyte;
unsignedcharhighbyte;
unsignedchartemfrac;
EA=0;
lowbyte=0x00;
highbyte=0x00;
Init18B20();
write_18B20(0xCC);
write_18B20(0x44);
while(DQ18B20==0);
Init18B20();
write_18B20(0xCC);
write_18B20(0xBE);
lowbyte=read_18B20;
highbyte=read_18B20;
if((highbyte&0xF0)==0xF0)
{neg_mark=1;
highbyte=~highbyte+1;
lowbyte=~lowbyte+1;
}
else
{neg_mark=0;
}
if(lowbyte&0x01!
=0)temfrac=6;
lowbyte=lowbyte>>1;
if(lowbyte&0x01!
=0)temfrac+=13;
lowbyte=lowbyte>>1;
if(lowbyte&0x01!
=0)temfrac+=25;
lowbyte=lowbyte>>1;
if(lowbyte&0x01!
=0)temfrac+=50;
temfrac+=5;
temfrac=temfrac/10;
highbyte=highbyte<<4;
tem=highbyte|(lowbyte>>4);
tem=tem*10;
tem=tem+temfrac;
return(tem);
}
voidmain(void)
{unsignedintwendu;
init_7219();
EA=0;
while
(1)
{wendu=read_temperature();
display7219(neg_mark,wendu);
delay(500);
}
}
4、仿真结果
5、结束语:
本系统基于AT89C51单片机为开发平台,通过对单线可编程温度传感器DS18B20的特性、内部结构、工作流程进行深入研究,结合相应的软、硬件设计,在此基础上设计了温度控制系统,与传统的装置相比,具有主机接口简单,结构灵活,调试方便等特点,实验结果表明这种测温系统转换速度快、精度高。
此外,在原有系统的基础上进行修改就可实现DS18B20的多点测量,是有方便。
6、参考文献:
1、单片机原理及接口技术(第3版)李朝青北京航空航天大学出版社
2、基于单片机的自适应温度控制系统叶丹
3、DS18B20的硬件连接与软件编程、传感器世界周月霞、孙传友
4、单片机应用系统设计何立民北京航空航天大学出版社
5、单片机原理及接口陈忠平清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 基于 AT89C51 温度 采集 显示 系统 设计