电子类毕业论文全文
温度控制系统
陈洪
物理与电子信息学院电子信息工程专业2008级 指导教师:陈俊
摘 要:本课题主要介绍基于AT89S52单片机和DS18B20数字温度传感器的温度控制系统。该系统利用单片机分别采集各个温度点的温度。实现温度显示、报警、控制等功能。它以AT89S52单片机为主控芯片,采用数字温度传感器DS18B20实现温度的检测,测量精度可以达到0.5°C,该系统采用了LCD1602显示模块,形象直观的显示测出的温度值。同时该系统采用继电器控制风扇的转动来达到控温的目的。基于AT89S52单片机的单总线温度控制系统具有硬件组成简单、读数方便、精度高、温度范围广等特点,在实际工程中得到广泛应用。 关键词:AT89S52单片机;数字温度传感器;控制
Temperature control system
ChenHong
School of Physics and Electronic Information,Electronic and Information Engineering,
Class10Grade08 Instructor:Chen Jun
Abstract:This subject mainly introduces the temperature control system based on AT89S52 SCM and the digital temperature sensor 18B20 . The system uses the SCM to collecte temperature points respectively each temperature. Realization of temperature display, alarm, control and other functions. It uses the AT89S52 SCM as the main control chip, the digital temperature sensor DS18B20 realize temperature detection and the measurement precision can reach 0.5 degree C, the system adopts LCD1602 display modules, image display the measured temperature value. At the same time, the system adopts the relay to control the rotation of the fan to achieve the purpose of controlling temperature. SCM AT89S52 based on single bus temperature control system has simple hardware composition, reading convenience, high precision, wide temperature range and other characteristics, are widely used in practical engineering.
Key words: AT89S52 SCM; Digital temperature sensor; control
1 绪 论
1.1微控制技术的现状与发展
单片机是指一个集成在一块芯片上的完整计算机系统。尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件: CPU (Central Processing Unit)、内存 、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器 、 实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音 、 图像 、 网络 、复杂的输入输出系统集成在一块芯片上 。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。
1.2温度控制系统
温度控制系统用于温度的采集、显示、控制,它能有效的运用于工业生产中,防止某些生产设备因温度变化而引起的各种不良后果。本系统采用单片机微处理器和简单的外围电路构成,系统简洁可靠,具有很强的实用性。
1.3系统方案及论证 1.3.1系统方案设计
该方案使用了AT89S52单片机作为控制核心,以智能温度传感器DS18B20为温度测量元件,对各点温度进行检测,设置温度上下限,超过其温度值就报警,采用LCD1602液晶模块显示,使用发光二极管,三极管,电阻和蜂鸣器组成的报警电路,用继电器,三极管CPU小风扇组成控制电路。这个系统结构清晰,实用性强。
1.3.2系统方案论证
基于DS18B20的温度测量系统是一种分布式的温度测量系统,它可以远程对温度实现测量和监控,广泛应用于工业、煤矿、森林、火灾、高层建筑等场合,按照DS18B20的通信协议,由主机向向DS18B20发送命令,读取DS18B20转换的温度,从而实现对环境温度的测量,当温度超过一定的值时,报警器开始报警。报警的同时,控制系统开始工作,三极管驱动继电器,接通控制电路,风扇开始转动,已达到降温的目的。
此方案硬件电路非常简单,但程序设计复杂一些,但是在课外对DS18B20、字符型液晶显示有所了解,也曾在网上看到过类似的程序设计,用单片机开发板对系统进行了测试,达到了预期的效果。由此可见,该方案完成具有可行性,体现了技术的先进性,经济上也没有任何问题。
2 系统硬件设计
2.1温度控制系统的组成
本系统主要基于AT89S52单片机和DS18B20数字温度传感器的温度控制系统,该系统利用单片机分别采集各个温度点的温度,实现温度显示、报警、控制等功能。
2.1.1硬件框图
整体方案设计框图如图2.1.1所示:
图2.1.1 方案设计框图
2.1.2微控制器
通过分析系统需求,对于此系统51系列单片机的资源已经足够,所以采用AT89S52单片机做系统的MCU(Micro Control Unit)控制单元性价比最高。本系统采用11.0592Mhz的晶振,按键复位电路,AT89S52系列支持ISP下载编程,可以方便程序的调试开发,减小开发时的成本。模块硬件图纸如图2.1.2:
图2.1.2 单片机小系统
2.1.3电源模块
电源模块采用电源(12V)经过7805稳压后得到。这样的好处是简洁实用,成本低,稳定性也较好。在电源输出端进行整流滤波,得到稳定的5V电源。模块硬件图纸如图2.1.3。
图2.1.3 电源模块
2.1.4显示模块
系统显示模块用于显示温度变化。显示模块是系统的重要组成部分。显示系统的方案有几种,分别是普通的数码管显示,LCD显示屏显示,彩色液晶屏显示。数码管就不说了,没有驱动要加CD4511等外加电路,LCD内部集成有显示芯片,可以识别英文字母、阿拉伯数字和日语片假名。彩色液晶屏成本最高,而且对于MCU的要求也高,优势不明显。综合考虑使用LCD作为显示器件。硬件上采用单片机芯片驱动,电位器调节亮度[1][2]。硬件电路图如下:
图 2.1.4 显示电路 2.1.5声音报警模块
在外界温度高于或低于设置温度的时候,需要简单的声音报警。由于功能
要求不高,可以用简单的蜂鸣器实现[3]。硬件电路图如下:
图2.1.5 声音报警模块
2.1.6温度控制模块
系统由继电器,三极管,小电扇组成,用继电器控制风扇的停转来达到降温的目的,由三极管驱动继电器[4]。
图2.1.6 控制模块
2.1.7键盘控制模块
图2.1.7 键盘控制模块
2.2硬件整体设计(见附录A)
3 系统软件设计
3.1程序设计方案
主程序调用了5个子程序,分别是温度采集程序、LCD
显示程序、温度报警程序、键盘控制和温度控制程序。
通过对各个模块的函数调用达到最终的系统功能,为了让整个软件系统的结构更加清晰,设计将通过程序流程图的方式来描述系统的软件部分。其中主流程
图是程序主函数的内容,其他个子程序流程图是通过主函数调用的方式来实现的。
软件编译环境采用Keil C51 软件[5]提供丰富的库函数和功能强大的集成开发调试工具,全 Windows 界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到 Keil C51 生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
3.2程序主流程图
3.3软件子程序流程图
软件子流程图主要有以下几个部分:温度采集模块、显示模块、报警模块、键盘控制模块和温度控制模块。
3.3.1控制模块
控制模块通过三极管驱动继电器接通风扇转动控制温度变化。
图 3.3.1 温度控制流程图
3.3.2显示模块
显示模块用于显示当前温度,采用的是LCD1602液晶显示屏,具体流程图及部分程序如下:
void lcd_init()//初始化设置// {
delay1ms(15);
wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); }
void display(unsigned char *p)//显示// {
while(*p!='\0') {
wr_dat(*p); p++;
delay1ms(1); } } r3);}
图 3.3.2 显示程序流程图
3.3.3采集模块
主要是用DS18B20采集周围温度。
图3.3.2 温度采集流程图
3.3.4声音提示
该系统中,当温度高于(低于)设定温度时,单片机芯片发出一个高电平,三极管驱动蜂鸣器报警,同时发光二极管发光[6]。部分程序如下:
void vary(uint t) {if (t>15) { beep=1; delay(15); d1=0; d2=0; d3=0; }else {d1=1; d2=1; d3=1; beep=0; fs();
delay(15) }
3.3.5键盘调节模块
3.4 程序调试
程序调试的主要工作是将几个模块的程序放在一起调试,解决相互间调用的问题。其中主要有的问题是程序调用时的变量传递,全局变量与局部变量的设置,有参数函数和无参数函数的使用。Keil编译环境的使用,程序软件在硬件上调试的效果。需要注意的是多个文件编译的时候变量是否重定义,程序执行时时间上的管理等等。
程序中用到的定时器和中断使用注意的问题,避免出现在定时器中断里有延时函数等。尽量减少中断的代码。
总 结
通过这次设计,我觉得自己学到了很多东西。其中我接触到了更多平时没有接触到的元器等,发现了自己很多不足之。我体会到了所学理论知识的重要性:知识掌握越多,设计得就更加严谨,更加顺利。
了解了进行一项相对比较大型的科研设计所必不可少的几个阶段。我经过这次系统的课程设计,熟悉了对一项课题进行研究,设计和试验的详细过程。这些在我们在将来的工作和学习当中都会有很大的帮助。
加深了解了查阅资料和利用工具书的重要性.平时课堂上所学习的知识大多比较陈旧,作为电子信息工程的学生,由于专业涉及知识广,一个人不可能什么都学过,什么都懂,因此,当我在设计过程中需要用到一些不曾学过的东西时,就要去有针对性地查找资料,然后加以利用吸收,以提高自己的应用能力,而且还能增长自己见识,补充我的专业知识。
参考文献
[1]蓝和慧、宁武、闫晓金《单片机应用技能》[M].北京:电子工业出版社,2010:
38-60,227-231.
[2]张鑫、华臻、陈书谦.《单片机原理及应用》[M].北京:电子工业出版社,2005:36-43.
[3]AT89S52 DATA SHEEP Philips Semiconductors 1999.dec
[4]丁元杰、吴大伟.《单片微机实题集与实验指导书》[M].北京:机械工业出版社, 2004:120-128.
[5]温子琪、刘志峰.51单片机C语言全新教程[DB/OL]. http://www.smartmcu.com/
[6]沙占友等编著.《单片机外围电路设计》[M].北京:电子工业出版社.2003:13-20.
附录
附录A
图A1 电路原理图
图A2 设计电路板
附录B 程序
//设置头文件,定义各端口及变量 #include #include #include
#define uchar unsigned char #define uint unsigned int
sbit DQ=P2^0;//ds18b20与单片机连接口sbit RS=P2^7; sbit RW=P2^6; sbit EN=P2^5; sbit beep=P3^7; sbit d1=P3^4; sbit d2=P3^5; sbit d3=P3^6; sbit key_compare=P1^0; sbit key_dec=P1^1; sbit key_inc=P1^2; sbit key_set=P1^3; sbit feng=P2^1;
uchar code str1[]={"Temperature is "}; uchar code str2[]={" "}; uchar code str3[]={" H: L: "}; uchar disdata[14]; uchar tvalue;//温度值 uchar tflag;//温度正负标志 uchar e,f,temp;
//---------------------------------------------------- //
function name: delay1ms(uint ms) // input: ms // output: no // function: delayms
//---------------------------------------------------- void delay1ms(uint ms)//延时1毫秒 {
unsigned int s,j; for(s=0;s
//---------------------------------------------------- // function name: wr_com(uchar com)
本科生毕业论文
(设计)打印专用纸
// input: com // output: no
// function: write command //---------------------------------------------------- void wr_com(uchar com)//写指令 {
delay1ms(1);
RS=0;//RS数据命令选择端,高电平为数据,低电平为命令 RW=0;//RW读写选择端,高电平为读,低电平为写 EN=0; P0=com; delay1ms(1); EN=1; delay1ms(1); EN=0; }
//---------------------------------------------------- //
function name: wr_dat(unsigned char dat) // input: dat // output: no // function: write data
//---------------------------------------------------- void wr_dat(unsigned char dat)//写数据 {
delay1ms(1);; RS=1; RW=0; EN=0; P0=dat; delay1ms(1); EN=1; delay1ms(1); EN=0; }
//---------------------------------------------------- //
function name: lcd_init() // input: no // output: no
// function: initialization lcd //---------------------------------------------------- void lcd_init()//初始化设置// {
delay1ms(15);
wr_com(0x38);delay1ms(5); //设置16X2显示,5X7阵列,8位数据接口 wr_com(0x08);delay1ms(5);//关闭显示
wr_com(0x01);delay1ms(5); //清显示,光标复位到00H位置. wr_com(0x06);delay1ms(5); //显示光标移动设置
wr_com(0x0c);delay1ms(5);//显示开/关设置(设置显示、光标和闪烁开关) }
//---------------------------------------------------- //
function name: display(unsigned char *p)) // input: p // output: no // function: display
//---------------------------------------------------- void display(unsigned char *p)//显示// {
while(*p!='\0') {
wr_dat(*p); p++; delay1ms(1); } }
//---------------------------------------------------- //
function name: nit_play() // input: no // output: no
// function: initialization display //---------------------------------------------------- void init_play()//初始化显示 {
lcd_init();
wr_com(0x80);//设置数据地址指针 display(str1); wr_com(0xc0); display(str2); }
//---------------------------------------------------- //
function name: lcd_init2() // input: no // output: no
// function: initialization //---------------------------------------------------- void lcd_init2()//初始化设置//
{
本科生毕业论文(设计)打印专用纸 delay1ms(15);
wr_com(0x38);delay1ms(15);
wr_com(0x0e);delay1ms(15);//光标不闪烁
wr_com(0xc9);delay1ms(15);
wr_com(0x06);delay1ms(15);
}
//----------------------------------------------------
// function name: init_play2()
// input: no
// output: no
// function: initialization
//----------------------------------------------------
void init_play2()//初始化显示2
{
lcd_init2();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str3);
}
/******************************ds1820程序***************************************/
// function name: delay_18B20(uint i)
// input: i
// output: no
// function: delay 1ms
//----------------------------------------------------
void delay_18B20(uint i)//延时1微秒
{
while(i--);
}
//----------------------------------------------------
// function name: ds1820rst()
// input: no
// output: no
// function: /*ds1820复位*/
//----------------------------------------------------
void ds1820rst()
{
uchar x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
//----------------------------------------------------
// function name: ds1820rd()
// input: no
// output: dat
// function: /*读数据*/
//----------------------------------------------------
uchar ds1820rd()
{
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_18B20(10);
}
return(dat);
}
//----------------------------------------------------
// function name: ads1820wr(uchar wdat)
// input: wdat
// output: no
// function: /*写数据*/
//----------------------------------------------------
void ds1820wr(uchar wdat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdat&0x01;
delay_18B20(10);
DQ = 1;
wdat>>=1;
}
本科生毕业论文
(设计)打印专用纸
}
//----------------------------------------------------
// function name: read_temp()
// input: no
// output: tvalue
// function: 读取温度值并转换
//----------------------------------------------------
read_temp()
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue
tvalue=tvalue|a;
if(tvalue
tflag=0;
else
{
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
//----------------------------------------------------
// function name: ds1820disp()
// input: no
// output: no
// function: 温度值显示
//----------------------------------------------------
void ds1820disp()
{
uchar flagdat;
disdata[0]=tvalue%1000/100+0x30;//十位数
disdata[1]=tvalue%100/10+0x30;//个位数 tvalue=~tvalue+1; tflag=1;
disdata[2]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示十位
wr_com(0xc2);
wr_dat(disdata[1]);//显示个位
wr_com(0xc3);
wr_dat(0x2e);//显示小数点
wr_com(0xc4);
wr_dat(disdata[2]);//显示小数位
}
//----------------------------------------------------
// function name: delay(uint z)
// input: z
// output: no
// function: delay z ms
//----------------------------------------------------
void delay(uint z) //这个大约定时zms
{
uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);
}
//----------------------------------------------------
// function name: vary(uint t)
// input: t
// output: no
// function: 控制温度
//----------------------------------------------------
void fs()
{
feng=1; disdata[0]=0x20;//如果百位为0,十位为0也不显示 }
delay(30);
}
void vary(uint t)
{
if (t=e)
{
beep=0;
delay(15);
d1=0;
d2=0;
d3=0;
fs();
delay(15);
}
else
{
d1=1;
d2=1;
d3=1;
beep=1;
} }
//----------------------------------------------------
// function name: disp()
// input: no
// output: no
// function: //设置温度时显示
//----------------------------------------------------
void disp()
{
wr_com(0xc9);
wr_dat(e/10+48);//h十位
wr_com(0xca); //h个位
wr_dat(e%10+48);
wr_com(0xce);
wr_dat(f/10+48);
wr_com(0xcf);
wr_dat(f%10+48);
}
//----------------------------------------------------
// function name: anjian()
// input: no
// output: no
// function: 按键控制
//----------------------------------------------------
本科生毕业论文
(设计)打印专用纸
void anjian()
{
if(key_set==0)
{
delay(10);
if(key_set==0)
{
temp++;
if(temp==3)
temp=0;
init_play2();
disp();
}
while(key_set==0);
}
if(key_inc==0)
{
delay(10);
if(key_inc==0);
{
if(temp==1)
e++;
if(temp==2)
{
if(f
f++;
}
init_play2();
disp();
}
while(key_inc==0);
}
if(key_dec==0)
{
delay(10);
if(key_dec==0)
{
if(temp==1)
{
if(e>f)
e--;
本科生毕业论文
(设计)打印专用纸
}
/********************主程序***********************************/
//----------------------------------------------------
// function name: main()
// input: no
// output: no
// function: 主函数
//----------------------------------------------------
void main()
{
e=17;f=10;temp=0x01;
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
vary( (uchar)tvalue/10) ;//温度变化报警 anjian();
}
} } } while(key_dec==0); } if(temp==2) { if(f>0) f--; } disp(); init_play2(); if(key_compare==0) delay(10); } if(key_compare==0) { } init_play(); temp=0; { while(key_compare==0);
致 谢
本论文和设计是在陈俊老师的悉心指导下完成的。陈俊老师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华,平易近人的人格魅力对我影响深远。本论文从选题到完成,每一步都是在导师的指导下完成的,倾注了导师大量的心血。尤其是论文的指导方面,给予了很多中肯的建议,并且提出解决方案。在此,谨向导师表示崇高的敬意和衷心的感谢!
大学即将结束,在这四年的时光里,是西华师范大学给了我成长进步的环境,在这四年的时间里,老师细心的指导和教诲让我学到了很多的专业知识,并且在实践中得到了很好的运用。在这里我要感谢我的班主任滕军老师,在大学的学习和生活中给了我很多帮助,他对于学术研究上的严谨态度和教育上的高尚师德对我的大学学习有着积极的影响。感谢学校领导的关怀和照顾。感谢所有的老师得教导,你们教授的知识将会让我受益一生。在此对我的母校和我的老师表示衷心的感谢。愿老师桃李满园,身体康泰。
感谢我的亲人和我的大学朋友,是你们让我的大学生活如此丰富。感谢你们在设计过程中为之付出的一切。感谢金凤同学在设计中提供的帮助。感谢所有在大学四年里帮助过我的人,感谢我的所有好友,谢谢你们。