单片机温度控制器
题目:基于单片机数字控温器
队员:武卫星 姜迎春 王伟勋
系别:电气与电子工程系
目录
设计目的-------------------------------------------------------------------------- 1
设计要求----------------------------------------------------------- ---------------1
设计方案--------------------------------------------- 1
系统工作原理-------------------------------------------------------------------- 2
各部分电路的设计和芯片的结构功能作用-------------------------------- 2
单片机程序(C语言程序)------------------------------------------------------ 11
设计总结------------------------------------------- 20
一、设计目的
1、系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。
培养一定的自学能力和独立分析问题、解决问题的能力,和团队协
作能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案。
2、能设计、安装和调试数显温度测试控制系统,并能利用模拟和数字
电路和单片机的知识分析和解决设计、安装和调试中遇到的实际问
题。
3、能熟练的设计并良好的印制PCB电路板。
4、对温度的控制要求尽量的高效,精确。
二、设计要求
1、
(1)温度控制范围为30度~100度之间;
(2)可键盘设置控制温度值,并显示;
(3)数字显示水的实际温度;
(4)设置温度控制值和检测值之间的误差在±1度;
2、发挥部分
(1)设计温度报警电路;
(2)升温或降温在5—10分钟之内完成;
三、设计方案
方案:用控制器MCS-51系列单片机和数字传感器DS18B20来进行控制,
并用七段数码显示管来显示温度,在程序中来设置温度的上下限,当温
度超出上下限时,由单片机发出控制信号,外界控制电路接收信号并作
相应的响应来调节温度。此为全控制型,最为简便。
四、系统工作原理
1、系统的总体结构图如下:
2、工作原理
首先,由数字温度传感器感受出温度并将其数字信号传递给单片
机的接口部分,单片机接收到信号后,对其进行处理(由导入单片机的
程序设置处理过程及处理结果),并将处理后的结果通过端口传递给七
段数码显示管让其显示出当前的温度值。如果温度高于或者是低于所设
置的温度上下限(上下限由程序进行设置),单片机以端口就向蜂鸣器
和外接的控制装置发出信号,蜂鸣器接收信号后开始报警,外接控制装
置接收信号后分析是上限信号还是下限信号(可调节),分析后控制升
温或者是降温。当温度恢复至所控制的范围后,数字温度传感器感受温
度后将数字信号传递给单片机,单片机处理后则停止向蜂鸣器和外接的
控制装置发信号,蜂鸣器和控制装置就停止动作等待下一次信号的到
1、单片机STC89C52RC
能力,在电源的一端接上一个小电容。 制,方便快捷(直流电机的旋转来模拟升温和降温)。 数字温度计 五、各部分电路的设计和芯片的结构功能作用 (2)外接晶振引脚XTAL1和XTAL2 它是一个反相放大器的输入端,这个放大器构成了片内振荡器。 来。此过程即完成了温度的测量和两点间的温度控制工作,完全自动控(1)如上图所示,单片机能正常工作的条件,复位电路,和晶振电出现连续两个高电平,可使单片机回到初始状态。为了提高系统的抗干扰路,其中当按下按键开关REST,此时当处于震荡器工作的单片机RESETXTAL1(19脚)和XTAL2(18脚):接外部石英晶振的一端,在单片机的内部,
2、数字温度传感器DS18B20介绍
(1)DS18B20基本介绍
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且 可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总 线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。 (2)DS18B20简介
(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口
线即 可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围: 3.0" 5.5 V。
(4)测温范围:-55 ~ 125 ℃。固有测温分辨率为0.5 ℃。
(5)通过编程可实现9"12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实
现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正
常工作。
(3)DS18B20的工作时序
DS18B20的工作时序包括初始化时序、写时序和读时序。
(1) 初始化:单片机将数据线的电平拉低480~960us后释放,等待
15~60us, 单总线器件即可输出一持续60~240us的低电平(存在脉
冲)单片机收到此应答后即可进行操作。
(2) 写时序:当主机将数据线的电平从高拉到低时,形成写时序,有
“0”和写“1”两种时序。写时序开始后,DS18B20在15us~60us
期间从数据线上采样。如果采样到低电平,则向DS18B20写“0”;
如果采样到高电平,则向DS18B20写“1”。两个独立的时序间至
少需要1us的恢复时间(拉高总线电平)。
(3) 读时序:当主机从DS18b20读取数时,产生时序。此时,主机将
数据线的电平从高拉到低使读时序被初始化。如果此后15us内,
主机总线上采样到低电平,则DS18B20读“0”;如果此后15us
内,主机在总线上采样到高电平,则DS18B20读“1”。
数字温度计 (3)DS18B20的各个引脚与单片机连接图
5、七段数码显示管 数字温度计 控制,利用其动态扫描,来显示四位不同的数字温度。 七段数码显示管用于显示所测量的温度值,如下图所示:
此数码管的位选段由P2.0~P2.4进行控制选通,段选端则有P1八位口进行6、温度控制部分和报警蜂鸣器的连接电路
数字温度计
(1)蜂鸣器的工作,当温度高于上限温度或是低于下限温度时,单片机控制器的P0.7口的就输出高低电平的波形而使三极管集电极和积集导通从而让蜂鸣器发出报警的声音。而当温度被控制在一个范围内时,单片机的P0.7口就发停止发出波形,而使蜂鸣器停止报警。
(2)外接温度控制部分,此部分为一个继电器,当温度低于下限温度时,单片机的P2.6口就发出低电平,从而是继电器的控制端通电导通,当继电器导通时,继电器的常闭触点变为常开触点,从而使C和B点连接导通,使加热装置通电,对被加热物体加热,使温度升高。当温度高于上限温度时,单片机的P2.6口就停止发出低电平,三极管关短导致继电器控制端也关断,使常开触点变为常闭触点,C和A之间导通,使外部制冷装置工作从而使温度降低致所规定的范围。
7、HK4001继电器S3-5工作原理
(1)继电器是一种电子控制器件,它具有控制系统(又称输入回路)
和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
(2)电磁继电器一般由 电磁铁,衔铁,弹簧片,触点 等组成的,其工作电路由低压控制电路和高压工作电路两部分构成。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。
8、上下限温度调节按钮电路
按钮S13控制上限温度的选择,当按下S13按钮时,数码管上显示上
限温度值。按钮S14控制着下限温度的选择,当按下S14时,数码管显示下限温度值。S15为温度上下限设置增加键,S16为上下限温度设置减少键。通过此四个按键可以任意设置上下限温度。
六、单片机程序如下(C语言程序)
1
、
程
序
编
写
模
块
温度可控恒温箱程序
/**************************************************************/ DS18B20的读写程序,数据脚P33 最大转化时间750微秒,显示温度-55.0到+99.9度,显示精度 为0.1度,显示采用4位LED共阳显示测温值
P1口为段码输入,P20~P23为位选 晶振为12MHZ /**************************************************************/ #include
#include //_nop_();延时函数用 #define uint unsigned int #define uchar unsigned char uint a=250; uint b=200;
sbit DQ=P3^0; //温度输入口 sbit P20=P2^0; sbit P21=P2^1;
sbit P22=P2^2; sbit P23=P2^3; sbit P17=P1^7; sbit P25=P2^5; sbit P26=P2^6; sbit S1=P3^4; sbit S2=P3^5; sbit S3=P3^6; sbit S4=P3^7;
unsigned int h,n=0; unsigned int temp;
/*uchar code table[]={0x40,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88,0x80,0xc6,0xa1,0x86,
0x8e};*/
//温度小数部分用查表法
unsigned char data temp_data[2]={0x00,0x00}; unsigned char data display[5]={0x00,0x00,0x00,0x00,0x00}; 数据和一个运算暂用
//11us延时函数 void delay(unsigned int t) {
for (;t>0;t--); } //
//延时882us void delay882us(void) {
unsigned char i; for(i=0;i
//消震除延时程序 void delay1(uint z) { int x,y;
for(x=z;x>0;x--)
//读出温度暂放
//显示单元数据,共4个
for(y=110;y>0;y--); }
//DS18B20复位函数 ow_reset(void) {
char presence=1; while(presence) {
while(presence) {
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0; delay(50); //550 us
DQ=1; delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步 }
delay(45); //延时500 us presence=~DQ; }
DQ=1; //拉高电平 }
//DS18B20写命令函数 //向1-WIRE 总线上写1个字节 void write_byte(unsigned char val) {
unsigned char i; for(i=8;i>0;i--) {
DQ=1;_nop_();_nop_(); //从高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_();//5 us DQ=val&0x01; //最低位移出 delay(6); //66 us val=val/2; //右移1位 }
DQ=1; delay(1); }
//DS18B20读1字节函数 //从总线上取1个字节
unsigned char read_byte(void) {
unsigned char i;
unsigned char value=0; for(i=8;i>0;i--) {
DQ=1;_nop_();_nop_(); value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_();//4 us if(DQ)value|=0x80;
delay(6); //66 us }
DQ=1;
return(value); }
//读出温度函数
unsigned int read_temp() {
ow_reset(); //总线复位 delay(200);
write_byte(0xcc); //发命令 write_byte(0x44); //发转换命令 ow_reset(); delay(1);
write_byte(0xcc); //发命令 write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的低字节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1];
temp6348) {
temp=65536-temp; n=1; }
display[4]=temp&0x0f; // 取小数部分的值 temp=temp>>4; // 取中间八位,即整数部分的值 temp=temp*10+display[4];
return temp; //返回温度值 }
//数码管扫描
void x8led(unsigned long ddd) {
unsigned char l[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; unsigned char xx[4]={0,0,0,0}; xx[0]=ddd%10; xx[2]=ddd/10%10; xx[1]=ddd/100%10; xx[3]=ddd/1000%10;
P20=0;
P1=l[xx[0]]; delay882us(); P20=1; P21=0;
P1=l[xx[1]]; delay882us(); P21=1; P22=0;
P1=l[xx[2]]; P17=0;
delay882us(); P22=1; P23=0;
P1=l[xx[3]]; delay882us(); P23=1; }
//蜂鸣器报警模块 void baojing() {
BEEP=~BEEP; delay(40); }
//主函数 void main() {
P0=0xff; //初始化端口 P2=0xff;
for(h=0;h
ow_reset(); //开机先转换一次 write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h
while(1) {
temp=read_temp(); //处理温度数 if(S2==0) {
delay1(150); while(1) {
if(S1==0) {
delay1(80); if(S1==0) a++; }
if(S3==0) {
delay1(80); if(S3==0) a--; } x8led(a); if(S2==0) {
delay1(150); break; } } }
if(S4==0) {
delay1(150); while(1) {
if(S1==0) {
delay1(80); if(S1==0) b++;
}
if(S3==0)
{
delay1(80);
if(S3==0)
b--;
}
x8led(b);
if(S4==0)
{
delay1(150);
break;
}
}
}
if(b>=a ) //当上限温度低于下限温度时报警
{
baojing();
}
if(temp>a)
{
baojing();
P25=0;
}
else if(temp
{
baojing();
P26=0;
}
x8led(temp); //显示温度值
}
}
七、整体电路图
见附图
八、设计进程及设计总结
1、设计进程
由于前期准备不足,和个人的认真程度不够。造成PCB封装没有按照给定的元器件直板,经多次修改才有比较完整较理想的PCB电路图。但因为近日没有找到老师领取铜板,现在还没有印制。现在硬件的设计和软件的仿真都测试完成。
2、设计过程中的收获
怀着对电子设计的浓厚兴趣,我们充满信心的参加了这次培训,通过这段时间的培训,不仅使我们收获了很多以前不知道的知识,同时,在学习的过程中,也使我们收获了很多的快乐。
这段时间,我们又重新看了一遍Protel2004的教学视频,使我们对这个软件又有了更深一步的了解,现在我们已经熟练掌握了用这个软件绘图,布线,制作元件封装,印制电路板等。我们还看了郭天祥的单片机教学视频,对用C语言编程有了更深刻的认识和理解,并熟悉Multisim电路设计仿真软件。
在学习的过程中,我们也曾遇到过很多难题,但都经过我们的不断努力克服掉了。在基础学习阶段,我们从基础开始学习,把以前学习的模电、数电、单片机、Protel等课程从新复习了一遍。同时我们也注重个人能力的提高和培养,有武卫星和姜迎春同学注重学习程序的编译,王伟勋同学负责硬件的开发学习。这段时间让我们认识到了团队合作,自主学习,实践创新,吃苦耐劳的的重要性。我们会不断的努力学习,提高自己。
附图1:PCB印制电路板
附图2:原理图
数字温度计
数字温度计