找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9859|回复: 2
打印 上一主题 下一主题
收起左侧

基于单片机的智能风扇设计 带驱蚊与调速电路+源程序

  [复制链接]
跳转到指定楼层
楼主
ID:441411 发表于 2018-12-7 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目   录

1 绪   论1
11 智能风扇发展史1
12 智能风扇的工作原理2
13 本次设计的主要任务和内容2
2 方案论证3
21 控制核心的选择3
22 显示电路的选择3
23 调速方式的选择4
24 温度传感器的选择5
25 超声波发生器的选择5
3 系统主要硬件电路设计7
31 系统总体设计7
32 电源电路设计7
33 单片机最小系统电路设计8
331 AT89C51单片机简介8
332 单片机最小系统电路10
34 温度采集电路设计11
341 DS18B20温度传感器简介11
342 温度采集电路13
35 温度显示电路设计14
351 LED数码管简介14
352 温度显示电路15
36 驱蚊电路设计15
361 TCT40-16T超声波发射器简介15
362 驱蚊电路16
37 驱动与调速电路设计17
371 达林顿反相器ULN2803简介17
372 驱动与调速电路18
38 独立按键电路设计18
4 软件设计20
41 系统总体软件设计流程图20
42 用Keil C51进行程序编辑21
5 系统调试与仿真22
51 系统软件调试22
52 程序下载22
53 系统仿真22         
6 结   论26
致   谢27
参考文献28
附   录29

1 绪   论

在现实生活中,我们要经常使用一些降温设备。虽然现在不少城市家庭都用空调设备作为降温工具,但在大部分农村家庭风扇仍然是作为夏季降温的主要工具。春夏或者夏秋交替季节,早晚温差比较大,白天温度很高,风扇应该转动的比较快,这样才能给人带来凉爽。到了晚上,气温下降的很多,当人们入睡后,风扇的转动速度应慢慢减下来,防止感冒。虽然现在的风扇有不同的档位可以调节,但都必须人工来换挡,当人们熟睡时就无能为力了。尽管现在普遍采用定时的方式解决这个问题,但定时时间有限,一般最多只有两个小时,在这两个小时内温度并不一定就会下降的很多,风扇关闭后,人们可能就会因为炎热再次醒来开启电扇,这样会使人的睡眠质量大大降低。从以上的分析可知,需要设计出一种很智能化的电风扇来解决。本设计用单片机作为控制核心,用温度传感器采集当前温度,LED数码管显示实时温度,并根据当前检测到的温度,输出不同占空比的PWM脉冲信号,从而风扇实现了不同的转速。

1.1 电风扇的发展史

  电风扇简称电扇,香港称为风扇,日本及韩国称为扇风机,从发明到现在已经经过了一百多年,是炎热夏季的宠物。电风扇起源于1830年,是叫詹姆斯的一个美国人发明了一种用发条来驱动的,可以固定在天花板上的电风扇。1880年,一个叫舒乐的美国人第一次将叶片直接装到电动机上,再接上电源,叶片便很快速旋转起来。1882年,一个叫休伊?斯卡茨?霍伊拉的纽约人最早发明了商品化的电风扇。

   中国生产的第一台风扇起于1916年,直到1925年华生电器制造厂才正式生产电风扇,并很快赢得市场好评。

   一开始电风扇不能很好的控制时间,过了一段时间,便出现了一种可以设置风扇转动时间,及可以根据设定的时间来开启或者关闭的电风扇,这种风扇在当时相当受好评,也受到广大人民的喜爱。电风扇的操作方式从一原先的旋钮,到按键,再到现在的触摸式操作[1]。

1.2 电风扇的工作原理

电风扇的主要功能器件是交流电机,通电后线圈在磁场中因受力而转动,能量的转化形式是这样的:电能主要是转化为机械能,同时由于电阻问题,电能还有一部分转化成内能。电风扇工作时,因为有电流流过电风扇的线圈,而线圈是有电阻的,所以会产生部分热量向外扩散,因此电风扇的温度会增高。但人们为什么会感觉到凉爽呢?因为人体的表面在夏天有大量的汗液,当电风扇工作后,室内的空气会随着电风扇流动,所以就能够蒸发人体表面的汗液,由物理学原理蒸发需要吸热,故人们会感觉到非常凉爽[2] 。

1.3 本次设计的主要任务和内容

    本设计是以AT8951单片机为主要控制核心,利用51单片机对温度传感器采集到的数据进行处理,并且通过各种电子元器件对电风扇各种工作状态进行实时控制,从而可以达到用户的要求。

本次设计主要完成以下内容:

