简易微波炉控制器的设计与实现Word文档格式.docx
《简易微波炉控制器的设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《简易微波炉控制器的设计与实现Word文档格式.docx(44页珍藏版)》请在冰点文库上搜索。
![简易微波炉控制器的设计与实现Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/ca313295-44ff-41f2-8fa1-4c80a159d5ee/ca313295-44ff-41f2-8fa1-4c80a159d5ee1.gif)
防抖模块
左边为时间输入防抖,右边为火力输入和开始键的防抖。
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是用于完成这个表达式的。
程序中默认接地。
倒计时模块
电路计时模块可以由十进制减法计数器和六进制减法计数器级联组成,其中,两个十进制的减法计数器用于分、秒的个位减法计数,两个六进制的减法计数器用于分、秒的十位减法计数。
由六进制计数器和十进制计数器级联构成的计时模块原理图如图所示。
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=>
00000010"
when2=>
00000100"
when3=>
00001000"
when4=>
00010000"
when5=>
00100000"
when6=>
01000000"
when7=>
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总框图
三:
仿真波形及波形分析
控制器仿真
图中,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则相应的数码管上显示相应的数字。
符合预期。
Key输入11秒
在start后11秒左右,ledbar全部为1,完成led功能。
且reset后ledbar清零。
在接受done信号后每两秒输出一个高电平且持续两秒。
总共响2次。
完成功能。
总体仿真
四:
源程序
分频器
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+1;
endif;
endprocess;
clk_out<
=clk_tmp;
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:
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;
ENTITYcontrollerIS
PORT(
RESET:
INSTD_LOGIC;
--¸
复位
KEY:
INSTD_LOGIC_VECTOR(3DOWNTO0);
--键盘时间输入
START:
--开始键
CLK:
--1hz输入
DONE:
--完成信号
COOK:
OUTSTD_LOGIC;
LD_CLK:
--将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:
='
BEGIN
PROCESS(CLK,RESET)--时钟和复位进程
IFRESET='
THEN----复位时将IDLE(显示0000)赋予当前状态
CUR<
=IDLE;
ELSIFCLK'
EVENTANDCLK='
THEN
=NXT;
--如果不是,遇到上边沿则自动跳转下一状态
ENDPROCESS;
PROCESS(RESET,KEY)--复位和输入的进程
BEGIN--可以让输入4位数字显示时间
IFRESET='
THEN--复位时不论任何状态数码管都将显示0000
DATATMP<
=(others=>
'
);
ELSE
IFKEY(3)'
EVENTANDKEY(3)='
THEN--设置分的十位
IFDATATMP(15DOWNTO12)="
0101"
THEN--5自动跳转到0
DATATMP(15DOWNTO12)<
="
0000"
=DATATMP(15DOWNTO12)+1;
--否则自动加1
IFKEY
(2)'
EVENTANDKEY
(2)='
THEN--设置分的个位
IFDATATMP(11DOWNTO8)="
1001"
THEN--9自动跳转到0
DATATMP(11DOWNTO8)<
=DATATMP(11DOWNTO8)+1;
IFKEY
(1)'
EVENTANDKEY
(1)='
THEN--设置秒的十位
IFDATATMP(7DOWNTO4)="
DATATMP(7DOWNTO4)<
=DATATMP(7DOWNTO4)+1;
IFKEY(0)'
EVENTANDKEY(0)='
THEN--设置秒的个位
IFDATATMP(3DOWNTO0)="
DATATMP(3DOWNTO0)<
=DATATMP(3DOWNTO0)+1;
DATA<
=DATATMP;
PROCESS(START,RESET)--É
è
Ö
Ã
Ê
±
¼
ä
º
Í
¸
´
Î
»
½
ø
³
Ì
THEN--将edit置1
EDIT<
='
ELSIFSTART'
EVENTANDSTART='
THEN--如何start按下将edit置0
PROCESS(CLK,CUR,EDIT,DONE)IS
BEGIN
NXT<
--将IDLE载入NXT
--LD_POWER<
LD_DONE<
LD_CLK<
COOK<
CASECURIS
WHENSET_CLOCK=>
--烹调时间测试状态
WHENDONE_MSG=>
--完成信息显示状态
WHENIDLE=>
--初始状态定义
IFEDIT='
THEN--设置计时模式
=SET_CLOCK;
ELSIFDONE='
THEN
=TIMER;
WHENTIMER=>
IFDONE='
THEN--设置计时完成
=DONE_MSG;
cook<
--WHENOTHERS=>
NULL;
ENDCASE;
PROCESS(EDIT)IS
LD_EDIT<
=EDIT;
ENDrtl;
数据装载模块
ENTITYloaderIS
DATAIN:
INSTD_LOGIC_VECTOR(15DOWNTO0);
--输入16位数据
LD_TEST:
DATAOUT:
--输出16位数据
LOAD:
OUTSTD_LOGIC--选择状态
ENDloader;
ARCHITECTURErtlOFloaderIS
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);
LOAD<
--三选一状态
--中间变量定义
CASETEMPIS
WHEN"
010"
=>
--烹调完成
DATAOUT<
=DONE;
001"
=DATAIN;
WHENOTHERS=>
十进制计数器
ENTITYcnt10IS
LOAD,CLR:
--CLR:
清除数据
EN:
--信号使能
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)
IFCLR='
THEN--当CLR高电平,数据变为0000
TMP<
ELSIFLOAD='
THEN--否则装载输入的数据
THEN--上升沿时,执行10进制减法
IFEN='
THEN
IFTMP="
THEN--0跳转到9
ELSE--自动减1
=TMP-'
THEN
CARRY_OUT<
--COOK<
=CARRY_OUT
Q<
=TMP;
--六进制减法计数器
ENTITYcnt6IS
ENDcnt6;
ARCHITECTURErtlOFcnt6IS
PR