数字电子时钟程序与仿真
- 格式:doc
- 大小:73.51 KB
- 文档页数:8
电子技术综合设计报告设计课题:电子数字钟的设计与仿真专业班级:电子信息工程学生姓名:指导教师:设计时间:电子数字钟的设计与仿真设计者指导教师摘要数字钟能经振荡器、计数器、译码和显示电路准确地将时间“时”“分”“秒”用数字的方式显示出来,并且需要校正电路使其准确工作,还可以有定时和报时功能。
研究数字钟及扩大其应用,有着非常现实的意义。
本文在Multisim基础上设计的数字钟,是由数字集成电路构成、用数码管显示。
关键词数字钟振荡器计数器译码显示仿真引言数字钟是一种用数字电路技术实现时、分、秒计时的装置,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播。
而且与传统的机械钟相比,它具有走时准确、显示直观、无机械传动、无需人的经常调整等优点。
数字钟的设计涉及到模拟电子与数字电子技术,其中绝大部分是数字部分、逻辑门电路、数字逻辑表达式、计算真值表与逻辑函数间的关系、编码器、译码器显示等基本原理。
现在主要用各种芯片实现其功能,更加方便和准确。
Multisim 8作为一种高效的设计与仿真平台。
其强大的虚拟仪器库和软件仿真功能,为电路设计提供了先进的设计理念和方法。
1 设计任务与要求1.1设计+5V稳压电源;1.2用LED管显示时、分、秒;1.3具有校时功能;1.4具有整点报时功能;1.5具有闹钟功能;1.6应用Multisim仿真软件对电路进行关键元器件参数的选择、主要功能特性的仿真与电路特性分析。
2 方案设计与论证该设计主要由以下几部分组成:震荡器、秒计数器、分计数器、时计数器、BCD-七段显示译码/驱动器、LED七段显示数码管、时间校准电路[3]。
数字钟数字显示部分,采用译码与二极管串联电路,将译码器、七段数码管连接起来,组成十进制数码显示电路,即时钟显示。
要完成显示需要6个数码管,八段的数码管需要译码器械才能显示,然后要实现时、分、秒的计时需要60进制计数器和24进制计数器,在在仿真软件中发生信号可以用函数发生器仿真,频率可以随意调整。
数字电子技术课程设计学院:信息工程学院班级:电气二班姓名:刘君宇张迪王应博数字时钟的Multisim设计和仿真一、设计和仿真要求学习综合数字电子电路的设计、实现?基础调研?应用设计、逻辑设计、电路设计?用Multisim软件验证电路设计?分析电路功能是否符合预期,进行必要的调试修改?撰写Project报告,提交Multisim?24???????显示精通过对软件Multisim的学习和使用,进一步加深了对数字电路的认识。
在仿真过程中遇到许多困难,但通过自己的努力和同学的帮助都一一克服了。
首先,连接电路图过程中,数码管不能显示,后经图形放大后才发现是电路断路了。
其次,布局的时候因元件比较多,整体布局比较困难,因子电路不如原电路直观,最后在不断努力下,终于不用子电路布好整个电路。
调试时有的器件在理论上可行,但在实际运行中就无法看到效果,所以得换不少器件,有时无法找出错误便更换器件重新接线以使电路正常运行。
在整个设计中,计数器的接线比较困难,反复修改了多次,在认真学习其用法后采用归零法和置数法设计出60进制和24进制的计数器。
同时,在最后仿真时,预置的频率一开始用的是1hz,结果仿真结果反应很慢,后把频率加大,这才在短时间内就能看到全部结果。
总之,通过这次对数字时钟的设计与仿真,为以后的电路设计打下良好的基础,一些经验和教训,将成为宝贵的学习财富。
数字电子技术基础感想(分工:完成24小时计时功能)本学期我们学习了数字电子技术基础这门课程,通过一学期的学习,我学习到了cmos门电路,ttl门电路,编码器,译码器,触发器和时序电路等数电专业的知识。
上学期接触过模拟电路的知识,在学习数电后,感受到了两门课很多相同又不同的地方。
老师在学期末给我们布置了一个作业,设计数字电路实现时钟功能的作业。
这次作业结合了大部分本学期所学习的知识,综合性极强。
我们在设计中应用了自动校时,并实现了闹钟的功能。
在扩展功能里,我们的时钟可以显示星期,可以整点报时,闹钟功能实现了彩铃响铃。
基于Proteus的数字电子钟的设计与仿真一、设计目的与要求 (1)二、设计内容与方案制定 (1)三、芯片简介 (1)1、AT89C52 (1)2、AT24C02 (2)四、设计步骤 (3)1、硬件电路设计 (3)1.1.硬件电路组成框图 (3)1.2.各单元电路及工作原理 (3)1.3.绘制原理图 (5)1.4.元件清单列表 (6)2、程序设计 (7)2.1程序流程 (7)2.2主程序 (9)2.2.源程序 (10)五、调试与仿真 (22)六、心得体会 (23)七、参考文献 (23)一、设计目的与要求设计目的:通过课程设计,培养学生运用已学知识解决实际问题的能力、查阅资料的能力、自学能力和独立分析问题、解决问题的能力和能通过独立思考。
设计要求:设计一个时、分可调的数字电子钟、断电后将数据保存,开启后时间将从断电后时间继续行走。
二、设计内容与方案制定具有校时功能,按键控制电路其中时键、分键六个键分别控制时、分时间的调整。
按下小时数实现对小时数加减,按下分钟数实现对分钟数进行加减,并设置有复位键,启始键。
以AT89C51单片机进行实现秒、分、时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。
通过AT24C02分别写入时、分、秒数据在断电后实现保存,在下次通电后将数据读出保持为断电前数据。
三、芯片简介1、AT89C52AT89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系2、AT24C02AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传件为接收器。
数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。
主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。
电子时钟VHDL程序与仿真1. 10进制计数器设计与仿真(1)10进制计数器VHDL程序--文件名:counter10.vhd。
--功能:10进制计数器,有进位C--最后修改日期:2004.3.20library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity counter10 isPort ( clk : in std_logic;reset : in std_logic;din : in std_logic_vector(3 downto 0);dout : out std_logic_vector(3 downto 0);c:out std_logic);end counter10;architecture Behavioral of counter10 issignal count : std_logic_vector(3 downto 0);begindout <= count;process(clk,reset,din)beginif reset='0'thencount <= din ;c<='0';elsif rising_edge(clk) thenif count = "1001" thencount <= "0000";c<='1';elsecount <= count+1;c<='0';end if;end if;end process;end Behavioral;(2)10进制计数器仿真2. 6进制计数器设计与仿真(1)6进制计数器VHDL程序--文件名:counter6.vhd。
数字钟系统电路的设计方案与仿真分析
在电子技术实验教学中,构建学生的电路设计理念,提高学生的电路设计能力,是教学的根本目的和核心内容。
数字钟电路的设计和仿真,涉及模拟电子技术、数字电子技术等多方面知识,能够体现实验者的理论功底和设计水平,是电子设计和仿真教学的典型案例。
文中采用了555 定时器电路、计数电路、译码电路、显示电路和时钟校正电路,来实现该电路。
1 系统设计方案
数字钟由振荡器、分频器、计时电路、译码显示电路等组成。
振荡器是数字钟的核心,提供一定频率的方波信号;分频器的作用是进行频率变换,产生频率为1 Hz 的秒信号,作为是整个系统的时基信号; 计时电路是将时基信号进行计数;译码显示电路的作用是显示时、分、秒时间;校正电路用来对时、分进行校对调整。
其总体结构图,如图1 所示。
2 子系统的实现
2.1 振荡器
本系统的振荡器采用由555 定时器与RC 组成的多谐振荡器来实现,如图2 所示即为产生1 kHz 时钟信号的电路图。
此多谐振荡器虽然产生的脉冲误差较大,但设计方案快捷、易于实现、受电源电压和温度变化的影响很小。
2.2 分频器
由于振荡器产生的频率高,要得到标准的秒信号,就需要对所得到的信号进行分频。
在此电路中,分频器的功能主要有两个:1)产生标准脉冲信号;2)提供电路工作需要的信号,比如扩展电路需要的信号。
通常实现分频器的电路是计数器电路,选择74LS160 十进制计数器来完成上述功能[5]。
如图3 所示,555 定时器产生1 kHz 的信号,经过3 次1/10 分频后得到1 Hz 的脉冲信号,为秒个位提供标准秒脉冲信号。
综合实践(论文)题目数字钟学院通信与电子工程学院专业班级学生姓名学生学号指导教师摘要:本次设计主要是利用数字电路实验箱上的74LS160、555定时器、74LS00与七段显示译码器设计简易数字钟,实现准确计时,以数字形式显示时、分、秒的时间和校时功能。
由于采用纯数字硬件设计制作,与传统机械表相比,它具有走时准、显示直观、无机械传动装置等特点。
它的小时周期为12,分和秒的周期为60。
关键字:数字时钟时计数器分计数器秒计数器校时器目录摘要: (I)第1章绪论 (1)1.1 设计要求 (1)1.2 设计任务 (1)第2章总体框图 (2)2.1 总体框图 (2)2.2 设计思路及模块功能 (2)第3章选择器件 (3)3.1 74LS160(本实验需要6片) (4)3.2 74LS04(本实验需要1片) (6)3.3 74LS00(本实验需要2片) (7)3.4 74LS20(本实验需要1个) (8)3.5 LED(本实验需要6个) (9)3.6 三极管8099(本实验需要1个) (11)3.7 小灯泡(本实验需要1个) (11)第4章功能模块 (13)4.1 秒脉冲发生器 (13)4.2 计数译码显示 (13)4.3 整点报时电路 (17)第 5章总体设计电路图 (19)结论 (21)参考文献 (22)附录 (23)第1章绪论1.1 设计要求能进行正常的时,分,秒计时功能,分别由6个数码管显示24h,60min,60s.Sb键进行校时:按下Sh键时,时计数器一秒速度递增,并按24循环,记满23后再回00.Sm键进行校分:按下Sm键时,分计时器以秒速度递增,并按60计数循环,记满59后再回00,但不能向“时”进位。
Sc键进行秒清零:按下Sc键时,可对秒清零。
扬声器整点报时:当计时器达59'51、59'53、59'55及59'57时,鸣叫声频率为500Hz;到达59'59是为最后一声整点报时,频率为1k Hz。
电子电路Multisim设计和仿真学院:专业和班级:姓名:学号:数字时钟的Multisim设计和仿真一、设计和仿真要求学习综合数字电子电路的设计、实现和调试1.设计一个24或12小时制的数字时钟。
2. 要求:计时、显示精确到秒;有校时功能。
采用中小规模集成电路设计。
3.发挥:增加闹钟功能。
二、总体设计和电路框图1. 设计思路1).由秒时钟信号发生器、计时电路和校时电路构成电路。
2).秒时钟信号发生器可由555定时器构成。
3).计时电路中采用两个60进制计数器分别完成秒计时和分计时;24进制计数器完成时计时;采用译码器将计数器的输出译码后送七段数码管显示。
4).校时电路采用开关控制时、分、秒计数器的时钟信号为校时脉冲以完成校时。
2. 电路框图图1. 数字钟电路框图三、子模块具体设计1. 由555定时器构成的1Hz秒时钟信号发生器。
由下面的电路图产生1Hz的脉冲信号作为总电路的初输入时钟脉冲。
图2. 时钟信号发生电路2.分、秒计时电路及显示部分在数字钟的控制电路中,分和秒的控制都是一样的,都是由一个十进制计数器和一个六进制计数器串联而成的,在电路的设计中我采用的是统一的器件74LS160D的反馈置数法来实现十进制功能和六进制功能,根据74LS160D的结构把输出端的0110(十进制为6)用一个与非门74LS00引到CLR端便可置0,这样就实现了六进制计数。
由两片十进制同步加法计数器74LS160级联产生,采用的是异步清零法。
显示部分用的是七段数码管和两片译码器74LS48D。
图3. 分秒计时电路3. 时计时电路及显示部分由两片十进制同步加法计数器74LS160级联产生,采用的是同步置数法,u1输出端为0011(十进制为3)与u2输出端0010(十进制为2)经过与非门接两片的置数端。
显示部分用的是七段数码管和两片译码器74LS48D。
图6. 整体电路图五、仿真结果1. 1hz脉冲产生电路仿真振荡器可由晶振组成,也可以由555与RC组成的多谐振荡器。
电子设计自动化(EDA)—数字时钟LED数码管显示二、实验内容和实验目的1. 6个数码管动态扫描显示驱动2. 按键模式选择(时\分\秒)与闹钟(时\分)调整控制,3. 用硬件描述语言(或混合原理图)设计时、分、秒计数器模块、闹钟模块、按键控制状态机模块、动态扫描显示驱动模块、顶层模块。
要求使用实验箱左下角的6个动态数码管(DS6 A~DS1A)显示时、分、秒;要求模式按键和调整按键信号都取自经过防抖处理后的按键跳线插孔。
实验目的: 1)学会看硬件原理图, 2)掌握FPGA硬件开发的基本技能3)培养EDA综合分析、综合设计的能力三、实验步骤、实现方法(或设计思想)及实验结果主要设备: 1)PC机, 2)硬件实验箱, 3)Quartus II软件开发平台。
1.打开Quartus II , 连接实验箱上的相关硬件资源, 如下图1所示。
2.建立新文件, 选择文本类型或原理图类型。
3. 编写程序。
4.编译5. 仿真, 加载程序到芯片, 观察硬件输出结果(数码管显示)6.结果正确则完成。
若结果不正确, 则修改程序, 再编译, 直到正确。
模24计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY count24 ISPORT(clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count24;ARCHITECTURE arc OF count24 ISSIGNAL a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk,en)BEGINhh<=a;hl<=b;IF(clk'EVENT AND clk='1') THENIF(en='1') THENIF(a="0010" AND b="0011") THENa<="0000";b<="0000";ELSE IF(b="1001") THENa<=a+'1';b<="0000";ELSE b<=b+'1';END IF;END IF;IF(a="0010" AND b="0010") THENcout<='1';ELSE cout<='0';END IF;END IF;END IF;END PROCESS;END arc;模60计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY count60 ISPORT(clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count60;ARCHITECTURE arc OF count60 ISSIGNAL a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL sout:STD_LOGIC;BEGINPROCESS(clk)BEGINhh<=a; hl<=b;IF(clk'EVENT AND clk='1') THENIF(en='1') THENIF(a="0101" AND b="1001") THENa<="0000";b<="0000";ELSE IF(b="1001") THENa<=a+'1';b<="0000";ELSE b<=b+'1';END IF;END IF;END IF;END IF;END PROCESS;sout<='1' WHEN a="0101" AND b="1001" ELSE '0';cout<=sout AND en;END arc;4-7显示译码模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY segment4to7 ISPORT(s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g:OUT STD_LOGIC);END segment4to7;ARCHITECTURE arc OF segment4to7 IS SIGNAL y:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGINa<= y(6);b<= y(5);c<= y(4);d<= y(3);e<= y(2); f<= y(1);g<= y(0);PROCESS(s)BEGINCASE s ISWHEN "0000"=>y<="1111110"; WHEN "0001"=>y<="0110000"; WHEN "0010"=>y<="1101101"; WHEN "0011"=>y<="1111001"; WHEN "0100"=>y<="0110011"; WHEN "0101"=>y<="1011011"; WHEN "0110"=>y<="1011111"; WHEN "0111"=>y<="1110000"; WHEN "1000"=>y<="1111111"; WHEN "1001"=>y<="1111011"; WHEN OTHERS=>y<="0000000"; END CASE;END PROCESS;END arc;带闹钟控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mode_adjust_with_alarm ISPORT (adjust,mode,clk1hz: IN STD_LOGIC;clkh,enh,clkm,enm,clks,enha: OUT STD_LOGIC;clkh_a,clkm_a:OUT STD_LOGIC;mode_ss: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END mode_adjust_with_alarm;ARCHITECTURE arc OF mode_adjust_with_alarm ISTYPE mystate IS (s0,s1,s2,s3,s4,s5);SIGNAL c_state,next_state: mystate;BEGINPROCESS (c_state)BEGINCASE c_state ISWHEN s0=> next_state <= s1; clkh<=clk1hz; clkm<=clk1hz; clks<=clk1hz;enh<='0'; enm<='0'; enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="000";WHEN s1=> next_state <= s2; clkh<=adjust; clkm<= '0'; clks<='0';enh<='1'; enm<='0';enha<='0'; clkh_a<= '0';clkm_a<= '0'; mode_ss <="001";WHEN s2=> next_state <= s3; clkh<= '0'; clkm<=adjust; clks <= '0';enh<='0';enm<='1';enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="010";WHEN s3=> next_state <= s4; clkh<= '0'; clkm<= '0'; clks<=adjust;enh<='0'; enm<='0';enha<='0'; clkh_a<= '0'; clkm_a<= '0'; mode_ss <="011";WHEN s4=> next_state <= s5; clkh<= clk1hz; clkm<= clk1hz; clks<=clk1hz;enh<='0';enm<='0';enha<='1'; clkh_a<=adjust; clkm_a<= '0'; mode_ss <="100";WHEN s5=> next_state <= s0; clkh<= clk1hz; clkm<= clk1hz; clks<=clk1hz;enh<='0'; enm<='0'; enha<='0'; clkh_a<= '0'; clkm_a<=adjust; mode_ss <="101";END CASE;END PROCESS;PROCESS (mode)BEGINIF (mode'EVENT AND mode='1') THENc_state<=next_state ;END IF;END PROCESS;END arc;扫描模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan ISPORT(clk256hz:IN STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END scan;ARCHITECTURE arc OF scan ISTYPE mystate IS (s0, s1,s2,s3,s4,s5);SIGNAL c_state,next_state: mystate;BEGINPROCESS ( c_state )BEGINCASE c_state ISWHEN s0=> next_state <=s1; ss<="010";WHEN s1=> next_state <=s2; ss<="011";WHEN s2=> next_state <=s3; ss<="100";WHEN s3=> next_state <=s4; ss<="101";WHEN s4=> next_state <=s5; ss<="110";WHEN s5=> next_state <=s0; ss<="111";END CASE;END PROCESS;PROCESS (clk256hz)BEGINIF (clk256hz'EVENT AND clk256hz='1') THENc_state<=next_state ;END IF;END PROCESS;END arc;复用模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux ISPORT(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);alarm:OUT STD_LOGIC);END mux;ARCHITECTURE arc OF mux ISSIGNAL a,hhtmp,hltmp,mhtmp,mltmp,shtmp,sltmp:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(mode_ss)BEGINCASE mode_ss ISWHEN "000"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "001"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "010"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "011"=>hhtmp<=hh; hltmp<=hl; mhtmp<=mh; mltmp<=ml; shtmp<=sh; sltmp<=sl;WHEN "100"=> hhtmp<=hha; hltmp<=hla; mhtmp<=mha; mltmp<=mla; shtmp<=sh; sltmp<=sl;WHEN "101"=> hhtmp<=hha; hltmp<=hla; mhtmp<=mha; mltmp<=mla; shtmp<=sh; sltmp<=sl;WHEN OTHERS=>hhtmp<="0000";hltmp<="0000";mhtmp<="0000";mltmp<="0000";shtmp<="0000";sltmp<="0000"; END CASE;END PROCESS;PROCESS(ss)BEGINCASE ss ISWHEN "010"=> a <=hhtmp;WHEN "011"=> a <=hltmp;WHEN "100"=> a <=mhtmp;WHEN "101"=> a <=mltmp;WHEN "110"=> a <=shtmp;WHEN "111"=> a <=sltmp;WHEN OTHERS => a <="0000";END CASE;y<=a;END PROCESS;alarm<='1' WHEN ((hh=hha)AND(hl=hla)AND(mh=mha)AND(ml=mla)) ELSE '0';END arc;闪烁模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY blink_control ISPORT(ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);blink_en:OUT STD_LOGIC);END blink_control;ARCHITECTURE arc OF blink_control ISBEGINPROCESS (ss,mode_ss)BEGINIF(ss="010" AND mode_ss="001") THEN blink_en<='1';ELSIF(ss="011" AND mode_ss="001") THEN blink_en<='1';ELSIF(ss="100" AND mode_ss="010") THEN blink_en<='1';ELSIF(ss="101" AND mode_ss="010") THEN blink_en<='1';ELSIF(ss="110" AND mode_ss="011") THEN blink_en<='1';ELSIF(ss="111" AND mode_ss="011") THEN blink_en<='1';ELSIF(ss="010" AND mode_ss="100") THEN blink_en<='1';ELSIF(ss="011" AND mode_ss="100") THEN blink_en<='1';ELSIF(ss="100" AND mode_ss="101") THEN blink_en<='1';ELSIF(ss="101" AND mode_ss="101") THEN blink_en<='1';ELSE blink_en<='0';END IF;END PROCESS;END arc;Top文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY design3 ISPORT (mode,adjust,clk1hz,clk2hz,clk256hz,clk1khz:IN STD_LOGIC;alarm,a,b,c,d,e,f,g:OUT STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END design3;ARCHITECTURE arc OF design3 ISCOMPONENT mode_adjust_with_alarm PORT (adjust,mode,clk1hz: IN STD_LOGIC;clkh,enh,clkm,enm,clks,enha: OUT STD_LOGIC;clkh_a,clkm_a:OUT STD_LOGIC;mode_ss: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;COMPONENT scan PORT (clk256hz:IN STD_LOGIC;ss:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;COMPONENT segment4to7 PORT (s: IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g: OUT STD_LOGIC);END COMPONENT;COMPONENT mux PORT(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);alarm:OUT STD_LOGIC);END COMPONENT;COMPONENT blink_control PORT(ss,mode_ss:IN STD_LOGIC_VECTOR(2 DOWNTO 0);blink_en:OUT STD_LOGIC);END COMPONENT;COMPONENT count24 PORT (clk,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT count60 PORT (clk ,en:IN STD_LOGIC;cout:OUT STD_LOGIC;hh,hl:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;SIGNALclkh,enh,clkm,enm,clks,clkh_a,clkm_a,coutm,couts,coutm_en,couts_en,cout,vcc,coutma_en,coutma,alarm1,bli nk_en,blink_tmp,enha: STD_LOGIC;SIGNAL mode_ss,ss1:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL hh,hl,mh,ml,sh,sl,hha,hla,mha,mla,y,i:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINvcc<='1';coutm_en <= enh OR coutm;couts_en <= enm OR couts;coutma_en<= enha OR coutma;blink_tmp<=blink_en and clk2hz;i(3)<=y(3) OR blink_tmp;i(2)<=y(2) OR blink_tmp;i(1)<=y(1) OR blink_tmp;i(0)<=y(0) OR blink_tmp;ss<=ss1;alarm<=alarm1 AND clk1khz;u1:mode_adjust_with_alarmPORT MAP( adjust,mode,clk1hz,clkh,enh,clkm,enm,clks,enha,clkh_a,clkm_a,mode_ss);u2:count24 PORT MAP(clkh,coutm_en,cout,hh,hl);u3:count60 PORT MAP(clkm,couts_en,coutm,mh,ml);u4:count60 PORT MAP(clks,vcc,couts,sh,sl);u5:count24 PORT MAP(clkh_a,coutma_en,cout,hha,hla);u6:count60 PORT MAP(clkm_a,vcc,coutma,mha,mla);u7:mux PORT MAP(hh,hl,mh,ml,sh,sl,hha,hla,mha,mla,ss1,mode_ss,y,alarm1);u8:scan PORT MAP(clk256hz,ss1);u9:blink_control PORT MAP(ss1,mode_ss,blink_en);u10:segment4to7 PORT MAP(i,a,b,c,d,e,f,g);END arc;实验结果:数字钟包括正常的时分秒计时, 实验箱左下角的6个动态数码管(DS6 A~DS1A)显示时、分、秒。
数字电子时钟程序【闹铃(持续5s),整点报时(几点报几下,每两下之间隔间2s,每声持续2s)】程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//此表为LED 的字模, 共阴数码管0-9 -uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/sbit key1=P3^0;sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit buzz=P1^3;uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1uchar seconde1=0;uchar bjcs;uchar minite1=0;uchar hour1=7;uchar seconde2=0;uchar minite2=0;uchar hour2=8;uchar temp1=0;uchar temp2=0;uchar count1,flag,temp;/*函数声明*/void delay(uint z); //延时子程序void time_pro( ); //时间处理子程序void display(uchar hour,uchar minite,uchar seconde); //显示子程序void keyscan( ); //键盘扫描子程序void zhengdian();void dinshi();void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}void time_pro(void) /*时间处理子程序*/{if(seconde1==60){seconde1=0;minite1++;if(minite1==60){minite1=0;hour1++;if(hour1==24){hour1=0;}}}}void display(uchar hour,uchar minite,uchar seconde) /*显示子程序*/ {uchar h1,h2,m1,m2,s1,s2;s2=seconde/10;s1=seconde%10;m2=minite/10;m1=minite%10;h2=hour/10;h1=hour%10;P2=0XFE; //1111 1110if(temp1==1) //功能选项,通过点提醒来调节相应位的时间P0=dispcode[s1]|0x80; //点提醒elseP0=dispcode[s1];//秒个位delay(1);P2=0XFD;//1111 1101P0=dispcode[s2];//秒十位delay(1);P2=0XFB; //1111 1011P0=dispcode[10];//间隔符-delay(1);P2=0XF7; //1111 0111if(temp1==2)//P0=dispcode[m1]|0x80;elseP0=dispcode[m1];//分个位delay(1);P2=0XEF; //1110 1111P0=dispcode[m2];//分十位delay(1);P2=0XDF; //1101 1111P0=dispcode[10];//间隔符-delay(1);P2=0XBF; //1011 1111if(temp1==3)P0=dispcode[h1]|0x80;//时个位elseP0=dispcode[h1];delay(1);P2=0X7F; //0111 1111P0=dispcode[h2];//时十位delay(1);}void keyscan(void) /*键盘扫描子程序*/{if(key1==0){delay(10);if(key1==0){//TR0=0;temp1++;if(temp1==4){temp1=0;TR0=1;}while(!key1)switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}if(key2==0){delay(10);if(key2==0){if(temp2==0) //闹钟选择键{//TR0=0;switch(temp1){case 1:seconde1++;if(seconde1==60)seconde1=0;break;case 2:minite1++;if(minite1==60)minite1=0;break;case 3:hour1++;if(hour1==24)hour1=0;break;}while(!key2)display(hour1,minite1,seconde1);}if(temp2==1){ TR0=1;switch(temp1){case 1:seconde2++;if(seconde2==60)seconde2=0;break;case 2:minite2++;if(minite2==60)minite2=0;break;case 3:hour2++;if(hour2==24)hour2=0;break;}while(!key2)display(hour2,minite2,seconde2);}}}if(key3==0){delay(10);if(key3==0){if(temp2==0){ //TR0=0;switch(temp1){case 1:if(seconde1==0)seconde1=60;seconde1--;break;case 2:if(minite1==0)minite1=60;minite1--;break;case 3:if(hour1==0)hour1=24;hour1--;break;}while(!key3)display(hour1,minite1,seconde1);}if(temp2==1){ TR0=1;switch(temp1){case 1:if(seconde2==0)seconde2=60;seconde2--;break;case 2:if(minite2==0)minite2=60;minite2--;break;case 3:if(hour2==0)hour2=24;hour2--;break;}while(!key3)display(hour2,minite2,seconde2);}}}if(key4==0){delay(10);if(key4==0){temp1=0;temp2++;if(temp2==2)temp2=0;while(!key4)switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}switch(temp2){case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}void dinshi() /*定时闹钟*/{uint i;if(hour1==hour2&&minite1==minite2&&(seconde1>=seconde2&&seconde1<seconde2 +5)){for(i=0;i<200;i++){buzz=1;buzz=0;}} /*整点报警*/ /*void zhengdian (void){ uint k;if((seconde1 == 0)&&(minite1 ==0)){for(bjcs = 0; bjcs<hour1; bjcs++){for(k=0;k<150;k++){buzz=0;delay(20);}buzz=1;delay(20);}}} */void zhengdian (void){if(seconde1==0&&minite1==0){ temp=hour1;flag=1; //标记buzz=1;}}/*主函数*/void main(void){TMOD=0x11; //time0为定时器,方式1TH0=0x3c; //预置计数初值,50msTL0=0xb0;TH1=(65535-50000)/256;TL1=(65535-50000)%256;EA=1; //总中断开ET0=1; //允许定时器0中断TR0=1;ET1=1;TR1=1;buzz=0; //开启定时器0{keyscan(); //按键扫描dinshi(); //定时闹钟// zhengdian(); //整点报时switch(temp2) //显示时间{case 0:display(hour1,minite1,seconde1);break;case 1:display(hour2,minite2,seconde2);break;}}}void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次{TH0=0x3c; //手动加载计数脉冲次数TL0=0xb0;// TMOD=0x11;mstcnt++;zhengdian(); //用于计算时间,每隔50ms加1if(mstcnt==20) //mstcnt满20即为一秒{seconde1++; //秒+1time_pro( ); //时间处理mstcnt=0; //对计数单元的清零,重新开始计}}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;if(flag==1){count1++;if(count1<=40)buzz=1;if(40<count1&&count1<80)buzz=0;if(count1==80){count1=0;temp--; // 时间减一}if(temp==0)flag=0;}仿真图:。