简易微波炉控制器的设计与实现.docx
《简易微波炉控制器的设计与实现.docx》由会员分享,可在线阅读,更多相关《简易微波炉控制器的设计与实现.docx(48页珍藏版)》请在冰豆网上搜索。
简易微波炉控制器的设计与实现
数电综合实验报告
简易微波炉控制器的设计与实现
班级:
姓名:
学号:
日期:
:
设计课题的任务要求3
基本要求:
3
提高要求:
3
二:
系统设计(包括设计思路、总体框图、分块设计)3
设计思路3
总体框图3
分块设计4
1分频器4
2:
防抖模块4
3:
控制器4
4:
数据装载5
4:
倒计时模块6
5:
译码模块7
6:
数码管驱动模块7
7:
火力显示8
8:
led显示模块9
9:
蜂鸣器模块9
三:
仿真波形及波形分析9
1:
控制器仿真9
2数据装载仿真10
3倒计时模块:
10
4:
decoder译码电路模块11
5:
驱动数码管模块11
6:
led显示模块11
7:
蜂鸣器模块12
&总体仿真12
四:
源程序12
1:
分频器12
2:
防抖模块13
3:
控制器14
4:
数据装载模块16
5:
倒计时模块17
9:
火力模块23
11:
蜂鸣器模块27
五:
功能说明28
六:
元件清单和利用情况28
七:
故障和问题分析28
八:
总结和结论29
一:
设计课题的任务要求
设计制作一个简易微波炉控制器。
基本要求:
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分频器
10khz是火力防抖所用(也
1hz用于倒计时,100hz是时间输入防抖所用频率,可以用100hz的,不过就是输入稳定性略差)
2:
防抖模块
左边为时间输入防抖,右边为火力输入和开始键的防抖。
3:
控制器
.fcontroiier
RESET
COOK
■KEY[30]
LD_CLK
START
DATA{15..0]
CLK
LD^DONE
DOME
LD_EDIT
i
:
i
状态控制器的功能根据输入信号和自身当时所处的状态完成状态的转换和输出相应的控制信号,其模块框图如图所示。
其中,输出信号
LD_DON指示数据装载电路载入的烹调结束的状态信息的显示的驱动信息数据;
LD_CLK显示数据装载电路的设置的时间数据;
LD_EDIT用于输出给其他分模块以便设置是否可改变;
COOI指示烹饪的状态,并提示计时器进行减法计算;
DATA[15..O]:
将key转化为二进制编码;
KEY为定时时间输入信号,用于设置烹饪时间的长短,其高到低分别表示时间分、秒的十位、个位。
当LD_DON有效时,输出烹调结束数据。
当LD_CLK有效时,输出烹调的设置时间数据。
4:
数据装载
loader
-DATAIN[15Q]
DATAOUT[160]
LDTEST
LOAD
LD_CLK
LD^DONE
instIO
当LD_DON有效时,输出烹调结束的信息数据数据。
当L_CLK有效时,输
出烹调的设置时间数据。
由于结构内部用到与或表达式
LOADv=LD_TESTRLD_DONBORLD_CLK;
TEMP:
=LD_TEST&LD_DONE&LD_CLK;
必须3个变量才能使用,所以LD-Test是用于完成这个表达式的。
程序中默认接地。
4:
倒计时模块
iinstl
电路计时模块可以由十进制减法计数器和六进制减法计数器级联组成,其中,两个十进制的减法计数器用于分、秒的个位减法计数,两个六进制的减法计数器用于分、秒的十位减法计数。
由六进制计数器和十进制计数器级联构成的计时模块原理图如图所示。
LOAD有效时完成装入功能,COO(EN有效时执行减计数;载已存的数据;DON返回给控制器,MIN和SEC显示所剩时间和测试状态信息、烹调结束状态信息等。
5:
译码模块
decoder
J・
'AIN4[30]
DOin7[60]
1■»
*■
inst2
a■~"S■-y・厂
¥・
r■-■J—叫■
用于将counter输出的sec和min信号转化成数码管显示信号。
输出分别对应每个数码管的管脚。
6:
数码管驱动模块
[qudong
0]
-!
恬
itnst22
edit
\xuanze[5..O]
T1—14接受来自四个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=>qv="00000001";
when仁>qv="00000010";
when2=>q<="00000100";
when3=>q<="00001000";
when4=>q<="00010000";
when5=>q<="00100000";
when6=>q<="01000000";
when7=>q<="10000000";的循环。
Dianzhenlieshuju是每列对应的数据,用于完成大中小三个字的显示。
低电平有效。
8led显示模块
:
ledbar
iinst17
Clk外接1hz分频,用于内部对秒的计数。
Key接受输入的时间信号,并在内部转化成秒数。
对clk的计数和key转化的总时间数比较,当计数对应1/8,2/8,3/8
…7/8个
key时点亮相应的led灯。
Ledbar用于输出led显示信号从OOOOOOOO-11111111.clk没到达一定数
字,相应的增加一位1显示。
计数完成时,led全部点亮。
Set用于清空clk计数。
Start用于将key的输入转化成秒数。
9:
蜂鸣器模块
他ngfrSrid、八;...
-?
■■■■
.E;「..
1res@iout!
—rdk「
■
—t—done’…
-?
1
.:
inst21:
.
Clk用于ihz输入。
对秒计数。
每两秒输出一个高电平。
总共输出2下。
Reset用于清空计数
Done用于接收倒计时的完成信号。
当done为高电平时开始计数。
Out1用于连接蜂鸣器。
高电平蜂鸣器响。
10
10总框图
:
仿真波形及波形分析
1:
控制器仿真
17525ri
小|Painhsi:
se29us
Stilt
Ei
7鸽4ns
"3.
J0.-ttferS
I
Ji.LfHTS
CUT
CD0E
药
囲HMA
*19]
B]
-ur[z]
-闵匕1
妙护
LDjCLE
26
LDJJIIl
&21
LD_iJ17
RE充T
3曲
srm
.Jj]jJ..0LDJ0CJ10
TTJ^LrLnn.
图中,CLK是输入脉冲,RESE■复位,SET_T设置时间,KEY按键输入,START开始计时,COOKE在烹饪,Key输入59分00秒。
Start按之前,ld_clk为有效,可改变数码管显示,start按下后ld-clk为0,不能改变,同时ld-edit变为低电平,控制其他模块不可改变,同时cook信号变为1,表示开始倒计时。
Reset后DATA变回0.2数据装载仿真
MasterTimeBar:
15.65ns
彳[HPointer:
147ns
Interval:
Name
bps
SC.0ns1600ns
1l!
0
is.e
■
i5皿J
[+JBATAIN
訝FT
[+]DATAOUT
(
1^34
LD_CLK
■|
*35
LD_E0NE
1^36
LD_TEST
4>3T
WAD
1
1||t|411Fl
LD—clk有效时,信号
DATAOUT=DATAIN同时load信号有效,表示倒计时接受来自LOADER的
3倒计时模块:
DATA勺值进行减法计数,并在每个时钟周期都输出减法计数器的当前值。
仿真结果与预先设定的电路功能相吻合4:
decoder译码电路模块
67us3.31ue3.95心4.59ue5.23us5-8*[ue6.51ue
w
□
AIH4
[ii])
([51
X[⑶)
(CIO]X
Tei~rTuTTCTil~x~D9]~~r
少1
-肛N4[3]
J1
r
1L
-AIN4[2]
1
r
M辜
-AIS4[1]
1^4
LaIN4[0]
!
!
:
1
i
諺5
曰
Down
biHoilnoiidiXXIouhoXTiuioT1oooooooXoooorio'|liofiifr:
-U0UT7L6]
1
1
Ii
ii
-WUT7[5]
i
~L
T
-D0UT7[4]
1
''"1
1
❻g
-D0UT7[3]
1
1"I1
Ir
O10
-D0UT7[2]
1
i
1
i
011
-B0UT7LI]
L
012
Luoirn[u]
'!
:
1
I
r
每个数字对应相应的数码管脚显示信号如0的时候数码管脚为0111111,与预期一致。
5:
驱动数码管模块
可见a轮流显示每个数码管T则相应的数码管上显示相应的数字。
符合预期6:
led显示模块7:
蜂鸣器模块
&总体仿真
四:
源程序
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')THE—消抖部分
tmp2(0)v=tmp1(0);
tmp1(0)v=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;
DONE:
INSTD_LOGIC;
COOK:
OUTSTD_LOGIC;
--1hz输入
__完成信号
LD_CLK:
OUTSTD_LOGIC将^key载入作为时间信号
DATA:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);--转换后的输出
LD_DONE:
OUTSTD_LOGIC;--完成输出
LD_EDIT:
OUTSTD_LOGIC
);
ENDcontroller;
ARCHITECTURErtlOFcontrollerIS
TYPESTATESIS(IDLE,SET_CLOCK,TIMER,DONE_MSG);
SIGNALNXT,CUR:
STATES;
__两个状态,当前和下一个
PROCESS(CLK,RESET)
BEGIN
一-时钟和复位进程
IFRESET='1'THEN
复位时将idle(显示0000)赋予当前状态
SIGNALDATATMP:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALEDIT:
STD_LOGIC;
--signalstartn:
std_logic:
='0‘;
BEGIN
CUR<=IDLE;
ELSIFCLK'EVENTANDCLK='1'THEN
CUR<=NXT;
ENDIF;
ENDPROCESS;
PROCESS(RESET,KEY)
BEGIN
IFRESET='1'THEN
__如果不是,遇到上边沿则自动跳转下一状态
复位和输入的进程
--可以让输入4位数字显示时间
―复位时不论任何状态数码管都将显示0000
DATATMP<=(others=>'0');
ELSE
IFKEY(3)'EVENTANDKEY(3)='1'THEN--设置分的十位
IFDATATMP(15DOWNTO12)="0101"THEN-自动跳转至U0
DATATMP(15DOWNTO12)<="0000";
ELSE
DATATMP(15DOWNTO12)<=DATATMP(15DOWNTO12)+1;
ENDIF;--否则自动加1
ENDIF;
IFKEY
(2)'EVENTANDKEY
(2)='1'THEN--设置分的个位
IFDATATMP(11DOWNTO8)="1001"THEN--9自动跳转至U0DATATMP(11DOWNTO8)<="0000";
ELSE
DATATMP(11DOWNTO8)<=DATATMP(11DOWNTO8)+1;
ENDIF;__否则自动加1
ENDIF;
IFKEY
(1)'EVENTANDKEY
(1)='1'THEN--设置秒的十位
IFDATATMP(7DOWNTO4)="0101"THEN--5自动跳转至U0
DATATMP(7DOWNTO4)<="0000";
ELSE
DATATMP(7DOWNTO4)<=DATATMP(7DOWNTO4)+1;
ENDIF;__否则自动加1
ENDIF;
IFKEY(0)'EVENTANDKEY(0)='1'THEN--设置秒的个位
IFDATATMP(3DOWNTO0)="1001"THEN--9自动跳转至U0
DATATMP(3DOWNTO0)<="0000";
ELSE
DATATMP(3DOWNTO0)<=DATATMP(3DOWNTO0)+1;
ENDIF;
ENDIF;__否则自动加1
ENDIF;
DATA<=DATATMP;
ENDPROCESS;
PROCESS(START,RESET)--e±?
o?
,,?
?
?
3i
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_CLKv='1‘;
COOKv='0‘;
WHENDONE_MSG=>
LD_DONEv='0‘;
COOKv='0‘;
--烹调时间测试状态
--完成信息显示状态
WHENIDLE=>--初始状态定义
IFEDIT='1'THEN-_设置计时模式
NXT<=SET_CLOCK;
LD_CLK<='1';
ELSIFDONE='0'THEN
NXT<=TIMER;
C00K<='1';
ENDIF;
WHENTIMER=>
IFDONE='1'THEN--设置计时完成
NXT<=DONE_MSG;
LD_DONE<='0';
cook<='0';
ELSE
NXT<=TIMER;
C00K<='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_L0GIC_V