单片机 课程设计之多点温度测量系统的设计.doc
单片机应用系统设计课 题: 多点温度测量系统的设计 姓 名: 班 级: 学 号: 指导老师: 日 期: 第一章 绪论传统的方法是用温度计等测试器材,通过人工进行检测,对不符合温度要求的库房进行通风和降温等工作。这种人工测试方法费时费力、效率低,且测试的温度误差大,随机性大。防潮、防霉、防腐、防爆是仓库日常工作的重要内容,是衡量仓库管理质量的重要指标。首要问题是加强仓库内温度与湿度的监测工作。因此我们需要一种造价低廉、使用方便且测量准确的温湿度测量仪。第二章 方案传感器是实现测量与控制的首要环节,是测控系统的关键部件,如果没有传感器对原始被测信号进行准确可靠的捕捉和转换,一切准确的测量和控制都将无法实现。工业生产过程主要依靠各种传感器来检测和控制生产过程中的各种参量,使设备和系统正常运行在最佳状态,从而保证生产的高效率和高质量。2.1 传感器的选择 (1)DSl8820的特点DSl8820是美国Dallas半导体公司继DSl820之后最新推出的一种改进型智能数字温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过编程实现912位的数字值读数方式;可以分别在9375ms和75O ms内完成9位和12位的数字量;从DSl8820读出信息或写入DSl8820信息仅需要1根口线(单线接口);温度变换功率来源于数据总线,总线本身也可以向所挂接的DSl8820供电,而无需额外电源。使用DSl8820可使系统结构更趋简单,可靠性更高。DSl8820在测温精度、转换时间、传输距离、分辨率等方面较DSl820有了很大的改进。(2)DSl8820内部结构及工作原理DSl8820的内部结构如图1所示,主要包括寄生电源电路、64位只读存储器(ROM)和单线接口、存储器和控制逻辑、存放中间数据的高速暂存存储器、温度传感器、报警上限寄存器TH、报警下限寄存器TL、配置寄存器和8位CRC(循环冗余校验码)发生器。22 AT89C51单片机AT89C51单片机是ATMEL公司生产的高性能8位单片机,主要功能特性如下:兼容MCS-51指令系统;32个双向I/O口,两个16位可编程定时/计数器;1个串行中断,两个外部中断源;可直接驱动LED;低功耗空闲和掉电模式;4 kB可反复擦写(>1 000次)FLASI ROM;该款芯片的超低功耗和良好的性能价格比使其非常适合嵌入式产品应用。第三章 系统总体设计1.硬件设计由DS18B20和Atmel公司推出的单片机AT89C51以及相关外围电路组成的高精度、多点温度测量系统的结构框图如图所示。系统采用8片DS18B20构成小型温度传感器网络3,通过并行连接方式连接至单片机的通用I/O端口。单片机获得温度信息后,通过特定的算法,将处理后的温度信息通过LED显示出来,同时通过串行口送上位机处理。AT89C51温度采集模块电源模块LED显示模块RS232模块2.软件系统设计主程序先对各DS18B20进行初始化,然后重复调用写命令和读数据模块,最后将数据处理后送LED显示7。主程序执行流程如图3所示:/*数码管的显示 */void display(uint temp)uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=tablebai; /显示百位dula=1; /从0到1,有个上升沿,解除锁存,显示相应段 dula=0; /从1到0再次锁存 wela=0;P0=0xfe;wela=1;wela=0;delay(1); /延时约2msP0=table1shi; /显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=tablege; /显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);3.软件仿真调试第四章 结束语本系统具有如下特点: a.结构简单,成本低廉,维护方便。b.直接将温度数据进行编码,可以只使用单根电缆传输温度数据,通信方便,传输距离远且抗干扰性强。 c.配置灵活、方便、易于扩展。可扩展多路下位温度采集子系统,将它们通过RS485与上位PC机组网,形成多点温度采集网络。也可在各子系统中有选择性地增减温度传感器。 d.适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。在大范围温度多点监控系统中具有十分诱人的应用前景。主要参考文献: 1. 余永权. 单片机原理及应用. 北京:电子工业出版社, 1997. 2. 邦田. 电子电路实用抗干扰技术. 北京:人民邮电出版社,1994.3. 曲喜贵. 电子元件材料手册 M. 北京:电子工业出版社,1989.422-430.4. 刘君华. 智能传感器系统 M . 西安:西安电子科技大学出版社,1999.5 戴俊峰.嵌入式系统大屏幕LED点阵显示器J.现代电子技术,2004,27 附录 主程序#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P22;sbit dula=P26;sbit wela=P27;uchar flag ;uint temp; /参数temp一定要声明为 int 型 uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /不带小数点数字编码uchar code table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /带小数点数字编码/*延时函数*/void TempDelay (uchar us)while(us-);void delay(uint count) /延时子函数uint i;while(count)i=200;while(i>0)i-;count-;/*串口初始化,波特率9600,方式1 */void init_com()TMOD=0x20; /设置定时器1为模式2TH1=0xfd; /装初值设定波特率TL1=0xfd;TR1=1; /启动定时器SM0=0; /串口通信模式设置SM1=1;/ REN=1; /串口允许接收数据PCON=0; /波特率不倍频/ SMOD=0; /波特率不倍频 / EA=1; /开总中断 /ES=1; /开串行中断/*数码管的显示 */void display(uint temp)uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=tablebai; /显示百位dula=1; /从0到1,有个上升沿,解除锁存,显示相应段 dula=0; /从1到0再次锁存 wela=0;P0=0xfe;wela=1;wela=0;delay(1); /延时约2msP0=table1shi; /显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=tablege; /显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);void ds_reset(void)ds=1;_nop_(); /1usds=0;TempDelay(80); /当总线停留在低电平超过480us,总线上所以器件都将被复位,这里/延时约530us总线停留在低电平超过480s,总线上的所有器件都/将被复位。_nop_(); ds=1; /产生复位脉冲后,微处理器释放总线,让总线处于空闲状态,原因查/18b20中文资料TempDelay(5); /释放总线后,以便从机18b20通过拉低总线来指示其是否在线, /存在检测高电平时间:1560us, 所以延时44us,进行 1-wire presence /detect(单线存在检测)_nop_();_nop_();_nop_();if(ds=0) flag=1; /detect 18b20 successelse flag=0; /detect 18b20 fail TempDelay(20); /存在检测低电平时间:60240us,所以延时约140us_nop_();_nop_();ds=1; /再次拉高总线,让总线处于空闲状态/*/bit ds_read_bit(void) /读一位bit dat;ds=0; /单片机(微处理器)将总线拉低 _nop_(); /读时隙起始于微处理器将总线拉低至少1usds=1; /拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据_nop_();_nop_(); /小延时一下,读取18b20上的数据 ,因为从ds18b20上输出的数据/在读"时间隙"下降沿出现15us内有效dat=ds; /主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现/15us内有效 TempDelay(10); /所有读"时间隙"必须60120us,这里77usreturn(dat); /返回有效数据uchar ds_read_byte(void ) /读一字节uchar value,i,j;value=0; /一定别忘了给初值for(i=0;i<8;i+)j=ds_read_bit(); value=(j<<7)|(value>>1); /这一步的说明在一个word文档里面return(value); /返回一个字节的数据void ds_write_byte(uchar dat) /写一个字节 uchar i; bit onebit; /一定不要忘了,onebit是一位 for(i=1;i<=8;i+) onebit=dat&0x01;dat=dat>>1;if(onebit) /写 1ds=0;_nop_(); _nop_(); /看时序图,至少延时1us,才产生写"时间隙" ds=1; /写时间隙开始后的15s内允许数据线拉到高电平 TempDelay(5); /所有写时间隙必须最少持续60uselse /写 0ds=0; TempDelay(8); /主机要生成一个写0 时间隙,必须把数据线拉到低电平并保持至少60s,这里64usds=1;_nop_(); _nop_(); void tem_change() ds_reset(); delay(1); /约2ms ds_write_byte(0xcc); ds_write_byte(0x44);unit get temperature() float wend; char a,b; ds_reset(); delay(1); /约2ms ds_write_byte(0xcc); ds_write_byte(0xbe); a=ds_read_byte(); b=ds_read_byte(); temp=b; temp<<=8; temp=temp|a; wendu=temp*0.0625; /温度读取的解释我记录在 "倒塌 18B20"里面 temp=wendu*10+0.5; return temp;void ds_read_rom() /这里没有用到uchar a,b;ds_reset();delay(30);ds_write_byte(0x33);a=ds_read_byte();b=ds_read_byte();*/void main()uint a;init_com();while(1)tem_change(); /12位转换时间最大为750msfor(a=10;a>0;a-)display( get_temperature();