资源描述
单片机原理及接口技术课程设计报告题目:智能小家电(全自动豆浆机)控制系统的设计 专业:电气工程及其自动化 班级: 32040901 学号:3204090124 姓名:何 玉 毛 授课教师:段晨东 时间: 2011.12 设计要求 题目4 智能小家电控制系统的设计(1)(一)功能介绍 全自动家用豆类和谷物处理机(即全自动豆浆机)具有按预设模式自动粉碎谷物、加热功能、防止溢出、处理完毕报警等基本功能。一般可以处理如豆类、玉米、其他五谷杂粮、蔬菜等多种食品。全自动家用豆类和谷物处理机的处理食品的过程通常为:加热粉碎1加热粉碎2加热完成报警,整个加工过程的进行按时间控制。由于食品原料的物理特性不同,在加工处理时采用不同的加工(过程)模式,其主要区别在于加热和粉碎时间的长短不同。在工作过程中,被加工的食品液体被限定在某一个给定的液位范围内,当液体加热时泡沫达到溢出液位时,停止加热,待脱离溢出液位区时继续加热。(二)设计参数(1)电机 5W,24VDC(2)加热器 500W,220V AC(3)加热容器 1.25升(4)电力供应:220V AC(三)设计要求 (1)实现多模式选择。被选中的模式用LED显示器表明(2)实现不同模式下的加工过程:加热粉碎1加热粉碎2加热完成报警,整个加工过程的进行按时间控制,时间自定(3)液位检测和控制:使被加工的食品液体限定在某一个给定的液位范围内,当液体溢出容器或无液体时,报警并断电。(4)显示工作模式、加工状态和时间。(5)每个动作完成时,通过声光报警提示。(6)测量并显示液体温度。(四)扩充功能(1)在加热阶段进行恒温控制(2)PWM调节电机转速 目录 摘要对于此次课程设计的要求,本设计采用STC89C52来实现全自动豆浆机的各个功能的控制。在本设计中,能实现一下功能:1. 针对食品原料的物理特性不同,在加工处理时采用不同的加工(过程)模式,其主要区别在于加热和粉碎时间的长短不同(其中我用不同颜色的LED灯来表示加热和粉碎过程。)2. 不同的共工作模式和加热、粉碎时间用数码管表示出来3. 可以实现液位溢出和过低报警(用拨码开关来模拟)4. 每个模式完成后报警在豆浆机工作过程中,全部用软件控制。对不同物料的不同处理用处理时间来区分,用定时来完成。防液位溢出和过低用中断方式来实现。但在设计过程中,对于PWM调速和恒温控制没能很好的实现,在后面的学习中,我一定会更加认真地学习理论知识,并与实践相结合,进一步提升自己的能力。在此,感谢在此次课程设计过程中提供帮助的同学,谢谢你们。 一,系统分析 此次课程设计的题目是:全自动豆浆机。我们采用STC89C52来完成其设计,用不同颜色的LED灯模拟加热与粉碎功能,还有就是用蜂鸣器来完成其报警功能,以中断方式采用拨码开关来实现液位的控制等。1.方案分析与论证 :(1)模式选择模块:方案一:键盘选择模式方法。通过按下键的键值判断,来跳转到不同的模式。键盘有九个键,最多可以设计九中模式,设计时设计三种模式即可。该方案可行。方案二:定时计数模式方法。设计一个三循环的计数。通过按一下,外部给单片机一个低电平,计数一次。按两下,计数加二,按三下计数加三。按四下后回到按一下的状态。然后通过计数后的数值来选择不同的模式。该方案可行。 方案选择:总体来讲,两种方案都挺好。最后,选择模块选择方案一,由于板上有键盘,可以加以运用,也方便实现。计数口可以留着扩展外部事件中断用。 (2)加热粉碎完成报警模块:方案一:加热和粉碎时都有一定的时间,用延时实现。方案二:加热和粉碎需要的时间可以用定时实现。方案选择:选择方案二,因为加热和粉碎的时间需要用动态扫描的方式显示出来,因此定时可以实现加热和粉碎时的显示,而延时方式不行。(3)液位控制模块: 液位控制模块可用外部事件中断方式实现。烧干,液体溢出容器功能采用外部事件中断(INTO,P3.2)实现,设为高优先级的中断。加热液位控制功能也采用外部事件(INT1,P3.3)中断实现,设为低优先级。 (4)扩展计时模块:计时用来动态计量在某种模式下工作了多久,以此来观察还需要多久完成全过程。并且工作过程中有两个报警的状态,由计时的时间大概可以判断属于那种情况。计时还可以检测豆浆机工作的时间是否正常。最后,我采用正计时的方式来实现。二,设计框图1.矩阵式键盘实现的模式选择框图开始置P2为输入有按键按下?N Y延时20ms消抖 Y有按键按下?N 按键识别按键释放? N Y延时20ms消抖 Y按键释放? N Y选择模式1KEY1按下? Y N选择模式2KEY2按下? Y N选择模式3KEY3按下? Y NRET 2. 加热粉碎完成报警及液位控制模块框图开始定时加热 定时粉碎定时加热 定时粉碎定时加热 完成报警 RET RETRETRET 3.液位溢出或者过低报警框图 加热时是否超液位或者液位过低 N 返回继续加热 Y 中断,停止加热,延时适当时间 RET4.显示程序框图开始设置显示起始位置取显示数据查显示数据字型码显示数据是否显示完N YRET5.定时程序框图 开始 设置TMODTH0,TL0置初值0允许定时器工作等待,并调用正计时显示程序及模式显示程序定时器是否溢出N YRET 5.主程序框图开始主程序初始化调用显示程序,初始化显示090124调用键盘扫描程序,有键按下?NY选择相应模式,并显示。同时显示加热和粉碎的时间及调用正计时程序中断返回调用加热粉碎程序,是否有中断执行烧干和溢出容器中断程序执行超液位中断程序 YY N完成报警,调用所有显示程序RET三,软件模拟1. 初始化 其初始值为090124,上电复位后显示2. 模式1其中第一个1表示工作在模式一,后面的09为加热和粉碎各维持9s,后三位为计时部分3. 模式二其中和模式一相同,不同的是加热和粉碎时间不同,还有就是模式三也是相同的方式。4. 液位溢出报警和液位过低报警其中用拨码开关模拟液位的变化,进行声光报警,液位过低也是这种模式。5. 温度当按下4号键,就会显示温度四,硬件调试:1.调试图详相见附录 2.问题归纳 中断时,返回的不是原来的状态?解决方案:因为中断里面的程序改变了主程序里面的端口状态,所以返回时不时原来的状态。需要对影响主程序的量进行保护和还原就行了。 通过键盘选择某模式,复位后,必须复位后的瞬间选择其它模式,否则就无法选择其他模式了?解决方案:这是因为键盘扫描程序里没有对无按键时的状态进行操作。只要让无按键时,执行重新扫描键盘即可。 在软件里模拟没有问题,但是下载板子里就不行了?解决方案:软件、硬件的灵敏度不同,软件里都是理想的,和实际存在一定差距,要结合硬件来调试。在延时、端口方面应该多注意。 数码管显示不要稳定,一直在闪?解决方案:改变延时长短,多调试几次,直至稳定。 温度一直是85度?解决方案:18b20在运行过程中,其第一次读数就是85,应该舍弃第一次读数,让其循环调用。3.总结: 在此次课程设计过程中,让我深刻认识到把理论转化为现实的不易,可谓是收益匪浅。通过这次的课设,让我也熟悉了 keil和protuse这两个软件,大大的提高了动手能力。过程中,遇到问题是在所难免的,最终那份通过寻求各种帮助将问题解决后的兴奋是令人难忘的。特别是当我看着自己辛苦两周焊接出来的板子上的各种功能一一实现,那份喜悦是无法代替的。在此感谢老师,感谢在此次课程设计过程中帮助我的同学。五,参考文献单片机原理及接口技术段晨东主编,清华大学出版社 手把手教你学单片机周兴华编著,北京航空航天大学出版社附录一:电路原理图软件模拟原理图附录二:原件明细表元器件数量备注电阻31K电阻45.1K电阻28K独石电容60.1uF独石电容230PF电解电容110Uf 25V51单片机实验板189C52芯片1MAX232芯片174LS245芯片274LS138芯片1DS18B201三极管90122PNP二极管IN40011数码管2三位八段 共阴继电器1晶振111.0592MHz芯片座6电源座1三脚 5V通信插座1CON232电源适配器1通讯电缆1微型按钮开关10实验插板1单排插针若干双排插针若干短路块若干导线若干补充原件:1. LED灯2个(一个红色,一个绿色)2. 排线:4根3. 面包板:1快4. 焊接线:若干附录三:程序清单 ORG 0000H LJMP MAIN ORG 0003H LJMP P_T0 ORG 0013H LJMP P_T1 ORG 0030H MAIN: MOV SP,#60H ;开辟栈区 CLR IT0 ;INT0低电平触发 CLR IT1 ;INT1低电平触发 SETB EA ;开CPU中断 SETB EX0 ;允许INT0中断SETB EX1 ;允许INT1中断 SETB PX0 ;设置INT0为高优先级CLR PX1 ;设置INT1为低优先级 CLR P3.6 ; 加热指示灯清零 CLR P3.7 ;粉碎指示灯清零 MOV 20H,#0 ;赋初始值 MOV 21H,#9 MOV 22H,#0 MOV 25H,#1 MOV 26H,#2 MOV 27H,#4 LCALL DSPLY1 ;调显示程序 LCALL DSPLY2 LCALL SCAN_KEYB ;点键盘扫描程序 MOV 25H,#00H ;高三位清零 MOV 26H,#00H MOV 27H,#00H MOV A,R5 ;键盘返回值在然中 NEXT: CJNE A,#01H,NEXT1 ;判断是否为1键按下LCALL FUNCTION_1 ;调1键处理程序 LCALL LOOP4 ;调用计时程序和完成之后的报警程序 LCALL LOOP6RET NEXT1:CJNE A,#02H,NEXT2 ;判断是否2键按下 LCALL FUNCTION_2 ;和第一种模式相同 LCALL LOOP6 LCALL LOOP4 RETNEXT2: CJNE A,#3,NEXT3 ;3键按下? LCALL FUNCTION_3 ;同前两种 LCALL LOOP6 LCALL LOOP4NEXT3: CJNE A,#4,NEXT4 ;4键按下否? LCALL PRO_18B20 ;调温度处理程序NEXT4:LJMP MIAN ;若无键按下,返回 ;#中断处理程序,液位溢出# ORG 0100H P_T0:PUSH ACC ;保护现场 PUSH PSW CLR P3.6 ;停止加热,粉碎 CLR P3.7 LCALL ALARM ;报警 POP PSW ;恢复现场 POP ACC RETI ;#液位过低处理程序# ORG 0200H P_T1:CLR EA ;关中断 PUSH ACC ;保护现场 PUSH PSW SETB EA ;开中断 SETB RS0 ;将工作寄存器切换 CLR P3.6 ;停止加热停止粉碎 CLR P3.7 LCALL A LARM ;报警 SETB P3.6 ;恢复中断前状态 CLR EA ;关中断 POP PSW ;恢复现场 POP ACC SETB EA ;开中断 RETI ;按键处理程序FUNCTION_1: MOV 20H,#01H ; MOV 21H,#0 MOV 22H,#9 MOV 30H,#03HMOV 31H,#03HLCALL DSPLY1 RET S2_PRESS: MOV 20H,#02H MOV 21H,#1 MOV 22H,#2 MOV 30H,#04HMOV 31H,#04HLCALL DSPLY1 RET S3_PRESS: MOV 20H,#03H MOV 21H,#1 MOV 22H,#5 MOV 30H,#05HMOV 31H,#05HLCALL DSPLY1 RETDSPLY1: MOV R0,#20H MOV R2,#00H REDO:ACALL DISP INC R2 MOV A, R2 INC R0 XRL A, #03H JNZ REDO RETDSPLY2: MOV R0,#25H MOV R2,#03H REDO2:ACALL DISP INC R2 MOV A, R2 INC R0 XRL A, #06H JNZ REDO2 RETDISP: MOV P1,R2 MOV DPTR,#LED_SEG MOV A ,R0 MOVC A ,A+DPTR MOV P0,A LCALL DL1MS RET LED_SEG:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHLOOP6: LCALL DL1S MOV A,27H CJNE A,#09H,GOON1 MOV 27H,#00H MOV A,26H CJNE A,#05H,GOON2 MOV 26H,#00H INC 25H RETGOON1: INC 27H RETGOON2: INC 26H RETDL20MS: MOV TMOD,#01H MOV TH0,#0DBH MOV TL0,#00H SETB TR0 CONT1:JBC TF0,OVERF1 SJMP CONT1 OVERF1:RETLOOP4: LCALL JIARE LCALL FENSUI LCALL JIARE LCALL FENSUI LCALL JIARE CLR P3.6 CLR P3.7 LCALL ALARM RETJIARE: MOV 23H,30H CLR P3.7 SETB P3.6LOOP1: LCALL DL1MIN DJNZ 23H,LOOP1 RETFENSUI: MOV 24H,31H CLR P3.6 SETB P3.7LOOP2: LCALL DL1MIN DJNZ 24H,LOOP2 RET ALARM: LOOP5: MOV R1,#20 MOV A,#06H MOV P1,A LCALL DL1MS LCALL DL1MS INC A MOV P1,A LCALL DL1MS LCALL DL1MS LCALL DSPLY1 LCALL DSPLY2 DJNZ R1, LOOP5 RETDL1MIN: MOV R7,#3 DL1: LCALL LOOP6 DJNZ R7,DL1 RET DL1MS: MOV R1,#200 DL2: NOP NOP NOP DJNZ R1,DL2 RET DL1S: MOV R6,#20 WAIT: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 CONT2: JBC TF0,OVERF2 LCALL DSPLY1 LCALL DSPLY2 SJMP CONT2 OVERF2: DJNZ R6,WAIT RETSCAN_KEYB: MOV P2,#0F0H MOV A,P2 ANL A,#0F0H XRL A,#0F0H JZ NO_KEY ACALL DL20MS ANL A,#0F0H XRL A,#0F0H JZ NO_KEY MOV R2,#11110111B SCAN:MOV A,R2 MOV P2,A MOV A,P2 ANL A,#11110000B MOV R3,A CJNE A,#0F0H,KEY_PRSD MOV A,R2 RR A MOV R2,A XRL A,#01111111B JNZ SCAN NO_KEY :LJMP MAIN KEY_PRSD:MOV A ,R2 ANL A ,#00001111B ORL A ,R3 MOV R4,A MOV R5,#01H MOV DPTR,#KEY_TAB CAL_VAL:MOV A ,R5 MOVC A,A+DPTR XRL A,R4 JZ FIXED INC R5 SJMP CAL_VAL FIXED:MOV A ,P2 ANL A ,#0F0H XRL A,#0F0H JNZ FIXED ACALL DL20MS MOV A ,P2 ANL A ,#0F0H XRL A,#0F0H JNZ FIXED INC A RET KEY_TAB: DB 77H,77H,7BH,7DH,0B7H,0BEH,0BDH DB 0D7H,0DBH,0DDH RET ;WENDUXIANSHI FLAG1 BIT F0 ;DS18B20存在标志位 DQ BIT P1.3 TEMPER_L EQU 27H TEMPER_H EQU 26H PRO_18B20: MOV 30H,#250 REPLY: LCALL INIT_18B20 LCALL RE_CONFIG LCALL GET_TEMPER LCALL CHANGE ;将18B20读的16位温度转换8位数据 LCALL DISPLAY ;调用数码管显示子程序 DJNZ 30H,REPLY;*DS18B20复位程序*INIT_18B20: SETB DQ NOP NOP CLR DQ NOP NOP MOV R0,#0FBH TSR1: DJNZ R0,TSR1 ;延时 SETB DQ MOV R0,#25H TSR2: JNB DQ ,TSR3 DJNZ R0,TSR2 TSR3: SETB FLAG1 ;置标志位,表明DS18B20存在 CLR P2.0 ;二极管指示 AJMP TSR5 TSR4: CLR FLAG1 LJMP TSR7 TSR5: MOV R0,#06BH TSR6: DJNZ R0,TSR6 TSR7:SETB DQ ;表明不存在 RET;*设定DS18B20暂存器设定值*RE_CONFIG: JB FLAG1,RE_CONFIG1 RETRE_CONFIG1: MOV A,#0CCH ;放跳过ROM命令 LCALL WRITE_18B20 MOV A,#4EH LCALL WRITE_18B20 ;写暂存器命令 MOV A,#00H ;报警上限中写入00H LCALL WRITE_18B20 MOV A,#00H ;报警下限中写入00H LCALL WRITE_18B20 MOV A,#1FH ;选择九位温度分辨率 LCALL WRITE_18B20 RET;*读转换后的温度值*GET_TEMPER: SETB DQ LCALL INIT_18B20 JB FLAG1,TSS2 RET ;若不存在则返回 TSS2: MOV A,#0CCH ;跳过ROM LCALL WRITE_18B20 MOV A,#44H ;发出温度转换命令 LCALL WRITE_18B20 ; LCALL DISPLAY ;延时 LCALL INIT_18B20 MOV A,#0CCH ;跳过ROM LCALL WRITE_18B20 MOV A,#0BEH ;发出读温度换命令 LCALL WRITE_18B20 LCALL READ2_18B20 ;读两个字节的温度 RET ;*写ds18b20汇编程序* WRITE_18B20:MOV R2,#8 CLR C WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET ;*读18B20程序,读出两个字节的温度* READ2_18B20:MOV R4,#2 ;低位存在29 H,高位存在28H MOV R1,#29H RE00: MOV R2,#8 RE01: CLR C SETB C NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET ;*读出的温度进行数据转换*CHANGE: MOV A,29H MOV C,28H.0 ;将28H中的最低位移入C RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3 RRC A MOV 29H,A RETDISPLAY: mov a,29H;将29H中的十六进制数转换成10进制 mov b,#100 div ab mov 34H,A MOV A,B MOV B,#10 DIV AB MOV 35H,A MOV 36H,B mov DPTR,#TAB ;指定查表启始地址 mov A,36H ;取个位数 MOVC A,A+DPTR ;查个位数的7段代码 mov P0,A ;送出个位的7段代码 MOV P1,#05;开个位显示 NOP NOP LCALL DELAYNMS MOV P1,#0FFH NOP NOP mov A,35H ;取十位数 MOVC A,A+DPTR ;查十位数的7段代码 mov P0,A;送出十位的7段代码 MOV P1,#04;开十位显示 NOP NOP LCALL DELAYNMS MOV P1,#0FFH NOP NOP RET DELAYNMS: MOV R6,#8 D11: MOV R7,#200 DJNZ R7,$ DJNZ R6,D11 RET TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
展开阅读全文