常裕文档网    > 范文大全 > 公文范文 >

【武汉华夏理工学院】 武汉华夏理工学院学费

时间:2022-01-17 14:55:09  浏览次数:

武汉华夏理工学院

信息工程课程设计报告书

课程名称智能仪表方向课程设计

课程设计总评成绩

学生姓名、学号胡宇恒1021213303

学生专业班级自动化1133

指导教师姓名黄梅志

课程设计起止日期2016.12.5——2016.12.21

专业方向课程设计任务书

——智能仪表方向学生姓名:胡宇恒专业班级:自动化1133

指导教师:黄梅志工作单位:信息工程学院

设计题目:智能温度测量仪表

初始条件:

以温度为测量对象,利用实验室可以提供的设备平台、仪器仪表、常见芯片,基于实验室已有的STC89C51单片机最小系统,设计一种智能温度测量仪表,温度测量范围为0-300°C,测量误差≤1°C。(0-400°C,0-500°C,0-700°C,0-900°C)

设计任务:

1、基本功能:要求6位数码管显示(3位显示测量值,3位显示设定值),4输入按钮(功能选择、数码管选择、数字增加、数字减少),可设定上下限报警(蜂鸣器报警);

2、智能温度测量仪表硬件电路设计,主要包括温度传感器、信号调理电路、A/D转换电路、单片机最小系统、人机接口电路等;

3、智能温度测量仪表软件设计,包括主程序、数据采集子程序、键盘处理程序、显示子程序、测量信号处理程序等。

4、智能化功能的实现(完成其中3个即可),也可自行扩展:

1)工作状态指示2)开机自检

3)硬件时钟4)打印功能

5)配置通信接口6)测温程序中加入消除零漂模块和适当的数字滤波模块

5、整机制作和调试;

6、撰写一份课程设计报告书;

7、设计说明书应包括:设计要求、总体方案设计与论证、总体电路、模块设计、模块程序、整机制作与调试、结果分析、结论或总结、参考文献(不少于5篇)。图纸要求:系统整机电路图和一份软件程序清单。

时间安排:

课程设计安排在第14-16周,地点在424实验室。具体进度安排如下:

武汉华夏理工学院

指导教师签名:2016年12月5日

智能温度测量仪表设计

作者:胡宇恒

武汉华夏理工学院信息工程学院

摘要:

在工业过程控制中,温度是一个重要的测量参数,而热电偶具有准确度高、测温范围广和成本低廉等优点,使其成为工业应用中温度测量的首选。为准确测量温度,本文将传统的热电偶测温技术、神经网络技术与单片机技术结合起来,设计了读数直观、准确的数字式智能测温仪表,该仪表采用单片机芯片AT89S52作为微处理器,K型热电偶(镍铬—镍硅)作为温度传感器,数字温度传感器DS18B20进行热电偶冷端温度的测量,以对热电偶进行冷端补偿,能够准确测量并显示温度。

关键词:温度、单片机、测量仪表

1 智能温度测量仪表方案设计与论证

1.1 功能与要求

功能

基于单片机的温度测控系统分为上位机和下位机两部分。其中上位机应可通过虚拟仪器的前置面板界面显示温度数据,若温度超过设定温度,在显示屏上进行报警提示。而下位机则是可以利用单片机对温度传感器采集到的温度数据及时采样,并在数码管上显示,用矩阵键盘来控制和设定温度值,并将采集到的温度数据通过串口传到上位PC机。

要求:

①学生自行设计硬件电路并焊接电路板

②编写上位机虚拟仪器和下位机程序

③实现温度测控并进行系统功能测试

1.2 方案

通过温度传感器DS18B20来实现。

武汉华夏理工学院

图1.1 方案2的系统方框图

本方案的优点是可直接将采集值进行处理得到数字量送入单片机数码管显示并通过串口送至上位机。

2 智能温度测量仪表的硬件设计

2.1 系统硬件框图

本设计是通过温度传感器DS18B20直接将采集值进行处理得到数字量送入单片机。单片机输出信号作用在继电器上,来控制被测对象温度值的升高或降低。最后将转换后的数字信号经单片机进行数字滤波,得到温度值。同时可以通过矩阵键盘进行控制,通过LED进行显示。系统硬件方框图如图2.1所示。

武汉华夏理工学院

图2.1系统硬件框图

2.2 系统的输入通道设计

本系统输入通道作用是将温度转换为数字信号传给单片机。其组成包括:温度传感器DS18B20和一个10K电阻。具体电路如图2.2所示。

