资源描述
课 程 设 计 说 明 书
目 录
摘要.....................................................1
目录..................................................................2
第一章 前言...........................................................3
1.1概述..............................................................3
1.2具体要求..........................................................3
第二章 总体方案设计....................................................5
2.1系统总体框图......................................................5
2.2定时模块..........................................................5
2.3按键输入模块......................................................6
2.3.1方案选择......................................................6
2.3.2按键输入设计..................................................6
2.4显示模块..........................................................7
2.4.1档位显示......................................................7
2.4.2计时显示......................................................8
2.5音响发声模块......................................................8
2.6电源模块..........................................................9
2.7功率输入模块......................................................9
第三章 系统软件设计和仿真.............................................11
3.1keil和protues软件................................................11
3.2系统软件编辑流程图................................................12
3.3系统程序调试......................................................12
3.3.1显示模块调试..................................................12
3.3.2定时模块调试..................................................15
3.3.3按键扫描模块..................................................17
第四章 总结...........................................................22
附录..................................................................23
第一章 前言
1.1概述
近年来,微波炉已经走进了千家万户的厨房,成为现代家庭的必备产品。随着控制技术和智能技术的发展,微波炉也向着智能化、信息化发展。我们希望微波炉能够按既有程序进行烹调,又不需要使用者根据食物的类型、数量、温度等因素去设定微波炉的工作时间,因为人为设定的工作时间过长,含水分较多的食物可能会产生过热碳化的现象,若时间过短则达不到预期的烹调效果。这不仅在节能方面未做过多考虑,使用者还需要经常翻看使用说明书才能完成操作过程。针对这些问题,我觉得有必要研制一种操作简单且烹调效果好的微波炉,根据一些家常菜按固定程序烹调的现象,可采取分时、分档火力加热,节时又节能。
本可编程微波炉控制器系统,以AT89C51单片机为核心, 由计时系统、手动键盘、温度测量、状态显示等功能模块组成。基于题目基本要求,本系统可实现微波炉的启动、停止、功率设定、加热时间设定、加热时间显示等功能。此外,还扩展了液晶显示工作状态、时间显示、微波炉火力档位设定、火力指示等功能。
其中常规基础部分可以选择火力并设定加热时间,系统通过发光二极管显示选择的火力档。系统启动后开始倒计时,此外还能通过LED显示。计时结束即工作完毕时,系统发出警报。
1.2具体要求
(1) 制定一个在不同功能时火力的控制时序表。具有三档微波加热功能,分别表示微波炉工作状态为烹调、烘烤、解冻,试验使用LED模拟。
(2) 实现工作步骤:复位待机——〉检测显示电路——〉设置输出功能和定时器初值——〉启动定时和工作开始——〉结束烹调、音响提示。
(3) 在上电或手动按复位键时,控制器输出的微波功率控制信号为0,微波加热处于待机状态,时间显示电路显示为00.00。
(4) 具有4位时间预置电路,按键启动时间设置,最大预设数为99分99秒。
(5) 设定初值后,按开启键,一方面按选择的挡位启动相应的微波加热;另一方面使计时电路以秒为单位作倒计时。当计时到时间为0则断开微波加热器,并给出声音提示,即扬声器输出2~3s的双音频提示音。
(6) 若在待机状态时按测试键,则4位数码管交替显示全亮和全灭两种状态,以检测数码管各发光段的好坏。
第二章 总体方案设计
2.1 系统的总体框图
系统以AT89C51单片机为核心,连接各外部电路完成人机交互等各功能的控制。系统的总体框图如下图2.1所示。
图2.1系统总体框图
A
T
8
9
C
5
1
内部定时器
按键输入电路
电源电路
档位显示电路
LED显示电路
音响发声电路
功率输出电路
2.2定时模块
方案一:采用传统的机械式定时,定时时间通过机械旋钮来控制。该方法操作简单,对设定时间只要旋转到相应的位置即可。但由于机械式定时容易磨损,定时精度低,也不能实现一些复杂的功能。特别是一些人性化的界面设计无法实现。
方案二:采用小规模集成元件定时,比如用计数器/分频器,该方法价格便宜,但是接线复杂,设计也比较困难,对时序要求比较高。该方案功能单一,也无法实现复杂功能,扩展麻烦。也不能实现一些人性化的界面设计。
方案三:采用单片机的定时器定时 。由于当前市场上的单片机都内含定时器计数器,所以用单片机定时比较方便。另外,单片机能够实现复杂功能,能够设计出友好的人机界面接口,价格也比较便宜,单片机定时比较准确,性价比很高。
综上所述,定时部分我们采用单片机的定时器来实现。
2.3按键输入模块
2.3.1方案选择
由于该微波炉控制系统用到的按键比较多,所以对按键的设计非常重要。单片机按键显示系统设计一般有如下几种方案 :
方案一:采用并行口扩展芯片扩展并行口的方法来设计键显系统。用来做键显系统的传统的芯片有8155、8255、8279等。这种方式的优点是速度快,显示数据简单,缺点是,占用单片机口线多。由于本系统的“火力”加热由多个发光二极管来模拟,所以,占用口线较多。显然,在本系统中不宜采用。
方案二:采用直接接I/O口方法。利用对I/O口的编辑可以实现相应的功能,用这种方法用的I/0口占用的比较多,但是用程序编程比较简单。
由于本系统用到程序复杂,故使用方案二,直接使用I/O口来实现。
2.3.2 按键输入设计
输入模块采用9个按键作为输入设备,实现数据输入控制。按键是一种常见的输入装置,在日常生活中,按键在计算机、电话、手机、微波炉等格式电子产品上已经被广泛应用,按键通常采用行列扫描法来确定所按下键的行列位置。由于按键是一种机械开关,所以设计其控制电路时,需要涉及到按键扫描、键盘译码,光靠按键是无法完成按键输入工作的。其中按键扫描又涉及到时序产生、按键扫描和消除抖动。这些按钮分别与P1口相连,分别是:30s、1MIN、5MIN、清零、档+、档-、启动、停止和检测数码管。连接电路图如下图2-1所示:
图2-1 按键电路
2.4显示模块
2.4.1档位显示
档位显示电路有一个共阴极LED显示,有1,2,3档,分别代表“烹调”、“烘烤”、“解冻”三个档位,直接将LED接至单片机P3口通过单片机发送低电平使LED发光,电路图如图2-2所示:
图2-2 档位显示电路
2.4.2计时显示
显示部分采用八段数码管实现。本次设计总共设计了1~3档共计3个火力档,考虑到用LED指示工作火力档,将会占据大量控制芯片的I/O口,所以采用LED数码管显示当前工作的火力档位的倒计时。具体设计时,采用4位LED数码管显示加热倒时,烹饪计时为减法计数,最大计时时间为99:99。采用四位八段数码管一个,格式为(分_十位、分_个位、秒_十位、秒_个位)。时间显示用到两个锁存器,共用一个输出口P0,分时复用,一个锁存器用来锁存“位”,一个锁存器用来锁存“段码”,数码管就可以稳定显示。档位显示单独用P3口输出数据。数码管均采用共阴数码管。显示模块设计图如图2-3所示:
图2-3 计时显示电路
2.5音响发声模块
本系统要求扬声器能够给出声音提示,输出2—3秒的双音频提示音。我们采用蜂鸣器来实现实现双音频输出。将蜂鸣器的借口与P2.3连接,原理图如下图2-4所示:
图2-4 蜂鸣器报警电路
2.6电源模块
本系统要给单片机提供一个5V的直流电源,所以设计一个220V转换为5V的电源电路,电路如下图2-5所示:
图2-5 由220V输出5V的电源电路
2.7 功率输出模块
磁控管是微波电子管的一种,通常作为微波能发生器。它的阴极电压可达到3KV以上,工作频率2KMHz,阳极电流为300mA-1200 mA,它的工作状态,不能直接控制,而高压是通过变压器得到,所以由此可以得出,要控制磁控管的工作状态,可以间接控制变压器初级绕组的供电状态。
为使单片机可以控制磁控管,通过单片机的一个引脚输出信号,去控制继电器的导通与关断,但是需要一个驱动电路,所以用到了三极管PNP,为防止继电器由导通到关断时产生的过电流对电路造成危害,所以和继电器并联一个反向二极管。
由于磁控管需要的电压很高,这里不予画出,只是通过继电器控制电路的开通与关断。实际仿真中,用灯泡代替,可以看到电路通断的切换状态,如果应用到实际中,灯泡就可以用变压器替换。电路原理图如下图2-6所示:
图2-6 功率输出电路
第三章 系统软件设计和仿真
3.1 keil和proteus软件
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
3.2 系统软件编辑流程图
图3-1 程序流程
3.3系统程序调试
3.3.1显示模块调试
烹饪计时为减法计数,最大计时时间为99:99。显示部分采用四位八段数码管一个和一位八段数码管一个。四位七段数码管用来显示工作时间,格式为(分_十位、分_个位、秒_十位、秒_个位)。一位七段数码管用来显示火力档位,档位分为(1-3)档,时间显示用到两个锁存器,共用一个输出口P0,分时复用,一个锁存器用来锁存“位”,一个锁存器用来锁存“段码”,数码管就可以稳定显示。档位显示单独用P3口输出数据。数码管均采用共阴数码管,设计一个数组dis[]来表示分的十位,分的个位,秒的十位,秒的个位,在通过循环程序显示,其程序如下:
/*------------------------
时间变换为每个显示位
--------------------------*/
void time_converter()
{
dis[0]=count_s/600; //取分的十位
dis[1]=(count_s/60)%10; //取分的个位
dis[2]=(count_s%60)/10; //取秒的十位
dis[3]=(count_s%60)%10; //取秒的个位
}
/*------------------------
显示函数
--------------------------*/
void display()
{
uchar t;
uchar k;
for(k=0;k<4;k++) //LED显示
{
wei=1;
P0=codecho[k];
wei=0;
P0=0xff;
delay_ms(1);
duan=1;
P0=codevalue[dis[k]];
duan=0;
P0=0xff;
delay_ms(1);
}
P3=codevalue[pv]; //显示档位 */
while(!P24) //按键测试
{
for(t=0;t<4;t++)
{
wei=1;
P0=codecho[t];
wei=0;
P0=0xff;
delay_ms(1);
duan=1;
P0=codevalue[10];
duan=0;
P0=0xff;
delay_ms(1);
P3=codevalue[10];
}
}
}
仿真图如下图3-2所示:
图3-2 显示模块仿真
3.3.2 定时模块
采用单片机内部定时器,用两个定时器T0,T1,T0用来倒计时微波炉的时间,用方式一定时50ms,用一个循环20次,就是定时1s,设定此致为TH0=0x3c,TL0=0xaf。T1用来定时火力的大小,用方式一,用来定时加热和冷却,初值TH0=0x3c,TL0=0xaf。程序如下所示:
/*------------------------
定时器初始化
--------------------------*/
void t_clr()
{
EA=1; //CPU开中断
ET0=1;
ET1=1; //定时器 中断允许
TMOD=0X11; //定时器T1、T0 定时 方式一
TH0=0X3c;
TL0=0Xaf;
//6M 晶振,65536-155367=50000,50000*20=1000000us=1s
TH1=0X3c;
TL1=0X0af;
}
/*------------------------
定时器T1中断
--------------------------*/
void t1() interrupt 3
{
TR1=0;
TH1=0X3c;
TL1=0X0af;
TR1=1;
if (pv_j!=0) //需要加热
{cyc1--;
if (cyc1==0)
{cyc1=20;
pv_j--;
if (pv_j==0) //加热时间到
{
P22=1; //否则,停止加热,进入冷却阶段
}
}
}
else if (pv_l!=0) //是否需要冷却
{cyc1--;
if (cyc1==0)
{cyc1=20;
pv_l--;
if (pv_l==0) //冷却时间到
{
P22=0; //进行加热
pv_j=pv*6+6;} //再次设定加热时间
}
}
}
3.3.3按键扫描模块
通常的按键所用开关为机械弹性开关。由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅作一次处理,必须去除抖动。
消除抖动的方法有硬件和软件两种方法。硬件方法常用RS触发器电路。软件方法是当检测出键闭合后执行一个10ms~20ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。这里用程序延时的方法消除抖动,并对按键进行编辑,程序如下:
/*------------------------
键盘扫描函数
--------------------------*/
void key_scan()
{
if(!P10)
{
delay_ms(70);
if(!P10)
count_s+=30; //时间 +30秒
if (count_s>6000)
count_s=0;
}
if(!P11)
{
delay_ms(70);
if(!P11)
count_s+=60; //时间 +1 分
if (count_s>6000)
count_s=0;
}
if(!P12)
{
delay_ms(70);
if(!P12)
count_s+=300; //时间+5分
if (count_s>6000)
count_s=0;
}
if(!P13)
{
delay_ms(70);
if(!P13)
count_s=0; //时间清零
}
if(!P14)
{
delay_ms(70);
if(!P14)
{if (pv<3)
pv++; //档位+1
pv_j=pv*6+6; //加热时间
pv_l=30-pv_j; //冷却时间
}
}
if(!P15)
{
delay_ms(70);
if(!P15)
{if (pv>0)
pv--; //档位-1
pv_j=pv*6+6;
pv_l=30-pv_j;
}
}
if(!P16)
{
delay_ms(70);
if(!P16)
{
P22=1;
if(count_s==0) //如果没有设定时间,不加热,定时器不工作
{TR0=0;
TR1=0;}
else //如果已经设定时间,则开始计时,开始加热
{
pv_j=6*pv+6;
pv_l=30-pv_j;
t_clr();
TR0=1;
TR1=1;
P22=0;}
}
}
if(!P17) //停止加热,终止定时器
{
delay_ms(70);
if(!P17)
{P22=1;
P23=0;
TR0=0;
TR1=0;
}
}
}
仿真图形如下图3-3所示:
图3-3 按键仿真电路
第四章 总结
在调试过程中,主要的问题不是电路的问题,而是程序的问题。问题主要在微波炉驱动和显示模块和按键模块方面。
驱动问题:在驱动的时候,软件中,只需要给相应端口一个电平,驱动继电器的时候,需要考虑电压和电流,驱动电压为5V,电流为100mA左右。
显示问题:显示的时候,先要确定位,通过锁存器确定。然后确定输出的具体数值,由另一个锁存器锁存。开始的时候,由于程序的问题,显示会不完整,并且出现显示错位的问题。后来,通过在显示程序里加入一定的延时,让七段数码管有一定时间来调整,避免了锁存混乱的情况,最终显示趋于稳定和正确。
按键问题:按键是人机交互的关键,主要涉及识别和去抖动。如果没有加入延时去抖动,会出现按一下动作多次的问题。
这次课程设计让我感受颇深,首先在刚拿到这个设计要求时,很是束手无策,但是通过老师悉心指导后,一次一次的翻阅参考资料,一次一次的捉摸,终于在和搭档的努力下,完成了这次课程设计。在设计的过程中,同学提出好的建议是我意识到学习贵在交流,只有在交流中才能提升自己,才能丰富自己的只是,只有在交流的过程中,才能产生多心的火花新的思想。要完成设计,必须做到一丝不苟,对各个部位的电路图都要检查,无比达到完美,因为电子方面只要出现一点小错误都会导致整体的瘫痪,因此不能粗心大意。在设计的过程中,我知道了做任何事情都要以严谨的态度对待,找个课程设计我有了能够综合运用所学知识的机会,让我的动手能力,逻辑思维能力得到了相应的锻炼。也让我学习有了新的理解。
作为当代大学生,我明白了,我们应该多多加强动手能力的训练,正所谓:实践出真知。理论和实践是不可分的整体!
附录
参考文献
[1]张毅刚、彭喜元、董继成.单片机原理及应用[M].北京:高等教育出版社,2003年12月
[2]袁庆辉 曹卫芳.基于单片机的可编程微波炉控制器系统设计[J].工业控制计机,2008(4)
[3]王小利.可编程微波炉控制器系统设计[J]. 实验室研究与探索,2009(1)
[4]李亚.微波炉控制器的设计与分析[J]. 中国科技博览,2010(30)
[5] 公茂法、马宝甫编著 单片机人机接口实例集 北京航空航天出版社1998
[6] 李广弟等 单片机原理机应用 北京航空航天大学出版社,2003
[7] 李华 MCS-51系列单片机使用接口技术。北京航空航天大学出版社,1990
[8] 何立民 单片机应用系统设计。北京航空航天大学出版社,1993
原理图:
仿真图:
程序:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint dis[]={0x00,0x00,0x00,0x00};
uint pv=1,pv_j=6,pv_l=24; //定义 档位、加热时间、冷却时间(每个周期)
uint count_s=0; //记录定时时间
uint cyc0=20,cyc1=20; // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //七段数码管显示码,显示0~9和全亮
uchar codecho[]={0xfe,0xfd,0xfb,0xf7}; //位选码
sbit P10=P1^0; //引脚定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit duan=P2^0;
sbit wei=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
/*--------------------
延时函数,大致延时一毫秒
-------------------*/
void delay_ms(uint t)
{uchar i;
while(t--)
{
i=250;
while(--i);
}
}
/*------------------------
定时器初始化
--------------------------*/
void t_clr()
{
EA=1; //CPU开中断
ET0=1;
ET1=1; //定时器 中断允许
TMOD=0X11; //定时器T1、T0 定时 方式一
TH0=0X3c;
TL0=0Xaf;
//6M 晶振,65536-155367=50000,50000*20us=1000000us=1s
TH1=0X3c;
TL1=0X0af;
}
/*------------------------
键盘扫描函数
--------------------------*/
void key_scan()
{
if(!P10)
{
delay_ms(70);
if(!P10)
count_s+=30; //时间 +30秒
if (count_s>6000)
count_s=0;
}
if(!P11)
{
delay_ms(70);
if(!P11)
count_s+=60; //时间 +1 分
if (count_s>6000)
count_s=0;
}
if(!P12)
{
delay_ms(70);
if(!P12)
count_s+=300; //时间+5分
if (count_s>6000)
count_s=0;
}
if(!P13)
{
delay_ms(70);
if(!P13)
count_s=0; //时间清零
}
if(!P14)
{
delay_ms(70);
if(!P14)
{if (pv<3)
pv++; //档位+1
pv_j=pv*6+6; //加热时间
pv_l=30-pv_j; //冷却时间
}
}
if(!P15)
{
delay_ms(70);
if(!P15)
{if (pv>0)
pv--; //档位-1
pv_j=pv*6+6;
pv_l=30-pv_j;
}
}
if(!P16)
{
delay_ms(70);
if(!P16)
{
P22=1;
if(count_s==0) //如果没有设定时间,不加热,定时器不工作
{TR0=0;
TR1=0;}
else //如果已经设定时间,则开始计时,开始加热
{
pv_j=6*pv+6;
pv_l=30-pv_j;
t_clr();
TR0=1;
TR1=1;
P22=0;}
}
}
if(!P17) //停止加热,终止定时器
{
delay_ms(70);
if(!P17)
{P22=1;
P23=0;
TR0=0;
TR1=0;
}
}
}
/*------------------------
时间变换为每个显示位
--------------------------*/
void time_converter()
{
dis[0]=count_s/600; //取分的十位
dis[1]=(count_s/60)%10; //取分的个位
dis[2]=(count_s%60)/10; //取秒的十位
dis[3]=(count_s%60)%10; //取秒的个位
}
/*------------------------
显示函数
--------------------------*/
void display()
{
uchar t;
uchar k;
for(k=0;k<4;k++) //LED显示
{
wei=1;
P0=codecho[k];
wei=0;
P0=0xff;
delay_ms(1);
duan=1;
P0=codevalue[dis[k]];
duan=0;
P0=0xff;
delay_ms(1);
}
P3=codevalue[pv]; //显示档位 */
while(!P24) //按键测试
{
for(t=0;t<4;t++)
{
wei=1;
P0=codecho[t];
wei=0;
P0=0xff;
delay_ms(1);
duan=1;
P0=codevalue[10];
duan=0;
P0=0xff;
delay_ms(1);
P3=codevalue[10];
}
}
}
/*------------------------
主函数
--------------------------*/
void main()
{
uchar n=200;
P23=0;
t_clr(); //初始化
while(1)
{
key_scan(); //键盘扫描
time_converter();//数值转换
display(); //显示
}
}
/*------------------------
定时器T0中断
--------------------------*/
void t0() interrupt 1
{
TR0=0;
TH0=0X3c;
TL0=0Xaf;
cyc0--;
if (cyc0==0)
{cyc0=20;
count_s-
展开阅读全文