(1) 能够检测当前温度并显示,可根据预设温度自动开启关闭,当当前温度大于预设温度,自动开启,小于预设温度自动关闭。

    (2) 预设温度可通过按键增加或减少。

    (3) 可随着外界温度的增加风扇可自行调速,主要分为五个档位,温度每升高五度风扇自动增加一档。

    (4) 具有驱蚊功能。


2 方案论证

2.1 控制核心的选择

方案一:采用单片机作为主要控制芯片。在本设计中采用AT89C51单片机,通过软件编程的方法来实现对温度的实时采集和控制,在其I/O口输出相应的控制信号。单片机AT89C51工作电压相对比较低,单片内含有4k字节的ROM和256字节的RAM,并且价格也相对较便宜。

方案二:采用电压比较电路作为控制执行部件。将采集到的温度信号转换为电信号并经放大电路放大,集成运算放大器组成的比较电路来判断决定电风扇的转动速度。

对于方案一,用单片机作为控制器件,通过简单的程序编写可以将温度传感器DS18B20检测的温度通过LED数码管显示出来,而且可以通过按键扫描程序通过单片机的外部按键对预设的初值进行增加或者减少,同时对于驱蚊功能采用单片机的软件编程更易实现,成本低,故以单片机AT89C51为控制核心,适合本次设计。对于AT89C51的具体参数参见下面“硬件设计”中的各器件介绍。

对于方案二,采用电压比较电路作为控制的核心,虽然电路比较简单、容易实现,但不能对预设温度的值进行更改,无法满足不同用户的需求,故本次设计不采用。

2.2 显示电路的选择

方案一 :采用LCD液晶显示器显示。

方案二:采用数码管做显示器件,共阴极接法,动态方式显示[3]。

对于方案一,液晶显示屏显示的字符非常优美,这一优点LED数码管是无法做到的,但是液晶显示屏价格太过昂贵,驱动程序编写起来也是相当复杂的,本次设计不采用。

对于方案二,用LED显示,成本非常低,温度显示清晰可见,即使夜间也能看见,显示程序的编写也比较容易,因此这种显示方式得到了广泛的应用。不足的地方是采用该方案可能会产生闪烁现象,因为这种动态扫描方式五个LED数码管是逐个点亮的,但由于人眼有个视觉暂留效应,为20MS,我们只要设定合适的扫面周期就可以避免闪烁现象,故这一方案可行。关于LED的详细参数参看下面“硬件设计”中的各器件介绍。

2.3 调速方式的选择

方案一:采用变压器调节方式,运用变压器原理将市电220V交流电压通过线圈降压到不同的值,电风扇电机接到不同电压值的线圈上就可以来控制直流电机的转速。

方案二:采用单片机的PWM软件编程方式。PWM中文意思是脉冲宽度调制,英文意思是Pulse Width Modulation的简写形式,它是一种按某种规律变化的脉冲方波,在PWM驱动直流电机的调节控制系统当中,最常用的是矩形PWM脉冲波信号,也是编写程序最简单的。在对直流电机的转速进行控制时,需要根据当前温度来输出不同占空比的PWM脉冲。PWM脉冲的占空比是指高电平的时间在一个周期时间内的百分比,若全为低电平,占空比为零,风扇不转;若全为高电平,占空比为100%时,转速达到最大 [4]。用单片机输出PWM脉冲信号时,有如下两种方法:

(1) 利用软件延时。可以利用单片机自带的定时器编程实现不同占空比的PWM脉冲的输出,利用中断程序对单片机输出的电平进行高低转换,从而实现风扇的调速,本设计采用该方法。设计不同占空比的PWM脉冲的思路是:假设采用1S的周期方波,以50MS为基准,则20个基准便就是一个1S,那么当其中4个连续的50MS的高电平脉冲,然后16连续的50MS低电平脉冲,便得到了占空比为20%的PWM方波信号。

(2) 利用单片机自带的PWM功能。但本次设计所用得AT89C51单片机没有这种功能,只有STC系列的才有,故不可行。

对于方案一,该方案可以对直流风扇进行调速,但调节不是很方便,而且采用变压器来改变电压,不能适应人性化要求。

对于方案二,采用PWM 脉冲调制的纯软件的方法来实现对直流电机的实时调速,具有很大的灵活性,而且可以更充分地发挥单片机的功能,综合考虑选用方案二。

2.4 温度传感器的选择

方案一:用热电偶来作为检测温度的元器件,配合适当的外围电路,将检测到的温度信号送入单片机AT89C51处理。

