单片机设计吸油烟机的设计.docx
《单片机设计吸油烟机的设计.docx》由会员分享,可在线阅读,更多相关《单片机设计吸油烟机的设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机设计吸油烟机的设计
吸油烟机的设计
一、概述
吸油烟机是广泛应用于厨房的重要的电气设备,吸油烟机性能的好坏将直接影响厨房的环境,因此也将影响人的健康。
随着现代科学技术的发展,吸油烟机将会有更广阔的应用领域,所以得到设计理想的吸油烟机也显得尤其重要。
吸油机控制电路的设计理念已相当成熟,根据对吸油烟机风扇电机转速不同的要求,可以用不同的方法来设计。
吸油烟机的设计既可以采用纯模拟电路,也可以采用数字电路,还可以采用数模混合电路。
吸油机可以采用数码管显示运行状态,也可以采用LCD液晶显示器。
该吸油烟机采用轻触式开关控制,并结合照明灯的亮和熄灭来控制油烟机风扇的转动。
照明灯开关按键一个B1,照明指示灯一个LED1,吸油烟机风扇转动按键两个B2、B3,对应这两个按键指示灯两个LED2、LED3,吸油烟机功能开关按键B4,对应指示灯LED4。
设计要求如下:
1、按一下B1,LED1变亮,同时吸油烟机的照明灯打开,再按一下B1,LED1熄灭,对应照明灯熄灭。
2、B2和B3都能控制吸油烟机风扇的转动,但这两者控制吸油烟机的转速不同,按一下B2,LED2变亮、风扇高速转动,此时按一下B3,LED3变亮,LED2熄灭,风扇低速转动,B2不再控制风扇,再按一下B2则LED2变亮,LED3熄灭,风扇又高速转动,B3不再控制风扇,也就是说在同一时间里,B2和B3中只能有一个按键能控制风扇转动。
3、按一下B4,LED4变亮,这是可以按B2或B3控制风扇转动,再按一下B4则LED4熄灭,LED2、LED3熄灭,B2、B3不再起作用,在LED4不亮的状态下,按B2或B3不起作用,而B1则不受影响。
二、吸油烟机的方案设计
在现代电子技术领域中,实现吸油烟机的控制电路的方法多种多样,可以通过纯硬件电路来实现,也可以采用硬件和软件结合的电路来完成。
以下列举了几种比较常用可行的方案,通过对比从中选择一种比较好的方案。
1吸油烟机的两种设计方案
方案一:
给予分立元件的吸油烟机控制电路
基于分立元件的吸油烟机的控制系统主要由控制电路、键盘模块、指示灯模块以及电机驱动电路组成。
其原理方框图如图1所示。
方案二:
基于AT89C51微处理器的吸油烟机控制电路
基于AT89C51的吸油烟机的控制系统主要由AT89C51微处理器、指示灯电路模块、键盘模块、LED显示器模块、复位模块等组成。
其原理方框图如图2所示。
基于基于AT89C51微处理器的吸油烟机控制系统的工作原理:
以AT89C51微处理器为核心,通过软件编程实现电机控制的高低速切换。
一旦有按键操作,则引起单片机中断,在中断服务子程序里,根据相应的按键,执行的电机控制动作和指示灯显示。
同时,本系统扩展了一个时钟电路,能够显示时间。
2方案比较
设计过程中,方案的选择必须与实际情形联系起来,从各方面考虑设计的可行性,即不仅要考虑其先进性也要考虑其实现的可能性,综合寻求最佳方案。
基于分立元件的吸油烟机采用纯硬件实现控制,故而电路结构复杂,所应用的集成IC较多,功能实现起来比较麻烦,而且电路稳定性不高。
基于微处理器AT89C51的吸油烟机采用硬件和软件相结合的方式实现控制,电路简单,功能完善,所应用的集成IC较少,稳定性较高。
经过上述方案的比较,结合各种因数综合考虑后,本设计采用方案二。
三、吸油烟机的硬件设计方案
1电极控制模块
电机控制电路的主要功能是完成吸油烟机风扇在高速转动与低速转动之间的切换。
其工作原理:
微处理器在确认风扇转动按键B2被按下后,则单片机的P1.6置为高电平,三极管V8导通,继电器KA2吸合,常开触点KA2闭合,直流电机电枢回路通电,风扇电机低速转动;当按下按键B3后,则将单片机的P1.7置为高电平,三极管V7导通,继电器KA1吸合,常开触点KA1闭合,电阻R18被短路,此时电枢回路的总电阻小于KA1断开时的总电阻,而端电压保持不变,所以电枢回路的电流增大,故而风扇电机转速增大。
电机控制电路图如图3所示。
2键盘模块
根据设计要求,在本系统中共需要7个按键,照明灯按键B1、风扇转速控制键B2、B3,功能选择键B4、电子时钟设置调整键B5~B8。
为了节省I/O资源,采用2×4键盘电路,键位的列线(输入线)连到P1.0~P1.2,行线(输出线)连到P1.2~P1.5,而2根列线则通过74LS08“与”门相连后,连到
端。
初态时,P1.2~P1.5全部为0,没有键压下时,
为高电平;当键位上有任一键压下,
端变低,向CPU发出中断请求,执行中断服务程序扫面键盘。
键盘电路原理图如图4所示。
3指示灯模块
指示灯电路的主要功能是指示当前吸油烟的工作状态。
当按键B1被按下时,将P3.0置为低电平,发光二极管V1点亮。
指示灯电路原理图如图5所示。
4复位电路模块
复位电路采用STC813组成的看门狗电路。
它和单片机的连接电路如图6所示。
看门狗定时器对微处理机提供了独立的保护系统,当系统出现故障时,在可选的超时周期之后,STC813看门狗将发出RESET信号,使CPU自动复位。
利用STC813的低电压监测电路,可以保护系统免受低电压的影响,当Vcc低到转换点以下时,系统复位,并一直保持到Vcc返回并且稳定为止。
5时钟模块
若采用直接驱动法驱动6个七段显示器,共须6×8=48条I/O线,而采用解码器驱动也要6×4=24条I/O线,形成I/O口的浪费。
所以采用扫描显示法,再加上TTL七段显示译码器74LS48和3-8译码器74LS138,只需要7条I/O线,可节省硬件。
时钟电路原理图如图7所示。
四、吸油烟机的软件设计
1初始化程序和主程序模块
初始化程序流程图如图8所示,初始化程序部分主要使系统进入复位初始化的状态值。
具体过程为:
设置中断优先级IP,选择定时器0的工作方式,并且设置初始值,开外部中断0,时钟显示寄存器初始化,使之全部显示为0,键盘端口初始化,指示灯显示初始化。
主程序流程图如图9所示,具体过程为:
主程序调用初始化程序后,处于等待状态,当外部中断0产生中断,则调用外部中断0服务子程序,当外部中断0没有产生中断时,则调用定时器0服务子程序。
2定时器0中断服务程序模块
定时器0中断程序工作过程:
定时器0每隔4ms中断,一次中断相当于一个计数,每中断一次则计数加1。
当计数为250次时,则表示1s到了,调用计时子程序,秒变量加1,再判断秒变量是否到60,如果到了60,则说明一分钟到了,分变量加1,同理判断时变量是否1小时到了,若计数到了则将相关变量清除为0。
同时调用显示子程序和子程序来对显示器进行扫描,从而显示时间数据。
定时器中断服务子程序的流程图如图10所示。
3时钟程序模块
时钟程序设计主要包括计时子程序CLOCL、显示子程序DIS、显示准备子程序READY三部分。
计时子程序CLOCK主要功能:
每隔1S判断秒变量、分变量、时变量寄存器的值,当秒、分变量寄存器的值超过60则清零,而时变量寄存器的值超过24则清零。
显示子程序SCAN的主要功能:
将列扫描值和显示数值送到P2口。
显示准备子程序DIS的主要功能:
分别将显示的秒、分、时数值转换程十进制数值暂存到寄存器20H~25H。
计时子程序CLOCL、显示子程序DIS、子程序REDAY的程序流程图分别如图11、图12和图13所示。
4外部中断0服务程序
外部中断0中断服务程序的功能是:
当有键按下时,通过“与”门触发外部中断0中断,调用键盘扫描子程序获取键值,根据键值执行相应的动作。
外部中断0的服务程序流程图和键盘扫描子程序流程图分别如图14、图15所示。
五、仿真及调试
1程序调试及问题分析
在编写应用程序的过程中,无论是谁都难免出现一些或大或小的错误,尤其是我们这些编程不是很厉害的学生,在编程过程中必然会产生错误,所以编好初稿后必须进行程序调试。
程序调试过程确实不是一个容易的过程,我把程序在WAVE6000集成实验环境下编辑好后一编译发现二十几处错误,有些是丢了冒号,或使用的是中文式的冒号,有些是宏汇编出错了等等错误。
2仿真测试
在Proteus6.9S环境下进行仿真,仿真效果如图16、图17所示。
图17吸油烟机仿真图二
六、结束语
做了两周的课程设计,有很多的心得体会,有关于单片机方面的,更多的是关于人与人之间关系方面的。
我们组一共有四个人,我单片机学的不太好,为此还是搞的很认真。
开始几天我白天在电子阅览室查找资料,晚上在图书馆查看一些有关书籍,有时还请教我们的指导老师。
经过老师的多凡讲解讲解使我得到了很大的收获。
所幸的是,我得到了很多同学的帮助。
我想没有他们我可能都要放弃了,因为我本人对单片机也并不是很熟悉,学的东西好像它是它,我是我理论联系不了实际。
以前的汇编语言没学好,一开始的程序这块儿就要令我不知所措了。
后来请教我们班的同学和老师,在他们的帮助下和大家的共同努力之下,终于写出了程序。
在此次课程设计中,我对着电路图再看课本,发现以前很多觉得很难记的东西现在记起来容易多了,因为整天都在同它们打交道。
51的引脚及其功能,驱动器的,所有我用到的我都一再的看书了解,同时请教同学我看书过程当中的疑惑。
在这个过程中又发现了以前连电路当中出的一些问题,能改的就改,不能改的,咳,要是时间再多一些,或者我能早点做好,不要想那些如果,还是准备自己的,做好我现在能做的吧。
还好,验收还算成功,但是我觉得对我来说已经很好,代表了我真实的水平,我觉得我对单片机的一些知识在这个动手的过程中真的是从无到有增长的。
同时我也尽量不去想别人得了多少分,没有什么不平衡的,有些人付出的是努力,有些人付出的是风险代价,其实这也没有什么不一样,这一点我早就了解。
最后,我发现自己对单片机竟然也有了一点兴趣,想暑假回家以后补一补汇编语言。
有什么问题请教下以前的那些老同学好了。
附录A吸油烟机的程序清单
HOUREQU2AH;存放小时变量
MINEQU2BH;存放分钟变量
SECEQU2CH;存放秒钟变量
GN_FLAGEQU20H.5;功能选择标志位
ORG00H;主程序起始地址
LJMPMAIN;跳至主程序
ORG03H;INT0中断起始地址
LJMPINT0;跳至中断子程序INT0
ORG0BH;TIMER0中断起始地址
LJMPTIMER;跳至TIMER0中断子程序TIMER
**********************************************************
主程序
*********************************************************
MAIN:
MOVSP,#70H;设置堆栈在70H
MOV28H,#00H;显示寄存器初值为00
MOVHOUR,#08H;"时"寄存器初值为09H
MOVMIN,#00H;"分"寄存器初值为00H
MOVSEC,#00H;"秒"寄存器初值为00H
MOVP2,#0FH;键盘端口初始化,行线置0
MOVP3,#0FFH;指示灯初始化
CLRGN_FLAG;功能标志位清零
MOVTMOD,#01H;TIMER0工作方式1
MOVTL0,#60H;定时4MS
MOVTH0,#0F0H;
MOVIE,#83H;中断使能
SETBPX0;中断0优先级高
SETBIE0;中断0跳变触发方式
MOVR4,#250;中断250次
SETBTR0;启动定时器0
AJMP$;等待中断
********************************************************************
外部中断0处理子程序
********************************************************************
INT0:
PUSHACC;将ACC的值暂存于堆栈
PUSHPSW;将PSW的值暂存于堆栈
AGAIN:
MOVP2,#0FH
JNBP2.0,ZHIX0
JNBP2.1,ZHIX1
AJMPEXIT
ZHIX0:
MOVP2,#0F0H
CALLDELAY
JNBP2.4,B5
JNBP2.5,B6
JNBP2.6,B7
JNBP2.7,B8
JMPEXIT
ZHIX1:
MOVP2,#0F0H
CALLDELAY
JNBP2.4,B1
JNBP2.5,B2
JNBP2.6,B3
JNBP2.7,B4
JMPEXIT
B1:
CPLP3.0;照明灯点亮或熄灭
JMPEXIT
B2:
JBGN_FLAG,BB2
CALLDELAY
JBGN_FLAG,BB2
JMPEXIT
BB2:
CPLP3.1;电机低速转动
CLRP1.7
JMPEXIT
B3:
JBGN_FLAG,BB3
JMPEXIT
BB3:
CPLP3.3;电机高速转动
CLRP1.6
JMPEXIT
B4:
CPLP3.5;电机功能选择
CPLGN_FLAG
JMPEXIT
B5:
MOVA,SEC;将秒寄存器的值载入A
ADDA,#01H;A的内容加1
DAA;A做十进制调整
MOVSEC,A;将A的值存入秒寄存器
CJNEA,#60H,EXIT;是否等于60秒,不是跳至N1
MOVSEC,#00H;是则清除秒寄存器的值为00
JMPEXIT
B6:
MOVA,MIN;将分寄存器的值载入A
ADDA,#01H;A的内容加1
DAA;A做十进制调整
MOVMIN,A;将A的值存入分寄存器
CJNEA,#60H,EXIT;是否等于60分?
不是则跳到N3
MOVMIN,#00H;是则清除分寄存器的值为00
JMPEXIT
B7:
MOVA,HOUR;将时寄存器的值载入A
ADDA,#01H;A的内容加1
DAA;A做十进制调整
MOVHOUR,A;将A的值存入秒寄存器
CJNEA,#24H,EXIT;是否等于24?
不是则跳到N5
MOVHOUR,#00H;是则清除时寄存器的值为00
JMPEXIT
B8:
JMPEXIT
EXIT:
POPPSW;至堆栈取回PSW的值
POPACC;至堆栈取回ACC的值
RETI
********************************************************************
TO定时中断处理子程序
********************************************************************
TIMER:
PUSHACC;将ACC的值暂存于堆栈
PUSHPSW;将PSW的值暂存于堆栈
MOVTL0,#60H;计时到重新赋初值
MOVTH0,#0F0H;
DJNZR4,X2;计时1S是否到?
未到则跳到X2
MOVR4,#250;到了重新给R4赋值
CALLCLOCK;调用计时子程序CLOCK
CALLDIS;调用显示子程序DIS
X2:
CALLSCAN;调用扫描子程序SCAN
POPPSW;至堆栈取回PSW的值
POPACC;至堆栈取回ACC的值
RETI;返回
********************************************************************
扫描子程序
********************************************************************
SCAN:
CLRRS0
CLRRS1;选择工作寄存组0
MOVR0,#28H;(28H)为扫描指针
CJNE@R0,#6,X3;扫描完6个显示器?
不是则跳至X3
MOV@R0,#00H;是则扫描指针为0
X3:
MOVA,@R0;扫描指针载入A
ADDA,#20H;A加上常数20H(显示寄存器地址)=各时间显示区地址
MOVR1,A;各时间显示时间地址存入R1
MOVA,@R0;扫描指针载入A
SWAPA;将A的高低4位互换(P1高四位为扫描值,低四位为显示值)
ORLA,@R1;扫描值加显示值
MOVP1,A;送至P1口显示
INC@R0;扫描指针加1
RET;返回
*********************************************************************
计时处理子程序
*********************************************************************
CLOCK:
MOVA,SEC;秒寄存器的内容载入A
ADDA,#01H;加1秒
DAA;A做十进制调整
MOVSEC,A;存入秒寄存器
CJNEA,#60H,X4;是否超过60秒?
不是则跳到X4
MOVSEC,#00H;是则秒位清零
MOVA,MIN;分寄存器的内容载入A
ADDA,#01H;加1分
DAA;做十进制调整
MOVMIN,A;存入分寄存器
CJNEA,#60H,X4;是否超过60分?
不是则跳到X4
MOVMIN,#00H;是则分位清零
MOVA,HOUR;时寄存器的内容载入A
ADDA,#01H;加1时
DAA;做十进制调整
MOVHOUR,A;存入时寄存器
CJNEA,#24H,X4;是否超过24时?
不是则跳到X4
MOVHOUR,#00H;是则时位清零
X4:
RET;返回
*********************************************************************
显示准备子程序
*********************************************************************
DIS:
SETBRS0
CLRRS1;选择工作寄存器2
MOVR1,#20H;(20H)为显示寄存器,R1=20H
MOVA,SEC;将秒寄存器的内容存入A
MOVB,#10H;设B的累加器的值为10H
DIVAB;A除B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(20H)
INCR1;R1=21H
MOV@R1,A;将A的内容存入(21H)
INCR1;R1=22H
MOVA,MIN;将分寄存器的内容存入A
MOVB,#10H;设B的累加器的值为10H
DIVAB;A除B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(22H)
INCR1;R1=23H
MOV@R1,A;将A的内容存入(23H)
INCR1;R1=24H
MOVA,HOUR;将时寄存器的内容存入A
MOVB,#10H;设B的累加器的值为10H
DIVAB;A除B,商(十位数)存入A,余数(个位数)存入B
MOV@R1,B;将B的内容存入(24H)
INCR1;R1=25H
MOV@R1,A;将A的内容存入(25H)
RET;返回
********************************************************************
延时子程序
********************************************************************
DELAY:
MOVR6,#10;5毫秒延时
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
END
附录B吸油烟机的电路原理图