简易微波炉控制器的设计与实现文档格式.docx
《简易微波炉控制器的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《简易微波炉控制器的设计与实现文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
![简易微波炉控制器的设计与实现文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/12/72aae4ac-17a5-422c-bfad-d755e47af8f6/72aae4ac-17a5-422c-bfad-d755e47af8f61.gif)
4、自拟其它功能。
二:
系统设计(包括设计思路、总体框图、分块设计)
设计思路
由一个总的控制器完成各个状态的转换。
主要分两个大状态,一为没有开始前的可编辑状态。
二为开始后的不可编辑状态。
所以总的控制器中应有个edit输出控制各个模块是否可改变。
Start开始前,为设置时间状态和火力状态和烧烤选择状态。
Start开始后edit变量为0,各个模块不可在编辑。
控制器转入倒计时模块,同时led灯进入工作状态。
需要注意的是需要为所有模块设置reset输入,以重置各个模块状态值。
主要考虑问题:
1:
由于键盘输入不稳定,数字跳变太快,所以需要加键盘防抖模块。
2:
键盘防抖模块需要特殊的频率,所以分频器模块不止一个。
综上,主要涉及以下几个模块。
分频器,键盘防抖模块,控制器,数据选择,数据装载,数字译码,数码管显示模块,led进度显示模块,火力选择和显示模块,倒计时模块,蜂鸣器模块
总体框图
分块设计
1分频器
1hz用于倒计时,100hz是时间输入防抖所用频率,10khz是火力防抖所用(也可以用100hz的,不过就是输入稳定性略差)
防抖模块
左边为时间输入防抖,右边为火力输入和开始键的防抖。
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;
USEIEEE.STD_LOGIC_11