武汉华夏理工学院

图2.2 输入通道的设计电路

2.2.1 DS18B20特征与外部引脚

数字温度传感器DS18B20介绍

武汉华夏理工学院

图2.3DS18B20图片

武汉华夏理工学院

图2.4 DS18B20引脚图

DS18B20的主要特性:

1.1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电

1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯

1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温

1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内

1.5、温范围-55℃~+125℃,-10~+85℃时精度为±0.5℃

1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和

0.0625℃,可实现高精度测温

1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快

1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力

1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

2.2.2 DS18B20的外形和内部结构

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

2.2.3 DS18B20引脚定义:

(1)DQ为数字信号输入/输出端;

(2)GND为电源地;

(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

武汉华夏理工学院

图2.5 DS18B20内部结构图

2.2.4 DS18B20工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

2.2.5 DS1820使用中注意事项

DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编

语言实现。

2.3系统的输出通道设计

本系统输出通道作用是来控制被测对象温度值的升高或降低。控制信号从单片机的P2.0口输出,接至PNP型三极管的基极。继电器的绕圈分别接地和PNP三极管集电极,同时绕圈两端还并联有发光二极管,用以直观显示控制信号的变化。为了保护电路,在继电器绕圈两端并联有一个390?电阻。

2.3.1 PNP三极管8550

8550是一种常用的普通三极管。它是一种低电压,大电流,小信号的PNP型硅三极管。如图2.6为三极管的引脚图。

武汉华夏理工学院

图2.6 8550引脚图

2.3.2 HK400-5VDC继电器

电气参数如下:

触点形式:1C(SPDT)

触点负载: 3 A 250 V AC/30 VDC

阻抗:≤100mΩ

额定电流: 3A

电气寿命:≥10万回

机械寿命:≥1000万回

线圈参数:阻值(士10%): 120Ω

线圈功耗:0.2W

额定电压:DC 5V

吸合电压:DC 3.75V

释放电压:DC 0.5V

工作温度:-25℃~+70℃

绝缘电阻:≥100MΩ

线圈与触点间耐压:1000V AC/1分钟

触点与触点间耐压:500V AC/1分钟

2.4人机接口电路

本电路的作用是实现温度显示温度设定。组成模块有4位集成数码显示,4*4键盘等。在该人机接口电路的设计中,Ch451为该模块电路的核心器件,功能相对完善。Ch451不仅

能有效的将采集到的温度值通过数码管进行实时显示;并且还能控制矩阵键盘,读取通过按键获得的温度设定值,一方面可将设定值直接显示,另一方面还能传输给单片机;同时通过Ch451芯片控制键盘输入和数码显示,还可有效的节省单片机P口的使用,方便单片机的扩展设计。

2.5 数码管驱动及键盘控制芯片CH451

CH451是一个整合了数码管显示驱动和键盘扫描控制的多功能外围芯片。CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED ,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过1线或者可以级联的4线串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。其引脚图如图2.12所示

武汉华夏理工学院

图2.12 CH451引脚图

各引脚说明如下表所示:

表2.2

武汉华夏理工学院

2.6单片机最小系统

本部分的作用是处理数据,控制各器件。组成包括89c52单片机,时钟电路,复位电路。

3 系统调试与软件设计

3.1 软件设计

本系统软件编写部分,主要包括以下几个功能:实现温度值的采集与显示、按键定温度值的读取,以及继电器控制信号的正确输出,功能十分全面、系统。具体包括以下内容:温控系统开机后则自动采集实时温度并进行显示;矩阵键盘中的A键为设定温度的功能键,若按下A键则可来时设定温度;随后单片机会不断将实时温度值与设定温度值进行比较,若实时温度值小于设定温度值则控制继电器开关不动作——继续加热,若实时温度值大于设定温度值则控制继电器开关动作——停止加热。

3.2 调试

将各个硬件电路搭建成一个完整的温控系统,并进行调试。根据所搭建的系统,编写相应的软件程序并将各模块调用的子程序进行整合,使其系统化、规范化。运用编译软件Keil 和烧写软件进行编译下载。

3.3上位机软件设计

通过MAX232实现串口通讯,下位机将数据发送到到上位机。上位机可以利用其相对强大的数据处理能力将数据进一步处理,让后输出显示,也可以实现远程控制。本出只是将数据上传,让后以波形,数字和温度计形式显示出来。此处运用LABVIEW软件实现,其程序图如图3.3。前置面板如图3.2。

武汉华夏理工学院

图3.2 上位机前置面板

武汉华夏理工学院

图3.3 上位机程序图

4 设计体会与小结

通过3周的课程设计,我更好地掌握了智能仪器的组成及工作原理、硬件和软件系统的设计方法、基本智能化功能的实现方法、整机设计与调试的方法等。进一步加强自己独立分析、解决问题的能力,同时注意培养自己实事求是、严肃认真的科学作风和良好的实验习惯,为今后工作打下良好的基础。培养并提高自己综合运用所学知识与技术进行仪器设计的实践创新能力,使自己通过实践锻炼,具有较扎实的系统电路设计基础和在实践中发现并解决问题的能力。

参考文献

[1] 董永祥,智能仪器的设计及发展,山西电子技术,2006年第1期。

[2] 史建芳,智能仪器设计基础,北京:电子工业出版社,2007,9

[3]凌志浩,智能仪器原理与设计技术,上海:华东理工大学出版社,2003

[4] 严令,测控系统电子技术,科学出版社,2007

[5] 郝长胜,C语言程序设计,内蒙古大学出版社,2005年12月第一版

附件:

该温度控制系统具体源程序如下所示:

/******************************************************

CH451功能宏定义

******************************************************/ #define CH451_RESET 0x0201 //复位

#define CH451_LEFTMOV 0x0300 //设置移动方式-左移#define CH451_LEFTCYC 0x0301 //设置移动方式-左循

#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移

#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗#define CH451_SYSON1 0x0401 //开显示

#define CH451_SYSON2 0x0403 //开显示、键盘

#define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能#define CH451_DSP 0x0500 //设置默认显示方式

#define CH451_BCD 0x0580 //设置BCD译码方式

#define CH451_TWINKLE 0x0600 //设置闪烁控制

#define CH451_DIG0 0x0800 //数码管位0显示

#define CH451_DIG1 0x0900 //数码管位1显示

#define CH451_DIG2 0x0a00 //数码管位2显示

#define CH451_DIG3 0x0b00 //数码管位3显示

#define CH451_DIG4 0x0c00 //数码管位4显示

#define CH451_DIG5 0x0d00 //数码管位5显示

#define CH451_DIG6 0x0e00 //数码管位6显示

#define CH451_DIG7 0x0f00 //数码管位7显示

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#include

#define uchar unsigned char

#define uint unsigned int

/******************************************************

定义端口

**************************************************/

sbit relay=P2^0;

sbit ch451_dclk=P2^1; //串行数据时钟上升延激活

sbit ch451_din=P2^2; // 串行数据输出,接CH451的数据输入

sbit ch451_load=P2^3;

sbit ch451_dout=P3^3; //INT1,键盘中断和键值数据输入,接CH451的数据输出

sbit DQ=P2^4; //ds18b20 端口

unsigned char showtemp[3]={0,3,6}; //用于存储要显示的温度数据高位在前unsigned char flag=0;

unsigned char ch451_key=0;

sfr dataled=0x80 ;//显示数据端口

unsigned char setb=0;

/******************************************************

全局变量

*****************************************************/

uint temp;

uchar flag_get,count,num,minute,second;

uchar str[6];

/******************************************************

函数声明

*****************************************************/

void delay1(uchar MS);

unsigned int ReadTemperature(void);

void Init_DS18B20(void);

unsigned char ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void delay(unsigned int i);

/******************************************************向CH451传输数据

*************************************************/

//输出命令子程序

//定义一无符号整型变量存储12字节的命令字。

void ch451_write(unsigned int command)

{

unsigned char i;

#ifdef USE_KEY

EX1=0;//禁止键盘中断

#endif

ch451_load=0;//命令开始

for(i=0;i<12;i++)

{ //送入12位数据,低位在前

ch451_din=command&1;

ch451_dclk=0;

command>>=1;

ch451_dclk=1; //上升沿有效

}

ch451_load=1; //加载数据

#ifdef USE_KEY

EX1=1;

#endif

}

/*************************************************

CH451初始化子程序

***************************************************/

void ch451_init()

{

P1=0x60;

ch451_din=0;

ch451_dclk=1; //先低后高,选择4线输入

ch451_din=1;

ch451_load=1;

ch451_dout=1;

#ifdef USE_KEY

IT1=0; //设置下降沿触发

IE1=0; //清中断标志

PX1=1; //设置低优先级

EX1=1; //开中断

#endif

}

//*****************************************************

// 温度设定子程序

//****************************************************** void Set_temp(void) //设定保温点

{ unsigned char i;

ch451_write(CH451_DIG0|showtemp[0]);//显示原来设定温度 ch451_write(CH451_DIG1|showtemp[1]);

ch451_write(CH451_DIG2|showtemp[2]); //设定温度

ch451_write(CH451_TWINKLE|1); //闪烁

EX1=1; //允许键盘中断

while(flag==0);

EX1=0; //禁止键盘中断

flag=0;

showtemp[0]=ch451_key; //保存数据

ch451_write(CH451_DIG0|showtemp[0]); //显示键值

ch451_write(CH451_TWINKLE); //停止闪烁

ch451_write(CH451_TWINKLE|2);

EX1=1; //允许键盘中断

while(flag==0);

EX1=0; //禁止键盘中断

flag=0;

showtemp[1]=ch451_key;

ch451_write(CH451_DIG1|showtemp[1]);

ch451_write(CH451_TWINKLE);

ch451_write(CH451_TWINKLE|4);

EX1=1; //允许键盘中断

while(flag==0);

EX1=0;

//禁止键盘中断

flag=0;

showtemp[2]=ch451_key;

ch451_write(CH451_DIG2|showtemp[2]);

ch451_write(CH451_TWINKLE);

setb=0;

}

//**************************************************

//键盘中断读取键值并且转换为二进制代码

//****************************************************

void ch451_inter() interrupt 2 using 1

{

unsigned char i;

unsigned char keycode1,keycode; //定义命令字,和数据存储器

keycode1=0x07; //输入读451命令字

ch451_load=0;

for(i=0;i<4;i++)

{

ch451_din=keycode1&1; //送入最低位

ch451_dclk=0;

keycode1>>=1; //往右移一位

ch451_dclk=1; //产生时钟上升沿锁通知CH451输入位数据

}

ch451_load=1;//产生加载上升沿通知CH451处理命令数

keycode=0; //清除keycode

keycode1=0;

ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位

ch451_dclk=1;

for(i=0;i<3;i++) //输出行数有四行第一行0

{

keycode1<<=1;

keycode1|=ch451_dout;

ch451_dclk=0;

ch451_dclk=1;

}

for(i=0;i<3;i++) // 输出列数四列第一列为0

{

keycode<<=1;

keycode|=ch451_dout;

ch451_dclk=0;

ch451_dclk=1;

}

ch451_key=keycode1*4+keycode; //计算键值(换算成编号)

if(ch451_key==10)

{

setb=1;

}

flag=1; //标记

IE1=0; //清中断标志

}

/*****************************************************

主程序

****************************************************/

main()

{

unsigned char TempH,TempL,i,j,m;

relay=1;

ch451_init();//初始化451

ch451_write(0x0403); //开显示、键盘

ch451_write(0x580); //设置BCD译码

EA=1;//开中断

while(1)

{

EX1=1; //允许键盘中断

flag=0;

if(setb==1)

{

Set_temp();

}

str[0]=TempH/100; //百位温度

ch451_write(CH451_DIG0|str[0]);

str[1]=(TempH%100)/10; //十位温度

ch451_write(CH451_DIG1|str[1]);

str[2]=(TempH%100)%10; //个位温度,带小数点

ch451_write(CH451_DIG2|str[2]);

ch451_write(CH451_DIG3|0x0c);

for(i=0;i<3;i++)

{

if(str[i]>showtemp[i])//则停止加热

{

m=1;

i=i+3;

}

else if(str[i]

{

m=0;

i=i+3;

}

else

m=m; //继续比较

}

relay=m;

{

temp=ReadTemperature();

str[3]=0;

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL*6/10;//小数近似处理

}

}

}

void delay(unsigned int i)//延时函数

{

while(i--);

}

/**************************************************** DS18B20初始化

****************************************************/ void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时大于480us

DQ = 1; //拉高总线

delay(10);

x=DQ; //稍做延时后,如果x=0则初始化成功。x=1则初始化失败

delay(5);

}

/******************************************************

读一个字节

****************************************************/

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

delay(5);

}

return(dat);

}

/************************************************/

/*写一个字节 */

/************************************************/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay(5);

DQ = 1;

dat>>=1;

}

delay(5);

}

/*****************************************************

读取温度

****************************************************/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b<<=8;

t=a+b;

return(t);

}

武汉华夏理工学院

武汉华夏理工学院

推荐访问:武汉华夏理工学院论文模板 华夏 武汉 理工学院