数字PWM温度控制器设计说明书.docx
《数字PWM温度控制器设计说明书.docx》由会员分享,可在线阅读,更多相关《数字PWM温度控制器设计说明书.docx(15页珍藏版)》请在冰豆网上搜索。
数字PWM温度控制器设计说明书
数字温度测控仪
设计说明书
1设计任务与要求
1.1设计项目名称
数字温度测控仪
1.2设计要求
①温度测量范围:
室温~99℃.在数码管上显示温度值;温度测量误差<0.5℃。
②能进行当前温度调校:
按键设置温度≥环境温度,加热传感器,PWM输出占空比=(设置温度-t)/(设置温度-室温),直流风机从停止到全速转动。
2总体方案设计
2.1设计方案
本系统采用温度传感器DS18B20,将采集温度CurrTemp送至STC89C52,并通过Nokia5110显示。
同时,三个按键设定温度,分别可控制升温、降温及温度变化步进,通过Nokia5110显示。
风扇转速展示出设定温度与当前温度的温差。
当当前温度与设置温度相等时,风扇停止转动。
2.2系统的总体设计框图
2.2.1设计框图的设计
2.2.2设计框图的工作流程
接通电源后,通过按键KEY3调整合适步进,使用KEY1(减)或KEY2(加)来设定温度SetTemp,并通过Nokia5110显示。
使用温度传感器DS18B20采集室温RoomT,通过Nokia5110显示。
启动电机,通过风扇转速展示出设定温度与当前温度的温差。
3芯片介绍
3.1STC89C52芯片介绍
3.1.1STC89C52芯片简介
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。
4.用户应用程序空间为8K字节。
5.片上集成512字节RAM。
6.通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成。
8.具有EEPROM功能。
9.具有看门狗功能。
10.共3个16位定时器/计数器。
即定时器T0、T1、T2。
11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。
12.通用异步串行口(UART),还可用定时器软件实现多个UART。
13.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)。
14.PDIP封装。
STC89C52RC单片机的工作模式
掉电模式:
典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序;
空闲模式:
典型功耗2mA;
正常工作模式:
典型功耗4Ma~7mA;
掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备。
3.1.2STC89C52芯片引脚
1~8脚:
通用I/O接口P1.0~P1.7;
9脚:
RST复位键;
10,11脚:
RXD串口输入,TXD串口输出;
12~19脚:
P3接口(12:
INT0外部中断0,13脚:
INT1中断外部中断1);
14,15脚:
计数脉冲T0、T1;
16,17脚:
WR写控制输出端,RD读控制输出端;
18,19脚:
晶振谐振器;
20脚:
地线;
21~28脚:
P2接口,高8位地址总线;
29脚:
PSEN片外ROM选通端,单片机对片外ROM操作时,29脚(PSEN)输出低电平;
30脚:
ALE/PROG地址锁存器;
31脚:
EAROM取指令控制器,高电平片内取,低电平片外取;
32~39脚:
P0.7~P0.0;
40:
电源+5V。
4单元电路的设计
4.1电路
4.1.1振荡电路
单片机的振荡电路如图4-1所示,单片机内时钟振荡方式需在单片机的XTAL1和XTAL2引脚上接上一个石英晶振和振荡电容,因为单片机时钟兼容1.2MHZ~12MHZ的晶振,为了软件定时的简便和精确,这里选用了11.05926MHZ的晶振,在参考STC89C52芯片资料后,振荡电容选用两个30pF的瓷片电容。
图4-1
4.1.2复位电路的工作原理
系统复位电路如图4-2所示,复位操作有上电自动和按键手动复位两种方式。
上电复位时通过外部复位电路的电容充电来实现的。
按键复位时通过复位端经电阻与VCC电源接通来实现的。
本设计选前者,两种复位电路都是输入单片机的RST引脚的且有效时间应持续24个振荡脉冲周期(即两个机器周期以上),经调试和验证,确定了一个22uF的电容和1K的电阻组成上电自动复位电路。
图4-2
4.1.3按键电路
键盘作为人机对话的基本窗口,我们可以利用它对外设进行各种不同的控制,按键的分类有独立式按键与行列式按键,由于本设计输入设备简单且要求方便,故选用独立式按键。
电路如图4-3所示,单片机的P2.5-P2.7口接VCC,用户可以通过软件来采集所接口线的状态,当口线为0时表示有按键按下,反之没有按键按下。
图4-3
4.1.4显示电路
显示是用来反映设定温度和实际测量温度的。
Nokia5110液晶显示屏接至P1口的P1.3~P1.7,电路如图4-4所示。
图4-4
4.1.5温度采集电路
通过温度传感器DS18B20采集实时温度CurrTemp,传送给单片机。
DS18B20接至P0口的P0.5。
电路如图4-5所示。
图4-5
4.1.6驱动电路
驱动电路由5V直流电源供电,通过单片机产生的PWM控制电机转动速率。
图4-6
5系统软件介绍
5.1按键程序流程图
5.2液晶显示程序流程图
5.3驱动程序流程图
5.4温度采集程序流程图
6.PCB图制作
走线如图6-1所示,器件放置如图6-2所示
图6-1
图6-2
附录(源代码)
#include"at89x52.h"
#include"Nokia5110.h"
#include"Ds18b20.h"
#defineucharunsignedchar
#defineuintunsignedint
intStep;/*步进*/
intSetTemp;/*设定温度*/
intCurrTemp;/*当前温度*/
intRoomT;/*室温*/
intzkb;/*占空比*/
intTimer;/*定时计数变量,为定时中断间隔时间的整数倍*/
intshi;/*数字转换为字符保存的十位*/
intge;/*数字转换为字符保存的个位*/
intshifen;/*数字转换为字符保存的十分位*/
intbaifen;/*数字转换为字符保存的百分位*/
charstr[5]={0};/*保存字符串*/
ucharcKey;/*初始键值*/
ucharcKeyCode;/*键值*/
uintnDelayKey;/*键盘延时变量,为定时中断间隔时间的整数倍*/
uintnDelay100uS;/*18B20复位延时变量*/
sbitPWM=P0^0;
/****************函数申明**********************/
voidKeyScan(void);
voidDisposeKey(void);
char*convert(intTemp);
/****************主函数**********************/
voidmain(void)
{
intk=0;//保存室温标志,k=0时,保存的当前温度即为室温
TMOD=0x20;//定时器工作在方式二
TL1=-92;//定时器中断一次为100us
TH1=-92;
TR1=1;//启动定时器1
ET1=1;//启动定时器1中断
IP=0x04;//将定时器1中断设为最高优先级
EA=1;//开总中断
LCD_init();//液晶初始化
LCD_Clear();//清屏
while
(1)
{
CurrTemp=ReadTemperature();//读取当前温度
if(k==0)
{
RoomT=CurrTemp;
k++;
LCD_write_english_string(0,0,convert(SetTemp));
}
if(cKeyCode)
{
DisposeKey();
LCD_write_english_string(0,0,convert(SetTemp));
}
LCD_write_english_string(20,20,convert(CurrTemp));
zkb=(int)100*(SetTemp-CurrTemp)/(SetTemp-RoomT);
if(SetTemp-CurrTemp<0)
{
zkb=0;
}
}
}
/****************数字转换为字符函数**********************/
char*convert(intTemp)
{
shi=Temp/1000;
ge=Temp/100%10;
shifen=Temp/10%10;
baifen=Temp%10;
str[0]=shi+48;
str[1]=ge+48;
str[2]='.';
str[3]=shifen+48;
str[4]=baifen+48;
returnstr;
}
/****************按键扫描函数**********************/
voidKeyScan(void)
{
cKey=P2&0xE0;//取键值P27,P26,P25
if(cKey!
=0xE0)
{
nDelayKey=100;//按键延时消颤
}
}
/****************按键处理函数**********************/
voidDisposeKey(void)
{
switch(cKeyCode)
{
case0x60:
//与P27相连的按键按下,实现步进加
Step=Step+30;
nDelayKey=2000;//按住按键不动,可连续产生键值
break;
case0xA0:
//与P26相连的按键按下,实现设置温度加
SetTemp=SetTemp+Step;
nDelayKey=2000;
break;
case0xC0:
//与P25相连的按键按下,实现温度减
SetTemp=SetTemp-Step;
nDelayKey=2000;
break;
default:
break;
}
cKeyCode=0;//键值清零
}
/****************多任务时序控制时钟中断**********************/
voidIntT1(void)interrupt3
{
/****************PWM产生计时******************/
Timer++;
if(Timer>=zkb)
{
PWM=1;
}
else
{
PWM=0;
}
if(Timer==100)
{
Timer=0;
}
/****************按键延时消颤*****************/
if(nDelayKey==0)
{
KeyScan();
}
else
{
nDelayKey--;
if(nDelayKey==0)
{
cKeyCode=P2&0xE0;//取键值P27、P26、P25
if(cKeyCode!
=cKey)//确认按键是否按下
{
cKeyCode=0;
}
}
}
/****************DS18B20复位延时******************/
if(nDelay100uS)
{
nDelay100uS--;
}
}