精品完整版豆浆机程序及仿真设计说明书Word文档格式.docx
《精品完整版豆浆机程序及仿真设计说明书Word文档格式.docx》由会员分享,可在线阅读,更多相关《精品完整版豆浆机程序及仿真设计说明书Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
1.功能介绍2
2.设计参数3
3.设计要求3
前言4
方案分析5
硬件需求分析5
软件功能分析7
主要硬件元件分析8
STC89C52RC芯片的介绍8
74LS245驱动器9
数码显示管10
调试10
1.接电源等待状态10
2.模式选择11
3.加热状态12
4.粉碎状态12
5.工作完成状态13
6.超液位中断状态14
7.液体溢出中断和液位过低中断状态14
总结15
附录16
豆浆机控制程序清单16
参考资料22
&
摘要
本豆浆机的控制系统是基于可编程的AT89C52单片机来实现的。
本控制系统主要实现以下几个功能:
1.针对不同的豆类和谷物进行不同程度的加热粉碎,即有不同的工作模式
2.不同的工作模式和加热粉碎时间用数码管予以显示
3.在整个过程中,将液位限制在安全的范围之内
4.处理完毕后,进行报警并关断电源
5.液体溢出或液位过低时,立即关断电源并报警
在豆浆机工作过程中,全部用软件控制。
对不同物料的不同处理用处理时间加以区分。
定时系统采用AT89C52内部的定时器T0来完成。
先用T0定时器定时20ms,并用循环指令定时1s加定时,之后在不同的时间段采取不同的操作。
液位限定、液体溢出保护和液位过低保护用中断来控制,其检测用防溢电极、温度传感器等控制传感器来实现。
前言
豆浆机是一种新型的家用饮料机,以黄豆等谷物等为原料,直接加工成熟的味道鲜美的热豆浆。
豆浆机由粉碎谷物的电机、豆浆加热器和控制电路三大部分组成。
用AT89C52单片机研制的全自动豆浆机的控制系统,当放入适量浸泡好的的谷物后,加入适量的冷水,插入220V交流电源,豆浆机指示灯亮起,按下按钮,先对豆浆机进行水位检测,符合要求后加热管开始对水进行加热,当加热到一定时间后,豆浆机停止加热,并启动磨浆电机开始粉碎,运转一定时间后停止运转,继续加热。
在加热过程中当温度达到一定值时豆浆上溢,当豆浆沫接触到防溢电极时,停止加热,待液位下降至安全液位后,继续加热。
如果温度过高,致使液体沸腾,溢出容器,或液体减少至过低液位时,立即触动检测开关,关断电源,停止工作并报警。
正常情况下,当粉碎2次后,谷物已经粉碎完全。
之后再对豆浆进行最后的加热,豆浆就加工好了。
此时系统关断电源并发出报警信号,等待主人处理。
可见,只要按下启动按键,豆浆机就开始工作,一会儿就能喝到美味又营养的豆浆。
整个过程由单片机全自动控制,并配合安全保护措施,用起来更加的方便、更加的安全。
方案分析
硬件需求分析
硬件上豆浆机的控制系统首先需要有一个单片机芯片作为控制核心来控制它的工作过程,我们选用AT89C52。
模式选择时需用3×
1个微型按钮开关。
因为要显示工作模式和工作时间,我们选择了1个共阴极的SEG-MPX6-CCLED数码显示管。
并配套选用74LS245芯片以驱动数码管、74LS138芯片以产生数码管片选信号。
在刚开始时需要进行水位检测,这就需要一个传感器,为了减少成本,这里采用一个开关来模拟代替传感器的作用,然后开始进行加热和粉碎。
本设计过程用LED灯进行模拟指示即可。
超液位、液体溢出和液位过低信号同样用开关来模拟。
对豆浆再次加热完毕后,预示着豆浆加工完成了,最后发出报警信号,这里就选用一个报警器和一个蜂鸣器就可以了。
综上,现实中需要的硬件有1个AT89C52,1个SEG-MPX6-CCLED数码显示管,2个74LS245芯片,1个74LS138芯片,4个BUTTON开关3个,1个电动机(带粉碎刀头),1个发热板,2个LED指示灯(电源指示和报警灯),1个蜂鸣器和2个继电器等。
而本模拟控制过程只需1个AT89C52,1个SEG-MPX6-CCLED数码显示管,2个74LS245芯片,1个74LS138芯片,4个BUTTON开关,3个LED指示灯,1个蜂鸣器等即可。
本豆浆机系统框图如下图1a和图1b所示:
图1a系统框图
图1b豆浆机模拟控制系统硬件电路图
(注:
键1、键2、键3分别为模式1、模式2、模式3的选择开关。
SW2为超液位信号模拟开关。
SW1和SW3分别为液体溢出和液位过低信号模拟开关。
LEDD3和D5分别为加热和粉碎指示灯。
功能工作时第3个数码管显示模式,第5、6两个数码管显示计时时间。
软件功能分析
软件上就是对单片机的编程了,在编程前需要画出一个流程图,如图2。
根据豆浆机控制系统的设计要求及目的,即插上电源按下按钮后,先对豆浆机进行水位检测,符合要求后,再设定工作模式。
根据豆浆机的工作场合,我们模拟设定3个工作模式:
模式1,加热6S,粉碎6S;
模式2,加热9S,粉碎9S;
模式3,加热12S,粉碎12S。
当粉碎2次,加热3次后,豆浆机完成工作,此时关电源,报
图2主程序简单流程图
警。
另外,程序需设3个中断:
超液位中断、液位溢出中断和液位过低中断(液位溢出中断和液位过低中断可用一个中断)。
超液位中断时,系统暂停工作,报警灯亮。
待液位下降至安全位置时,继续之前的操作;
当液位溢出中断和液位过低中断时,系统直接断电
结束操作,报警灯亮,蜂鸣器响。
按照上述对豆浆机控制系统的要求,软件程序应包括主程序、键盘子程序、显示子程序、两个中断子程序和报警子程序。
具体程序见附图。
用软件的编程配合硬件的设计以至于完成整个豆浆机控制系统的设计。
主要硬件元件分析
AT89C52芯片的介绍
结构,、32个可编程I/O口线、一个6向量两级中断结构,一个全双工串行通信口,片内振荡及时钟电路。
同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容。
但振荡器停止工作并禁
中的内容,但振荡器停止工作
AT89C52提供以下标准功能:
8k字节可重擦写Flash闪速存储器、256×
8字节内部RAM、32个可编程I/O口线、一个6向量两级中断
图3AT89C52RC的引脚封装图
止其它所有部件工作直到下一个硬件复位。
AT89C52的引脚封装图如上图3所示。
(1)电源及时钟引脚
●Vcc:
电源接入引脚;
●GND:
接地引脚;
●XTAL1:
晶体振荡器接入的一个引脚(采用外部振荡器时,此引脚接地);
●XTAL2:
晶体振荡器接入的另一个引脚(采用外部振荡器时,此引脚作为外部振荡信号的输入端)。
(2)控制线引脚
●RST:
复位信号输入引脚。
(3)并行I/O口引脚
●P0.0--P0.7:
一般I/O口引脚或数据/低位地址总线复用引脚;
●P1.0--P1.7:
一般I/O口引脚
●P2.0--P2.7:
一般I/O口引脚或数据/高位总线引脚;
●P3.0—P3.7:
一般I/O口引脚或第二功能引脚。
74LS245驱动器
表174LS245功能表
如图474LS245的引脚图,图表一为其功能表。
图中CE为使能端,AB/BA为方向控制端,A1-A8为A端的数据输入/输出,B1-B8为B端的数据输入/输出。
74LS245是一种三态输出的8总线收发驱动器,无锁存功能。
当CE为低电平时,如果AB/BA为高电平,则74LS245将A端的数据传送至B端;
如果AB/BA为低电平,则74LS245将B端的数据传送至A端。
在其他情况下不传送数据,输出呈高阻态。
CE
AB/BA
操作
L
H
A→B
B→A
×
高阻
图474LS245的引脚图
数码显示管
8段LED数码管是一种显示设备。
它是由若干个发光二极管组成的显示字段。
有共阳极和共阴极两种连接方式,在此设计中我们都用共阴极连接,即把所有的发光二极管的阴极连接一起。
共阴数码管的公共端COM接低电平,当某个显示字段控制端接高电平时,对应的字段就点亮,当显示字段控制端接低电平时,该显示字段熄灭。
由于每个显示字段显示通常需要十到几十毫安的驱动电流,因此显示控制信号必须经过驱动电路(即通过74LS245)才能使显示器正常工作。
调试
1.接电源等待状态
当接通电源且没有按键选择模式时,电源指示灯亮。
显示器显示“00”,表示处于等待状态。
如图5:
图5接电源等待状态
出现的问题及解决办法:
刚开始测试时,上电后显示管显示乱码。
原因可能有三:
1.编程问题,2.电路焊接问题,3.芯片问题。
经过反复测试,终于找出原因,改正后显示管显示正常。
2.模式选择
在等待状态下按下键1、键2或键3时,就会选择工作模式1、模式2或模式3。
现以模式3为例,其余两种模式雷同。
当按下键3时,显示器显示“312”,表示选择了模式3,加热时间是12S。
如图6所示。
此后显示器上模式“3”闪三次后,豆浆机开始工作。
图6模式选择
在此过程中,由于89c51芯片的原因,使得键盘比较混乱。
原来设定的按键不会工作了。
经过反复测试,测定了芯片P2口的管脚顺序,重新定义了按键,之后工作正常。
3.加热状态
当显示器上模式“3”闪三次后,豆浆机开始第一次加热,加热指示灯(红灯)亮,计时显示器开始倒计数。
如图7:
图7加热状态
加热时发现豆浆机倒计时12S和现实中的12S有较大的误差。
经分析找出病因:
在定时器定时1S(20MS×
50)的过程中,没有考虑显示程序所调用的1MS时间。
经改进,将定时器定时改为19MS×
50。
定时准确了。
4.粉碎状态
当第一次加热计时到0时,加热结束,开始第一次粉碎。
计时显示器重新开始倒计时,粉碎指示灯(蓝灯)亮。
如图8所示。
之后又进行第二次加热,第二次粉碎。
图8粉碎状态
5.工作完成状态
当两次粉碎,三次加热结束后,豆浆机工作完毕。
此时豆浆机主动关电源,同时报警灯亮,蜂鸣器响。
如图9
图9工作完成状态
6.超液位中断状态
当在工作中液位超过安全位置时,豆浆机暂停工作,报警灯亮。
如图10。
待液位回落后,继续接着执行之前的操作。
图10超液位中断状态
7.液体溢出中断和液位过低中断状态
在工作中当液体溢出或液位过低时,豆浆机直接停止工作,并报警。
报警灯亮,蜂鸣器响。
如图11:
图11液体溢出中断和液位过低中断状态
总结
经过将两周的单片机课程设计,我做的全自动家用豆浆机的控制系统的设计终于完成了。
虽然经过了多次曲折的修改和整理,最终还是比较圆满的实现了本次设计的基本要求。
针对这个控制系统,我比较满意的有两点:
第一,完美的安全防范措施。
其有三重安全保护,使豆浆机的使用更安全;
第二,全过程完全自动化,只需要将豆类等谷物和水加入豆浆机,并按键,片刻之后就会变成鲜美的豆浆。
操作简便,更加人性化。
在本次设计的过程中,我发现了很多的问题,并且也学会了很多东西。
此刻我已经对单片机这科有了比较深的认识,能熟练地运用相关的编程软件和仿真软件,会用单片机去做一些比较简单的控制系统。
这就是我在这次课程设计中的最大收获。
虽然我的作品成功了,但我觉得还有一些可以改进的地方。
第一:
我将同一个模式下的加热时间和粉碎时间设置成相同的,虽然程序简单了,但不是很合理;
第二:
可以再加上加热很粉碎次数的统计;
第三:
我的控制系统中加热很粉碎是通过时间来控制的,我觉得要是改用温度来控制就更好了。
等等。
附录
豆浆机控制程序清单
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT0_RD;
INT0口中断(液位溢出和液位过低中断)入口````````
ORG0013H
LJMPINT1_RD;
INT1口中断(超液位中断)```````
ORG0030H
;
#####【主程序】#####
置初始状态``````
MAIN:
MOVSP,#70H
SETBIT0;
INT0口中断触发方式为跳变触发````````
SETBIT1;
INT1口中断触发方式为跳变触发````````
SETBEA;
开放中断``````
MOVIE,#85H;
开中断``````
MOVIP,#01H;
INT0中断源为高优先级,INT1中断源为低优先级·
·
`````
CLRP3.0;
设初值`````
CLRP3.1
MOV30H,#00H;
设置时间单元清零``````
MOV31H,#00H;
显示模式单元清零``````
MOV34H,#00H;
显示定时时间单元清零``````
MOV32H,#00H;
计时显示十位清零`````
MOV33H,#00H;
计时显示个位清零`````
SCAN_RD:
LCALLXS_RD;
开始无键按下,显示00```````
LCALLSCAN_KEYB;
模式选择```````
JZSCAN_RD;
有键按下向下
LCALLKEY_PRSD
MOVDPTR,#JMP_RD;
设置转移表首地址``````
MOVA,R5;
取键值`````
RLA;
键值乘以2````
INCR5
JMP@A+DPTR
JMP_RD:
AJMPPRO_00;
模式0```
AJMPPRO_01;
模式1```
AJMPPRO_02;
模式2```
PRO_00:
MOV30H,#06;
定时时间为6s```
AJMPLOOP_W
PRO_01:
MOV30H,#09;
定时时间为9s```
PRO_02:
MOV30H,#12;
定时时间为12s```
模式选择后闪烁3次·
LOOP_W:
MOV34H,30H;
调入定时时间显示数据`````
MOVR7,#3;
闪烁3次·
LOOP_RD:
MOVR6,#30;
延时20MS的次数·
LOOP0_RD:
调显示程序````
LCALLDL20MS
DJNZR6,LOOP0_RD;
1S了?
````
MOVR6,#25;
LOOP1_RD:
LCALLXS0_RD
DJNZR6,LOOP1_RD;
0.5S了?
DJNZR7,LOOP_RD;
闪烁3次了?
开始工作·
MOVR6,#02;
粉碎次数`````
LCALLJR_RD
G00N_GZ:
LCALLFS_RD
DJNZR6,G00N_GZ
LCALLBAOJ_WRD
#####【主程序END】#####
加热子程序`````
JR_RD:
MOV34H,30H;
给显示单元置数·
SETBP3.0;
加热````
MOVR4,#50;
20MS程序循环50次`````1
GOON_JR:
LCALLTIME_19MS;
调用定时20MS子程序·
LCALLXS_RD;
显示`````
DJNZR4,GOON_JR;
到1S了吗?
`````
DJNZ34H,GOON_JR;
倒计时完成了吗?
停止加热`````
RET
粉碎子程序``````
FS_RD:
重新给显示单元置数·
SETBP3.1;
粉碎````
GOON_FS:
显示````
DJNZR4,GOON_FS;
`````·
DJNZ34H,GOON_FS;
粉碎完毕?
CLRP3.1;
停止粉碎`````
键盘子程序````
SCAN_KEYB:
MOVP2,#0EFH;
扫描有无按键按下`````
MOVA,P2
ANLA,#0EFH
XRLA,#0EFH
JZNO_KEY
ACALLDL20MS
NO_KEY:
KEY_PRSD:
MOVR4,P2
MOVR5,#00H
MOVDPTR,#KEY_TAB
CAL_VAL:
MOVA,R5
MOVCA,@A+DPTR;
查键值表````
XRLA,R4
JZFIXED
INCR5;
键值加1````
SJMPCAL_VAL
FIXED:
MOVA,P2;
判断按键是否释放`````
JNZFIXED
KEY_TAB:
DB0EBH,0EDH,0EEH
DL20MS:
MOVR3,#20
DD1:
MOVR4,#200
DD2:
NOP
DJNZR4,DD2
DJNZR3,DD1
显示子程序````
XS_RD:
MOV31H,R5;
调入模式显示数据`````
MOVR0,#31H;
显示缓存区数据`````
MOVP1,#00000010B;
第三个灯为显示位置``````
ACALLDISP_RD;
显示一位`````
XS0_RD:
MOVA,34H;
将定时数据分为两位·
MOVB,#10
DIVAB
MOV32H,A;
十位`````
MOV33H,B;
个位`````
CJNEA,#00H,XS1_RD0;
十位是否为0?
AJMPXS1_RD
XS1_RD0:
MOVR0,#32H
MOVP1,#00000100B;
第五个为显示位置``````
XS1_RD:
MOVR0,#33H;
MOVP1,#00000101B;
第六个灯为显示位置``````
DISP_RD:
MOVDPTR,#LED_RD;
字型码表首地址`````
MOVA,@R0;
取显示数据````
求显示数据的字型码``````
MOVP0,A;
输出字型码`````
ACALLDL1MS;
稳定显示1ms`````
RET;
返回`````
延时小程序``````
DL1MS:
MOVR3,#200
DDD1:
DJNZR3,DDD1
字型码表``````
LED_RD:
DB3FH,06H,5BH,4FH,66H;
'
0,1,2,3,4'
DB6DH,7DH,07H,7FH,6FH;
5,6,7,8,9'
定时19MS子程序``````
TIME_19MS:
MOVTMOD,#01H;
设置工作方式1和定时模式```````
MOVTH0,#0B5H;
计数初值为46536(O)````
MOVTL0,#0C8H
SETBTR0;
启动定时器``````
CONT_RD:
JBCTF0,OVER_RD;
是否溢出``````
SJMPCONT_RD
OVER_RD:
重新设计数初值为46536(O)`````
溢出中断和液位过低中断````````
ORG0200H
INT0_RD:
LCALLBAOJ_WRD;
直接报警,并关发热器和电动机电源```````
RETI
超液位中断``````
ORG0300H
INT1_RD:
CLREA;
关中断`````
PUSHACC;
保护现场````
PUSHPSW
开中断`````
SETBRS0;
把工作寄存器切换到1区```````
MOVP1,#00000111B;
报警灯亮````
JNBP3.0,INT0_FS;
判断是否在加热?
```·
停止加热````
WAIT_RD:
JNBP3.3,WAIT_RD;
液位是否下降?
```````
继续极热````
LJMPOK
INT0_FS:
WAIT0_RD:
JNBP3.3,WAIT0_RD;
``````
继续粉碎`````
OK:
关中断·
POPPSW;
恢复现场`````
POPACC
报警子程序·
BAOJ_WR