课程设计温度监测系统.doc

上传人:文库蛋蛋多 文档编号:3993295 上传时间:2023-03-30 格式:DOC 页数:32 大小:1.11MB
返回 下载 相关 举报
课程设计温度监测系统.doc_第1页
第1页 / 共32页
课程设计温度监测系统.doc_第2页
第2页 / 共32页
课程设计温度监测系统.doc_第3页
第3页 / 共32页
课程设计温度监测系统.doc_第4页
第4页 / 共32页
课程设计温度监测系统.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《课程设计温度监测系统.doc》由会员分享,可在线阅读,更多相关《课程设计温度监测系统.doc(32页珍藏版)》请在三一办公上搜索。

1、题目 主从式温度监测报警与控制系统 任务与要求1) 设计以单片机为从机利用温度传感器对环境温度进行监测,将结果通过标准串行口传送通信给微机主机,由微机跟踪显示目标状态;若超过设定值,则从机目标状态以某种现场变化为提示,主机则以某种直观警方式为提示。设计硬件电路,编写PC机和单片机的控制程序,写出设计报告及详细使用说明。开始日期 2011年 5月 8 日完成日期 2011 年6月 21 日主从式温度监测警报与控制系统摘要:本文以AT89S52单片机为主控器构成一个多功能的主从式温度监测警报与控制系统。在文中详尽分析所设计电路的原理、所编写单片机程序及部分主要电路元件功能,结合实际焊接调试的问题和

2、解决方案,给出我们完整的课程设计。关键词:AT89S52单片机、DS13B02、PC串口通信、温度监测引言在各工业生产部门经常会遇到对温度进行监测和控制的需要,而用微机构成温度控制系统有很大的实用意义。微机测温、控温便于实现生产过程的自动化,具有操作简单、精度高、可靠性好、测量范围广等特点,可实现远距离巡回检测、安全报警、温度显示与打印、信息存储、数据通讯等功能。1主从式温度监测警报与控制系统设计及主要功能部分本温度监测警报与控制系统的整体电路图如图一示,以AT89S52单片机为主控器,借助DS18B20一线总线数字式传感器的功能,采用四位数码管来显示实时温度。当时是温度高于设置值时,蜂鸣器将

3、会发出警报。图一、监测报警与控制系统整体电路图1.1 AT89S52单片机采用AT89S52单片机来对电路实施控制是十分高效的。通过对程序的编写,可以随时根据实际需要改变电子钟的功能,使其具有可拓展性。AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。在本课程设计中使用到的AT89S52主要特性如下:1)8K字节可擦写1000次的在线可编程ISP 闪存2)全静态工作:0Hz 24MHz3)256字节内部RAM4)32条可编程I/O线5)3个16位定时器/计数器6)8个中断源7)通过中断终止掉电方式8)看门狗定时器图二、AT89S52引脚图1.2 DS18B

4、20一线总线数字式传感器DS18B20“一线总线”数字化温度传感器是DALLAS最新单线数字温度传感器, DS18B20支持“一线总线”接口,测量温度范围为 -55C+125C,在-10+85C范围内,精度为0.5C。DS1822的精度较差为 2C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,与前一代产品不同,新的产品支持3V5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。DS18B20可以程序设定912位的分辨率,精度为0.5C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在E

5、EPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为2C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。1.2.1 DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL

6、、配置寄存器。DS18B20的管脚排列如图三示:图三、DS18B20的管脚排列DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中的温度传感器可完成对温度的测量,以12

7、位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式表达,其中S为符号位。图四、12位转化后得到的12位数据这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 例如+125的数字输出为07D0H,+25.0625的数字输出为0191H,-25.0625的数字输出为FF6FH,-55的数字输出为FC90H。图五、各温度对应的数字输出1.2.2 DS1

8、8B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。该字节各位的意义如下:TM R1 R0 1 1 1 1 1 低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式

9、还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)图六、分辨率设置表根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。1.2.3 DS1820使用中注意事项 DS1820虽然具

10、有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题: (1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温

11、系统设计时要加以注意。(3)连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。(4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序

12、进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。 1.3MAX232芯片MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。MAX232芯片的引脚介绍如图七所示。图七、MAX232引脚图第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。 其

13、中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)。MAX232芯片的主要有以下特点1)符合所有的RS-232C技术标准 2)只需要单一 +5V电源供电 3)片载电荷泵具有升压、电