方案二:用热敏电阻作为检测温度的元器件,经过运算放大器放大,由于温度变化会引起热敏电阻的电阻值发生相应的变化、便可以得到输出电压变化的信号。

方案三:用高精度集成温度传感器DS18B20作为检测温度的元器件,直接输出数字温度信号给单片机处理[5]。

对于方案一,采用热电偶作为检测元器件,其检测的温度范围非常宽,可检测-50摄氏度到1600摄氏度,但是电路设计比较复杂,故本设计不采用该方案。

对于方案二,采用热敏电阻价格相对便宜、元器件也很容易买到,但热敏电阻对温度的变化不是很敏感,在检测温度信号的时候,还有可能产生失真和误差,故本设计不采用该方案。

对于方案三,由于温度传感器DS18B20的集成度很高,大大减少了外接电路,从而检测误差也会变小很多,DS18B20检测温度的原理与前面两种方案的原理有着很大的不同。其检测到的温度值可以直接送入单片机处理,不用编写更多的转换程序,简化了程序的编写,且只用一根线便可与单片机相连,接口相当简单,本次设计采用该方案。关于DS18B20的详细参数参看下面“硬件设计”中的器件介绍。

2.5 超声波发射器的选择

本设计的原理是根据蚊子的生理特性来的,主要灵感来源是现在的智能手机上带有驱蚊的软件。在夏天咬人的一般都是雌蚊,雄蚊几乎是不咬人的,雌蚊在夏天大部分都是怀卵的且在怀卵期间又不喜欢与雄蚊接近,因此当它们感觉到雄蚊发出频率在22KHZ的超声波信号时,就会自动离开,因此只需控制超声波发射器发射出模拟雄蚊的超声波就可达到驱蚊的目的。产生该频率的超声波有一下两种方案:

方案一:可以通过软件编写,定时器T1产生频率在22KHZ的方波信号,并通过并联的反相器用来增大驱动能力,然后接入超声波发射器,使超声波发射器发出模拟雄蚊的超声波,从而驱逐雌蚊,进而可以避免蚊子的叮咬。

方案二:用NE555构成多谐振荡器产生可调频率的方波,从而驱动超声波发射器,使其发射我们需要的超声波信号,达到驱蚊目的[6]。

对于方案一:AT89C51单片机定时器T1工作在方式1,可通过初值的设置,输出22KHz的时钟信号输出,不用反复中断,提高了系统的执行效率。

超声波发射器选择的是TCT40-16T ,为了增大驱动能力,单片机P3.5口产生的方波信号经过并联反相器后加在超声波发射器的两端,这样超声波发射器就可以发射22KHz的超声波,本设计采用该方案。关于TCT40-16T的详细参数参看下面“硬件设计”中的器件介绍。

对于方案二:由于NE555产生的超声波频率调节是依靠调节滑动变阻器实现的,不好可视化的调节频率,不方便用户使用。


3 系统主要硬件电路设计

3.1 系统总体设计

本次设计的思路:本次设计主要利用AT89C51单片机为控制核心,利用温度传感器DS18B20采集当前温度送入单片机处理,单片机根据当前温度与预设温度的比较决定是否开启风扇,并通过五段LED数码管显示当前温度和预设温度。当当前温度高于预设温度,风扇开启,低预设温度时风扇关闭。单片机根据当前的温度输出相应占空比的PWM脉冲,并通过ULN2803增大驱动后,送入12V的直流电机,从而产生不同转速。

本次设计的系统总框图如图3.1所示:

                    图3.1系统总体框图

3.2 电源电路设计

直流稳压电源作为直流能源的提供者,在电路中起到很关键的作用,因此对电源的要求比较高,尤其是对电源纹波系数和输出电流能力的要求上,如果电源没有达到设计所需电源的要求,将直接影响系统的正常工作。

常用的转5V电源有线性型稳压芯片和开关型稳压芯片两大类。线性型稳压芯片线性度高,纹波小,外围电路简单。开关型稳压电路功耗小,转换率高,但纹波大,受尖峰脉冲干扰严重。综合考虑选用线性型三端稳压芯片LM7805。

本次设计需要两个幅度不同的直流电压5V和12V。其中5V电压的产生是将市电~220V交流电经过降压器降压,桥式整流滤波后送入稳压器件LM7805,输出的电压可能还含有纹波,在通过470uf带极性的电容滤除低频信号,0.1uf不带极性的电容滤除高频信号,进而可以得到稳定的5V电压[7]。12V电压只需将5V电压经过运算放大器放大即可得到,5V和12V电压产生电路如图3.2(a)和3.2(b)所示:

3.2(a) 5V电压产生电路


3.2(b) 12V电压产生电路

