资源描述
电子信息工程《专业基础课程设计》研究报告
多路温度测量系统设计
中国·大庆
年 月
信息技术学院
课 程 设 计 任 务 书
一、课程设计课题:
多路温度测量系统设计
二、课程设计工作日自 年 月 日至 年 月 日
三、课程设计进行地点:
四、 程设计任务要求: (详细内容见课程设计文档)
1.课题来源:
教师下发
2.目的意义:
1、培养理论联系实际的正确思想,训练综合应用已经学过的理论知识和生产实际知识去综合解决工程实际问题的能力。
2、学习较复杂电子系统设计的一般方法,了解和掌握模拟、数字电路等知识解决电子信息方面常见实际问题的能力,由有学生自行设计和调试。
3、进行基本技能和技术训练,如掌握设计资料、手册、标准和规范以及使用绘图软件和仿真软件等。
3.基本要求:
1、能够通过相应的气体传感器实时检测室内的煤气、天然气信息,具有显示功能;2、当煤气和天然气浓度高于设定界限值时自动报警(声光报警),提醒用户燃气泄漏;3、设计键盘,能够输入界限浓度值;4、主要单元电路和元器件参数选择;5、用绘图软件画出总体电路图;6、提交格式符合要求,内容完整的设计报告。
课程设计评审表
指导教师评语:
成绩: 签字: 日期:
II
08电信2微机设计性实验报告
1 设计任务和要求
1.1 课题研究的背景和意义
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。
目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和medwin v3.0软件对设计电路进行综合虚拟仿真,实现了温度实时测量和显示。
1.2 本设计的主要要求
采用单片机80C51实现八路温度检测 。
要求温度范围0℃~100℃之间。
温度传感器选用模拟和数字的都可以。
在LCD中显示温度。
精度达到±1% 。
分辨率≤0.1℃
根据精度自选A/D转换芯片。
2 方案比较
2.1 采用数字单片智能温度传感器
智能温度传感器(亦称数字温度传感器)是微电子技术、计算机技术和自动测试技术(ATE)的结晶。目前,已开发出多种智能温度传感器系列产品。智能温度传感器内部都包含温度传感器、A/D转换器、信号处理器、存储器(或寄存器)和接口电路。有的产品还带多路选择器、中央控制器(CPU)、随机存取存储器(RAM)和只读存储器(ROM)。智能温度传感器的特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU). 智能温度传感器的总线技术也实现了标准化、规范化,所采用的总线主要有单线(1-WIRE)总线、I2C总线、SMBUS总线和SPI总线。温度传感器作为从机可通过专用总线接口与主机进行通信。智能温度控制器是在智能温度传感器的基础上发展而成的。典型产品有DS18B20,智能温度控制器适配各种微控制器,构成智能化温控系统;它们还可以脱离微控制器单独工作,自行构成一个温控仪。DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55℃~+125℃,在-10℃~+85℃范围内,精度为0.5℃。DS18B20的精度较差为±0.2℃ 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量。如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。
DALLAS 半导体公司的数字化温度传感器DS18B20是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的“DS1820”体积更小、更经济、更灵活。使您可以充分发挥“一线总线”的长处。 DS18B20、 DS1822 “一线总线”数字化温度传感器 。
由于DS18B20将温度传感器、信号放大调理、A/D转换、接口全部集成于一芯片,与单片机连接简单、方便,与AD590相比是更新一代的温度传感器,所以温度传感器采用DS18B20。
2.2 显示器的选择
2.2.1 LED显示器
采用传统的七段数码LED显示器。LED虽然价格便宜,但在现代的许多仪表、各种电子产品中逐渐被LCD所取代。
2.2.2 LCD液晶屏
采用LCD液晶屏进行显示。LCD液晶显示器是一种低压、微功耗的显示器件,只要2~3伏就可以工作,工作电流仅为几微安,是任何显示器无法比拟的,同时可以显示大量信息,除数字外,还可以显示文字、曲线,比传统的数码LED显示器显示的界面有了质的提高。在仪表和低功耗应用系统中得到了广泛的应用。优点为:
1 显示质量高,由于液晶显示器的每一个点收到信号后就一直保持那种色彩和亮度恒定发光,因此液晶显示器的画质高而且不会闪烁。
2 数字式接口,液晶显示器都是数字式的,和单片机的接口简单操作也很方便。
3 功率消耗小,相比而言液晶显示器的主要功耗在内部电极和驱动IC上,因而耗电量比其他器件要小很多。
虽然LCD显示器的价格比数码管要贵,但它的显示效果好,是当今显示器的主流,所以采用LCD 作为显示器。
2.3 采用AT89S51单片机
由于单片机技术在各个领域正得到越来越广泛的应用,世界上许多集成电路生产厂家相继推出了各种类型的单片机,在单片机家族的众多成员中,MCS-51系列单片机以其优越的性能、成熟的技术及高可靠性和高性能价格比,迅速占领了工业测控和自动化工程应用的主要市场,成为国内单片机应用领域中的主流。
单片机的诞生标志着计算机正式形成了通用计算机系统和嵌入式计算机系统两个分支。通用计算机系统主要用于海量高速数值运算,不必兼顾控制功能,其数据总线的宽度不断更新,从8位、16位迅速过渡到32位、64位,并且不断提高运算速度和完善通用操作系统,以突出其高速海量数值运算的能力,在数据处理、模拟仿真、人工智能、图像处理、多媒体、网络通信中得到了广泛应用;单片机作为最典型的嵌入式系统,由于其微小的体积和极低的成本,广泛应用于家用电器、机器人、仪器仪表、工业控制单元、办公自动化设备以及通信产品中,成为现代电子系统中最重要的智能化工具。因此,单片机的出现大大促进了现代计算机技术的飞速发展,成为近代计算机技术发展史上一个重要里程碑。
由于MCS系列单片机集成了几乎完善的中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,这给我们利用单片机提供了极大的便利。单片机把微型计算机的主要部件都集成在一块芯片上,使得数据传送距离大大缩短,运行速度更快,可靠性更高,抗干扰能力更强。由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达到最优化,工作也相对稳定。51的优点是价钱便宜,I/O口多,程序空间大。因此,测控系统中,使用51单片机是最理想的选择。单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。单片机的开发环境要求较低,软件资源十分丰富,开发工具和语言也大大简化。单片机的典型代表是Intel公司在20世纪80年代初研制出来的MCS51系列单片机。MCS51单片机很快在我国得到广泛的推广应用,成为电子系统中最普遍的应用手段,并在工业控制、交通运输、家用电器、仪器仪表等领域取得了大量应用成果。
以MCS-51技术核心为主导的单片机已成为许多厂家、电气公司竞相选用的对象,并以此为基核,推出许多与MCS51有极好兼容性的CHMOS单片机,同时增加了一些新的功能,所以用AT89S51。
3 单元电路设计
3.1 DS18B20
DSl820数字温度计是美国Dallas公司生产的数字温度计,它提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线。DSl820的电源可以由数据线本身提供而不需要外部电源。因为每一个DSl820在出厂时已经给定了唯一的序号,因此任意多DSl820可以存放在同一条单线总线上。这允许在许多不同的地方放置温度敏感器件。DSl820的测量范围从-55到+125,增量值为0.5,可在l s(典型值)内把温度变换成数字。每一个DSl820包括一个唯一的64位长的序号,该序号值存放在DSl820内部的ROM(只读存贮器)中。开始8位是产品类型编码(DSl820编码均为10H)。接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码。图2为DS18B20的实物图。
图2
温度/数据关系(表1)
3.2 AT89C51
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。ATC9C51实物图如图3。主要参数如下:
·与MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存储器
·1000次擦写周
·全静态操作:0Hz-24MHz
·三级加密程序存储器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·6个中断源
·可编程串行UART通道
·低功耗空闲和掉电模式
图3
3.3 LCD1602
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。LCD1602的实物图如图4,主要参数如下:
·显示容量:16×2个字符
·芯片工作电压:4.5—5.5V 图4
·工作电流:2.0mA(5.0V)
·模块最佳工作电压:5.0V
·字符尺寸:2.95×4.35(W×H)m
4 元器件选择
单片机的P0.0、P0.1、P0.7分别与三极管的基极连接来控制控制温度(图4.1)和报警(图5.2)。利用面包板搭了一个PNP9012的偏置电路电路如图4-4。基极输入为“0”时,这时三极管导通推动报警器和控制电路工作,当基极输入为“1”时,三极管不导通,报警器和控制电路都不工作。只要控制单片机的P0.0、P0.1、P0.7口的高低电平就可以控制模拟电路的工作。
5 整体电路
6 电路工作原理
系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后, DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内, 然后与系统进行数据通信, 系统将温度读出并驱动LED 数码管显示。如果温度值低于设定下限值或高于设定上限值, 则自动启动报警装置。
由于DS18B20 单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。该系统结构图
图1
7 困难及解决措施
在做课程设计的过程中遇到了很多以前没有在意的细节问题,在遇到困难后先是去图书馆查资料和请教同学和指导老师。
8 软件设计
8.1 功能概述
本系统的软件由C语言编写,程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。
8.2 系统软件流程图
开始
执行初始化时序
发出跳过ROM匹配命令
启动温度转换
延时750mS等待温度转换完成
执行初始化时序
发 出 匹 配
ROM命令
1
CRC 校 练
正 确?
温度数据格式转换
结束
读 取 便 笺 存 储 器 内
容 并 进 行 CRC 校 练
发 出 读 便 笺
存 储 器 命 令
发出64位序列号
1
N
Y
9 总结与体会
经过一周多的设计以及调试,实现实验的部分设计要求,能读出并显示DS18B20采集的温度,并且能够实现高低温报警,能通过对按键的处理来调节高低温报警温度,使得1条总线上可以同时读取到2个温度传感器的温度值并将其同时显示在液晶屏幕上,液晶屏幕可以清楚地区分2个温度传感器的温度值。
我在这为期一周多的设计性实验中,我们在老师的指导下,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。我希望自己能在今后的深入学习中设计出更好的,力求创新,努力地提升自己,寻求更大的进步!最后用一句话来结束吧。“实践是检验真理的唯一标准”。
10 致谢
在本次课程设计中,不仅自己付出了很多心血,也得到了很多老师和同学的支持,为我创造了很多有利条件,在这里,我要特别感谢我的导师席桂清老师,在课程设计的开始,席老师给了我很多帮助,指导我了解了很多单片机的相关知识,并在当我设计遇到困难时,及时的给予帮助和鼓励,同时,对我其他学科的鼓励也渗透在课程设计的同时,给了我莫大的信心,为我顺利完成课程设计起到了非常重要的作用。同时。我还要感谢实习组及实验室的所有老师,为我的课程设计提供了非常便利的条件。
11 参考文献
1、马建国、孟宪元.电子设计自动化技术基础.清华大学出版 ,2004
2、姜威.实用电子系统设计基础,2008
3、姜威.单片机系统的PROTEUS设计与仿真 ,2007
4、张毅坤、陈善久.单片微型计算机原理及应用.西安电子科技大学
出版社,2003
5、李华.MCS—51系列单片机实用接口技术.北京航空航天大学出版
社,2001
6、潭浩强.C语言程序设计.清华大学出版社,2001
22
附录:程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define data 1000
sbit LEDCLK=P3^4;
sbit LEDDIN=P2^3;
sbit lcd_en=P2^2;
sbit lcd_rw=P2^3;
sbit lcd_rs=P2^4;
sbit key0=P1^0;
sbit key1=P1^1;
sbit led=P1^7;
#define lcd_date P0
uchar code lcdtable[]={"0123456789- "};
uchar code error[12]={"no facility"};
uchar rom_id[3][8]={{0x28,0x56,0x04,0x00,0x00,0x00,0x0,0x9d}
,{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}};
uchar dispbuf[8];
uchar dispbuf1[8];
uint data1=50000;
uchar tem1,tem2,temt1,temt2;
uint temper1;//温度寄存器
uint temper11;
uint temper22;
uint temper2;
uint tempert1;//温度阀值R-min
uint tempert2;//温度阀值R-max
uint tempert11;
uint tempert22;
#define NOP3() _nop_();_nop_();_nop_()
sbit DQ=P3^2;
bit flag_init;//DS18B20是否存在标志
/**************************************************************
延时函数
*功能: 可随意设置延时时间,延时时间为(tt*9+16)us.晶振为12MHz
***************************************************************/
void delay_us(unsigned int tt)
{
while(tt--)
{
;
}
}
/*****************************************************
延时函数
*功能: 可随意设置延时时间,延时时间为tt ms.晶振为12MHz
*****************************************************/
void delay_ms(unsigned int tms)
{
unsigned char i;
while(tms--)
for(i=123;i>0;i--)
;
}
void close_led()
{
uchar i;
for(i=8;i>0;i--)
{
LEDCLK=0;
LEDDIN=1;
_nop_();
LEDCLK=1;
_nop_();
}
}
void Write_com(uchar com)
{
lcd_rs=0;
lcd_date=com;
delay_ms(2);
lcd_en=1;
delay_ms(2);
lcd_en=0;
}
void Write_dat(uchar dat)
{
lcd_rs=1;
lcd_date=dat;
delay_ms(2);
lcd_en=1;
delay_ms(2);
lcd_en=0;
}
void lcd_init()
{
lcd_rw=0;
lcd_en=0;
delay_ms(15);
Write_com(0x38);
delay_ms(5);
Write_com(0x38);
delay_ms(5);
Write_com(0x38);//显示模式设置
Write_com(0x08);//显示关闭
Write_com(0X01);//清屏
Write_com(0x06);//显示光标移动设置
Write_com(0X0c);//显示开及光标设置
}
/****DS18B20初始化**************************************/
void reset()
{
flag_init=1;
EA=0;
DQ=1;
NOP3();
DQ=0;
delay_us(60);//480~960us 556
DQ=1;
delay_us(5);//60us
flag_init=DQ;
delay_us(25);//241us
EA=1;
}
/****写一个字节函数*************************************/
void Write_Byte(uchar dat)
{
uchar i;
DQ=1;
EA=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=(bit)(dat&0x01);
delay_us(5);//61us
DQ=1;
dat>>=1;
}
EA=1;
}
/*****读数据函数*****************************/
uchar Read_Byte()
{
uchar i,date;
date=0;
DQ=1;
EA=0;//关中断
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;
NOP3();
if(DQ)
{
date|=0x80;
}
delay_us(5);//61us
}
EA=1;//开中断
return(date);
}
void match_rom(uchar x)
{
uchar i;
EA=0;
reset();
Write_Byte(0x55);
for(i=0;i<8;i++)
Write_Byte(rom_id[x][i]);
EA=1;
}
void get_tem()
{
uchar teml,temh;
reset();
Write_Byte(0xcc);
Write_Byte(0x44);//启动温度转换
delay_ms(800);//750ms
match_rom(0);
Write_Byte(0xbe);//读取温度转换结果
teml=Read_Byte();
temh=Read_Byte();
temper11=(temh*256+teml);
if(temper11&0x8000)
{
temper1=(~temper11+1)*0.625;
tem1=1;
}
else
{
temper1=(temh*256+teml)*0.625;
tem1=0;
}
match_rom(1);
Write_Byte(0xbe);//读取温度转换结果
teml=Read_Byte();
temh=Read_Byte();
temper22=(temh*256+teml);
if(temper22&0x8000)
{
temper2=(~temper22+1)*0.625;
tem2=1;
}
else
{
temper2=(temh*256+teml)*0.625;
tem2=0;
}
}
update()
{
if(tem1)
{
dispbuf[0]=10;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
else
{
if(temper1/1000)
{
dispbuf[0]=temper1/1000;
dispbuf[1]=temper1%1000/100;
}
else
{
dispbuf[0]=11;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
}
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
if(tem2)
{
dispbuf[4]=10;
if(temper2/100)
dispbuf[5]=temper2/100;
else
dispbuf[5]=11;
dispbuf[6]=temper2%100/10;
dispbuf[7]=temper2%10;
}
else
{
if(temper2/1000)
{
dispbuf[4]=temper2/1000;
dispbuf[5]=temper2%1000/100;
}
else
{
dispbuf[4]=11;
if(temper2/100)
dispbuf[5]=temper2/100;
else
dispbuf[5]=11;
}
dispbuf[6]=temper2%100/10;
dispbuf[7]=temper2%10;
}
}
update_1()
{
if(tempert1/1000)
{
dispbuf1[0]=tempert1/1000;
dispbuf1[1]=tempert1%1000/100;
}
else
{
dispbuf1[0]=11;
if(tempert1/100)
dispbuf1[1]=tempert1/100;
else
dispbuf1[1]=11;
}
dispbuf1[2]=tempert1%100/10;
dispbuf1[3]=tempert1%10;
if(tempert2/1000)
{
dispbuf1[4]=tempert2/1000;
dispbuf1[5]=tempert2%1000/100;
}
else
{
dispbuf1[4]=11;
if(tempert2/100)
dispbuf1[5]=tempert2/100;
else
dispbuf1[5]=11;
}
dispbuf1[6]=tempert2%100/10;
dispbuf1[7]=tempert2%10;
}
ds_inti()
{
led=0;
tempert1=100;
tempert2=600;
}
void disp()
{
Write_com(0xc0);
Write_dat('1');
Write_dat(':');
Write_dat(lcdtable[dispbuf[0]]);
Write_dat(lcdtable[dispbuf[1]]);
Write_dat(lcdtable[dispbuf[2]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf[3]]);
Write_com(0xc9);
Write_dat('2');
Write_dat(':');
Write_dat(lcdtable[dispbuf[4]]);
Write_dat(lcdtable[dispbuf[5]]);
Write_dat(lcdtable[dispbuf[6]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf[7]]);
Write_com(0x80);
Write_dat('L');
Write_dat(':');
Write_dat(lcdtable[dispbuf1[0]]);
Write_dat(lcdtable[dispbuf1[1]]);
Write_dat(lcdtable[dispbuf1[2]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf1[3]]);
Write_com(0x89);
Write_dat('H');
Write_dat(':');
Write_dat(lcdtable[dispbuf1[4]]);
Write_dat(lcdtable[dispbuf1[5]]);
Write_dat(lcdtable[dispbuf1[6]]);
Write_dat('.');
Write_dat(lcdtable[dispbuf1[7]]);
}
key() interrupt 3
{
TH1=(65536-data1)>>8;
TL1=(65536-data1)%256;
if(key0==0)
{
tempert1+=10;
if(tempert1>1280)
tempert1=0;
while(key0==0);
}
if(key1==0)
{
tempert2-=10;
if(tempert2>1280)
tempert2=1280;
while(key1==0);
}
}
init_mcu()
{
TMOD=0x01;
TH1=(65536-data1)>>8;
TL1=(65536-data1)%256;
ET1=1;TR1=1;
EA=1;
}
alarm()
{
if(tem1|tem2)
led=1;
else
{
if((temper1<tempert1|temper1>tempert2)|(temper2<tempert1|temper2>tempert2))
led=1;
else
led=0;
}
}
main()
{
uchar i;
init_mcu();
ds_inti();
close_led();
lcd_init();
while(1)
{
reset();
if(flag_init)//不存在时
{
Write_com(0x80);
for(i=0;i<12;i++)
{
Write_dat(error[i]);
}
}
else//存在时
{
get_tem();
update();
update_1();
disp();
alarm();
}
}
}
展开阅读全文