单片机温度控制系统的Word文件下载.docx
《单片机温度控制系统的Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机温度控制系统的Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
复位电路、震荡电路以及存储器选择模式(EA脚的高低电平选择),电路如下图2所示:
图2单片机最小系统
(三)单片机的选型
本课题设计的温度控制系统主控制芯片选型为STC89C52单片机,其特点如下:
1.STC89C52单片机简介
目前,51系列单片机在工业检测领域中得到了广泛的应用,因此我们可以在许多单片机应用领域中,配接各种类型的语音接口,构成具有合成语音输出能力的综合应用系统,以增强人机对话的功能。
STC89C52单片机是深圳宏晶科技有限公司生产的一种单片机,在一小块芯片上集成了一个微型计算机的各个组成部分。
每一个单片机包括:
一个8位的微型处理器CPU;
一个512K的片内数据存储器RAM;
4K片内程序存储器;
四个8位并行的I/O接口P0-P3,每个接口既可以输入,也可以输出;
两个定时器/记数器;
五个中断源的中断控制系统;
一个全双工UART的串行I/O口;
片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。
最高允许振荡频率是12MHZ。
以上各个部分通过内部总线相连接。
2.STC89C52单片机时序
STC89C52单片机的一个执器周期由6个状态(s1—s6)组成,每个状态又持续2个震荡周期,分为P1和P2两个节拍。
这样,一个机器周期由12个振荡周期组成。
若采用12MHz的晶体振荡器,则每个机器周期为1us,每个状态周期为1/6us;
在一数情况下,算术和逻辑操作发生在N期间,而内部寄存器到寄存器的传输发生在P2期间。
对于单周期指令,当指令操作码读人指令寄存器时,使从S1P2开始执行指令。
如果是双字节指令,则在同一机器周期的s4读人第二字节。
若为单字节指令,则在51期间仍进行读,但所读入的字节操作码被忽略,且程序计数据也不加1。
在加结束时完成指令操作。
多数STC89C52指令周期为1—2个机器周期,只有乘法和除法指令需要两个以上机器周期的指令,它们需4个机器周期。
对于双字节单机器指令,通常是在一个机器周期内从程序存储器中读人两个字节,但Movx指令例外,Movx指令是访问外部数据存储器的单字节双机器周期指令,在执行Movx指令期间,外部数据存储器被访问且被选通时跳过两次取指操作。
3.STC89C52单片机引脚介绍
STC89C52单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
下面按引脚功能分为4个部分叙述个引脚的功能。
(1)电源引脚Vcc和Vss
Vcc(40脚):
接+5V电源正端;
Vss(20脚):
接+5V电源正端。
(2)外接晶振引脚XTAL1和XTAL2
XTAL1(19脚):
接外部石英晶体的一端。
在单片机内部,它是一个反相放大器的输入端,这个放大器构成采用外部时钟时,对于HMOS单片机,该引脚接地;
对于CHOMS单片机,该引脚作为外部振荡信号的输入端。
XTAL2(18脚):
接外部晶体的另一端。
在单片机内部,接至片内振荡器的反相放大器的输出端。
当采用外部时钟时,对于HMOS单片机,该引脚作为外部振荡信号的输入端。
对于CHMOS芯片,该引脚悬空不接。
(3)控制信号或与其它电源复用引脚
控制信号或与其它电源复用引脚有RST/VPD、ALE/P、PSEN和EA/VPP等4种形式。
(A).RST/VPD(9脚):
RST即为RESET,VPD为备用电源,所以该引脚为单片机的上电复位或掉电保护端。
当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机复位到初始状态。
当VCC发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。
(B).ALE/P(30脚):
当访问外部存储器时,ALE(允许地址锁存信号)以每机器周期两次的信号输出,用于锁存出现在P0口的低
(C).PSEN(29脚):
片外程序存储器读选通输出端,低电平有效。
当从外部程序存储器读取指令或常数期间,每个机器周期PESN两次有效,以通过数据总线口读回指令或常数。
当访问外部数据存储器期间,PESN信号将不出现。
(D).EA/Vpp(31脚):
EA为访问外部程序储器控制信号,低电平有效。
当EA端保持高电平时,单片机访问片内程序存储器4KB(MS—52子系列为8KB)。
若超出该范围时,自动转去执行外部程序存储器的程序。
当EA端保持低电平时,无论片内有无程序存储器,均只访问外部程序存储器。
对于片内含有EPROM的单片机,在EPROM编程期间,该引脚用于接21V的编程电源Vpp。
(4)输入/输出(I/O)引脚P0口、P1口、P2口及P3口
(A).P0口(39脚~22脚):
P0.0~P0.7统称为P0口。
当不接外部存储器与不扩展I/O接口时,它可作为准双向8位输入/输出接口。
当接有外部程序存储器或扩展I/O口时,P0口为地址/数据分时复用口。
它分时提供8位双向数据总线。
对于片内含有EPROM的单片机,当EPROM编程时,从P0口输入指令字节,而当检验程序时,则输出指令字节。
(B).P1口(1脚~8脚):
P1.0~P1.7统称为P1口,可作为准双向I/O接口使用。
对于MCS—52子系列单片机,P1.0和P1.1还有第2功能:
P1.0口用作定时器/计数器2的计数脉冲输入端T2;
P1.1用作定时器/计数器2的外部控制端T2EX。
对于EPROM编程和进行程序校验时,P0口接收输入的低8位地址。
(C).P2口(21脚~28脚):
P2.0~P2.7统称为P2口,一般可作为准双向I/O接口。
当接有外部程序存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用于高8位地址总线送出高8位地址。
对于EPROM编程和进行程序校验时,P2口接收输入的8位地址。
(D).P3口(10脚~17脚):
P3.0~P3.7统称为P3口。
它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可独立定义为第1功能的输入输出或第2功能。
P3口的第2功能见下表
表1单片机P3.0管脚含义
引脚
第2功能
P3.0
RXD(串行口输入端0)
P3.1
TXD(串行口输出端)
P3.2
INT0(部中断0请求输入端,低电平有效)
P3.3
INT1(中断1请求输入端,低电平有效)
P3.4
T0(时器/计数器0计数脉冲端)
P3.5
T1(时器/计数器1数脉冲端)
P3.6
WR(部数据存储器写选通信号输出端,低电平有效)
P3.7
RD(部数据存储器读选通信号输出端,低电平有效)
综上所述,MCS—51系列单片机的引脚作用可归纳为以下两点:
1).单片机功能多,引脚数少,因而许多引脚具有第2功能;
2).单片机对外呈3总线形式,由P2、P0口组成16位地址总线;
由P0口分时复用作为数据总线。
(四)温度传感器电路
采用一线制数字温度传感器DS18B20来作为本课题的温度传感器。
传感器输出信号进4.7K的上拉电阻直接接到单片机的P1.0引脚上。
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。
该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。
本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:
(1)系统的特性:
测温范围为-55℃~+125℃,测温精度为士0.5℃;
温度转换精度9~12位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;
12位精度转换的最大时间为750ms;
可以通过数据线供电,具有超低功耗工作方式。
(2)系统成本:
由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。
一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。
(3)系统复杂度:
由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。
(4)系统的调试和维护:
由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。
同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。
DS18B20温度传感器只有三根外引线:
单线数据传输总线端口DQ,外供电源线VDD,共用地线GND。
DS18B20有两种供电方式:
一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。
这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。
另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。
在本设计中采用外部供电方式实现DS18B20传感器与单片机的连接,其接口电路如图4所示。
图3温度传感器接口
(五)LCD显示电路
本课题设计的温度控制系统是采用液晶屏128*64作为显示模块,其接口原理图如下图6所示:
图4液晶显示接口电路
(六)按键接口电路
本课题设计采用的键盘模块,其接口原理图如下图8所示:
图6键盘模块电路
(七)升温降温电路
本设计采用了光电耦合器控制三极管,再进一步控制继电器线圈,这样做的好处:
信号单向传输,输入端与输出端完全实现了电气隔离,输出信号对输入端无影响,抗干扰能力强,工作稳定,无触点,使用寿命长,传输效率高。
如下图所示。
图7升降温模块电路
(八)报警电路
本设计采用蜂鸣音报警电路。
连接图如图3-6所示,当输出高电平“1”时,晶体三极管导通,压电蜂鸣器两端获得约+5V电压而鸣叫;
当输出低电平“0”时,三极管截止,蜂鸣器停止发声。
图8三极管驱动的蜂鸣音报警电路
报警电路与单片机的P1.7口相连,当单片机输出一个低电平时,蜂鸣器就会发出报警信号,说明温度已经超过规定的上下限值,外部输出设备应该启动进行相应的措施。
只用在人按下复位按钮或温度在允许的范围内报警电路就不会触动。
三、系统软件设计
系统的软件主要是采用C语言,对单片机进行变成实现各项功能。
主程序对模块进行初始化,而后调用读温度、处理温度、显示、键盘等模块。
用的是循环查询方式,来显示和控制温度,主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值并负责调用各子程序,其程序流程如图10系统程序流程图。
图9系统程序流程图
(一)温度采集子程序
温度采集就是把温度传感器采集到的数据传输给单片机,供显示器显示和温度控制部分的判定。
程序流程框图如图12所示。
图10温度采集流程图
(二)按键扫描子程序
按键扫描就是通过按键调节设定温度的上下限的值和控制单片机的复位。
按键扫描程序流程图如图14。
图11按键扫描子程序
(二)温度控制子程序
温度控制就是通过采集到的温度预设定的温度比较,当温度高于设定的温度上限时,并通过光电耦合器和继电器的动作,继而启动通风散热设备,使棚内的温度降低;
当温度低于设定的温度下限时,并通过光电耦合器和继电器的动作,继而启动加热设备,是棚内的温度升高。
温度控制程序流程图如下图所示。
图12温度控制子程序
四、结束语
本设计是一个温度自动控制系统。
系统温度可以在一定范围内由人工设定,并能在环境温度降低时实现自动通风降温,在环境温度升高时实现自动升温,以保持温度在设定的范围内。
通过此次毕业论文的课题设计,我们学会了怎样把所学的书本知识应用于实践中去,并学会了如何去思考整个控制系统的软硬件设计。
参考文献
[1]李广弟,朱月秀,王秀山.《单片机基础》北京航空航天大学出版社,2001(07).
[2]蔡美琴,张为民等.《MCS-51系列单片机系统及其应用》高等教育出版社,2004(06).
[3]张毅刚,等.MCS-51单片机应用设计[M].哈尔滨工业大学出版社,1997.
[4]刘瑞星,胡健等.《ProtelDXP实用教程》机械工业出版社,2003(04).
[5]于海生.《计算机控制技术》机械工业出版社2007(05).
[6]谭浩强.《C程序设计》清华大学出版社.
[7]康华光.《电子技术基础模拟部分》高等教育出版社1998(08).
[8]余锡存.《单片机原理与接口技术》西安电子科技大学出版社,2003.
附件1:
系统原理图
附件2:
源程序
#include<
reg52.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitleden=P2^2;
sbitledrs=P2^0;
sbitds=P2^7;
sbitled0=P3^6;
//加热端口
sbitFan=P3^7;
//风扇端口
sbitkey1=P1^0;
//按一下,温度上限加1
sbitkey2=P1^2;
//按一下,温度上限减1
sbitkey3=P1^4;
//按一下,温度下限加1
sbitkey4=P1^6;
//按一下,温度下限减1
sbitTru=P1^7;
uinttemp;
floatf_temp;
ucharTFLAG;
uintnum=280;
//温度上限
uintnum2=150;
//温度下限
unsignedchardisdata[4];
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelayms(uintxms)//延时
uinti,j;
for(i=xms;
i>
i--)
for(j=10;
j>
j--);
voidwrite_com(ucharcom)//lcd1602写指令
ledrs=0;
P0=com;
delay(5);
leden=1;
leden=0;
voidwrite_date(uchardate)//lcd1602写数据
ledrs=1;
P0=date;
voidinit()//lcd1602初始化
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
voiddsreset(void)//ds18b20初始化
uinti;
ds=0;
i=103;
while(i>
0)i--;
ds=1;
i=4;
bittempreadbit(void)//ds18b20读字节
bitdat;
i++;
i++;
dat=ds;
i=8;
return(dat);
uchartempread(void)//ds18b20读字
uchari,j,dat;
dat=0;
for(i=1;
i<
=8;
i++)
{
j=tempreadbit();
dat=(j<
<
7)|(dat>
>
1);
}
voidtempwritebyte(uchardat)//ds18b20写字
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)
{
ds=0;
i++;
ds=1;
i=8;
while(i>
}
else
voidtempchange(void)
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
//ds18b20温度转换指令
uintget_temp()//ds18b20温度转换
uchara,b;
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<
temp=temp|a;
if(temp<
0x0800)
f_temp=temp*0.0625;
TFLAG=0;
else
f_temp=(~temp)+1;
f_temp=f_temp*0.0625;
TFLAG=1;
}
temp=f_temp*10;
returntemp;
voidwarn()//闪烁报警
{
led0=1;
delay(100);
led0=0;
voidwarn1()//蜂鸣器报警
Tru=1;
Tru=0;
}
voidmotor()//马达转动
{Fan=1;
Fan=0;
voiddeal(uintt)//数据处理
if((t>
num)|(t<
num2)