3.3 单片机最小系统电路设计

3.3.1 AT89C51简介

AT89C51是美国ATMEL公司生产的低电压单片机,其含有4K字节的ROM和256字节的RAM,兼容MCS-51指令。其中央处理器是8位的,且含有Flash存储单元,功能非常强大。

AT89C51单片机具有以下标准的功能:一个8位CPU频率范围1.2-12MHZ,4K字节Flash闪存,256字节内部数据存储器RAM,4个8位并行I/O口,一个全双工串行口,2个16位定时/计数器,5个中断源的中断控制系统,片内自带振荡器和时钟电路。

AT89C51单片机管脚图如3.3所示:

                  


3.3AT89C51单片机

各管脚功能如下[8]:

VCC:40引脚接5V供电电压。

GND:20引脚接地。

XTAL1:19引脚为单片机提供外部时钟信号,外接石英晶体和微调电容。

XTAL2:18引脚为单片机提供外部时钟信号,外接石英晶体和微调电容。

P0口:P0.7~P0.0,这组引脚共8条,其中P0.7为最高位,P0.0为最低位。是漏极开路的8位准双向I/O口,有两种功能。第一:做通用I/O口,无片外内存时,P0口可做通用I/O接口使用。第二:做地址/数据口,在访问外部内存时,用作地址总线的低8位和数据总线。

P1口:P1.7~P1.0,其中P1.7为最高位,P1.0为最低位,仅用作I/O口。

P2口:P2.7~P2.0,其中P2.7为最高位,P2.0为最低位。P2口是带内部上拉电阻的8位准双向I/O接口,具有两种功能。第一:做通用I/O口,无片外内存时,P2口可用作通用I/O口。第二:做地址口,在访问外部内存时,用作地址总线的高8位。

P3 口:P3.7~P3.0,其中P3.7为最高位,P3.0为最低位。P3口是双功能口。具有两种功能。第一:用作通用I/O口。第二功能:P3.0RXD串行口输入;P3.1TXD串行口输出;P3.2INTO外部中断0输入;P3.3INT1外部中断1输入;P3.4T0定时计数器的脉冲输入;P3.5T1定时计数器的脉冲输入;P3.6WR片外RAM写信号;P3.4RD片外RAM读信号。

RST:9引脚复位输入,高电平有效。

    :29引脚外部程序内存读信号。当访问外部程序内存时,此脚定时输出脉冲作为读片外程序内存的选通信号,通常接EPROM的OE端。端在每个机器周期中两次有效,但当访问外部RAM时,两次负脉冲不出现。可驱动8个LS型TTL。

ALE/:30引脚地址锁存允许/编程线,当访问片外存储器时,在P0.7~P0.0引脚线上输出片外存储器低8位地址的同时还在ALE/线上输出一个高电位脉冲,其下降沿用于把这个片外存储器低8位地址锁存到外部专用地址锁存器。

/VPP:31引脚内外部程序内存选择输入端。=1,CPU访问片外ROM,并执行其指令。当PC>0FFFH时,自动转向片外ROM。=0,不论片内是否含有内存,只执行片外ROM的指令。

3.3.2 单片机最小系统电路

单片机工作时需要时钟信号,时钟信号通常可由外部方式或者单片机的内部方式提供。本次设计采用内部时钟方式,利用单片机内部自带的反相放大器,XTAL2为放大器的输出端,XTAL1为放大器的输入端,这两个引脚外接石英晶体振荡器和微电容,构成可以自激的振荡器。本设计在XTAL1和XTAL2外接了一个12MHZ的晶振,30pf的电容[9]。

复位是使单片机回复到初使的状态,就跟计算机的重启差不多,并从初始状态从新工作。单片机是高电平复位,一般有两种方式:按键复位和上电复位,两种复位方式均可。本次设计采用按键复位,当按下按键开关S1时,系统复位一次,电阻R2、R3为10k。其时钟电路与复位电路如图3.4所示:














3.4最小系统电路

3.4 温度采集电路设计

3.4.1 DS18B20简介

DS18B20内部结构主要有四个部分:64位的只读程序存储器ROM、温度传感器、非挥发的报警触发器TH和TL、配置寄存器。总共有三个管脚,包含DQ,GND,VDD。其中DQ为数字信号端,GND为电源地,VDD为电源输入端。

DS18B20的主要性能特点如下:

(1) 仅可用一个端口便可以通信;

(2) 无须外部器件;

(3) DS18B20支持多点组网功能;

(4) 适应电压范围广,电压范围为3.0~5.5V;

(5) 待机功耗为零;

(6) 温度以9位或12位数字;

