Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrlstype
TForm1 = class(TForm)
Timer1: TTimer
Label1: TLabel
Label2: TLabel
procedure Timer1Timer(Sender: TObject)
private
{ Private declarations }
public
{ Public declarations }
endvar
Form1: TForm1implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject)
var s :string
begin
Label1.Caption := FormatDateTime('yyyy/mm/dd AM/PM hh:mm ', Now + 0.125)
Label2.Caption := FormatDateTime('hhmmss',now())
if(FormatDateTime('hhmmss',now())='000000') then
showmessage(FormatDateTime('yyyy/mm/dd AM/PM hh:mm ', Now + 0.125))
endend.
在中国有很多历史悠久的古都,在这些古都中大多都有“钟楼”、“鼓楼”。但很多人并不知道它们的用途。其实“钟楼”“鼓楼”在古代有重要的作用,它是用来报时的,也就是古代的授时系统。
在人类社会,为了统一人们的行动,就必须统一时间,因此需要建立授时系统。中国古代的授时系统就是人们常说的“晨钟暮鼓”。北京也不例外。北京的钟鼓楼是元、明、清代都城的报时中心,座落在北京市南北中轴线北端,位于北京东城区地安门外大街北端。“钟楼”和“鼓楼”前后纵置,气势雄伟,巍峨壮观。鼓楼台基高达4米,台上横列5间房屋,红墙朱栏;钟楼在鼓楼北面约100米,灰墙绿瓦。在城市钟鼓楼的建制史上,北京钟鼓楼规模最大,形制最高,是古都北京的标志性建筑之一。
那么钟鼓楼是如何定时和报时的呢?
定时的方法是滴漏或燃香。
铜刻漏从上到下分为天池、平水、万分三级漏壶,各壶下端中心处设龙嘴,将上一级漏壶之水向下一级漏壶流送。收水壶为圆柱形,壶顶部设双龙抱扶箭尺,随壶中水位缓升,14分24秒上升一刻度。漏壶前立一铙神,张臂双手执铙做欲击状,待至壶水一尽,双铙立时击响八下。鼓手们听到铙响后击鼓定更,钟楼听到鼓声后撞钟报时。这一科学的铜刻漏计时、更鼓定时和铜钟报时程序,系统地为文武百官的上朝和百姓的生息劳作和生活起居提供了重要的时间参考。
清代计时仪器改用时辰香,严格定制的时辰香为盘旋状,均匀燃烧,在经过精确计算的刻度上悬挂小球,下接金属盘。当香烧到该刻度,球掉入盘中报时,提醒鼓手击鼓。
报时方法是鼓楼置鼓,钟楼悬钟,暮鼓晨钟。所谓暮鼓晨钟是指“击鼓定更”、“撞钟报时”。清代原规定钟楼昼夜报时,乾隆后改为只报夜里两个更时,而且由两个更夫分别登钟、鼓楼,先击鼓后敲钟。其计时方式按古人将一夜分为五更来计算,每更为一时辰,即现在的两小时,19点为定更,21点为二更,23点为三更,l点为四更,3点为五更,5点为亮更。钟鼓楼每到定更先击鼓,后敲钟,提醒人们进入睡眠,二更到五更则只撞钟不击鼓,以免影响大家睡眠。到了亮更则先击鼓后敲钟,表示该起床了。击鼓的方法是先快击18响,再慢击18响,共击6次,共108响。撞钟与击鼓相同。
清代司鼓者是銮舆卫校尉。每晚定更,司鼓校尉以“对灯”为号,钟声响起,城门关闭,交通断绝,叫“净街”。这时,皇宫及京城大小街巷的更夫们手持铜锣、梆子和护身用的器具开始上夜,一为报时,一为守卫都城的安全。文武百官入朝都以钟鼓声为准:听到三更钟声就起床,四更钟声就赶到午门外集合,五更钟声就鱼贯入朝,跪在大和殿前的砖地上听旨。鼓楼击鼓定更,钟楼撞钟报时,在没有钟表计时的古代,钟鼓声对老北京人的起居劳作起着相当重要的作用。
击鼓定更,撞钟报时,在1924年废帝溥仪离开紫禁城时被废止。
如今的钟鼓楼虽已失去司时的作用,但每到年节,北京人依然能听到宏厚有力的钟鼓声,成为京城著名的一景。每到新年到来时,这里将再现“暮鼓晨钟”的表演,而且是在历史资料记载的基础上加以完善进行的。25面鼓是按照中国第一历史档案馆所存的清代嘉庆时期奏折中资料,依尺寸仿制的。
“晨钟暮鼓”的起源
“晨钟暮鼓”的授时方法起源于南北朝时期。公元485年的一天,南朝齐国的皇宫内,齐武帝因皇宫的时间不对,一直没有吃上早饭。观测天象的官员们是非常敬业的,他们用圭表、滴漏等仪器测量出了准确的时间,每到整点都用鼓声向周围传递时间。但皇宫离敲鼓报时的地方太远,御厨没有听到,所以耽误了开饭时间。于是齐武帝下令,在皇宫比较高的景云楼里挂起一个大钟,因为景云楼比较高,肯定能听到报时的鼓声,根据鼓声敲响景云楼的大钟,整个皇宫都能清楚地知道准确的时间,再也不会耽误事情了。能按时吃饭,齐武帝很高兴,但他却不知道,他更应该高兴的是他开创了一个“晨钟暮鼓”授时的新制度。到了唐朝,“晨钟暮鼓”报时已经非常成熟,大一点的城市都建有钟鼓楼。早上敲钟,城门打开,人们就可以随便进城出城活动了。晚上敲鼓,宵禁开始,所有的人禁止随意走动。每个时辰都有不同的钟声或者鼓声告诉人们时间,成为整个城市和周围村庄的人们用于生活、工作的标准时间。
在清末到民国初年,由于耸起的楼宇阻挡了钟声,人们就找到了声音更大的装备——大炮,从而开始了午炮报时。在北京德胜门东侧的城墙上设有一座炮台,这就是当年用来报时的“午炮”。炮台有电话与北京观象台连通,每当快到中午时,两个值班人分工合作,一人守在电话旁,听电话里传来的指令,另一人揭开炮衣,装好炮药、手持点燃的长香,站在炮位上静候。当北京观象台通过电话发来指令时,炮台上的人马上点燃炮药,炮声响彻大街小巷,人们就知道:现在是中午12点,有钟表的赶忙对表。
1、完成秒/分/时的依次显示并正确计数;2、秒/分/时各段个位满10正确进位,秒/分能做到满60向前进位;
3、定时闹钟:实现每到整点时报时,扬声器发出报时声音;
4、时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行调整;秒还可以手动调0;
分频模块:
源代码:
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity yxfrequencydivider is
port(clk:in std_logic
hz512,hz256,hz64,hz4,hz1:out std_logic)
end yxfrequencydivider
architecture hz of yxfrequencydivider is
signal count:std_logic_vector(9 downto 0)
begin
process(clk)
begin
if (clk'event and clk='1') then
if (count="1111111111") then
count<="0000000000"
else
count<= count+1
end if
end if
end process
hz512 <= count(0)
hz256 <= count(1)
hz64 <= count(3)
hz4<=count(7)
hz1<=count(9)
end architecture
模块说明:由于clk的频率为1024hz,所以可以定义一个std_logic_vecture(9 downto 0),使它不停地从0000000000加到1111111111然后又返回000000000,由于最低位在clk脉冲到来时从0变成1,然后又在下一个脉冲变回0,因此最低位的时钟周期为clk的时钟周期的两倍,它的频率就为clk频率的1/2即512HZ。同理,次高位的频率就为clk频率的1/2*1/2=1/4,用这种方法就可以得到各种能整除1024的频率,从而实现分频功能。
24进制模块
源程序
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity m24 is
port(cp:in std_logic
sqmsl,sqmsh:out std_logic_vector(3 downto 0))
end m24
architecture arh_m24 of m24 is
signal stempl,stemph:std_logic_vector(3 downto 0)
begin
process(cp)
begin
if cp='1' then
if stempl="0011" and stemph="0010" then
stempl<="0000"
stemph<="0000"
else
if stempl=9 then
stempl<="0000"
stemph<=stemph+1
else
stempl<=stempl+1
end if
end if
end if
end process
sqmsl<=stempl
sqmsh<=stemph
end architecture
本模块端口说明:cp为脉冲输入端sqmsh和sqmsl分别为小时的高位和低位输出,用来在数码管中分别显示小时的高位和低位数值,定义为std_logic_vector(3 downto 0).
功能实现:在cp高脉冲到时执行以下程序块,如果高位为2,低位为3则高位各低位都变回0,不然再低位进行判断,若为9低位变回0,高位加1,若不为9则低位直接加1即可同样实现.
60进制模块
源程序
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity m60 is
port(cp,clr:in std_logic
co:out std_logic
sqmsl,sqmsh:out std_logic_vector(3 downto 0))
end m60
architecture arh_m60 of m60 is
signal stempl,stemph:std_logic_vector(3 downto 0)
signal stempco:std_logic
begin
process(cp,clr)
begin
if clr='0' then
stemph<="0000"
stempl<="0000"
else
if cp'event and cp='1' then
stempco<='0'
if stempl=9 then
if stemph=5 then
stempco<='1'
stempl<="0000"
stemph<="0000"
else
stempl<="0000"
stemph<=stemph+1
end if
else
stempl<=stempl+1
end if
end if
end if
end process
co<=stempco
sqmsl<=stempl
sqmsh<=stemph
end architecture
本模块端口说明:cp为脉冲信号输入端clr为置0端,并且低电平有效,用来在校时时秒位清零co为进位输入端sqmsh和sqmsl分别是秒或分的高位或低位,定义为std_logic_vector(3 downto 0),用来分别在数码管中显示读数.
功能说明:以cp和clr而敏感变量,先判断clr是否为0,若为0则stemph种stempl都为0000,然后分别赋值给sqmsh和sqmsl如果不为0,则执行累加否则,再判断高位是否为5,若为5则进位输出为1、低位和高位都赋予0,若不为5则高位加1,低位赋予0.从而实现了60进制的累加.
扫描显示及译码模块
源程序
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity dongtaism is
port(clk:in std_logic
s:in std_logic_vector(7 downto 0)
f:in std_logic_vector(7 downto 0)
m:in std_logic_vector(7 downto 0)
selout:out std_logic_vector(5 downto 0)
segout:out std_logic_vector(6 downto 0))
end dongtaism
architecture a of dongtaism is
signal temp:std_logic_vector(2 downto 0)
signal seg:std_logic_vector(6 downto 0)
signal sel:std_logic_vector(5 downto 0)
begin
process(clk)
variable num:std_logic_vector(3 downto 0)
begin
if (clk'event and clk='1' ) then
if temp>=5 then
temp<="000"
else
temp<=temp+1
end if
case temp is
when "101" =>num:=s(7 downto 4)
sel<="100000"
when "100" =>num:=s(3 downto 0)
sel<="010000"
when "011" =>num:=f(7 downto 4)
sel<="001000"
when "010" =>num:=f(3 downto 0)
sel<="000100"
when "001" =>num:=m(7 downto 4)
sel<="000010"
when "000" =>num:=m(3 downto 0)
sel<="000001"
when others=>sel<="000000"
end case
case num is
when"0000"=>seg<="0111111"
when"0001"=>seg<="0000110"
when"0010"=>seg<="1011011"
when"0011"=>seg<="1001111"
when"0100"=>seg<="1100110"
when"0101"=>seg<="1101101"
when"0110"=>seg<="1111101"
when"0111"=>seg<="0000111"
when"1000"=>seg<="1111111"
when"1001"=>seg<="1101111"
when others=>seg<="0000000"
end case
end if
end process
selout<=sel
segout<=seg
end architecture
本模块端口说明:stempl、stemph、ftempl 、ftemph、mtempl、mtemph
分别为时,分,秒的输入端,定义为std_logic_vector(7 downto 0)segout为七端显示管的输出,定义为std_logic_vector(6 downto 0)selout为扫描地址端,定义为std_logic_vector(5 downto 0),某一时刻只有一个为1,对应的数组号即为当前扫描的数码管的编号.
功能实现:定义一个std_signal_vector(2 downto 0)变量addr,它在0和5之间不断的循环,用来指示当前扫描的哪一根管,循环用if addr>=5 then addr<=”000” else addr<=addr+1end if实现.再定义一个类型为std_logic_vector(5 downto 0)的tempaddr信号,它用来产生一个长度为6的数,该数在同一时刻只有一位是高电平表示正在扫描该显示管,在进程结束时它的值将赋给selout输出.定义一个std_logic_vector(6 downto 0)类型的temp_display,用来存放将由4位BCD码编码而来的7段显示码.最后在进程中定义一个std_logic_vector(3 downto 0)类型的tempnum变量,用来存放时、分、秒的高位或低位,然后将该数编码成7段显示码,并赋给temp_display信号。具体算法如下:
建立一个以cp脉冲为敏感变量的进程,先判断是否是cp的高电平脉冲,若不是则什么也不执行,若是高电平脉冲,则执行以下程序。Adder加1,用case语句根据adder的值,给tempnum赋予当前要扫描的数码管的值,用case语句根据tempnum的值编译成对应的7段显示管的值并赋给temp_display,当进程结束时把temp_display的值赋给segout,把tempaddr的值赋给selout,然后由这两个端口输出。
整点报时模块:
源程序
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity baoshi is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0)
sig500,sig1k:out std_logic)
end baoshi
architecture behave of baoshi is
begin
process(m0)
begin
sig500<='0'
sig1k<='0'
if m1="0101" and m0="1001" then
if s1="0101"and (s0="0000" or s0="0010" or s0="0100" or s0="0110" or s0="1000") then
sig500<='1'
else
sig500<='0'
end if
end if
if m1="0000" and m0="0000"and s1="0000" and s0="0000" then
sig1k<='1'
else
sig1k<='0'
end if
end process
end behave
本模块端口说明:m1,m0,s1,s0分别为分和秒的高低位的输入;sig500,sig1k分别为500hz和1khz鸣叫的控制信号。
功能实现:定义temp500,temp1k信号,用于存放两种频率报时的控制信号;定义一个以m0为敏感信号的一个比较进程,在进程一开始的时候先给temp500和temp1k赋予初值0,然后判断分是否为59分,若是则判断秒的高位是否是5,若是则如果秒的低位为0、2、6、8则temp500为1;若分不是59则判断分和秒是否都为0,若都为0则temp1k为1。进程结束时把temp500,temp1k的值分别赋给sig500,sig1k。
然后连接顶层图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)