用电器电源自动控制电路的电子自动化实现 左函未.docx
《用电器电源自动控制电路的电子自动化实现 左函未.docx》由会员分享,可在线阅读,更多相关《用电器电源自动控制电路的电子自动化实现 左函未.docx(14页珍藏版)》请在冰豆网上搜索。
用电器电源自动控制电路的电子自动化实现左函未
目录
1实验要求1
2设计内容.................................................................................1
3设计思想.2
4设计方案.....2
模块一:
计数的设计2
模块二:
定时的设计4
模块三:
扫描电路的设计6
5底层元器件的生成程序9
5.1BCD-7段数码管显示译码器电路9
5.2MUX89
5.360进制计数器10
5.4十进制计数器12
5.5JK14
6硬件实验结果15
7心得体会15
8参考文献16
用电器电源自动控制电路
1实验要求
1.控制电路能使用电器的电源自动开启X秒,然后自动关闭X秒,如此周而复始的工作
2.X可以设置,范围为1~30s;
3.定时范围Y可以调节,范围为1~60分;
4.单独设置置数输入控制端实现范围调节;
5.要有工作状态指示;并有分秒的倒计时显示。
2设计内容
随着计算机技术的发展,计算机的应用领域也以惊人的速度拓展。
计算机的高效性、灵活性使得它在CAD(ComputerAidedDesign计算机辅助设计)方面得到广泛的应用,这使得产品的开发和研制的周期大大缩小了,而这一点是非常重要的。
这些因素就决定了在市场对于掌握CAD知识的人才的青睐。
事实也是如此,在人才市场上,大量需求具有CAD知识的人才。
EDA(ElectronicDesignAutomation电子设计自动化)就包含在CAD范畴之中,利用计算机的优势,快速高效的开发和研制电子产品,来缩短产品开发时间。
EDA技术是电子技术的发展趋势,利用EDA工具可以代替设计者完成电子系统设计中的大部分工作,EDA工具从数字系统设计的单一领域发展到今天,应用范围以射击模拟、微波等多个领域,可以实现各个领域电子系统设计的测试、设计仿真和布局布线等。
我们作为设计者只要完成对电子系统的功能描述,就可以利用计算机和EDA工具,进行设计处理,最终得到设计结果。
现代的大学教育是面向市场的,开设EDA课程设计,可以帮助我们熟悉电子EDA的一些基本知识,培养独立思考和动手的能力,也可以增强我们的创新意识。
此次课程设计是一次很好的锻炼机会,通过自己认真思考,动手动脑,设计出属于自己的作品,那是一件多么令人愉悦的事情!
另外一点就是,经过这次课程设计还可以对以前学过的知识进行巩固练习,继而对以后的工作和学习有所帮助。
3设计思想
首先分析题目要求,我从中得到下面几点内容:
1.用电器可以自动开启30s,然后就会自动关闭30s,如此周而复始,同时要有状态的显示—〉所以这里需要用到一个30进制的计数器,且有一个输出端表示用电器的工作状态。
2.题目要求随时都可以采用自动控制方式对用电器进行控制,即:
通过手动使用器由运行转换到停止或由停止转换到运行—〉因此必须有一个输入端用作开关来对用电器进行工作状态的控制。
3.定时信号的设计,且要有分秒的倒计时显示—〉首先必须得用到减法计数器,用减法计数器来做成”分”和”秒”;另外很重要的是要用到扫描电路,用以显示倒计时。
此定时信号是用来控制整个电路的工作时间。
4.当然,在这其中不免会用到一些触发器、与非门、或非门、与门、或门、非门等。
5.在设计的时候可以首先把整个电路分成若干个小模块,如果先把小模块设计出来,那么整个电路就不成问题了。
4设计方案
将整个器件设计变为三个模块,即30计数器,计时器和显示模块
模块一:
计数的设计
(一)30计数器
因为现成的计数器只有十进制计数器74160和十六进制计数器74161,要想做一个30进制的计数器,需要用两片计数器。
这里,我利用两片十进制计数器74160来构成一个30进制计数器。
依据如下:
把第一片74160的四位输出端接成1001(即十进制中的9),另一片接成0010(即十进制中的2),然后把第一片的进位输出端C接到第二片的使能控制端EP和ET上,每当第一片计成9(1001)时C变为1,下一个CP信号到达时第二片为计数工作状态,计入1,而当第一片计成0(0000),它的C端回到低电平;第一片的EP
和ET接高电平恒为1,始终处于计数工作状态。
这样就构成了30进制计数器。
另外,还要有一个输出端是用来表示用电器工作状态的,我用到了一个JKFF、非门、与门。
具体的逻辑电路如下图所示:
图1
图形说明:
(1)此图是采用整体置数法接成的30进制计数器。
首先需将两片74160接成百进制计数器,然后将电路的29状态译码产生0信号,把此0信号和一个表示开关的输入端相“与”的结果(以下均称为”A”)同时加到两片74160的LD端(即LD非端),当下一个计数脉冲(第30个计数脉冲)到达时,将0000同时置入两片74160中,从而得到30进制计数器。
(2)JKFF在J=K=1时,输出波形不断翻转。
将“A”作为JKFF的CP信号,则输出端会0、1、0、1……这样循环,将此输出连接到某一指示灯上,若出现“灭”与“亮”每隔30秒交替的现象,就说明该用电器的工作状态为:
自动开启30s,然后自动进入关闭状态。
(3)该逻辑图中的CP信号设为CP
该模块的仿真波形图如下所示
图2
图形说明:
(1)KaiGuan一栏表示开关的状态:
0表示关闭,1表示打开。
7表示用电器的状态:
0表示停止,1表示运行。
20表示计数的高位(即十位),一直按照0、1、2……循环。
10表示计数的低位(即个位),一直按照0、1、2、3、4、5、6、
7、8、9、0……循环。
(2)当开关保持状态1不变,20由2变为0时,7会自动改变状态进行翻转。
这说明用电器运行30s和停止30s是自动循环的。
(3)在任意时刻,若手动开关改变其状态,则用电器的状态也会翻转,并且重新开始计时30s。
结论:
通过对逻辑电路进行仿真,从波形图上可以看出,此逻辑电路的设计是正确的,符合题目要求。
模块二:
定时的设计
题目要求有分秒的定时,且为倒计时,所以必然会用到减法计数器。
74168为十进制同步加减计数器,当U/DN=0时,它可以做减法计数。
不妨把时间定时为5分钟,即数码管上倒计时的时间显示为从5分59秒开始,到0分00秒结束。
这里要用到3片74168。
另外,还须有T触发器、或门、或非门、与门、非门等。
图3
图形说明:
(1)首先,74168做减法计数,U/DN=0,要把它接地。
(2)秒的定时为0~59s需要用到两片74168,因为是倒计时,和一般的情况稍有差别,所以应该把八个输出端用一个或门译成0后加到LD非端,且第一片和第二片的输入端D0~D3应分别译成1001、0101(即十进制中的9、5)。
还要把秒的借位输出作为分的脉冲信号,这样,当秒减够60后,分会自动减1。
依据同样的道理,分的定时只需一片74168即可,同时把四个输出端用或门译成0加到LD非端,输入端D0~D3译成0101(即十进制中的5)。
这样,就把时间的的初始值置为0分00秒,而后马上回到5分59秒,这就开始了倒计时。
(3)为了使倒计时计到0分00秒的时候自动停止而不至于循环,所以这里需要对控制秒的脉冲信号加上一些限制。
用到了或非门、与门、非门,还有T触发器,具体连线见图中所示。
(4)该逻辑图中的CP信号设为CP2。
该模块的仿真波形图如下所示:
图4
图形说明:
(1)b(4~1)表示“分”由5自减到0;
(2)a[8~5]表示“秒”的高位有5自减到0;
Q[4~1]表示“秒”的低位由9自减到0。
(3)从整个图形可以看出:
时间由5分59秒开始,一秒一秒的自减到0分0秒。
结论:
通过对逻辑电路进行仿真,从波形图上可以看出,此逻辑电路的设计是正确的,符合题目要求。
模块三:
扫描电路的设计
由于只用到3个数码管,所以地址端只需S0、S1即可,体现在试验箱上就是有4个数码管。
用到一片74161,将其接成4进制;还用到四片74151双8选一数据选择器;另需一片7449BCD--七段显示译码器。
具体的逻辑电路如下页图所示:
图5
图形说明:
(1)74161的输出端QA、QB分别作为数码管的地址端S0、S1和74151
的地址端A、B。
(2)两片74151的32个输入端分别称为1~32;74151的四个输出端
分别作为7449的输入端;7449的输出端OA~OG分别称为a~g。
(3)该逻辑电路的CP信号设为CP3,
图6
有图可知电路的设计是正确的。
将上述三个模块组合到一起,就构成了整个的逻辑电路,如下图所示:
图7
总逻辑电路的仿真模型为
图8
结论:
通过对逻辑电路进行仿真,从波形图上可以看出,用电器每隔30秒就会自动改变一下状态,且可以随时由KaiGuan改变状态,数码管上的数字显示是:
5分59秒~0分00秒,此逻辑电路符合题目要求,其设计是正确的。
5底层元器件的生成程序
5.1BCD-7段数码管显示译码器电路
library ieee;
use ieee.std_logic_1164.all;
entity bcd71 is port(d:
in std_logic_vector(3 downto 0);
led:
out std_logic_vector(6 downto 0));
end entity bcd71;
architecture arch of bcd71 is
begin led<= "1111110"
when d="0000" else "0110000"
when d="0001" else "1101101"
when d="0010" else "1111001"
when d="0011" else "0110010"
when d="0100" else "1011011"
when d="0101" else "1011111"
when d="0110" else "1110000"
when d="0111" else "1111111"
when d="1000" else "1111011"
when d="1001" else "0000000";
end architecture arch;
5.2MUX8
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;
entity mux8_12 is
port(d0,d1,d2,d3,d4,d5,d6,d7:
in std_logic; g:
in std_logic;
a2,a1,a0:
in std_logic; y:
out std_logic);
end entity mux8_12;
architecture one of mux8_12 is
signala:
std_logic_vector(2 downto 0);
begin
a<=a2&a1&a0;
process(a,g,d0,d1,d2,d3,d4,d5,d6,d7)
begin
if g='0' then y<='0';
else
case a is
when"000"=>y<=d0;
when"001"=>y<=d1; when"010"=>y<=d2; when"011"=>y<=d3; when"100"=>y<=d4; when"101"=>y<=d5; when"110"=>y<=d6; when"111"=>y<=d7; when others=>y<='0'; end case;
end if;
end process;
end architecture one;
5.360进制计数器
libraryieee;--调用ieee库
useieee.std_logic_1164.all;--使用ieee库中的1164包
useieee.std_logic_unsigned.all;--使用ieee库中的无符号包
entitycntm60is
port(ci:
instd_logic;--来至低级的进位
nreset:
instd_logic;--清零端
load:
instd_logic;--置数端
d:
instd_logic_vector(7downto0);--与置数端对应的数据输入端
clk:
instd_logic;--时钟端
co:
outstd_logic;--进位输出端
qh:
bufferstd_logic_vector(3downto0);--计数器的高位输出端
ql:
bufferstd_logic_vector(3downto0));--计数器的低位输出端
endcntm60;
architecturebehaveofcntm60is
begin
co<='1'when(qh="0101"andql="1001"andci='1')else'0';
process(clk,nreset)
begin
if(nreset='0')then
qh<="0000";
ql<="0000";
elsif(clk'eventandclk='1')then
if(load='1')then
qh<=d(7downto4);
ql<=d(3downto0);
elsif(ci='1')then
if(ql=9)then
ql<="0000";
if(qh=5)then
qh<="0000";
else
qh<=qh+1;
endif;
else
ql<=ql+1;
endif;
endif;
endif;
endprocess;
endbehave;
5.4十进制计数器
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;
5.5JK
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt16 is
port(clk,clr,enb,control:
in std_logic;
cout:
out std_logic;
coh:
out std_logic_vector(3 downto 0));
end entity cnt16;
architecture one of cnt16 is
begin
process (clk,clr,enb,control)
variable co :
std_logic_vector(3 downto 0);
begin
if clr='1' then co:
="0000";
elsif rising_edge(clk) then
if enb='1' then
case control is
when '0' =>
if co<15 then co:
=co+1;
else co:
="0000";
end if;
when '1'=>
if co>0 then co:
=co-1;
else co:
="1111";
end if;
end case;
end if;
end if;
if co=15 then cout<='1';
else cout<='0';
end if;
coh<=co;
end process;
end architecture;
6硬件实验结果
对总的逻辑电路进行编译下载后,在试验箱上连线,观察到如下现象:
表示用电器工作状态的指示灯每隔30s就会自动“亮”或“灭”,用高低电平当作开关来控制电路,也可以实现用电器状态的自动转换;数码管上的时间显示为000、559、558……000。
硬件实验的结果完全符合题目要求,说明此逻辑电路的设计是完全正确的。
7心得体会
当我刚刚拿到题目的时候,感觉特别难,一点思路都没有,对此软件
的掌握也不是太熟练,后来,经过自己进一步的仔细琢磨、认真思考以及刻苦练习,慢慢地有了点眉目。
然后我就一点一点的设计电路,最后再进行模块组合,把整个设计思路连接起来成为了一个整体的数字电路。
当然在这其中也有过不少的错误,我仔细查看电路找错误,通过一次又一次的不断修改与仿真,我的电路一步步趋于完善,我也正一步步走向成功,当我波形仿真后,完全符合题目的各个要求,经过老师的验收,我顺利通过了这次为期两周的EDA课程设计。
经过这次课程设计,我发现自己还有很多不足,对数字电路某些内容的掌握不是太熟练,在逻辑电路设计方面欠佳;同时,在课程设计的过程中,我也学会不少新的知识,扩展了自己的知识面,培养了亲自动手实践的能力,并且也对以前已经学过的知识进行了巩固练习。
我又一次深深体会到了知识的力量,感受到在知识海洋里遨游是一件多么愉快的事情。
从中我也悟出了一些道理:
人是不可以满足的!
我深信,经过刻苦学习,我一定可以掌握更多的科学知识。
在此,我深深地感谢每一位老师!
8参考文献
[1]赵全利.《EDA技术及应用教程》
[2]韩力群.《人工神经网络理论、设计及应用》第二版.化学工业出版社,1990.1
[3]闻新,周露,李翔,张宝伟.《MATLAB神经网络仿真与应用》.科学出版社,2003.7
[4]邹彦.《EDA技术与数字系统设计》.电子工业出版社