(7) 具有报警命令识别功能;

(8) 具有负电压特性,电源接反时,芯片不会烧坏;

DS18B20的管脚图及部分温度值与DS18B20输出的数字量对照表见图

3.5和表3-1所示:




3.5 DS18B20温度传感器






3-1 部分温度值与DS18B20输出的数字量对照

温度值/℃              数字输出(二进制)         数字输出(十六进制)
    +125                     0000 0111 1101 0000                     07D0H            
+85                      0000 0101 0101 0000                     0550H
+25.625                  0000 0001 1001 0001                     0191H
+10.125                  0000 0000 1010 0010                     00A2H
+0.5                     0000 0000 0000 1000                     0008H
0                       0000 0000 0000 0000                     0000H
-0.5                     1111 1111 1111 1000                     FFF8H
-10.125                  1111 1111 0110 1110                     FF5EH
-25.625                  1111 1111 0110 1111                     FF6FH
-55                      1111 1100 1001 0000                     FC90H

3.4.3 温度采集电路

DS18B20数字温度传感器检测现场温度,将检测到的温度值送入AT89C51单片机的P1.0口,经过单片机处理后显示此时温度值,并与设定温度值做比较,输出相应占空比的PWM脉冲信号。电路如图3.6所示:








3.6 温度采集电路

3.5 温度显示电路设计

3.5.1 LED数码管简介

本设计选用五个LED数码管来进行温度显示。LED又称为数码管,主要是由8个发光二极管构的。LED数码管按结构可以分为共阴极和共阳极两种结构,如图3.7所示:共阴极把8个发光二极管阴极连接在一起,共阳极把8个发光二极管阳极连接在一起。通过编程的方式使单片机的引脚输出不同的高低电平,便可以得到相应的数字,这种数码管的显示方式就被称做段选码[10]。







  

3.7 七段LED数码管


3-2 七段LED数码管的段选码

显示字符
共阴极段码
共阳极段码
显示字符
共阴极段码
共阳极段码
0
3fH
C0H
8
7fH
80H
1
06H
F9H
9
6fH
90H
2
5bH
A4H
A
77H
88H
3
4fH
B0H
B
7fH
83H
4
66H
99H
C
39H
C6H
5
6dH
92H
D
3fH
A1H
6
7dH
82H
E
79H
86H
7
07H
F8H
F
71H
8EH


假如一个数码管采用共阴极接法接入单片机中,想要显示数字“5”须使a、c﹑d﹑f﹑g这5个二极管同时发光 (即这5个二极管接入高电平),而其他二极管不发光。只要P0口输入01101101(6dH)即可。字形与段选码的对照见表3-2。

3.5.2 温度显示电路

本次设计主要显示当前温度值和预设温度值,其中前三个LED数码管显示当前温度值,可显示0到99.9不同的温度,后两个LED数码管显示之前预设定的温度值。数码管显示采用共阴极接法,其中a,b,c,d,e,f,g,dp分别与P0.0到P0.7相连,作为段选信号,又因为P0口输出的是低电平,所以在P0口接了10K的上拉电阻,P2.0到P2.5分别接到1,2,3,4,5,6引脚作为位选信号。显示电路如图3.8所示:


                              图3.8 温度显示电路

3.6 驱蚊电路设计

3.6.1 TCT40-16T超声波发射器简介

TCT40-16T是一种较小的超声波发射器,它能发射出不同频率的超声波,适用于家用电器及其他电子设备的超声波遥控装置。其器件外观如图3.9所示:











              3.9 超声波发射器TCT40-16T

3.6.2 驱蚊电路

P3.5是单片机定时器T1的时钟输出端口,我们可以利用定时器T1输出频率为22KHZ的方波信号,并通过并联反相器增大驱动后送入超声波发射器TCT40-16T来模拟雄蚊发出的超声波,进而达到驱蚊目的[11]。驱蚊电路如图3.10所示:










图3.10 驱蚊电路

3.7 驱动与调速电路设计

3.7.1 达林顿反相器ULN2803简介

因为直流电机工作时需要较大的电流,而单片机I/O口输出的电流都在几十毫安级别,无法满足直流电机的工作电流,所以必须要外加驱动电路。在本设计驱动电路中,选用达林顿反向驱动器ULN2803来驱动直流风扇电机。ULN2803在使用时接口非常简单,并且操作很容易,可为电机提供几百毫安的驱动电流,它实际上是一个集成芯片,单块芯片可同时驱动8个直流电机。

ULN2803实际上是16个NPN晶体管组成,总共含有18个引脚。 ULN2803的管脚图如下图3.11所示:




                                  图3.11 ULN2803管脚图