14、压极性反转能力,能够产生+10V和-10V电压V+、V- 4)功耗低,典型供电电流5mA 5)内部集成2个RS-232C驱动器 6)内部集成2个RS-232C接收器 7)高集成度,片外最低只需4个电容即可工作。图八、MAX232引脚接法原理图1.4 四位数码管显示该温度计的显示采用四位共阴动态数码管来动态显示。最高一位用来显示“+”或者“-”摄氏温度,中间两位用来显示当前的温度数值的“十位”和“个位”,最后一位用来显示当前的温度数值的“小数点后一位”。如下图十一所示(显示的是“+32.8摄氏度”)。图九、数码管显示(环境温度为32.8)1.5 蜂鸣器发声蜂鸣器是一种一体化结构的电子讯响器,采用

15、直流电压供电。本课程设计采用压电式蜂鸣器。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V直流工作电压),多谐振荡器起振,输出1.52.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。图十、蜂鸣器发声电路由于驱动蜂鸣器需要较大的电流,而单片机89S52芯片所提供的电流并不足以驱动蜂鸣器,所以要通大电流三极管来驱动蜂鸣器。如图十三所示,蜂鸣器一端接地,一端通过三极管接高电平。利用AT89S52单片机芯片输出的信号,通过三极

16、管来驱动蜂鸣器。2 单片机主程序否开始串口初始获取温度是警告处理温度超标上位机显示LED显示定时1S完成否是图十一、单片机主程序流程图2.1程序运行流程说明当给电路供电时首先是对单片机的串口通信以及定时器的初始化,以便程序能正确运行。随后程序开始调用温度获取函数,从温度传感器中获取当前温度。然后对当前温度进行判断,以便当当前的环境温度超过温度所设置的范围时,能够及时对其进行处理。监测温度完后便将当前的温度值送入到主机中,同时将其显示到数码管中,将温度直观化,方便人们对温度的观察与处理。如果需要更改温度的的上下限值,可以通过主机进行设置。首先,先向从机发送“S”待主机出现提示后,根据提示输入所需

17、要设置的温度值,点击发送后,设置就完成了。输入的数值必须用两位数字来表示。(如:设置温度为1度时,则需输入“01”。)2.2程序模块说明本单片机程序由温度获取模块(DS18B20Drive.c);数码管显示模块(NixieTubeDrive.c);串口通信模块(RS232SerialPort.c);温度监测模块(TemperatureChec.c);主程序(main.c)五大部分组成。以下部分程序为单片机的主程序:#include #include #include TypeDe.hsbit BEEP = P34 ; 设置P3.4引脚为蜂鸣器的控制引脚bitUGFlag ;uint8 USE_

18、C = 0 ;void initT0( void ) ;extern bitBFlag ;extern bitWFlag ;extern float Temp_V ;extern sint8 max_temp , min_temp ;void main( void )InitSerialP ( ) ; 初始化串口initT0 ( ) ; 初始化T0定时器max_temp = 85 ; 设置初始默认温度上限值为85 min_temp = 0 ; 设置初始默认温度下限值为0while ( 1 )Temp_Chek ( ) ; 监测环境温度值是否超过温度设置范围if( BFlag & WFlag )

19、BEEP = 1 ; 超过温度设置的上限值,蜂鸣器一直响else if ( BFlag & !WFlag ) 低于温度设置的下限值,蜂鸣器间断的响BEEP = BEEP ;else BEEP = 0 ; 环境温度在设置范围内,蜂鸣器不鸣响PC_Display( ) ; 将当前温度值发送到主机PCUGFlag = 0 ; while( !UGFlag )uint8i;TemperatureUpdate( ) ; 重新获取当前环境温度值for( i = 0 ; i20 ; i+ )LED_display( ) ; 数码管显示当前温度值/*开启定时器 每秒更新一次温度*/void initT0( v

20、oid )TMOD|=0x01; /设置定时器T0为模式1TH0 = 0x4c ;/定时50msTL0 = 0x00 ;/EA=1; /开总中断 ET0=1; /允许定时/计数器1 中断 TR0=1; /启动定时/计数器1 中断 void Send_Temp_to_PC( void ) interrupt 2TH0 = 0x4c ;TL0 = 0x00 ;if (+USE_C = 40) /每隔1秒更新一次当前温度值并发到PCUGFlag = 1 ;USE_C = 0 ;4 电路运行效果 4.1从机运行效果图此图为从机(温度获取端)的运行效果图,图中数码管显示的环境温度为29.1。图十二 从机

