基于STC单片机恒温控制系统的设计及C语言程序.docx
- 文档编号:29914479
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:41
- 大小:1.68MB
基于STC单片机恒温控制系统的设计及C语言程序.docx
《基于STC单片机恒温控制系统的设计及C语言程序.docx》由会员分享,可在线阅读,更多相关《基于STC单片机恒温控制系统的设计及C语言程序.docx(41页珍藏版)》请在冰豆网上搜索。
基于STC单片机恒温控制系统的设计及C语言程序
第 1 章恒温控制系统完成的功能………………………………………………………1
第 2 章 总体设计方案………………………………………………………………………1
2.1 单片机主控制电路………………………………………………………………………1
2.3 温度测量与控制模块……………………………………………………………………1
2.2 人机交互模块……………………………………………………………………………2
第 3 章 硬件电路详细设计……………………………………………………………… 2
3.1 单片机最小系统…………………………………………………………………………2
3.2 人机交互模块……………………………………………………………………………3
3.3 测温模块…………………………………………………………………………………5
3.4 温度控制模块……………………………………………………………………………5
3.5 总电路图…………………………………………………………………………………6
第 4 章 系统软件设计………………………………………………………………………6
4.1 原理框图…………………………………………………………………………………6
4.2 详细程序…………………………………………………………………………………8
结论………………………………………………………………………………………………16
参考文献…………………………………………………………………………………………16
第 1 章 恒温控制系统完成的功能
本恒温控制系统设计采用现在流行的 51 系列单片机,配以 DS18B20 数字温度传感器,
能够较精确的控制温度,并显示设定温度与当前温度。
单片机将实时检测到的温度与设定的
温度进行比较,根据两者差值决定是否让加热电阻加热以及加热多长时间。
实现了基本的温度控制功能:
①当温度低于设定温度 1℃时,单片机输出高电平,控制大
功率三极管导通,进而使得加热电阻通电,加热电阻加热,温度快速上升,同时红灯亮。
②
当温度上升到与设定温度差值小于 1℃时,单片机输出高低电平的时间不相等,也就是加热
电阻的通断时间不等,使得温度缓慢上升,同时红、绿灯都亮。
③当温度上升到设定温度时,
单片机输出低电平,三极管截止,加热电阻停止加热,同时绿灯亮。
数码管实时显示温度,精确到小数点后一位,同时可以通过 2 个按键调节设定温度。
第 2 章 总体设计方案
系统总体框图如图 1 所示。
温度测量
被
控
制
对
单
片
机
人机
交互
模块
象
温度控制
2.1 单片机主控制电路
主控制电路采用 STC 89C52 的单片机作为控制主机。
89C52 作为 51 系列单片机的一种,
其使用性能稳定,价格便宜,完全能够满足此次设计的需求。
89C52 内部集成了程序存储器,
可以装载用户程序,方便使用。
电 源
时钟电路
复位电路
STC
89C52
单
片
机
烧录口
外
部
接
口
电
路
2.2 温度测量与控制模块
温度测量模块采用美国 DALLAS 半导体公司的 DS18B20 温度传感器。
该传感器与传统
的热敏电阻等测温元件相比,它能直接读出被测温度。
这一部分主要完成对温度信号的采集
和转换工作,由 DS18B20 数字温度传感器及其与单片机的接口部分组成。
数字温度传感器
DS18B20 把采集到的温度通过数据引脚 P1.3 传到单片机,单片机接受温度并存储。
0
温度控制模块采用 FAIRYCHILD 的 8N60C 开关管、10W10Ω 的水泥电阻。
由单片机根
据设定温度与测量温度之差决定输出高低电平,控制 8N60C 开关管的通断,近而控制水泥
电阻加热。
被
控
制
对
象
DS18B20 温度传感器
8N60C 开关管 控制信号
10W1Ω 的
STC
89C52
单
片
机
水泥电阻
10V 直流电
2.2 人机交互模块
人机交互模块主要包括键盘、数码管、LED 指示灯,其中键盘用于供用户输入温度期望
值,数码管用于显示用户设定温度及控制对象中温度,LED 指示灯用于指示系统工作状态
(加热中,加热过高时)。
键盘
STC
89C52
数码管
LED 指示灯
第 3 章 硬件电路详细设计
单
片
机
3.1 单片机最小系统:
包括电源电路、复位电路、时钟电路、烧录口共四个单元,其中电源电路与烧录口省略。
电路图如下:
其中,31 端口接高电平,表明单片机复位后访问内部程序存储器;由于 P0 口作为输出
口时处于漏极开路状态,所以必须外接上拉电阻,如果后期实验中不使用其作为输出口,则
此处可省略。
1
3.2 人机交互模块:
(1)、数码管:
2
其中,采用 8 段共阴数码管,P0、P2 口输出段码、位码,P1.4 和 P1.6 为段锁存,P1.5
和 P1.7 为位锁存。
数码管上面四位显示用户测量温度,下面四位显示用户设定温度。
(2)、LED 指示灯:
其中,指示灯绿色用于指示加热温度过高、红色用于指示加热中,当两个 LED 均亮起时,
表示当前温度接近设定温度,也可理解成保温状态。
(3)、按键
3
其中,上面的按键表示温度上升 1℃、下面的按键表示温度下降 1℃。
3.3 测温模块:
测温模块采用美国 DALLAS 半导体公司的 DS18B20 温度传感器。
其输出与 P1.3 相连。
3.4 温度控制模块:
4
8N60C 是仙童公司出品的一款 N 沟道的 MOSFET,最小开启电压为 4V,最大关断电压
为 2V,故可以直接接在单片机 IO 口,由高低电平控制通断。
8N60C 的栅极(G)与 P1.2 相连,源级(S)接地(注意与单片机控制端共地,否则将
导致无法关断),漏极(D)接水泥电阻,水泥电阻另一端接 10V 直流电。
水泥电阻是将电阻线绕在无碱性耐热瓷件上,外面加上耐热、耐湿及耐腐蚀材料,并把
绕线电阻体放入方形瓷器框内,用特殊不燃性耐热水泥充填密封而成。
水泥电阻的外侧主要
是陶瓷材质。
3.5 总电路图:
第 4 章 系统软件设计
4.1 原理框图:
(1)、主程序
5
开始
按键输入端口置高,定时器初始
化
调用读温度子程序
显示被测温度和用户设定温度
是否按下加温
度设定键?
N
Y
Y
设定温度加 1
是否按下减温
度设定键?
N
初始设定温度为
20
设定温度减 1
当前温度<设
定温度—1
Y
P1.2 置高电平,加热电阻加热,红灯亮
N
Y
当前温度>=
设定温度?
P1.2 置低电平,加热电阻停止加热,绿灯
亮
N
调节 P1.2 的高低电平时间长短的比例,红绿灯同时
亮
N
系统是否断
电?
Y
结束
6
(2)、定时器 T0 中断程序
定时器 T0 中断
定时器初始化
调用数码管显示子程序
计数>300?
Y
读温度标志置 1
中断返回
N
4.2 详细程序:
(1)、主程序
/*----------------------------------------------------------------------------------------------------------
名称:
恒温控制系统采用 DS18b20 并用数码管显示当前测的温度
和用户设定的温度,用户可用按键增加或减小温度。
编写:
1013105 班小组
日期:
2013.10
内容:
精确到小数点后一位,显示格式 符号 xxx.x C
------------------------------------------------------------------------------------------------------------*/
#include
#include "18b20.h"
#include "delay.h"
#define DataPort0 P0 //定义数据端口 程序中遇到 DataPort0 则用 P0 替换
#define DataPort1 P2 //定义数据端口 程序中遇到 DataPort1 则用 P1 替换
sbit LED_Green=P1^0;//定义绿色指示灯
sbit LED_Red=P1^1;//定义红色指示灯
sbit PWM=P1^2;//定义加热端口
sbit LATCH1=P1^4;//定义锁存使能端口 段锁存
7
sbit LATCH2=P1^5;//位锁存
sbit LATCH3=P1^6;//定义锁存使能端口 段锁存
sbit LATCH4=P1^7;//位锁存
sbit KEY_ADD=P3^2;//定义按键输入端口 增加 1 度
sbit KEY_DEC=P3^3;//减小 1 度
bit ReadTempFlag1;//定义读时间标志 1
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值 0~9
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData1[8]; //存储显示值的全局变量 1
unsigned char TempData2[8]; //存储显示值的全局变量 2
/*--------------------------------------------------------------------------------------
函数声明
------------------------------------------------------------------------------------------*/
void DelayUs2x(unsigned char t);//us 延时函数
void DelayMs(unsigned char t); //ms 延时函数
void Display1(unsigned char FirstBit,unsigned char Num);//数码管 1 显示当前测的温度函数
void Display2(unsigned char FirstBit,unsigned char Num);//数码管 2 显示用户设定温度函数
void Init_Timer0(void);//定时器 T0 初始化函数
/*-------------------------------------------------------------------------------------
主函数
---------------------------------------------------------------------------------------*/
void main (void)
{
unsigned int TempH,TempL,temp;
unsigned char usertemp=20;//开机设定 20 度
KEY_ADD=1; //按键输入端口电平置高
KEY_DEC=1;
Init_Timer0();
while
(1)//主循环
{
/*-----------------------------------------------------------------------------------
显示当前测得的温度
--------------------------------------------------------------------------------------*/
if(ReadTempFlag1==1)
{
ReadTempFlag1=0;
temp=ReadTemperature();
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
if(TempH/10==0) //不考虑负温度
8
TempData1[0]=0;//消隐
else
TempData1[0]=DuanMa[TempH/10]; //十位温度
TempData1[1]=DuanMa[TempH%10]|0x80; //个位温度,带小数点
TempData1[2]=DuanMa[TempL];//显示小数点后一位
TempData1[3]=0x39;//显示 C 符号
}
/*-----------------------------------------------------------------------------------------
显示用户设定的温度
---------------------------------------------------------------------------------------------*/
if(!
KEY_ADD) //如果检测到低电平,说明按键按下
{
DelayMs(10); //延时去抖,一般 10-20ms
if(!
KEY_ADD)//再次确认按键是否按下,没有按下则退出
{
while(!
KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(usertemp<50)//加操作
usertemp++;
}
}
}
if(!
KEY_DEC) //如果检测到低电平,说明按键按下
{
DelayMs(10); //延时去抖,一般 10-20ms
if(!
KEY_DEC)//再次确认按键是否按下,没有按下则退出
{
while(!
KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
{
if(usertemp>10) //减操作
usertemp--;
}
}
}
TempData2[0]=DuanMa[usertemp/10];
TempData2[1]=DuanMa[usertemp%10]|0x80;
TempData2[2]=DuanMa[0];
TempData2[3]=0x39;
Display2(0,4);
/*---------------------------------------------------------------------------------------
红绿灯指示加温状态
------------------------------------------------------------------------------------------*/
if(TempH {//PWM=1 三极管导通,加热电阻快速加热 LED_Red=0; LED_Green=1; 9 PWM=1; } else {if(TempH>=usertemp)//当测的温度高于用户设定温度时,绿灯亮, {//PWM=0 三极管关闭,加热电阻停止加热 LED_Red=1; LED_Green=0; PWM=0; } else// 当测的温度与用户设定温度的差值小于 1 度且没达到用户设定温度时,加热 {LED_Red=0;//电阻加热,红绿灯都亮,当温度超过设定温度时,绿灯亮,加热电阻又 LED_Green=0;//会断开,从而导致温度维持一定范围,红灯会闪烁,代表温度恒定。 PWM=1; } } } } /*---------------------------------------------------------------------------------------------------------- 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值 2 表示从第三个数码管开始显示 如输入 0 表示从第一个显示。 Num 表示需要显示的位数,如需要显示 99 两位数值则该值输入 2 ---------------------------------------------------------------------------------------------------------------*/ void Display1(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0; DataPort0=0;//清空数据,防止有交替重影 LATCH1=1;//段锁存 LATCH1=0; DataPort0=WeiMa[i+FirstBit]; //取位码 LATCH2=1;//位锁存 LATCH2=0; DataPort0=TempData1[i]; //取显示数据,段码 LATCH1=1;//段锁存 LATCH1=0; i++; if(i==Num) i=0; } void Display2(unsigned char FirstBit,unsigned char Num) 10 { unsigned char i; for(i=0;i { DataPort1=0;//清空数据,防止有交替重影 LATCH3=1;//段锁存 LATCH3=0; DataPort1=WeiMa[i+FirstBit]; //取位码 LATCH4=1;//位锁存 LATCH4=0; DataPort1=TempData2[i]; //取显示数据,段码 LATCH3=1;//段锁存 LATCH3=0; DelayMs (2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 } } /*-------------------------------------------------------------------------------------------------- 定时器 T0 初始化子程序 -----------------------------------------------------------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01;//使用模式 1,16 位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00;//给定初值 //TL0=0x00; EA=1;//总中断打开 ET0=1;//允许定时器 T0 中断 TR0=1;//启动定时器 T0 } /*------------------------------------------------------------------------------------------ 定时器 T0 中断子程序 -----------------------------------------------------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { static unsigned int num; TH0=(65536-2000)/256;//重新赋值 2ms TL0=(65536-2000)%256; Display1(0,4);// 调用数码管扫描 num++; if(num==300)// { 11 num=0; ReadTempFlag1=1; //读标志位置 1 } } (2)、18B20.c 程序 #include"delay.h" #include"18b20.h" /*-------------------------------------------------------------------------------- 18b20 初始化 -------------------------------------------------------------------------------*/ bit Init_DS18B20(void) { bit dat=0; DQ = 1;//DQ 复位 DelayUs2x(5);//稍做延时 DQ = 0;//单片机将 DQ 拉低 DelayUs2x(200); //精确延时 大于 480us 小于 960us DelayUs2x(200); DQ = 1;//拉高总线 DelayUs2x(50); //15~60us 后 接收 60-240us 的存在脉冲 dat=DQ;//如果 x=0 则初始化成功, x=1 则初始化失败 DelayUs2x(25); //稍作延时返回 return dat; } /*--------------------------------------------------------------------------------- 读取一个字节 ---------------------------------------------------------------------------------------*/ 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; DelayUs2x(25); } return(dat); } /*------------------------------------------------------------------------- 写入一个字节 12 --------------------------------------------------------------------------*/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; DelayUs2x(25); DQ = 1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC 单片机 恒温 控制系统 设计 语言 程序