各引脚简介如下:      

1-8引脚:8个输入端口;

9引脚:接地端;

10引脚:为COM端,一般悬空或接电源,但与负载的电源共同接在一起,驱动效果更好,本次设计接12电源。ULN2803可以输出最大电流可达500毫安,最大电压可达50V。本系统选用的电机为12V直流无刷电机,所需电流为300毫安左右,因此可用ULN2803来驱动。

11-18引脚:8个输出端口;

3.7.2 驱动与调速电路

本次设计利用PWM脉冲宽度调制技术对直流电机进行实时调速,风扇分为五档,预设温度t0为25度,温度每增高5度,风扇增加一档。当当前温度低于预设温度时,输出占空比为0的PWM脉冲,风扇不转。当当前温度大于预设温度时,风扇转动,并且可以根据当前温度输出相应占空比的PWM脉冲,进而实现了对风扇的自动调速。

驱动与调速电路如下图3.12所示:直流风扇电机与ULN2803的COM端供接12V电源,直流电机另一端接ULN2803的4C,单片机的P3.4口接4B,通过单片机的P3.4口输出不同占空比的PWM脉冲信号,便可以对直流电机进行调速,系统选用的电机为12V直流无刷电机。

         
                               图3.12驱动与调速电路

3.8 独立按键电路设计

本次设计需要两个独立按键S2和S3,主要是用来对预设温度初值进行调整。当S2每按下一次,预设初值自动加一,S3每按下一次预设温度初值自动减一。加减采用中断方式实现,将S2与P3.2相连,S3与P3.3相连。当有键按下立刻执行中断程序,低电平有效。独立按键电路如下图3.13所示:

                              

















图3.13 独立按键电路


4 软件设计

4.1 系统总体软件设计流程图

初始化程序后,传感器采集温度送入单片机,通过LED显示。当有键按下时处理按键,无键按下,根据温度得到不同的转速,如图4.1所示:

4.1 软件总体设计流程图

4.2 用Keil C51进行程序编写

Keil C51 软件目的主要在于解决嵌入式软件开发商面临的问题,当有新项目的时候,只需要从设备数据库选择使用的设备,uVision IDE 将设置好所有的编译器,链接器和存储器选项[12]。Keil C51是美国Keil Software公司开发的51系列并且兼容单片机C语言的嵌入式开发软件,与单片机汇编语言相比,C语言的灵活性更强一点,程序编写相比于汇编也更简单,很容易学习和使用,且编写的函数模块可移植性强[13]。一般创建一个Keil C51应用程序需要按照下面的步骤:

   (1) 创建一个工程项目文件;

  (2) 为工程项目选择目标器件;

   (3) 为工程项目设置软硬件调试环境;

  (4) 创建源程序项目文件;

   (5) 保存创建的源程序项目文件;

  (6) 把源程序文件添加到项目中;

Keil C51使用界面如图4.2:


                     
4.2Keil C51使用界面


5 系统调试与仿真

5.1 系统软件调试

源程序通过编译,只能说明源程序的语法没有问题,但不能保证程序的逻辑功能和需要的逻辑功能一致,所以还必须对程序进行调试。程序调试时可以采用单步执行或者连续执行,连续执行速度快,但当出错时不易查出错误的地方。单步执行简单方便,可以检查每条指令的正确性,但比较繁琐,消耗大量时间。因此可先连续调试,对有问题的地方在单步调试[14]。

5.2 程序下载

程序调试好以后,就可以下载了,将经过编译后生成的.HEX文件下载到单片机上,下载在单片机上的程序将在程序存储器储存起来,即使掉电后仍然保存,不会因此而丢失。本次设计的总程序清单见附录2。

5.3 系统仿真

本次设计采用protues软件进行仿真,Proteus软件是英国Labcenter electronics 公司出版的EDA工具软件。它不仅具有其它EDA工具软件仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。Proteus是世界上著名的EDA工具,从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计[15]。Proteus  ISIS的工作界面是一种标准的Windows界面,其中包含标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择窗口、图形编辑窗口。



(1) 本次设计的预设温度值为25度,当当前温度大于设定温度时直流电机开始转动。当当前温度为26度时直流电机转动情况如图5.1所示:








                         图5.1 当前温度为26度的转速情况




(2) 当当前温度值升高至31度时,其电机转速如图5.2所示:显然转速较温度为26的时候有了明显的增加,表明单片机对电机的转速控制功能能够正常实现。

5.2 当前温度为31度的转速情况