21、运行效果图4.2主机端显示效果图此图为主机端(PC平台)与从机通信后显示的实时温度情况。图十三 主机端直观显示效果图3 实际中遇到的问题与解决措施1)由于实现该温度监测警报功能的程序比较长,期间要经常调用相关的子程序,并出现了不少问题。后来我们结合程序流程图,对相关程序部分进行分析,找出错误的地方并使用PROTUES软件对所设计的电路和程序进行模拟,这有助于我们对所编写的程序实现实时分析。2)而在实际焊接电路的过程中,我们采用的策略的分模块焊接,每焊接好一个模块就用仪器检查焊接是否正确,这样可以有效地减少出错的可能。特别是在整体电路焊接好,插上芯片之后,发现无法实现其逻辑功能。在这种情况下,我

22、们还是分模块检测,对症下药,分析哪里处现问题,是电路问题还是元器件的问题。这样做可以有效地提高我们解决问题的效率。3)在调试好程序和实际电路后,发现数码显示管的显示比较暗。这是单片机输出电流比较小的原因。所以我们在数码管的输入端通过三极管来连接高电平,拉高相关输入电流,使得数码管的亮度变亮。4 结束语在这次的课程设计中,我们结合了所学的单片机和电路知识,设计出满足课程设计要求的温度监测警报与控制系统。在进行课程设计的过程中,我们四组员四人查阅了很多文献,了解了AT89S52、MAX232芯片、DS18B20温度传感器的功能。拓展了我们的视野。通过本次的课程设计,加深了我们对单片机的理解,使得我

23、们更加熟悉单片机的程序编写。特别是通过程序的调试,我们发现了很多程序编写的坏习惯,例如使用中断服务程序时没有保护好相关可能被改变的数据。我们所设计的温度监测警报与控制系统原理简单,所用到的软器件较少,而且是使用AT89S52单片机来实现控制功能,使得其相关功能或参数可以根据需要进行修改。参考文献1胡少宏.主从式温度测量控制系统.网络与通讯.1997(7).2康华光.电子技术基础数字部分.高考教育出版社.2002.3 李朝青.单片机原理及接口技术(第三版).北京航空航天大学出版社.2009.7 教师评语: 教师签名: 批改日期: 附件:(完整单片机程序)所有的子程序void Delay10Us_

24、f( uint8 DT ) ;uint8 Ds18b20Init_f( void );void Ds18b20Write_Byte( uint8 Cmd );uint8 Ds18b20Read_Byte( void );uint16 Ds18b20ReadTemp_f( void );void TemperatureUpdate( void );void LED_delay( uint8 i ) ;void LED_display() ;void InitSerialP( void ) ;void SendByte_SP( uint8 sbuf_Data );uint8 GetByte_SP(

25、 void ) ;void Send_Data_SP( uint8 *send_data , data_length ) ;void deal_Temp( void ) ;void ser_int ( void ) ;void PC_Dis_Temp( void );void PC_Display( void ) ;void Temp_Warn( void ) ;void Temp_Chek ( void ) ;/* 程序名: 芯片DS18B20驱动程序 自身函数:void Delay10Us_f( uint16 Count ) uint8 Ds18b20Init_f( void )void

26、Ds18b20Write_Byte( uint8 Cmd )uint8 Ds18b20Read_Byte( void )uint16 Ds18b20ReadTemp_f( void )void TemperatureUpdate( void ) 全局变量: uint16 idata TempDat 以十进制形式保存所获得温度值uint8 idata Temperature 4 保存温度值的数组.依次存放正负标志,温度值十位,个位,和小数位 引用的外部函数或变量: 无 功能: 对 DS18B20 进行初始化对 DS18B20 进行数据读写的操作。 实现温度的获取。 */* 以下为 DS18B20

27、 的驱动程序 */#include #include #include TypeDe.h/*定义芯片DS18B20的数据输入输出管脚*/sbit Io_DS18B20_DQ = P36 ; #define DS18B20_DQ_HIGH Io_DS18B20_DQ = 1 #define DS18B20_DQ_LOWIo_DS18B20_DQ = 0 #define DS18B20_DQ_READ Io_DS18B20_DQ /* 函数声明 */void Delay10Us_f( uint8 DT ) ;uint8 Ds18b20Init_f( void );void Ds18b20Write

