简易微波炉控制器的设计与实现.docx
《简易微波炉控制器的设计与实现.docx》由会员分享,可在线阅读,更多相关《简易微波炉控制器的设计与实现.docx(44页珍藏版)》请在冰豆网上搜索。
简易微波炉控制器的设计与实现
数电综合实验报告
--简易微波炉控制器的设计与实现
班级:
姓名:
学号:
日期:
一:
设计课题的任务要求
设计制作一个简易微波炉控制器。
基本要求:
1、微波炉的火力有大、中、小三档可选。
用一个按键实现火力的选择,用点阵显示火力档位,点阵的显示随着按键的按下次数而变化,没有选择时默认的火力为大。
2、微波加热时间在0-59分59秒之间可选。
用4个按键分别设置加热时间各位的长度,用数码管显示加热时间。
3、设置一个开始键,按下此键后开始加热。
加热过程中,用数码管倒计时显示剩余时间。
4、加热过程中,不能修改火力和加热时间。
5、加热完成后蜂鸣器至少鸣响两声以提醒使用者加热已结束,加热结束后回到等待状态。
6、设置复位键,任何时候按下复位键可以取消加热,回到等待状态,只有在等待状态下才可以修改火力和加热时间。
提高要求:
1、用8个LED灯作为加热进度显示条,随着加热时间的增加匀速增加点亮LED灯的个数,无论加热时间是多长,最后都必须将8个LED灯全部点亮。
2、增加烧烤功能,用一个键选择微波或烧烤功能,用一个数码管指示当前处于微波还是烧烤功能。
3、烧烤火力和加热时间要求与微波功能相同。
4、自拟其它功能。
二:
系统设计(包括设计思路、总体框图、分块设计)
设计思路
由一个总的控制器完成各个状态的转换。
主要分两个大状态,一为没有开始前的可编辑状态。
二为开始后的不可编辑状态。
所以总的控制器中应有个edit输出控制各个模块是否可改变。
Start开始前,为设置时间状态和火力状态和烧烤选择状态。
Start开始后edit变量为0,各个模块不可在编辑。
控制器转入倒计时模块,同时led灯进入工作状态。
需要注意的是需要为所有模块设置reset输入,以重置各个模块状态值。
主要考虑问题:
1:
由于键盘输入不稳定,数字跳变太快,所以需要加键盘防抖模块。
2:
键盘防抖模块需要特殊的频率,所以分频器模块不止一个。
综上,主要涉及以下几个模块。
分频器,键盘防抖模块,控制器,数据选择,数据装载,数字译码,数码管显示模块,led进度显示模块,火力选择和显示模块,倒计时模块,蜂鸣器模块
总体框图
分块设计
1分频器
1hz用于倒计时,100hz是时间输入防抖所用频率,10khz是火力防抖所用(也可以用100hz的,不过就是输入稳定性略差)
2:
防抖模块
左边为时间输入防抖,右边为火力输入和开始键的防抖。
3:
控制器
状态控制器的功能根据输入信号和自身当时所处的状态完成状态的转换和输出相应的控制信号,其模块框图如图所示。
其中,输出信号
LD_DONE指示数据装载电路载入的烹调结束的状态信息的显示的驱动信息数据;
LD_CLK显示数据装载电路的设置的时间数据;
LD_EDIT用于输出给其他分模块以便设置是否可改变;
COOK指示烹饪的状态,并提示计时器进行减法计算;
DATA[15..0]:
将key转化为二进制编码;
KEY为定时时间输入信号,用于设置烹饪时间的长短,其高到低分别表示时间分、秒的十位、个位。
当LD_DONE有效时,输出烹调结束数据。
当LD_CLK有效时,输出烹调的设置时间数据。
4:
数据装载
当LD_DONE有效时,输出烹调结束的信息数据数据。
当L_CLK有效时,输出烹调的设置时间数据。
由于结构内部用到与或表达式
LOAD<=LD_TESTORLD_DONEORLD_CLK;
TEMP:
=LD_TEST&LD_DONE&LD_CLK;
必须3个变量才能使用,所以LD-Test是用于完成这个表达式的。
程序中默认接地。
4:
倒计时模块
电路计时模块可以由十进制减法计数器和六进制减法计数器级联组成,其中,两个十进制的减法计数器用于分、秒的个位减法计数,两个六进制的减法计数器用于分、秒的十位减法计数。
由六进制计数器和十进制计数器级联构成的计时模块原理图如图所示。
LOAD有效时完成装入功能,COOK(EN)有效时执行减计数;载已存的数据;DONE返回给控制器,MIN和SEC显示所剩时间和测试状态信息、烹调结束状态信息等。
5:
译码模块
用于将counter输出的sec和min信号转化成数码管显示信号。
输出分别对应每个数码管的管脚。
6:
数码管驱动模块
T1—t4接受来自四个decoder的译码信号。
分别代表秒,十秒,分,十分位的信号。
Clk是用于显示的分频信号。
数码管不能做到同时显示,只能以较快速度分别显示每个数码管的数字,由于人眼分辨不出快速的变化,看起来的效果是同时显示的。
T输出是管脚信号,每个clk上升沿t就输出下一个t的信息,轮流显示t1-t4的信号。
a是选择数码管的信号,低电平表示该数码管工作。
轮流显示111110,111101,111011,110111.011111.
T5是烧烤信号,作用与第一个数码管,为1时是普通功能,0时换做烧烤。
Edit来自控制器,表示t5信号是否可改变
7:
火力显示
Dianzhenjishu用于完成火力按钮按的次数计数。
3个一循环,分别对应大中小3档。
Dianzhenxuanzelie用于选择显示点阵中的哪列,原理通数码管一样,快速完成when0=>q<="00000001";
when1=>q<="00000010";
when2=>q<="00000100";
when3=>q<="00001000";
when4=>q<="00010000";
when5=>q<="00100000";
when6=>q<="01000000";
when7=>q<="10000000";的循环。
Dianzhenlieshuju是每列对应的数据,用于完成大中小三个字的显示。
低电平有效。
8:
led显示模块
Clk外接1hz分频,用于内部对秒的计数。
Key接受输入的时间信号,并在内部转化成秒数。
对clk的计数和key转化的总时间数比较,当计数对应1/8,2/8,3/8…7/8个key时点亮相应的led灯。
Ledbar用于输出led显示信号从00000000-11111111.clk没到达一定数字,相应的增加一位1显示。
计数完成时,led全部点亮。
Set用于清空clk计数。
Start用于将key的输入转化成秒数。
9:
蜂鸣器模块
Clk用于1hz输入。
对秒计数。
每两秒输出一个高电平。
总共输出2下。
Reset用于清空计数
Done用于接收倒计时的完成信号。
当done为高电平时开始计数。
Out1用于连接蜂鸣器。
高电平蜂鸣器响。
10总框图
三:
仿真波形及波形分析
1:
控制器仿真
图中,CLK是输入脉冲,RESET复位,SET_T设置时间,KEY按键输入,START开始计时,COOK正在烹饪,
Key输入59分00秒。
Start按之前,ld_clk为有效,可改变数码管显示,start按下后ld-clk为0,不能改变,同时ld-edit变为低电平,控制其他模块不可改变,同时cook信号变为1,表示开始倒计时。
Reset后DATA变回0.
2数据装载仿真
LD—clk有效时,DATAOUT=DATAIN,同时load信号有效,表示倒计时接受来自LOADER的信号
3倒计时模块:
图中,LOAD为高电平时读取信号DATA的值,当COOK信号为高电平时,对DATA的值进行减法计数,并在每个时钟周期都输出减法计数器的当前值。
仿真结果与预先设定的电路功能相吻合。
4:
decoder译码电路模块
每个数字对应相应的数码管脚显示信号如0的时候数码管脚为0111111,与预期一致。
5:
驱动数码管模块
可见a轮流显示每个数码管
T则相应的数码管上显示相应的数字。
符合预期。
6:
led显示模块
Key输入11秒
在start后11秒左右,ledbar全部为1,完成led功能。
且reset后ledbar清零。
7:
蜂鸣器模块
在接受done信号后每两秒输出一个高电平且持续两秒。
总共响2次。
完成功能。
8:
总体仿真
四:
源程序
1:
分频器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinqi1hzis
port(clk_in:
instd_logic;
clk_out:
outstd_logic);
end;
architectureaoffenpinqi1hzis
signalcnt:
integerrange0to24999999;--用于clk计数。
(10khz为2499,100hz为249999)
signalclk_tmp:
std_logic;
begin
process(clk_in)
begin
if(clk_in'eventandclk_in='1')then
ifcnt=24999999then
cnt<=0;
clk_tmp<=notclk_tmp;--输出相反电平
else
cnt<=cnt+1;
endif;
endif;
endprocess;
clk_out<=clk_tmp;
end;
2:
防抖模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfangdouis
port(CLK_100hz:
instd_logic;--定义端口
key:
instd_logic_vector(3downto0);--按键输入
keyout:
outstd_logic_vector(3downto0)--按键输出
);
endfangdou;
architectureartoffangdouis
signaltmp1:
std_logic_vector(3downto0);
signaltmp2:
std_logic_vector(3downto0);
begin
PROCESS(CLK_100hz,key)
BEGIN
IF(CLK_100hz'eventANDCLK_100hz='0')THEN—消抖部分
tmp2(0)<=tmp1(0);
tmp1(0)<=key(0);
tmp2
(1)<=tmp1
(1);
tmp1
(1)<=key
(1);
tmp2
(2)<=tmp1
(2);
tmp1
(2)<=key
(2);
tmp2(3)<=tmp1(3);
tmp1(3)<=key(3);
ENDIF;
keyout(0)<=CLK_100hzANDtmp1(0)AND(NOTtmp2(0));
keyout
(1)<=CLK_100hzANDtmp1
(1)AND(NOTtmp2
(1));
keyout
(2)<=CLK_100hzANDtmp1
(2)AND(NOTtmp2
(2));
keyout(3)<=CLK_100hzANDtmp1(3)AND(NOTtmp2(3));
ENDPROCESS;
endart;
3:
控制器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYcontrollerIS
PORT(
RESET:
INSTD_LOGIC;--¸复位
KEY:
INSTD_LOGIC_VECTOR(3DOWNTO0);--键盘时间输入
START:
INSTD_LOGIC;--开始键
CLK:
INSTD_LOGIC;--1hz输入
DONE:
INSTD_LOGIC;--完成信号
COOK:
OUTSTD_LOGIC;
LD_CLK:
OUTSTD_LOGIC;--将key载入作为时间信号
DATA:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);--key转换后的输出
LD_DONE:
OUTSTD_LOGIC;--完成输出
LD_EDIT:
OUTSTD_LOGIC
);
ENDcontroller;
ARCHITECTURErtlOFcontrollerIS
TYPESTATESIS(IDLE,SET_CLOCK,TIMER,DONE_MSG);
SIGNALNXT,CUR:
STATES;--两个状态,当前和下一个
SIGNALDATATMP:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALEDIT:
STD_LOGIC;
--signalstartn:
std_logic:
='0';
BEGIN
PROCESS(CLK,RESET)--时钟和复位进程
BEGIN
IFRESET='1'THEN----复位时将IDLE(显示0000)赋予当前状态
CUR<=IDLE;
ELSIFCLK'EVENTANDCLK='1'THEN
CUR<=NXT;--如果不是,遇到上边沿则自动跳转下一状态
ENDIF;
ENDPROCESS;
PROCESS(RESET,KEY)--复位和输入的进程
BEGIN--可以让输入4位数字显示时间
IFRESET='1'THEN--复位时不论任何状态数码管都将显示0000
DATATMP<=(others=>'0');
ELSE
IFKEY(3)'EVENTANDKEY(3)='1'THEN--设置分的十位
IFDATATMP(15DOWNTO12)="0101"THEN--5自动跳转到0
DATATMP(15DOWNTO12)<="0000";
ELSE
DATATMP(15DOWNTO12)<=DATATMP(15DOWNTO12)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY
(2)'EVENTANDKEY
(2)='1'THEN--设置分的个位
IFDATATMP(11DOWNTO8)="1001"THEN--9自动跳转到0
DATATMP(11DOWNTO8)<="0000";
ELSE
DATATMP(11DOWNTO8)<=DATATMP(11DOWNTO8)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY
(1)'EVENTANDKEY
(1)='1'THEN--设置秒的十位
IFDATATMP(7DOWNTO4)="0101"THEN--5自动跳转到0
DATATMP(7DOWNTO4)<="0000";
ELSE
DATATMP(7DOWNTO4)<=DATATMP(7DOWNTO4)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY(0)'EVENTANDKEY(0)='1'THEN--设置秒的个位
IFDATATMP(3DOWNTO0)="1001"THEN--9自动跳转到0
DATATMP(3DOWNTO0)<="0000";
ELSE
DATATMP(3DOWNTO0)<=DATATMP(3DOWNTO0)+1;
ENDIF;
ENDIF;--否则自动加1
ENDIF;
DATA<=DATATMP;
ENDPROCESS;
PROCESS(START,RESET)--ÉèÖÃʱ¼äºÍ¸´Î»½ø³Ì
BEGIN
IFRESET='1'THEN--将edit置1
EDIT<='1';
ELSIFSTART'EVENTANDSTART='1'THEN--如何start按下将edit置0
EDIT<='0';
ENDIF;
ENDPROCESS;
PROCESS(CLK,CUR,EDIT,DONE)IS
BEGIN
NXT<=IDLE;--将IDLE载入NXT
--LD_POWER<='0';--¸´Î»
LD_DONE<='0';
LD_CLK<='0';
COOK<='0';
CASECURIS
WHENSET_CLOCK=>--烹调时间测试状态
LD_CLK<='1';
COOK<='0';
WHENDONE_MSG=>--完成信息显示状态
LD_DONE<='0';
COOK<='0';
WHENIDLE=>--初始状态定义
IFEDIT='1'THEN--设置计时模式
NXT<=SET_CLOCK;
LD_CLK<='1';
ELSIFDONE='0'THEN
NXT<=TIMER;
COOK<='1';
ENDIF;
WHENTIMER=>
IFDONE='1'THEN--设置计时完成
NXT<=DONE_MSG;
LD_DONE<='0';
cook<='0';
ELSE
NXT<=TIMER;
COOK<='1';
ENDIF;
--WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(EDIT)IS
BEGIN
LD_EDIT<=EDIT;
ENDPROCESS;
ENDrtl;
4:
数据装载模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYloaderIS
PORT(
DATAIN:
INSTD_LOGIC_VECTOR(15DOWNTO0);--输入16位数据
LD_TEST:
INSTD_LOGIC;
LD_CLK:
INSTD_LOGIC;
LD_DONE:
INSTD_LOGIC;
DATAOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);--输出16位数据
LOAD:
OUTSTD_LOGIC--选择状态
);
ENDloader;
ARCHITECTURErtlOFloaderIS
BEGIN
PROCESS(DATAIN,LD_TEST,LD_CLK,LD_DONE)
CONSTANTALLS:
STD_LOGIC_VECTOR(15DOWNTO0)--测试信息
:
="1000100010001000";--显示8888
CONSTANTDONE:
STD_LOGIC_VECTOR(15DOWNTO0)--烹调完成信息
:
="1010101111001101";
VARIABLETEMP:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
LOAD<=LD_TESTORLD_DONEORLD_CLK;--三选一状态
TEMP:
=LD_TEST&LD_DONE&LD_CLK;--中间变量定义
CASETEMPIS
WHEN"010"=>--烹调完成
DATAOUT<=DONE;
WHEN"001"=>
DATAOUT<=DATAIN;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDrtl;
5:
倒计时模块
1:
十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;--CLR:
清除数据
EN:
INSTD_LOGIC;--信号使能
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);--输入的4位数据
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出的4位数据
CARRY_OUT:
OUTSTD_LOGIC--数据装载
);
ENDcnt10;
ARCHITECTURErtlOFcnt10IS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);--链接输入输出
BEGIN--数据的信号
PROCESS(CLK,LOAD,CLR,EN)
BEGIN
IFCLR='1'THEN--当CLR高电平,数据变为0000
TMP<="0000";
ELSIFLOAD='1'THEN--否则装载输入的数据
TMP<=DATAIN;
ELSIFCLK'EVENTANDCLK='0'THEN--上升沿时,执行10进制减法
IFEN='1'THEN
IFTMP="0000"THEN--0跳转到9
TMP<="1001";
ELSE--自动减1
TMP<=TMP-'1';
ENDIF;
ENDIF;
ENDIF;
IFTMP="0000"THEN
CARRY_OUT<='1';--COOK<=CARRY_OUT
ELSE
CARRY_OUT<='0';
ENDIF;
ENDPROCESS;
Q<=TMP;
ENDrtl;
2:
--六进制减法计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt6IS
PORT(
CLK:
INSTD_LOGIC;
LOAD,CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
DATAIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC
);
ENDcnt6;
ARCHITECTURErtlOFcnt6IS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PR