课程设计主从式温度监测报警与控制系统Word格式.docx
《课程设计主从式温度监测报警与控制系统Word格式.docx》由会员分享,可在线阅读,更多相关《课程设计主从式温度监测报警与控制系统Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
DQ为数字信号输入输出端;
Vdd为外接电源输入端。
图3DS18B20的内部结构
DS18B20内结构主要由4部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH、TL和配置寄存器。
64位光刻ROM:
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,即ID。
它的作用是使每一个DS18B20的地址都各不相,可以实现在相同的总线上挂接多个DS18B20的目的。
64位光刻ROM的排列是开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
温度传感器:
在DS18B20温度传感器的使用中,以9位转化为例,从DS18B20中得到16位符号扩展的二进制补码读数形式,以0.5℃/LSB的形式表达,其中S为符号位,二进制的数存储在DS18B20的2个8位的RAM中,这是9位转化后得到的16位数据,其中前面5位是符号位,如果测得温度大于0℃,这5位为0,只要将测到的数值乘以0.5即可得到实际温度;
如果温度小于0℃,这5位为1,测得到的数值需要取反加1再乘以0.5即可得到实际温度。
非发挥的温度报警触发器TH、TL:
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的电可擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
当温度达到低温或高温的时候,温度报警触发器会发出警报。
高速暂存RAM:
高速暂存存储器包含了9个连续字节,如表-1,当温度转换命令发出后,经转换所得的温度值存放在高速暂存存储器的第0和第1个字节内,第0个字节存放的是温度的低8位信息,第1个字节存放的是温度的高8位信息,单片机可通过单线接口读到该数据,读取时低位在前,高位在后;
第2、3字节是TH、TL的易失性拷贝,第4个字节是结构寄存器的易失行拷贝,这三个字节的内容每一次上电复位时被刷新;
第5、6、7字节用于内部计算;
第8个字节是冗余检验字节。
Ds18B20的设置位有一个字节,该字节的各位定义为TMR1R011111,每一次进行针对DS18B20的读写前,都需要对DS18B20进行设置,从上面的定义可以看出,该字节的低5位一直都是1,TM位是测试模式位,用于设置DS18B20在工作模式及测试模式。
在DS18B20出厂时该位被置为0,,用户不要进行改动,R1、R0用来设置分辨率。
3.MAX232芯片
图4MAX232芯片引脚图
a)引脚介绍:
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;
DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5V)。
b)主要特点
1、符合所有的RS-232C技术标准
2、只需要单一+5V电源供电
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-
4、功耗低,典型供电电流5mA
5、内部集成2个RS-232C驱动器
6、内部集成两个RS-232C接收器
7、高集成度,片外最低只需4个电容即可工作。
4.四位一体共阴极数码管
图5四位一体共阴极数码管
最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。
所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。
二、温度显示设计电路:
图6温度显示电路图
说明:
根据感应的温度,在数码管里显示。
三、电路图片
图7电路正面
图8电路背面
图9温度显示照片
图10温度上升
四、总结:
这个电子综合课程设计包括了硬件电路和PC部分两大块,硬件电路方面做了一个温度的显示电路,总体的难度也是体现在温度传感器DS1820的理解和应用上,至于PC部分就是体现在对传入温度进行处理的编程,但是这次由于时间太急,因此只是做了温度显示的部分而没有做PC机的部分。
这次课程设计同时锻炼了我们电路设计能力和编程能力,经过这次的锻炼,我们的能力得到长足的进步。
另外,关于这次课程设计的所有资料的查找,也锻炼了我们的资料搜索能力。
这次课程设计完成的时间实在是很紧迫,但在我们看来这也是对我们意志的一种考验,每一次面对困难时,只有勇于面对,我们也明白只有通过磨练,人的能力才会提升。
五、参考文献:
[1]郭瑜茹,张朴.《光电子技术及其应用》.化学工业出版社,2006
[2]康华光.《电子技术基础数字部分》.高等教育出版社,2006
[3]康华光.《电子技术基础模拟部分》.高等教育出版社,2006
[4]李朝青.《单片机原理及接口技术》.北京航空航天大学出版社.2009.34-39
附录:
单片机程序:
程序名:
芯片DS18B20驱动程序
自身函数:
voidDelay10Us_f(uint16Count)
uint8Ds18b20Init_f(void)
voidDs18b20Write_Byte(uint8Cmd)
uint8Ds18b20Read_Byte(void)
uint16Ds18b20ReadTemp_f(void)
voidTemperatureUpdate(void)
全局变量:
uint16idataTempDat以十进制形式保存所获得温度值
uint8idataTemperature[4]保存温度值的数组.依次存放正负标志,温度值十位,个位,和小数位
引用的外部函数或变量:
无
功能:
对DS18B20进行初始化
对DS18B20进行数据读写的操作。
实现温度的获取。
***********************************************************************
***********************************************************************/
/*以下为DS18B20的驱动程序*/
#include<
reg52.H>
intrins.h>
#defineuint8unsignedchar
#definesint8signedchar
#defineuint16unsignedshort
#definesint16signedshort
#defineNOP_nop_()
/*定义芯片DS18B20的数据输入输出管脚*/
sbitIo_DS18B20_DQ=P3^7;
///////////////////////////////
#defineDS18B20_DQ_HIGHIo_DS18B20_DQ=1
#defineDS18B20_DQ_LOWIo_DS18B20_DQ=0
#defineDS18B20_DQ_READIo_DS18B20_DQ
#defineucharunsignedchar
voiddelay2ms();
/*函数声明*/
voidDelay10Us_f(uint8DT);
uint8Ds18b20Init_f(void);
voidDs18b20Write_Byte(uint8Cmd);
uint8Ds18b20Read_Byte(void);
uint16Ds18b20ReadTemp_f(void);
voidTemperatureUpdate(void);
floatidataTemp_V;
/*声明以十进制形式保存温度值的变量TempDat*/
uint8idataTemperature[4];
/*声明保存温度值的数组.依次存放正负标志,温度值十位,个位,和小*/
ucharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xdf,0x00,0x40};
uchari;
uchara,b;
ucharcodetemp[]={0xfe,0xfd,0xfb,0xf7};
/*显示哪一位?
*/
/*函数名:
Delay_10us*/
/*输入:
uint16Count(延时的时间大小)*/
/*输出:
无*/
/*功能:
延时10uS函数*/
voidDelay10Us_f(uint8DT)
{
while(--DT>
0);
}
Ds18b20Init_f*/
uint8Flag(复位成功与否标志)*/
初始化芯片DS18B20*/
uint8Ds18b20Init_f(void)
{
bitFlag;
DS18B20_DQ_HIGH;
/*稍作延时*/
NOP;
DS18B20_DQ_LOW;
//总线拉低
Delay10Us_f(50);
//延时大于480us
//总线释放
Delay10Us_f(10);
//等待DS18B02复位
Flag=DS18B20_DQ_READ;
//如果Flag为0,则复位成功,否则复位失败
Delay10Us_f(15);
returnFlag;
Ds18b20Write_Byte(uint8Cmd)*/
uint8Cmd(需要写入的命令)*/
对芯片DS18B20进行写命令*/
voidDs18b20Write_Byte(uint8Cmd)
uint8i;
for(i=8;
i>
0;
i--)
{
//拉低总线,开始写时序
Delay10Us_f
(2);
DS18B20_DQ_READ=Cmd&
0x01;
//控制字的最低位先送到总线
Delay10Us_f(4);
//稍作延时,让DS18B20读取总线上的数据
NOP;
//拉高总线,1bit写周期结束
Cmd>
>
=1;
}
Ds18b20Read_Byte*/
ReadValue(从DS18B20读取的数据)*/
从DS18B20中读取一个字节的数据*/
uint8Ds18b20Read_Byte(void)
uint8ReadValue=0,i;
ReadValue>
if(DS18B20_DQ_READ==1)
ReadValue|=0x80;
Delay10Us_f(3);
returnReadValue;
Ds18b20ReadTemp_f*/
无*/
ReturnTemp(读取的温度值)*/
读取当前的温度数据(只保留一位小数)*/
uint16Ds18b20ReadTemp_f(void)
uint8TempH,TempL;
uint16ReturnTemp;
Ds18b20Init_f();
//复位DS18B20
Ds18b20Write_Byte(0xcc);
//跳过ROM
Ds18b20Write_Byte(0x44);
//启动温度转换
Ds18b20Write_Byte(0xbe);
//读取DS18B20内部的寄存器内容
TempL=Ds18b20Read_Byte();
//读温度值低位(内部RAM的第0个字节)
TempH=Ds18b20Read_Byte();
//读温度值高位(内部RAM的第1个字节)
ReturnTemp=TempH;
ReturnTemp<
<
=8;
ReturnTemp|=TempL;
//温度值放在变量ReturnTemp中
returnReturnTemp;
TemperatureUpdate_f*/
无*/
将读取的温度数据值转化存放在数组Temperature(只保留了一位小数)*/
voidTemperatureUpdate(void)
uint16TempDat;
uint8Tflag=20;
floatTemp;
TempDat=Ds18b20ReadTemp_f();
if(TempDat&
0xf000)
Tflag=21;
TempDat=~TempDat+1;
Temp=TempDat*0.0625;
Temp_V=Temp;
TempDat=Temp*10;
Temperature[0]=Tflag;
//温度正负标志
Temperature[1]=TempDat/100;
//温度十位值
Temperature[2]=(TempDat%100/10)+10;
//温度个位值
Temperature[3]=TempDat%10;
//温度小数位
///////////////////////////////////////////////////////////
voidmain(void)
while
(1)
TemperatureUpdate();
for(i=0;
i<
4;
i++)
{
P2=0xff;
P1=dispcode[Temperature[i]];
P2=temp[i];
/*哪位显示,哪位P2口引脚为低*/
delay2ms();
/*调用延时程序5*/
}
/**********延时2ms****************/
voiddelay2ms(void)
for(a=4;
a>
0;
a--)
for(b=248;
b>
b--);