28、_Byte( uint8 Cmd );uint8 Ds18b20Read_Byte( void );uint16 Ds18b20ReadTemp_f( void );void TemperatureUpdate( void );float Temp_V ;/*声明以十进制形式保存温度值的变量 TempDat */uint8 Temperature 4 ; /*声明保存温度值的数组.依次存放正负标志,温度值十位,个位,和小数位*/*函数名:Delay_10us*/*输入:uint16 Count(延时的时间大小)*/*输出: 无*/*功能:延时10uS函数*/void Delay10Us_f(

29、uint8 DT ) while( -DT0 ); /*函数名:Ds18b20Init_f*/*输入:无*/*输出: uint8 Flag(复位成功与否标志)*/*功能:初始化芯片DS18B20*/uint8 Ds18b20Init_f( void ) bit Flag ; DS18B20_DQ_HIGH ; /*稍作延时*/ NOP ; DS18B20_DQ_LOW ; /总线拉低 Delay10Us_f(50) ; /延时大于480us NOP ; DS18B20_DQ_HIGH ; /总线释放 Delay10Us_f(10) ; /等待DS18B02复位 Flag = DS18B20_D

30、Q_READ ; /如果Flag为0,则复位成功,否则复位失败 Delay10Us_f(15) ;NOP ;NOP ;DS18B20_DQ_HIGH ; return Flag ; /*函数名:Ds18b20Write_Byte( uint8 Cmd )*/*输入:uint8 Cmd(需要写入的命令)*/*输出: 无*/*功能:对芯片DS18B20进行写命令*/void Ds18b20Write_Byte( uint8 Cmd ) uint8 i ; for( i = 8 ; i 0 ; i- ) DS18B20_DQ_LOW ;/拉低总线,开始写时序Delay10Us_f( 2 ) ; DS

31、18B20_DQ_READ = Cmd & 0x01 ; /控制字的最低位先送到总线 Delay10Us_f( 4 ) ; /稍作延时,让DS18B20读取总线上的数据 NOP ;NOP ; DS18B20_DQ_HIGH ; /拉高总线,1bit写周期结束 Cmd = 1 ; /*函数名:Ds18b20Read_Byte*/*输入:无*/*输出:ReadValue(从DS18B20读取的数据)*/*功能:从DS18B20中读取一个字节的数据*/uint8 Ds18b20Read_Byte( void ) uint8 ReadValue = 0 , i ; for( i = 8 ; i 0 ;

32、 i- ) DS18B20_DQ_LOW ; ReadValue = 1 ; DS18B20_DQ_HIGH ; if( DS18B20_DQ_READ = 1 ) ReadValue |= 0x80 ; Delay10Us_f( 3 ) ; return ReadValue ; /*函数名:Ds18b20ReadTemp_f*/*输入:无 */*输出: ReturnTemp(读取的温度值)*/*功能:读取当前的温度数据(只保留一位小数)*/uint16 Ds18b20ReadTemp_f( void ) uint8 TempH, TempL ; uint16 ReturnTemp ; /*

33、if( v_Ds18b20Init_() ) return ; /复位失败,添加错误处理的代码 */ 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个字节

34、) TempH = Ds18b20Read_Byte( ) ; /读温度值高位(内部RAM的第1个字节) ReturnTemp = TempH ; ReturnTemp = 8 ; ReturnTemp |= TempL ; /温度值放在变量ReturnTemp中 return ReturnTemp ; /*函数名:TemperatureUpdate_f*/*输入:无*/*输出: 无*/*功能:将读取的温度数据值转化存放在数组Temperature(只保留了一位小数)*/void TemperatureUpdate( void ) uint16 TempDat ;uint8 Tflag = 1

35、0 ; float Temp ; TempDat = Ds18b20ReadTemp_f() ; if( TempDat & 0xf000 ) Tflag = 11 ; 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 ; /温度个位值 Temperature 3

36、 = TempDat % 10 ;/温度小数位 &/* 程序名: 4位7段动态数码管显示驱动程序 自身函数:void LED_delay( uint8 i ) ;void LED_display() ; 全局变量: 无 引用的外部函数或变量: extern idata Temperature 4 ; 功能: 对数码管进行初始化; 利用数码管实现温度的直观显示。 */#include #include TypeDe.hextern uint8Temperature 4 ; /声明Temperature是外部数组/* 函数声明 */void LED_delay( uint8 i ) ;void LED_display() ;/* 数组 Disp_Tab 存放的数据为 LED 显示的字模, 共阴数码管 0-9 */ uint8 code Disp_Tab = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf;uint8 code Disp_bit=0x01,0x02,0x04,0x08;/ 数组 Disp_bit 数码管位选值 /*函数名:LED_delay*/*输入:uint8 i*/*输出: 无*/*功能:数码管显示延时*/void

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号