数字电子时钟源程序
数字电路中产生1Hz时钟信号源的方法及其工作原理
数字电路中产⽣1Hz时钟信号源的⽅法及其⼯作原理2019-07-17摘要:数字电路中常常需要准确、稳定的脉冲信号源来⽤作分频、定时,产⽣节拍脉冲和脉冲序列以及执⾏数字运算等。
本⽂介绍采⽤CD406014位⼆进制计数/分频/振荡器与⼀个CD4027相连接产⽣脉冲信号,即秒信号(1HZ)的产⽣,也就是计数器电路中计数脉冲CP的形成。
除此以外还可采⽤CD4060与74LS90相连接都能产⽣1HZ信号脉冲。
关键词:分频;计数;脉冲;振荡⽅法⼀:CD4060、CD4027时钟信号源电路1HZ时钟信号源实际上就是“秒”信号源。
它是电⼦计时钟表和许多电⼦仪表和⾃动测量控制装置中⼗分重要的时钟信号。
这种秒信号源除了某些集成电路设有专门的秒信号发⽣发⽣电路外,⼤多数使⽤通⽤数字集成电路来组成。
例如⽤各类门电路,包括施密特门等,将门电路与RC元件或⽯英晶体组合,组成RC或⽯英晶体多谐振荡器,通过多级分频取得1HZ的秒时钟信号。
其中最常⽤的秒时钟信号源是由“⼗四位⼆进制串联计数器/分频器和振荡器集成电路CD4060”组成的秒时基信号源。
对于CD4060来说,它是⼀只⼗四位⼆进制/分频和振荡器集成电路,该电路内含⼀个⼗四位⼆进制计数/分频器和两个独⽴的反相器。
⼗四级分频器的分频范围为:16―16384。
可根据电路需要来选摘不同的分频系数,在⼀般电⼦钟表电路中都采⽤晶振频率为32768HZ的⽯英晶体,选⽤16384的分频系数将其分频为1HZ的输出,作为秒时基脉冲信号。
其详细引脚功能如下:CD4060为16引脚扁平塑封结构,其中16脚、8脚分别为电源正、负端外,7、5、4、6、14、13、15、1、2、3分别为分频输出端Q4~Q14。
其中Q1、Q2、Q3和Q11四个分频端不引出,实际上引出端为10个。
12脚为复位端R。
其余3个引脚9、10、11则为内部两只反相器外引脚,当⽤它作为RC振荡器时,9脚接振荡电容,10脚接振荡电阻,11脚接保护电阻。
数字电子钟方案及对策
一、设计方案1、总体设计方案说明及系统框图:数字钟是计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和报时功能。
一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。
干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发现一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态菁七段显示译码器译码,通过LED显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一脉冲信号,控制信号灯亮灭周期。
由于计数的起始时间不可能与标准时间(如时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。
通常使用石英晶体振荡器电路构成数字钟。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。
数字电子钟的总体框图如下图所示。
系统框图:2、单元电路设计方案:1)振荡器和分频器振荡器的作用是产生时间标准信号。
数字钟的精度就是主要取决于时间标准信的频率和稳定度。
所以,在实验中采用脉冲信号作为时间标准信号源。
2)计数器根据计数周期分别组成两个60进制(秒、分)和一个24进制(时)的计数器。
把它们适当连接构成秒、分、时的计数,(分计数器中分的个位和十位计数单元的状态转换和秒计数器中的是一样的,只是它要把进位信号传输给时的个位计数单元。
) 实现计时功能。
LED数字显示电子时钟源程序代码
LED数字显示电子时钟源程序代码程序:(注已完全经过调试,达到预期目的)#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar count=0;sbit LED=P1^0;uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示数码管0,1,3,4,5,6,7,8,9 uchar miao=0,fen=0,hour=0;void delay(uint i) //延迟函数{uint j;for(;i>0;i--)for(j=124;j>0;j--);}void init(){ET0=1;TMOD=0x51; //选定定时器0,1和中断0,1TH0=(65536-25000)/256;TL0=(65536-25000)%256; //设定时器0时间为250ms一次ET1=1;TH1=0xff;TL1=0xff; //定时器1为中断EX0=1;IT0=1; //中断0开EX1=1;IT1=1; //中断1开TR0=1; //定时器0开TR1=1; //定时器1开EA=1; //总中断开}void display() //时钟显示函数{P0=tab[hour/10%10];P2=0xfe;delay(1);P0=tab[hour%10];P2=0xfd;delay(1);P0=tab[fen/10%10];P2=0xfb;delay(1);P0=tab[fen%10];P2=0xf7;delay(1);P0=tab[miao/10%10];P2=0xef;delay(1);P0=tab[miao%10];P2=0xdf;delay(1);}void main() //主函数{init();LED=0;while(1){display();}}void T0_int() interrupt 1 //定时器0函数{TH0=(65536-25000)/256;TL0=(65536-25000)%256;count++;if(count==20){count=0;miao= miao +1;LED=~LED;if(sec==60){miao=0;fen= fen +1;if(fen ==60){fen =0;hour=hour+1;if(hour==24)hour=0;}}}}void T1_int() interrupt 3 //定时器1函数控制秒针加1 {TH1=0xff;TL1=0xff;miao=miao+1;if(miao ==60)miao =0;}void I1_int() interrupt 2 //中断1函数控制按键分针加1 {EX0=0;fen= fen +1;if(fen ==60)fen =0;EX0=1;}void I0_int() interrupt 0 //中断函数0控制按键时针加1 {EX1=0;hour=hour+1;if(hour==24)hour=0;EX1=1;}。
多功能数字电子钟_VHDL
四、各功能模块的源程序代码 :
-- CONTOR 模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity contor is
1 )“小时” 校时状态: 进入“小时”校时状态后,显示 “小时” 的数码管闪烁,每按动“ k” 键一次,“小时” +1,若不按动“ k”键 则小时数不变,一直按下“ k” 键则小时数一 4Hz 的频率递增计数。
2 )“分”校时状态:进入“分”校时状态后,显示“分”的数 码管闪烁,每按动“ k” 键一次,“分” +1,若不按动“ k”键则分数 不变,一直按下“ k” 键则分数一 4Hz的频率递增计数。
chs,cms,css,f4 :in std_logic; bsg,bmg,bhg,bsd,bmd,bhd :buffer std_logic_vector(3 downto 0); comout :out std_logic); end time_com; architecture time_comx of time_com is begin com:process(hh,mh,sh,hl,ml) begin if(bhg=hh and bhd=hl and bmg=mh and bmd=ml and bsg=sh)then comout<='1'; else comout<='0'; end if; end process; set:process(f4) begin if(f4'event and f4='1')then if(chs='1'and k='0')then if(bhg="0010" and bhd="0011")then bhd<="0000";bhg<="0000"; elsif(bhd="1001")then bhd<="0000";bhg<=bhg+1; elsif(bhd="0000"or bhd="0001" or bhd="0010"or bhd="0011"or bhd="0100"or bhd="0101"or bhd="0110"or bhd="0111"or bhd="1000")then bhd<=bhd+1; end if; end if; end if; end process; process(f4) begin if(f4'event and f4='1')then if(cms='1'and k='0')then if(bmg="0101" and bmd="1001")then
简单的数字时钟(verilog设计)
设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
Verilog中的并行语句包括
模块实例化、连续赋值语句、门级电路描述等,用于描述电路的并行行为。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
纯数字电路数字时钟原理图(免费)
做成时钟,并不难,把十进改成6进就行了如下:1,震荡电路的电容用晶震,记时准确.2, 时:用2块计数器,十位的用1和2(记时脚)两个脚.分:用2块计数器,十位的用1,2,3,4,5,6,(记时脚)6个脚.秒:同分.评论:74系列的集成块不如40系列的,如:用CD4069产生震荡,CD4017记数,译码外加.电压5V.比74LS160 74LS112 74LS00好的.而且CD4069外围元件及少.如有需要我可以做给你.首先需要产生1hz的信号,一般采用CD4060对32768hz进行14分频得到2hz,然后再进行一次分频。
(关于此类内容请参考数字电路书中同步计数器一章)(原文件名:4060.JPG)一种分频电路:(原文件名:秒信号1.JPG)采用cd4518进行第二次分频另一种可以采用cd4040进行第二次分频第三种比较麻烦,是对1mhz进行的分频(原文件名:秒信号2.JPG)介绍一下cd4518:CD4518,该IC是一种同步加计数器,在一个封装中含有两个可互换二/十进制计数器,其功能引脚分别为1~7和9~{15}。
该计数器是单路系列脉冲输入(1脚或2脚;9脚或10脚),4路BCD码信号输出(3脚~6脚;{11}脚~{14}脚)。
此外还必须掌握其控制功能,否则无法工作。
手册中给有控制功能的真值(又称功能表),即集成块的使用条件,如表2所示。
从表2看出,CD4518有两个时钟输入端CP和EN,若用时钟上升沿触发,信号由CP输入,此时EN端应接高电平“1”,若用时钟下降沿触发,信号由EN端输入,此时CP端应接低电平“0”,不仅如此,清零(又称复位)端Cr也应保持低电平“0”,只有满足了这些条件时,电路才会处于计数状态,若不满足则IC不工作。
计数时,其电路的输入输出状态如表3所示。
值得注意,因表3输出是二/十进制的BCD码,所以输入端的记数脉冲到第十个时,电路自动复位0000状态(参看连载五)。
另外,该CD4518无进位功能的引脚,但从表3看出,电路在第十个脉冲作用下,会自动复位,同时,第6脚或第{14}脚将输出下降沿的脉冲,利用该脉冲和EN端功能,就可作为计数的电路进位脉冲和进位功能端供多位数显用。
电子设计自动化(EDA)_数字时钟程序模块(LED数码管显示)_实验报告
电子设计自动化(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)显示时、分、秒。
电子钟的工作原理
电子钟的工作原理电子钟是一种通过电子技术来测量和显示时间的设备。
它使用电子元件和数字显示屏来实现时间的精确测量和显示。
下面将详细介绍电子钟的工作原理。
1. 时钟信号生成电子钟的核心是一个时钟信号生成器,它产生一个稳定的、精确的时间基准信号。
这个信号通常是一个固定频率的方波信号,可以通过晶体振荡器或者其他稳定的时钟源来生成。
晶体振荡器是一种利用晶体的振荡特性来产生稳定频率信号的设备。
这个时钟信号会被用作整个电子钟系统的基准。
2. 时钟信号处理生成的时钟信号会经过一系列的处理步骤,以满足电子钟的功能需求。
首先,信号会经过分频器,将高频的时钟信号分频为较低的频率,以便于后续的计数和显示。
然后,信号会进入计数器,计数器会根据分频比例和时钟信号的频率来计算时间的流逝。
计数器通常是一个二进制计数器,它会不断累加时钟信号的脉冲,从而得到时间的值。
3. 时间显示计数器得到的时间值会通过数码管或者液晶显示屏来显示出来。
数码管是一种由多个七段显示器组成的显示设备,每一个七段显示器可以显示0-9的数字。
液晶显示屏则通过液晶材料的光学特性来显示数字和字符。
计数器输出的二进制时间值会经过编码转换器,将其转换为数码管或者液晶显示屏可以识别的信号,然后在显示屏上显示出来。
4. 时间校准为了保证电子钟的准确性,通常会加入时间校准的功能。
校准可以通过手动调整或者自动校准来实现。
手动调整是指通过按钮或者旋钮来调整时间的值,以使其与标准时间一致。
自动校准则是通过接收来自标准时间源(如无线电信号、互联网时间服务器等)的校准信号来自动调整时间的值。
5. 电源供应电子钟通常需要外部电源供应,以提供所需的电能。
电源可以是直流电源或者交流电源,具体取决于电子钟的设计和使用场景。
为了保证电子钟在断电或者电源故障时仍能正常工作,通常还会加入备用电池或者超级电容器来提供暂时的电源支持。
综上所述,电子钟的工作原理是通过时钟信号生成、信号处理、时间显示、时间校准和电源供应等步骤来实现时间的精确测量和显示。
数字电子钟设计实验报告
数字电子钟设计实验报告实验项目名称:数字电子钟的设计实验项目性质:普通试验所属课程名称:VHDL程序设计实验计划学时:4学时一、实验目的掌握VHDL程序设计方法二、实验内容和要求能够实现小时(24进制)、分钟和秒钟(60进制)的计数功能具有复位功能功能扩展:具有复位、整点报时提示、定时闹钟等功能在软件工具平台上,进行VHDL语言的各模块编程输入、编译实现和仿真验证。
三、实验主要仪器设备和材料计算机四.设计思想1、计数模块:Q0为六十进制计数,代表秒计数,当Q0<59时,每逢一个时钟上升沿Q0增加1,直到当Q0=59时,再逢一个时钟上升沿,立即输出高电平至进位CLK1。
使得CLK1为一个60秒为周期的时钟,作为六十进制分计数Q1时钟。
同理,当Q1<59时,每逢一个时钟上升沿Q1加1,直到当Q1=59,再逢一个时钟上升沿,立即输出高电平到进位CLK2。
CLK2是一个60分钟为周期的时钟,作为二十四进制时计数Q2的时钟。
2、复位模块:分别在秒,分,时计数模块语句之前加入一个判断语句IF RST=‘0',如果复位输入RST为0则跳过计数模块,不为0则运行计数模块。
3、整点报时模块:判断秒,分计数是否都为0,【Q1=("000000")AND(Q0="000000")】,如果是,则令报时ALM0输出为1,不是则输出为0。
4、定时闹钟模块:用户设定闹钟DS(秒),DF(分),DM(秒)的输入,当它们都等于输出的Q1(分),Q2(时)数值时,则令闹钟ALM1输出为1,否则输出为0。
五、源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clock ISPORT (CLK,RST:IN STD_LOGIC;CLK1,CLK2:INOUT STD_LOGIC;CLK3:OUT STD_LOGIC;S:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);F,M:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);DS:IN STD_LOGIC_VECTOR(4 DOWNTO 0);DF,DM:IN STD_LOGIC_VECTOR(5 DOWNTO 0);ALM0,ALM1:OUT STD_LOGIC);END clock;ARCHITECTURE one OF clock ISBEGINPROCESS(CLK,RST)VARIABLE Q0: STD_LOGIC_VECTOR(5 DOWNTO 0);VARIABLE Q1: STD_LOGIC_VECTOR(5 DOWNTO 0);VARIABLE Q2: STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINIF RST='0' THEN Q0:=(OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1' THENIF Q0="111011" THEN CLK1 <= '1' ;ELSE CLK1<='0';END IF ;IF Q0<59 THEN Q0:=Q0+1;ELSE Q0:=(OTHERS=>'0') ;END IF;END IF;IF RST='0' THEN Q1:=(OTHERS=>'0');ELSIF CLK1'EVENT AND CLK1='1' THENIF Q1="111011" THEN CLK2 <= '1' ;ELSE CLK2<='0';END IF ;IF Q1<59 THEN Q1:=Q1+1;ELSE Q1:=(OTHERS=>'0') ;END IF;END IF;IF RST='0' THEN Q2:=(OTHERS=>'0');ELSIF CLK2'EVENT AND CLK2='1' THENIF Q2="011101" THEN CLK3 <= '1' ;ELSE CLK3<='0';END IF ;IF Q2<23 THEN Q2:=Q2+1;ELSE Q2:=(OTHERS=>'0') ;END IF;END IF;M<=Q0;F<=Q1;S<=Q2;IF Q1=("000000")AND(Q0="000000") THEN ALM0<='1'; ELSE ALM0<='0';END IF ;IF (Q0=DM)AND (Q1=DF)AND(Q2=DS) THEN ALM1<='1'; ELSE ALM1<='0';END IF;END PROCESS;END one;六、仿真图秒到分进位:分到时进位:23时59分59秒进位:复位:整点报时:闹钟报时(闹钟时间设定为7时16分4秒):七、总结经过这次实验,让我更加熟悉了VHDL的编程实现。
用数码管(8位)显示的数字时钟程序
用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。
二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。
2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。
3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。
在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。
三、程序特点
1.采用8位数码管显示,时间更加直观。
2.支持12小时制和24小时制切换,适用于不同场景。
3.实现精度为秒的实时显示,更加准确。
四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。
2.加入温度传感器模块,实现显示温度的功能。
3.优化显示效果,增加字体和颜色等选项。
五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。
电子时钟实验报告电子时钟
电子时钟实验报告一、实验目的学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
二、设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1.在4位数码管上显示当前时间,显示格式为“时时分分”;2.由LED闪动做秒显示;3.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出音乐,按停止键使可使闹玲声停止。
三、工作原理及设计思路利用单片机定时器完成计时功能,定时器0计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,电路如右图,当P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
四、电路设计及描述(1) 硬件连接部分:在ZKS-03单片机综合实验仪上有四位共阳LED数码管,其标号分别为LED1~LED4。
为了节省MCU的I/O口,采用串行接口方式,它仅占用系统2个I/O口,即P1.0口和P1.1口,一个用作数据线SDA,另一个用作时钟信号线CLK,它们都通过跳线选择器JP1相连。
由于采用共阳LED数码管,它的阴极分别通过限流电阻R20~R27连接到控制KD_0~KD_Q7。
这样控制8个发光二极管,就需要8个I/O口。
但由于单片机的I/O 口资源是有限的,因此常采用实验电路所示的串并转换电路来扩充系统资源。
串并转换电路其实质是一个串入并处的移位寄存器,串行数据再同步移位脉冲CLK的作用下经串行数据线SDA把数据移位到KD_0~KD_Q7端,这样仅需2根线就可以分别控制8个发光二极管的亮灭。
而P0口只能作地址/数据总线,P2口只能作地址总线高8位,P3.0、P3.1作为串行输入、输出接口,实验仪上单片机可用作I/O的口仅有:P1.0--P1.7 ,8位;P3.2、P3.3、P3.4、P3.5 ,4位。
数字电子钟的制作
数字电子钟的制作1 电路原理图数字电子钟的电路原理图如图1.1所示。
图1.1 数字电子钟的电路原理图2 工作原理数字电子钟由多谐振荡器、计数器、显示译码器、显示器和校时电路组成。
多谐振荡器产生秒脉冲信号,秒脉冲送入计数器计数,计数结果通过“时”、“分”、“秒”显示译码器译码,由显示器显示时间。
数字时钟的组成框图如图2.1所示。
图2.1 数字电子钟的组成框图2.1 多谐振荡器与分频电路多谐振荡器与分频电路如图2.2所示。
多谐振荡器是一种能产生矩形波的自激振荡器,也称矩形波发生器。
“多谐”指矩形波中除了基波成分外,还含有丰富的高次谐波成分。
多谐振荡器没有稳态,只有两个暂稳态。
在工作时,电路的状态在这两个暂稳态之间自动地交替变换,由此产生矩形波脉冲信号,常用作脉冲信号源及时序电路中的时钟信号。
数字时钟里用的是555定时器构成的1khz多谐振荡器。
可调电阻Rw可以改变输出信号的频率。
图2.2 多谐振荡器电路与分频电路如图2.2所示图中电容C、电阻R1和R2作为振荡器的定时元件,决定着输出矩形波正、负脉冲的宽度。
定时器的触发输入端(2脚)和阀值输入端(6脚)与电容相连;集电极开路输出端(7脚)接R1、R2相连处,用以控制电容C的充、放电;外界控制输入端(5脚)通过0.01uF电容接地。
电路接通电源的瞬间,由于电容C来不及充电,Vc=0v,所以555定时器状态为1,输出Vo为高电平。
同时,集电极输出端(7脚)对地断开,电源Vcc 对电容C充电,电路进入暂稳态I,此后,电路周而复始地产生周期性的输出脉冲。
多谐振荡器两个暂稳态的维持时间取决于RC充、放电回路的参数。
多谐振荡器与分频电路为计数器提供计数脉冲和为校时电路提供校时脉冲。
多谐振荡器的振荡频率设计为2Hz,R为51KΩ,RW大约为50 KΩ,C为4.7μF。
多谐振荡器产生的2Hz脉冲信号为校时电路的校时脉冲。
2Hz脉冲信号经过CD4013组成的分频器,进行2分频,输出1 Hz的秒脉冲为计数器的计数脉冲。
数字电子钟逻辑电路设计
数字电子钟逻辑电路设计数字电子钟是一种应用广泛的数字化产品,它不仅方便准确地显示时间,还具备功能丰富、外观美观等优点。
本文将介绍数字电子钟的逻辑电路设计,包括时钟信号输入模块、计数模块、显示模块以及设置功能模块等方面。
一、时钟信号输入模块时钟信号输入模块是数字电子钟的核心模块之一,它负责提供准确的时钟信号供其他模块使用。
在设计时钟信号输入模块时,我们可以采用晶振作为时钟源,通过将晶振输出的脉冲信号进行适当的处理,得到精确的时钟信号。
具体而言,我们可以通过使用频率分频电路,将晶振输出的高频脉冲信号分频成我们需要的低频时钟信号。
这样能够降低电路的复杂度,提高系统的稳定性和可靠性。
二、计数模块计数模块是实现数字电子钟时间计数功能的核心模块。
在设计计数模块时,我们可以采用分秒计数和时分计数两种方式。
对于分秒计数,我们可以使用两个计数器分别表示分钟和秒钟,当秒钟计数到59时,分钟计数器加1,同时秒钟计数器清零,从而实现分秒的连续计数。
对于时分计数,我们可以使用两个计数器分别表示小时和分钟,同样采用类似的逻辑实现。
当分钟计数到59时,小时计数器加1,同时分钟计数器清零,从而实现时分的连续计数。
三、显示模块显示模块是数字电子钟的重要组成部分,它负责将计数模块得到的时间信息以合适的形式显示出来。
在设计显示模块时,我们可以采用数码管来显示时间信息。
数码管是一种方便实用的数字显示元件,它可根据控制信号显示0至9的数字。
我们可以通过将计数器输出的二进制信号转换为对应的数码管控制信号,从而实现时间的数字显示。
四、设置功能模块设置功能模块是数字电子钟的附加功能之一,它可以实现时间的设置和调整。
在设计设置功能模块时,我们可以引入按钮和开关等输入元件,通过对输入元件状态的检测和判断,实现时间的设置和调整。
具体而言,我们可以设计一个按钮矩阵用于选择要设置的时间单位(例如时、分、秒),再通过加减按钮来实现时间数值的单步增减操作。
数字时钟课程设计程序
数字时钟课程设计程序一、课程目标知识目标:1. 学生能理解数字时钟的构造原理,掌握时钟的数字显示方法。
2. 学生能掌握时、分、秒的概念,并运用这些概念解读数字时钟。
3. 学生了解数字时钟与日常生活、科技发展的联系。
技能目标:1. 学生能通过实际操作,制作一个简单的数字时钟模型。
2. 学生能运用所学知识,解决数字时钟相关的问题。
3. 学生能运用信息技术手段,收集、整理与数字时钟相关的资料。
情感态度价值观目标:1. 学生培养对数字时钟的兴趣,激发探究时间的欲望。
2. 学生在合作学习中,培养团队协作精神和解决问题的能力。
3. 学生认识到时间的重要性,养成珍惜时间、合理安排时间的习惯。
课程性质:本课程为信息技术与科学相结合的综合性课程,旨在培养学生的动手能力、创新能力和时间观念。
学生特点:六年级学生具有较强的观察力、思维力和动手能力,对新鲜事物充满好奇心。
教学要求:注重理论与实践相结合,引导学生主动探究,关注学生个体差异,提高学生的综合素质。
将课程目标分解为具体的学习成果,以便于后续的教学设计和评估。
二、教学内容1. 数字时钟的基础知识:- 时、分、秒的概念及相互关系- 数字时钟的构造原理及工作方式- 数字时钟的显示方法及特点2. 数字时钟的制作:- 选择合适的材料和工具- 设计数字时钟的电路图- 实际操作,制作数字时钟模型3. 数字时钟的应用与问题解决:- 数字时钟在生活中的应用案例- 运用数字时钟知识解决实际问题- 信息技术手段在数字时钟学习中的应用4. 时间观念与时间管理:- 认识时间的重要性- 学会珍惜时间,合理安排时间- 时间管理的方法与技巧教学内容安排和进度:第一课时:数字时钟基础知识学习第二课时:数字时钟制作(1)第三课时:数字时钟制作(2)第四课时:数字时钟应用与问题解决第五课时:时间观念与时间管理教材章节:- 第四章《电子时钟与计时器》- 第一节《电子时钟的原理与制作》- 第二节《计时器及其应用》教学内容与课本紧密关联,遵循科学性和系统性原则,注重培养学生的动手能力、创新能力和时间观念。
数字电子钟课程设计报告
单片机原理与应用摘要本论文基于单片机原理技术介绍了一款于STC89C52芯片作为核心控制器的单片机数字电子钟的设计与制作,包括硬件电路原理的实现方案设计、软件程序编辑的实现、数字电子钟正常工作的流程、原理图仿真实现、硬件实物的安装制作与硬件实物的调试过程。
该单片机数字电子钟采用LED 数码管能够准确显示时间(显示格式为:时时,分分,秒秒),可随时进行时间调整,时间可采用12 小时制显示或24 小时制显示,采用12 小时显示时可在标志位数码管上显示A(表示上午)或B(表示下午),可暂停时间的变动,暂停时一位数码管上显示字母T,可按自己的要求设置扩展的小键盘个数。
关键词:单片机;数字电子钟;数码管;STC89C52目录1.设计任务与要求 (3)1.1设计任务 (3)1.2设计要求 (3)2.方案设计与论证 (4)2.1单片机芯片选择方案 (4)2.2数码管显示选择方案 (5)2.3数码管驱动选择方案 (5)3.硬件单元电路设计与参数计算 (6)3.1电源电路 (6)3.2按键电路 (6)3.3时钟电路 (6)3.4驱动电路 (7)3.5LED显示电路 (7)3.6单片机电路 (7)4.软件设计与流程图 (8)4.1数字电子时钟主程序流程图 (8)4.2中断服务程序流程图 (8)4.3显示子程序流程图 (11)5.总原电路及元器件清单 (12)5.1总原理图 (12)5.2PCB制板图 (13)5.3整体电路仿真图 (14)5.4元件清单 (15)心得体会 (16)参考文献 (17)致谢 (18)程序清单 (19)1.设计任务与要求1.1设计任务用单片机设计一个数字电子钟,采用LED 数码管来显示时间。
1.2设计要求(1)显示格式为:XX:XX:XX,即:时:分:秒。
(2)时间可采用12 小时制显示或24 小时制显示,采用12 小时显示时必须在另外一个数码管上显示A(表示上午)或B(表示下午)。
(3)设置一个按键用于时间显示方式的切换。
多功能电子钟程序(完全好使)
/*设计功能:1.时钟功能(上排数码管)每秒更新一次时钟显示,显示方式为MM.SS,其中M为分钟,S为秒。
可以通过按键调整当前时间,调整时间时需要闪烁调整位置的数值。
2.秒表功能(下排数码管)按开始按键开始走秒,按停止按键停止走秒,按清除按键秒表归零,显示方式为:SSS.U,其中S为秒,U为0.1秒。
3.闹钟功能(下排数码管)用按键设置闹钟时间,显示格式为MM.SS。
闹钟时间到达后,闪烁一个指示灯。
可以用按键设置闹钟、取消闹钟。
各个按键功能可以自行定义,每按一次任何按键,D2灯会翻转一次状态*//*硬件连接:一个有上下两个4位共阳数码管,4个按键,2个LED指示灯P2高四位控制上排数码管位选,低4位控制下排数码管位选,P0控制段选四个按键为独立按键,与P2高4位相连,与数码管复用LED0接P34,LED1接P35*//*使用方法:第一步:设定系统时间,在上排的4位数码管显示,注意系统时间设定确认后就不得修改了第二步:选择秒表模式或闹钟模式,在下排的4位数码管显示。
两种模式只能选择一种,并且不能切换。
1.设定系统时间此时按键定义:S5 移位,S6 加,S7 减,S8确认一开始上电时数字全0不闪烁,默认从第一位开始设置,按下加减进行调节,如此要更换调节位置,每按一次S5会右移一位,移到第四位再按会重新移回第一位。
设置完系统时间,按下S8确认,跳出设定环节,进入秒表和闹钟模式选择环节。
2。
秒表和闹钟模式选择此时按键定义:S5 改变模式标志,S6 S7未用,S8确认进入该模式设置完系统时间,进入秒表和闹钟模式选择环节。
此时第一位为0 。
然后按S5,第一位会在1和2之间来回切换,在显示1时按S8进入秒表模式,在显示2时按S8进入闹钟模式,2.1秒表模式此时按键定义:S5 未用,S6 开始,S7停止,S8清除2.2闹钟模式此时按键定义:S5 移位,S6 加,S7 减,S8按一次确认,等报警到了,再按S8停止报警如设定系统时间的步骤,设定好闹钟时间,按S8确认设定(S8只能按一次哦),等时间到了D1灯会不断闪烁表示报警,按S8停止报警*/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit keysource= P1^7;sbit S5= P2^4;sbit S6= P2^5;sbit S7= P2^6;sbit S8= P2^7;sbit led0=P3^4; //每按一次任何按键,D2灯会翻转一次状态sbit led1=P3^5; //闹钟报警用的灯uint shuju_1;uint shuju_2;uint count;uint stopwatch_count;int miao;int fen;int warn_miao;int warn_fen;uint shanshuo; //1 2 3 4bit shanshuo1,shanshuo2,shanshuo3,shanshuo4;uint num_settime_cnt; //标识按键5设置时间时,按下的次数uint num_setmode_cnt; //1 or 2uint stopwatch_miao;uint stopwatch_Umiao;uint stopwatch_miao_1;uint stopwatch_Umiao_1;uint mode_flag;uint warn_flag;uint stopflag = 1; //初始时先让秒表停止uchar code shuma[] = {0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/}; // 共阳数码管void delay(uint z) // 1ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_1() // 上排{uchar qian,bai,shi,ge;qian = shuju_1/1000;bai = shuju_1%1000/100;shi = shuju_1%100/10;ge = shuju_1%10;////xianshi 1////P2 |= 0xf0; //高4位全部置1P2 &= 0xef; //改变高4位,低4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0xf0;P2 &= 0xdf;if(shanshuo2 == 1)P0= 0xff;elseP0=shuma[bai]&0x7f; //要点亮小数点delay(1);////xianshi 3////P2 |= 0xf0;P2 &= 0xbf;if(shanshuo3 == 1)P0= 0xff;elseP0=shuma[shi];delay(1);////xianshi 4////P2 |= 0xf0;P2 &= 0x7f;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void display_2() // 下排{uchar qian,bai,shi,ge;qian = shuju_2/1000;bai = shuju_2%1000/100;shi = shuju_2%100/10;ge = shuju_2%10;////xianshi 1////P2 |= 0x0f; //低4位全部置1P2 &= 0xfe; //改变低4位,高4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0x0f;P2 &= 0xfd;if(shanshuo2 == 1)P0= 0xff;else if (mode_flag == 2){P0=shuma[bai]&0x7f;}else{P0=shuma[bai] ;}delay(1);////xianshi 3////P2 |= 0x0f;P2 &= 0xfb;if(shanshuo3 == 1)P0= 0xff;else if (mode_flag == 1){P0=shuma[shi]&0x7f;}else{P0=shuma[shi] ;}delay(1);////xianshi 4////P2 |= 0x0f;P2 &= 0xf7;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void check_ledflash() //判断哪一位正在设置中,让该位闪烁{switch(shanshuo) //利用shanshuo标志来判断,当前正在在哪一位设定{case 1:shanshuo1 = ~shanshuo1; //如果为第一位,则第一位闪烁,其它位不闪烁shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;case 2:shanshuo2 = ~shanshuo2;//如果为第二位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo3 =0;shanshuo4 =0;break;case 3:shanshuo3 = ~shanshuo3;//如果为第三位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo4 =0;break;case 4:shanshuo4 = ~shanshuo4;//如果为第四位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;break;default:shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;}}void settime()//设定系统时间,时间格式:分-分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
send(0x0500+(m%10));
*PEDATDIR=0xFF04;delay(1000);*PEDATDIR=0xFF00;}}
if((*PFDATDIR & 0X0004)==0) //按下KEY2,则分钟减
{*T1CON &= ~0x0040;//停止定时器1
{
*PBDATDIR=0xFF00; //IOPB(MAX7219的LOAD引脚)输出低电平
*SPITXBUF=data; //发送一个字符
while((*SPISTS&0x40)!=0x40); //循环,直到SPI有中断,说明发送完毕
data = *SPIRXBUF; //空读SPIRXBUF,以清除SPI中断标志
{*T1CON &= ~0x0040;}//停止定时器1
if((*PFDATDIR & 0X0008)==0) //若按下KEY3,则复位时钟
{*T1CON &= ~0x0040;//停止定时器1
for(n=0;n<8;n++) //显示全0
{send(d[n]);}
k=0;s=30;m=59;h=23 ;}
enable();//允许全局中断
//设置MAX7219到需要的工作状态
send(0x0C01);//关闭Shutdown模式,正常操作
send(0x09FF);//全部8个数字都采用解码模式
send(0x0A08);//亮度17/32
send(0x0B07);//扫描全部8个数码管
send(0x0F00);//关闭测试模式
if((*PFDATDIR & 0X0010)==0) //若按下KEY4
{ *T1CON &= ~0x0040;j++;}
}
while(j==2)
{
if((*PFDATDIR & 0X00010)==0) //若按下KEY4,则继续开启时钟
{*T1CON |= 0x0040;
j=1;k=0;s=s;m=m;h=h;}
*PBDATDIR=0xFF08; //IOPB.3=LOAD = 1,上升沿锁存
}
//INT2中断服务程序
void interrupt GISR2()
{
unsigned int i;
switch(*PIVR)
{
case 0x0027://是定时器1周期中断
*EVAIFRA=*EVAIFRA|0x0080;//清除定时器1周期中断标志k += 1;
}
}
}
{m--;if(m==-1){m=59; h-=1;};
if(h==-1){h=23; };
send(0x0100+(h/10));
send(0x0200+(h%10));
send(0x0400+(m/10));
send(0x0500+(m%10));
*PBDATDIR=0xFF04;delay(1000);*PBDATDIR=0xFF00;}}
void interrupt nothing()
{enable(); return; //允许总中断然后中断返回,因一进入ISR后,总中断就被自动关闭了
}
//主程序
void main(void)
{
unsigned int n;
disable();//关闭全局中断
chushihua();//初始化
dingshi();//初始化定时器1
if((*PFDATDIR & 0X0002)==0) //按下KEY1,则分钟加
{*T1CON &= ~0x0040;//停止定时器1
{m++;if(m>59){m-=60; h+=1;};
if(h>23){h-=24; };
send(0x0100+(h/10));
send(0x0200+(h%10));
*T1PER=0x0270; //(0x0270+1)*64/40 us =1ms
*T1CNT=0; //赋定时器初值
*EVAIFRA=*EVAIFRA; //清除可能存在的定时器1周期中断标志*EVAIMRA=*EVAIMRA|0x0080; //允许定时器1周期中断
}
//用SPI发送一个字符
void send(unsigned int data)
WSGR=0x00; //禁止所有的等待状态
}
//延时子程序
void delay(unsigned int pp)
{
unsigned int k,i;
for(k=0;k<pp;k++)
{
for(i=0;i<3997;i++);//延时1ms}Βιβλιοθήκη }//定时1初始化
void dingshi()
{
*T1CON=0x160C; //停止运行、连续增计数模式
unsigned int d[8] = {0x0100,0x0200,0x030a,0x0400,0x0500,0x060a,0x0700,0x0800};
unsigned int w[8] = {0x0101,0x0204,0x030a,0x0400,0x0503,0x060a,0x0700,0x0804};
#include "2407c.h"//数字电子时钟按Key1启动、Key2暂停、Key3复位、Key4调时
#define disable() asm(" setc INTM")//禁止全局中断
#define enable() asm(" clrc INTM")//允许全局中断
unsigned int k=0,s=30,m=59,h=23,j=1;
send(d[3]+(m/10));
send(d[4]+(m%10));
send(d[6]+(s/10));
send(d[7]+(s%10));
break;
default:
break;
}
enable();//允许总中断,因一进入ISR后,总中断就被自动关闭了
return; //中断返回
}
//其他中断
if(k>999){k-=1000; s+=1;}//超过999ms,需要进位
if(s>59){s-=60; m+=1;}//超过59s,需要进位
if(m>59){m-=60; h+=1;}//超过59m,需要进位
if(h>23){h-=24; }
send(d[0]+h/10);
send(d[1]+(h%10));
//系统初始化子程序
void chushihua (void)
{
asm (" clrc SXM"); //抑制符号位扩展
asm (" clrc OVM"); //累加器正常溢出
asm (" clrc CNF");//B0被配置为数据存储空间
*WDCR=0x00E8; //关闭看门狗
*SCSR1=0X00FC; //CLKIN=10M,CLKOUT=CLK*4=40M
for(n=0;n<8;n++)//显示全0
{send(d[n]);}
while(1)
{
while(j==1)
{
if((*PFDATDIR & 0X0002)==0) //若按下KEY1,则启动定时器1
{*T1CON |= 0x0040;}//启动定时器1
if((*PFDATDIR & 0X0004)==0) //若按下KEY2,则暂停定时器1
*SPICCR=0x0F; //SPI软复位、上升沿输出数据、16位数据长度
*SPICTL=0x0E; //禁止过冲中断、允许TALK(发送)数据、主机模式、禁止SPI中断
//上升沿有延时
*SPIBRR=0x0F; //SPI波特率=SYSCLK/(SPIBRR+1)=2.5M
*SPICCR=*SPICCR|0x80; //SPI恢复操作,准备发送、接收下一个字符
*IMR=0x0002; //开INT2
*IFR=0xFFFF; //清全部中断,写1清0,参见P43
*MCRB=0xFE3C; //启用SPI功能引脚
*MCRA=0; //IOPA、IOPB配置为一般I/O功能
*MCRC=0; //IOPE、IOPF配置为一般I/O功能
*PFDATDIR=0x00FF; //IOPF设置为输入,并上拉