课程设计主从式温度监测报警与控制系统.docx
《课程设计主从式温度监测报警与控制系统.docx》由会员分享,可在线阅读,更多相关《课程设计主从式温度监测报警与控制系统.docx(17页珍藏版)》请在冰豆网上搜索。
![课程设计主从式温度监测报警与控制系统.docx](https://file1.bdocx.com/fileroot1/2023-2/4/84bee43d-065c-4ac2-8778-c167137d2b43/84bee43d-065c-4ac2-8778-c167137d2b431.gif)
课程设计主从式温度监测报警与控制系统
题目主从式温度监测报警与控制系统
任务与要求:
设计以单片机为从机利用温度传感器对环境温度进行监测,将结果通过标准串行口传送通信给微机主机,由微机跟踪显示目标状态;若超过设定值,则从机目标状态以某种现场变化为提示,主机则以某种直观警方式为提示。
设计硬件电路,编写PC机和单片机的控制程序,写出设计报告及详细使用说明。
开始日期2011年6月20日完成日期2011年6月21日
主从式温度监测报警与控制系统
摘要:
本设计分为硬件电路设计和PC设计两部分。
硬件电路设计主要由单片机AT89S52、温度传感器DS18B20、MAX232芯片、四位一体共阴极数码管以及RS232母头组成,该电路主要是由对环境温度进行监控,然后用数码管显示出来,再将所测温度通过母头传入PC机。
PC机部分主要是对温度进行监测,如果超过设定值,PC机和电路都会以一定的方式进行反应。
关键词:
单片机AT89S52、温度传感器DS18B20、MAX232芯片、四位一体共阴极数码管以及PC部分程序
一、主要器件功能介绍
1.AT89S52单片机
图1AT89S52单片机管脚图
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.数字温度传感器DS1820
图2数字温度传感器DS1820
DS18B20有三个引脚,GND接地;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
#include
#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
NOP;
DS18B20_DQ_HIGH;//总线释放
Delay10Us_f(10);//等待DS18B02复位
Flag=DS18B20_DQ_READ;//如果Flag为0,则复位成功,否则复位失败
Delay10Us_f(15);
NOP;
NOP;
DS18B20_DQ_HIGH;
returnFlag;
}
/*函数名:
Ds18b20Write_Byte(uint8Cmd)*/
/*输入:
uint8Cmd(需要写入的命令)*/
/*输出:
无*/
/*功能:
对芯片DS18B20进行写命令*/
voidDs18b20Write_Byte(uint8Cmd)
{
uint8i;
for(i=8;i>0;i--)
{
DS18B20_DQ_LOW;//拉低总线,开始写时序
Delay10Us_f
(2);
DS18B20_DQ_READ=Cmd&0x01;//控制字的最低位先送到总线
Delay10Us_f(4);//稍作延时,让DS18B20读取总线上的数据
NOP;
NOP;
DS18B20_DQ_HIGH;//拉高总线,1bit写周期结束
Cmd>>=1;
}
}
/*函数名:
Ds18b20Read_Byte*/
/*输入:
无*/
/*输出:
ReadValue(从DS18B20读取的数据)*/
/*功能:
从DS18B20中读取一个字节的数据*/
uint8Ds18b20Read_Byte(void)
{
uint8ReadValue=0,i;
for(i=8;i>0;i--)
{
DS18B20_DQ_LOW;
ReadValue>>=1;
DS18B20_DQ_HIGH;
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);//启动温度转换
Ds18b20Init_f();
Ds18b20Write_Byte(0xcc);//跳过ROM
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>0;b--);
}