(3) 当我们通过独立按键S2将预设温度增加到29大于当前温度26时,输出占空比为零的脉冲,直流电机将停止转动,如图5.3所示:

5.3 当前温度小于设定温度的转速情


6 结   论

本次设计以单片机AT89C51为主控芯片,硬件主要包含电源电路、单片机最小系统电路、温度采集电路、温度显示电路、独立按键电路、驱蚊电路、驱动与调速电路。用DS18B20温度传感器采集当前温度送入单片机处理,LED数码管能正常显示当前温度和设定温度,并能根据当前温度和设定温度的差值调节风扇转速,在一定范围内实现了对风扇的实时调速。独立按键部分也能正常使用,可以调节预设温度t0的值。同时超声波发射器也能正常工作,达到了驱蚊目的。

本次设计对于现实生活具有积极的作用,可以用来作为降温工具,环保且智能,能够给人带来很多方便,同时驱蚊的功能在夏季还是很有必要。



附录一 电路总图

单片机源程序如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DQ=P1^0;
  5. sbit key2=P3^2;
  6. sbit key3=P3^3;
  7. sbit P3_4=P3^4;
  8. sbitP3_5=P3^5;
  9. float ff;
  10. uint y3;
  11. uchar shi,ge,xiaoshu,yushe=25;
  12. uchar code dispcode[]={  
  13. 0x3f,0x06,0x5b,0x4f,
  14. 0x66,0x6d,0x7d,0x07,
  15. 0x7f,0x6f,0x77,0x7c,
  16. 0x39,0x5e,0x79,0x71};  //段码
  17. uchar code tablel[]={
  18. 0xbf,0x86,0xdb,0xcf,
  19. 0xe6,0xed,0xfd,
  20. 0x87,0xff,0xef}; //带小数点的段码
  21. uchar dispbitcode[]={    //位选
  22. 0xfe,0xfd,0xfb,0xf7,
  23. 0xef,0xdf,0xbf,0x7f};  
  24. uchar dispbuf[8]={0,0,0,0,0,0,0,0};
  25. void Delay(uint num)// 延时函数
  26. {
  27.               while( --num );
  28. }
  29. void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
  30. {
  31.               dispbuf[0]=a0;
  32.               dispbuf[1]=a1;
  33.               dispbuf[2]=a2;
  34.               dispbuf[3]=a3;
  35.               dispbuf[4]=a4;
  36.             
  37.               P2=0xff;
  38.               P0=dispcode[dispbuf[0]];
  39.               P2=dispbitcode[5];
  40.               Delay(1);

  41.               P2=0xff;
  42.               P0=dispcode[dispbuf[1]];
  43.               P2=dispbitcode[4];
  44.               Delay(1);

  45.               P2=0xff;
  46.               P0=dispcode[dispbuf[2]];
  47.               P2=dispbitcode[2];
  48.               Delay(1);

  49.               P2=0xff;
  50.               P0=tablel[dispbuf[3]];
  51.               P2=dispbitcode[1];
  52.               Delay(1);

  53.               P2=0xff;
  54.               P0=dispcode[dispbuf[4]];
  55.               P2=dispbitcode[0];
  56.               Delay(1);
  57. }
  58. void dmsec(uint count)
  59. {   
  60.               uint i;                                          // 1ms延时
  61.               while(count--)
  62.               {
  63.                             for(i=0;i<125;i++){}
  64.               }
  65. }

  66. void tmreset(void)
  67. {                 
  68.               DQ=0;
  69.               Delay(90);                                          // 精确延时 大于 480us
  70.               DQ=1;
  71.               Delay(4);                                          // 90,4 可以小范围变化
  72. }

  73. void tmpre(void)
  74. {                  
  75.               while(DQ);
  76.               while(~DQ);
  77.               Delay(4);
  78. }

  79. bit tmrbit(void)
  80. {                  
  81.               uint i;
  82.               bit dat;
  83.               DQ=0;
  84.               i++;                                          // i++;大概1us
  85.               DQ=1;
  86.               i++;
  87.               i++;               
  88.               dat=DQ;
  89.               Delay(8);           
  90.               return(dat);
  91. }

  92. uchar tmrbyte(void)  //读一个比特
  93. {        
  94.               uchar i,j,dat;
  95.               dat=0;
  96.               for(i=1;i<=8;i++)
  97.               {
  98.                             j=tmrbit();
  99.                             dat=(j<<7)|(dat>>1);
  100.               }
  101.               return(dat);
  102. }

  103. void tmwbyte(uchar dat)  //写一个比特
  104. {            
  105.               uint i;
  106.               uchar j;
  107.               bit testb;
  108.               for(j=1;j<=8;j++)
  109.               {
  110.                             testb=dat&0x01;
  111.                             dat=dat>>1;                            // 从低位开始
  112.                             if(testb)       // Write 1
  113.                             {
  114.                                           DQ=0;                             // 先拉低
  115.                                           i++;
  116.                                           i++;                            // >1us                        
  117.                                           DQ=1;
  118.                                           Delay(4);           
  119.                             }
  120.                             else            // Write 0
  121.                             {
  122.                                           DQ=0;
  123.                                           Delay(4);                        
  124.                                           DQ=1;
  125.                                           i++;
  126.                                           i++;                             // 再拉高                        
  127.                             }
  128.               }
  129. }
  130. void tmstart(void)    //ds1820开始转换
  131. {  
  132.               dmsec(1);            
  133.     tmreset();
  134.     tmpre();
  135.     dmsec(1);
  136.     tmwbyte(0xcc);                             // skip rom            
  137.     tmwbyte(0x44);                             // 转换
  138. }
  139. uchar tmrtemp(void)     //读取温度
  140. {                 
  141.               uchar a,b;
  142.               tmreset();
  143.               tmpre();
  144.               dmsec(1);
  145.               tmwbyte(0xcc);                             // skip rom
  146.               tmwbyte(0xbe);                                          // 转换
  147.               a=tmrbyte();                             // LSB低8位
  148.               b=tmrbyte();                            // MSB高8位
  149.               y3=b;
  150.               y3<<=8;
  151.               y3=y3|a;
  152.               ff=y3*0.0625;
  153.               y3=ff*10+0.5;
  154.               return(y3);
  155. }
  156. void keyscan(void)
  157. {
  158.               if(key2==0)
  159.               {
  160.                             dmsec(5);
  161.                             if(key2==0)
  162.                             {
  163.                                           yushe++;
  164.                                           if(yushe==100)
  165.                                                         yushe=25;            
  166.                             }
  167.                             while(!key2);
  168.               }
  169.               else if(key3==0)
  170.               {
  171.                             dmsec(5);
  172.                             if(key3==0)
  173.                             {
  174.                                           yushe--;
  175.                                           if(yushe==0)
  176.                                                         yushe=25;            
  177.                             }
  178.                             while(!key3);            
  179.               }
  180. }
  181. void time0_int(void) interrupt 1            //定时器T0产生不同占空比的PWM
  182. {  uint tmp;
  183.    static unsigned char j;
  184.    TH0=(65536-50000)/256;
  185.    TL0=(65536-50000)%256;
  186.    j=j+1;
  187.    if(tmp<=yushe)
  188.      {
  189.        P3_4=0;
  190.        j=0;                              //占空比00%
  191.      }
  192.    else if((tmp>yushe)&&(tmp<=(yushe+5)))
  193.        {
  194.             if(j==4)
  195.               P3_4=0;
  196.             else if(j==20)
  197.               P3_4=1;
  198.               j=0;
  199.         }                             //占空比为20%
  200.     else if((tmp>(yushe+5))&&(tmp<=(yushe+10)))
  201.        {
  202.             if(j==8)
  203.               P3_4=0;
  204.            else if(j==20)
  205.               P3_4=1;
  206.               j=0;
  207.         }                            //占空比为40%
  208.     else if((tmp>(yushe+10))&&(tmp<=(yushe+15)))
  209.        {
  210.               if(j==12)
  211.                 P3_4=0;
  212.               else if(j==20)
  213.                 P3_4=1;
  214.                 j=0;
  215.         }                         //占空比为60%
  216.     else if((tmp>(yushe+15))&&(tmp<=(yushe+20)))
  217.        {
  218.               if(j==16)
  219.                 P3_4=0;
  220.              else if(j==20)
  221.                 P3_4=1;
  222.                 j=0;
  223.         }                         //占空比为80%
  224.      else if(tmp>(yushe+20))
  225.             P3_4=1;
  226.              j=0;                       //占空比100%
  227. }
  228. void time1_int(void) interrupt 1     //定时器T1产生频率为22KHz的驱蚊超声波
  229. {
  230.    P_3.5=!P3_5;
  231.    TH0=(65536-2500)/256;
  232.    TL0=(65536-2500)%256;
  233. ……………………

  234. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于单片机的智能风扇设计.doc (1.66 MB, 下载次数: 128)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1071489 发表于 2023-4-14 14:29 来自手机 | 只看该作者
您好,有源程序和仿真吗
回复

使用道具 举报

板凳
ID:1064915 发表于 2023-4-15 08:56 | 只看该作者
完整的一篇文档
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表