收藏和点赞,您的关注是我创作的动力
概要
本研究对温控风扇系统进行分析设计,单片机为其核心构成部分,通过温度传感器DS18B20获取温度信息,输入至单片机内部,单片机与系统设置的温度做比较,发出相应的控制信号,通过ULN2803控制风扇系统对元件进行散热处理,同时能通过判断设定温度与采集温度的温差大小,来确定风扇系统的转速,采用LED八段数码管实现温度显示功能。动态显示当前所处的环境温度和设定温度,并可以通过键盘按钮设定当前温度。键盘部位则可以自主调节设定温度而DS18B20可以测定外部环境温度,然后记录环境温度和设定温度并将其连续及时显示。
关键词:单片机、DS18B20、温控、LED
一、系统整体设计
本系统的主要元件分工如下:首先利用温度传感器,对环境温度进行检测以及获取数字信息,进而将其输入单片机中,从而在八段数码管中显示出两种温度,一是环境温度,二是系统预先设置的温度。分别精确到十分位与整数位。并且通过运用PWM脉宽调制法,实现电机转速随着环境温度的改变而改变。此外,为了方面预设温度的调整,设定两个按键来对预设温度进行升高或者降低。该系统运行流程图如下所示:
图1.1系统构成框图
二、各单元模块的硬件设计
本设计的主要硬件包含:①型号为DS18B20的输出离散型号的数字温度传感器;②型号为AT89C52的CMOS 8位单片机;③5位发光二极管封装的数码管显示器④风扇直流电动机;⑤型号为ULN2803驱动器。其他电子元器件包含:①多种不同阻值的电阻器;②多种不同电容量的电容器;③多个晶体振荡器;④各类电压源以及电流源;⑤多个按键;⑥多个DIP开关。
三、 软件设计
3.1 程序设置
主程序、DS18B20初始化功能、DS18B20温度转换功能、温度读取功能、键盘扫描功能、数码管指示功能、温度功能和风扇发动机控制功能等均可使用和应用,旨在控制电风扇的相关指标。一般情况下,DS18B20程序恢复初始状态可以由DS18B20初始函数控制;外界环境温度可以通过DS18B20温度转换功能进行实时监测和记录;温度读取功能的功能则是将温度转换函数收集和记录的数据进行读取并将这些数据进行换算传输至主机中;键盘扫面功能的功能需要通过完成设定温度的原始数值进行加减设定来完成;对于检测、收集、记录的相关温度的数据进行处理则离不开温度处理功能,除此之外电风扇发动机转速的改变也离不开温度处理函数的运行;电风扇发动机是否转动以及转读的高低以外界温度和设定的温度为基础加以风扇电机控制函数进行控制。
如图3.1.1所示该程序的具体使用方法:
图3.1.1 主程序流程图
附录1:电路总图
附图1 电路总图
程序代码
附录2:程序代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7;
sbit key1=P1^3;
sbit key2=P1^4;
sbit dianji=P3^1;
float ff;
uint y3;
uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum;
uchar code dispcode[]={ //段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablel[]={ //带小数点的段码
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位选
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar dispbuf[8]={0,0,0,0,0,0,0,0};
void Delay(uint num)// 延时函数
{
while( --num );
}
void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
{
dispbuf[0]=a0;
dispbuf[1]=a1;
dispbuf[2]=a2;
dispbuf[3]=a3;
dispbuf[4]=a4;
P2=0xff;
P0=dispcode[dispbuf[0]];
P2=dispbitcode[5];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[1]];
P2=dispbitcode[4];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
Delay(1);
P2=0xff;
P0=tablel[dispbuf[3]];
P2=dispbitcode[1];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[4]];
P2=dispbitcode[0];
Delay(1);
}
void dmsec(uint count)
{
uint i; // 1ms延时
while(count--)
{
for(i=0;i<125;i++){}
}
}
void tmreset(void)
{
DQ=0;
Delay(90); // 精确延时 大于 480us
DQ=1;
Delay(4); // 90,4 可以小范围变化
}
void tmpre(void)
{
while(DQ);
while(~DQ);
Delay(4);
}
bit tmrbit(void)
{
uint i;
bit dat;
DQ=0;
i++; // i++;大概1us
DQ=1;
i++;
i++;
dat=DQ;
Delay(8);
return(dat);
}
uchar tmrbyte(void) //读一个比特
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmwbyte(uchar dat) //写一个比特
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1; // 从低位开始
if(testb) // Write 1
{
DQ=0; // 先拉低
i++;
i++; // >1us
DQ=1;
Delay(4);
}
else // Write 0
{
DQ=0;
Delay(4);
DQ=1;
i++;
i++; // 再拉高
}
}
}
void tmstart(void) //ds1820开始转换
{
dmsec(1);
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0x44); // 转换
}
uchar tmrtemp(void) //读取温度
{
uchar a,b;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0xbe); // 转换
a=tmrbyte(); // LSB低8位
b=tmrbyte(); // MSB高8位
y3=b;
y3<<=8;
y3=y3|a;
ff=y3*0.0625;
y3=ff*10+0.5;
return(y3);
}
void keyscan(void)
{
if(key1==0)
{
dmsec(5);
if(key1==0)
{
sheding++;
if(sheding==100)
sheding=20;
}
while(!key1);
}
else if(key2==0)
{
dmsec(5);
if(key2==0)
{
sheding--;
if(sheding==0)
sheding=20;
}
while(!key2);
}
}
void deal(uint tmp) //温度处理
{
if(tmp<=sheding)
{
gaonum=0;
dinum=4;
}
else if((tmp>sheding)&&(tmp<=(sheding+5)))
{
gaonum=1;
dinum=3;
}
else if((tmp>(sheding+5))&&(tmp<=(sheding+10)))
{
gaonum=2;
dinum=2;
}
else if((tmp>(sheding+10))&&(tmp<=(sheding+15)))
{
gaonum=3;
dinum=1;
}
else
{
gaonum=4;
dinum=0;
}
}
void dianjik() //电机控制
{
uchar q,i;
for(q=0;q<dinum;q++)
{
dianji=0;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
for(q=0;q<gaonum;q++)
{
dianji=1;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
}
void main(void)
{
uint last;
dianji=0;
tmstart();
dmsec(450); // 初始化ds18b20
while(1)
{
tmstart(); // ds1820开始转换
dmsec(2);
last=tmrtemp()+256; // 读取温度
shi=last/100;
ge=(last%100)/10;
xiaoshu=(last%100)%10;
keyscan();
dmsec(2);
deal(last/10);
dianjik();
}
}
四、 结论
本系统采用单片机为核心部位,以DS18B20温度传感器测定环境温度为基础组合可以具有不同转速的风扇发动机为一个整体,通过测定外界环境温度的变化来加快或减慢发动机的转速,并实现在一定的温度范围内转速的连续调节。LED数码管可以显示周围环境温度,并可以通过键盘上的两个独立按键实现维持和稳定数码管不同设定温度的调整,这意味着数码管的温度是固定在不同的温度差值水平的。改变环境的温度和设定温度之间的差值可以进一步改变发动机的转速。
了解本系统的发动机转速设计可以应用众多发动机的控制系统之中。它可以在日常生活中使用,使智能化风扇可以被广大消费者所使用,为生活提供便利。在工业化生产中,为了控制发动机的转速,可以改变输入信号的不同类型,降低生产自动化程度和生产压力及使用成本。该系统的设计和研究在工业生产和日常生活中起着重要的作用。文章来源:https://www.toymoban.com/news/detail-791887.html
五、 文章目录
目 录
摘 要 I
Abstract II
第一章 整体方案设计 1
1.1 前 言 1
1.2 系统整体设计 1
1.3方案论证 2
1.3.1 温度传感器的选择 2
1.3.2 控制核心的选择 3
1.3.3 温度显示器件的选择 3
1.3.4 调速方式的选择 3
第二章 各单元模块的硬件设计 5
2.1系统器件简介 5
2.1.1 DS18B20单线数字温度传感器简介 5
2.1.2 达林顿反向驱动器ULN2803简介 5
2.1.3 AT89C52单片机简介 6
2.1.4 LED数码管简介 7
2.2 各部分电路设计 8
2.2.1 开关复位与晶振电路 9
2.2.2 独立键盘连接电路 9
2.2.3 数码管显示电路 10
2.2.4 温度采集电路 11
2.2.5 风扇电机驱动与调速电路 12
第三章 软件设计 14
3.1 程序设置 14
3.2 用Keil C51编写程序 14
3.3 用Proteus进行仿真 15
3.3.1 Proteus简介 15
3.3.2 本设计基于Proteus的仿真 16
第四章 系统调试 21
4.1 软件调试 21
4.1.1 按键显示部分的调试 21
4.1.2 传感器DS18B20温度采集部分调试 21
4.1.3 电动机调速电路部分调试 21
4.2 硬件调试 22
4.2.1 按键显示部分的调试 22
4.2.2 传感器DS18B20温度采集部分调试 22
4.2.3 电动机调速电路部分调试 22
4.3 系统功能 23
4.3.1 系统实现的功能 23
4.3.2 系统功能分析 23
结 论 24
参考文献 25
致 谢 26
附录1:电路总图 27
附录2:程序代码 28文章来源地址https://www.toymoban.com/news/detail-791887.html
到了这里,关于基于单片机的温控风扇设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!