数字钟程序清单
数字钟程序
5:A=secl;
default: A=0;
endcase
end
else
begin
case(sel)
0:A=hourh1;
1:A=hourl1;
2:A=minh1;
3:A=minl1;
4:A=sech1;
default: SG=8'b11111111;
endcase
end
always@(posedge clk1) //实现闹铃功能
begin
if((hourh1==hourh)&(hourl1==hourl)&(minl1==minl)&(minh1==minh)&(secl==secl1)&(sech==sech1))
else count2<=count2+1;
end
end
always@(posedge clk1 or negedge rst)
if(!rst)
begin
secl<=0;sech<=0;
minl<=0;minh<=0;
hourl<=0;hourh<=0;
//m 对应K7(B5)
/*
s1:小时调整
s2:分钟调整
s3:调节秒钟
k:在不按s1、s2、s3下切换到调闹钟。如果把s1、s2、s3任意一个变低电平,则调整该位的计数
rst:复位
m:开始/停止计数
闹钟时间: (LED1闪)
定点报时:每次到59分59秒(LED2闪)
以上全为低电平有效,正常运行时置s1、s2、s3为高,k为高,rst为高,m为高
数字钟汇编程序
MOV NUM,#8
RETI
/*********************设置闹钟**********************/
SET_ALARM:
MOV A,ALARM_X
CJNE A,#1,SET_ALARM_BACK
SET_ALARM1:
ORG 0013H
LJMP SERVE_ALARM
ORG 0020H
MAIN:
MOV TMOD,#11H
MOV NUM_D1,#20
MOV SEC,#59 ;时间初始化
MOV MIN,#59
MOV HOU,#12
MOV NUM,#0
MOV NUM_KEY,#0
MOV ALARM_2_SEC,#00 ;闹钟2
MOV ALARM_2_MIN,#58
MOV ALARM_2_HOU,#12
MOV ALARM_3_SEC,#00 ;闹钟3
MOV ALARM_3_MIN,#05
MOV ALARM_3_HOU,#13
MOV ALARM_4_SEC,#00 ;闹钟4
CPL P1.0
RETURN4:
RETI
/******************外部中断0重置秒分时位置选择************/
ORG 0200H
SERVE_PLACE:
MOV MODE,#0 ;标记为外部中断0
LCALL DELAY
LCALL DELAY
MOV SECX,40H
MOV MINX,41H
MOV HOUX,42H
LCALL CHECK_KEY14
VHDL编程--数字钟
一、数字钟要求:1、能进行正常的时、分、秒计时功能,分别由6个数码管显示24h、60min、60s。
2、可以进行当前时间设置。
二、应用系统功能的详细说明该数字钟使用的是二十四时计时制。
计时时间范围从00:00:00到23:59:59。
当时间及时到23:59:59时,钟面跳转到00:00:00重新下一轮计时。
该数字钟总共有三个按钮,分别是md1控制数字钟的开关,md2(1)控制数字钟的正常运行还是时间设置和md2(0)控制对时还是对分的设置。
md1:为0时,数字钟电源关闭;为1时,数字钟电源开启。
md2(1):为0时,数字钟正常运行;为1时,数字钟进入设置状态。
md2(0):为0时,数字钟对时进行设置;为1时,数字钟对分进行设置。
三、主要模块的算法描述1、扫描显示模块scan6由于试验箱上的8只显示数码管只有16个接脚,当显示四个以上时,每次只能显示一位,所以要显示六位要轮流输出,即扫描显示。
人的视觉暂留大约为1/30s,所以每只数码管闪动频率为32Hz即可。
那么8只数码管轮流显示一遍,2、计时模块hourten,huoroen,minten,minone,secten,secone计时模块共分为6个部分,分别是时、分、秒的十位和个位。
由每位之间的逻辑关系以及md1和md2来控制正常计数、进位和对小时分钟的设置。
3、译码模块dec7s把计时模块输出的时、分、秒各位的二进制数翻译成能在七段数码管上显示的七位二进制码,能够显示0~9各个数字。
四、程序的源代码清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity digital_clock isport(clk:in std_logic; --扫描频率,>=256Hz clk1:in std_logic; --计时频率,1Hzmd1:in std_logic; --开关,0时有效md2:in std_logic_vector(1 downto 0); --时间设置dout:out std_logic_vector(6 downto 0); --译码显示ms:out std_logic_vector(5 downto 0)); --扫描控制end digital_clock;architecture one of digital_clock issignal sel:std_logic_vector(2 downto 0);signal hou1,hou2,min1,min2,sec1,sec2:std_logic_vector(3 downto 0);signal time:std_logic_vector(3 downto 0);begin---------------------------------------------scan6scan6:process(clk1,hou1,hou2,min1,min2,sec1,sec2)beginif clk1'event and clk1='1' thenif sel="101" thensel<="000";elsesel<=sel+1;end if;end if;case sel iswhen "000"=>ms<="000001";time<=hou1;when "001"=>ms<="000010";time<=hou2;when "010"=>ms<="000100";time<=min1;when "011"=>ms<="001000";time<=min2;when "100"=>ms<="010000";time<=sec1;when "101"=>ms<="100000";time<=sec2;when others=>ms<="100000";time1=sec2;end case;end process scan6;---------------------------------------------hourtenhourten:process(clk,hou2,min1,min2,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (hou1&hou2&min1&min2&sec1&sec2="001000110101100101011001") then hou1<="0000"; --当23:59:59时,时十位归0elsif (hou1&hou2="00100011"and md1&md2="001") thenhou1<="0000"; --当设置小时,时位是23时,时十位归0elsif ((hou2&min1&min2&sec1&sec2="10010101100101011001")or(hou2="1001"and md1&md2="001")) thenhou1<=hou1+1; --当正常计时,时间是x9:59:59时,或设置小时,end if; --时位是x9时,时十位加1end if;end process hourten;---------------------------------------------houronehourone:process(clk,min1,min2,sec1,sec2,md1,md2,hou1)beginif clk'event and clk='1' thenif (hou1&hou2&min1&min2&sec1&sec2="001000110101100101011001") then hou2<="0000"; --当23:59:59时,时个位归0elsif (hou2&min1&min2&sec1&sec2="001000110101100101011001") thenhou2<="0000"; --当x9:59:59时,时个位归0elsif ((hou2="1001"or hou1&hou2="00100011")and(md1&md2="001")) thenhou2<="0000"; --当设置小时,时位是x9或23时,时个位归0 elsif (min1&min2&sec1&sec2="0101100101011001)or(md1&md2="001")then hou2<=hou2+1; --当正常计时,时间是xx:59:59时,或设置小时,时个位加1 end if;end if;end process hourone;---------------------------------------------mintenminten:process(clk,min2,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (min1&min2&sec1&sec2="0101100101011001") thenmin1<="0000"; --当xx:59:59时,分十位归0elsif (min1&min2="01011001"and md1&md2="000")thenmin1<="0000"; --当设置分钟,分位是59时,分十位归0elsif (min2&sec1&sec2="100101011001")or --正常计时,时间是xx:x9:59时,或(min2="1001"and md1&md2="000") then --设置分钟,时间是x9,分十位加1min1<=min1+1;end if;end if;end process minten;---------------------------------------------minoneminone:process(clk,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (min2&sec1&sec2="100101011001") thenmin2<="0000"; --当xx:x9:59时,分个位归0elsif (min2="1001"and md1&md2="000") thenmin2<="0000"; --当设置分钟,分位是x9时分个位归0elsif (sec1&sec2="01011001")or(md1&md2="000") thenmin2<=min2+1; --正常计时,时间是xx:xx:59时,或设置分钟,分个位加1 end if;end if;end process minone;---------------------------------------------sectensecten:process(clk)beginif clk'event and clk='1' thenif (sec1&sec2="01011001") then --当时间是xx:xx:59时,秒十位归0sec1<="0000";elsif sec2="1001"then --当秒位是x9时,秒十位加1sec1<=sec1+1;end if;end if;end process secten;--------------------------------------------seconesecone:process(clk)beginif clk'event and clk='1' thenif sec2="1001" then --当秒位是x9时,秒个位归0sec2<="0000";else sec2<=sec2+1; --否则加1end if;end if;end process secone;------------------------------------------dec7sdec7s:process(time)begincase time iswhen "0000"=>dout<="0111111";when "0001"=>dout<="0000110";when "0010"=>dout<="1011011";when "0011"=>dout<="1001111";when "0100"=>dout<="1100110";when "0101"=>dout<="1101101";when "0110"=>dout<="1111101";when "0111"=>dout<="0000111";when "1000"=>dout<="1111111";when "1001"=>dout<="1101111";when others=>dout<="0111111";end case;end process dec7s;end one;。
数字时钟程序(完整版)
数字时钟程序/**************************************************程序名称:数字时钟程序全局变量:tt,shi,fen,miao等参数说明:无返回说明:无版本:1.0功能说明:通过数码实现时钟的显示,通过键盘实现时间的调整其中k1是开始调整,k2是增加,k3是减小,k5是实现定时屏幕的切换,k4是定时设置的开始。
带闹铃功能。
作者邮箱:****************(欢迎交流)**************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit beep=P2^3;sbit dula=P2^6;sbit wela=P2^7;sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;sbit k4=P3^3;sbit k5=P3^4;sbit rd=P3^7;uchartt,shi_s,shi_g,shi1_s,shi1_g,fen1_s,fen1_g,miao1_s,miao1_g,fen_s,fen_g,miao_s,miao_g,k1num,k 4num,flag;char shi,fen,miao=20,shi1,fen1,miao1;/*********************************函数名称:延时程序设计全局变量:无参数说明:z传递给内部,是实现75*z条空指令延迟返回说明:无版本:1.0功能说明:约Z*75us延时程序设计作者邮箱:****************(欢迎交流)*********************************/void delay(uint z){uchar x;uint y;for(x=z;x>0;x--)for(y=75;y>0;y--);}/********八段数码管编码**********/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*********************************函数名称:初始化函数全局变量:无参数说明:无返回说明:无版本:1.0功能说明:定时器装初值,开总中断,定时中断,并写定时中断函数作者邮箱:****************(欢迎交流)*********************************/void init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}/*********************************函数名称:6个数码管显示函数全局变量:shi fen miao 的个十位分离参数说明:将个十位的分离分别传递到各个数码管中并显示返回说明:无版本:1.0功能说明:实现时钟的数码管显示,动态扫描。
fpga数字钟实验流程
fpga数字钟实验流程FPGA(可编程逻辑门阵列)数字钟是一种基于可编程逻辑器件的数字时钟实验,通过编程和硬件设计的方式,实现数字时钟的功能。
本文将详细介绍FPGA数字钟实验的流程。
第一部分:实验准备1.硬件准备:需要准备一块FPGA开发板、显示器、键盘等硬件设备,以及一些连接线。
2.软件准备:需要安装好FPGA开发软件,例如Xilinx ISE,以及相应的驱动程序。
第二部分:FPGA数字钟的原理和设计1.了解数字时钟的结构和工作原理,数字时钟一般由时钟控制模块、时钟显示模块和按键控制模块组成。
2.设计时钟控制模块,该模块用来控制时钟的频率和计时功能。
3.设计时钟显示模块,该模块用来将时钟的计时结果以数字的形式显示在显示器上。
4.设计按键控制模块,该模块用来实现时钟的设置功能,包括设置时间和闹钟等。
第三部分:FPGA数字钟的硬件连接1.将FPGA开发板和显示器通过连接线连接起来,确保能够正常显示。
2.将FPGA开发板和键盘通过连接线连接起来,确保能够正常接收按键信号。
第四部分:FPGA数字钟的编程实现1.打开FPGA开发软件,创建一个新工程,并选择合适的FPGA芯片型号。
2.导入所需的模块和外设驱动程序,并将其进行连接。
3.配置FPGA芯片的引脚分配,将各个模块和硬件设备连接起来。
4.编写FPGA数字钟的软件代码,包括时钟控制模块、时钟显示模块和按键控制模块的代码。
5.进行编译和综合,生成对应的比特流文件。
6.将比特流文件下载到FPGA芯片中,实现数字时钟的功能。
第五部分:实验调试和功能测试1.将FPGA开发板连接到电源上,确保供电正常。
2.通过按键进行时间设置,并观察显示器上的时钟显示是否正确。
3.调整时钟频率,观察显示器上的时钟走动是否正常。
4.测试其他功能,例如闹钟功能、定时功能等。
第六部分:实验总结与展望1.对实验结果进行总结,分析实验中遇到的问题和解决方法。
2.展望数字时钟的进一步应用,例如可以加入温湿度传感器,实现天气预报功能等。
51单片机数字钟设计程序
51单片机数字钟设计程序51单片机是一种常用的单片机芯片,它具有体积小、功耗低、性能稳定等特点,被广泛应用于各种电子设备中。
本文将以51单片机数字钟设计程序为主题,介绍如何使用51单片机设计并实现一个简单的数字钟。
我们需要了解一下数字钟的基本原理。
数字钟主要由时钟芯片、数码管、按键等组成。
时钟芯片负责计时和控制,数码管用于显示时间,按键则用于设置和调整时间。
在设计数字钟的程序时,我们需要考虑以下几个方面:1. 时钟设置:首先,我们需要设置时钟芯片的工作模式。
一般来说,时钟芯片有两种工作模式,分别是24小时制和12小时制。
我们可以通过按键来选择工作模式,并将选择结果保存到相应的寄存器中。
2. 时间显示:接下来,我们需要将时钟芯片中的时间数据通过数码管显示出来。
数码管通常由7段LED组成,每段LED对应一个数字或字符。
我们可以通过控制数码管的引脚状态来实现不同数字的显示。
同时,为了使时间显示更加清晰,我们可以在数码管之间加入冒号等分隔符。
3. 时间调整:为了保证时间的准确性,我们需要提供时间调整的功能。
可以通过按键来实现时间的增加和减少,从而调整时钟芯片中的时间数据。
当按键按下时,我们可以检测到相应的信号,并将其转换为时间调整的命令。
4. 闹钟功能:除了显示时间,数字钟还可以具备闹钟功能。
我们可以设置一个闹钟时间,并在达到闹钟时间时触发相应的报警信号。
一般来说,闹钟功能可以通过按键设置,并将设置结果保存在相应的寄存器中。
当时钟芯片中的时间与闹钟时间一致时,我们可以通过控制蜂鸣器等外设来发出报警信号。
通过以上的设计,我们可以实现一个简单的数字钟。
当然,如果我们希望数字钟具备更多的功能,比如温湿度显示、定时器等,我们还可以在程序中添加相应的代码来实现。
总结一下,本文以51单片机数字钟设计程序为主题,介绍了数字钟的基本原理以及设计过程。
通过对时钟芯片、数码管、按键等的控制,我们可以实现时间的显示、调整和闹钟功能。
数字钟流程图(汇编语言)
Mov hour,#0
Mov min,#0
Mov sec,#0
Mov xsstate,#0
Clr addflag
Clr decflag
Mov seccs,#0
Mov tmod,#01h
Mov th0,#03ch
Mov tl0,#0b0h
Setb tr0
Clr sectime
秒表流程图及相应的程序
(汇编语言版)
定义(资源分配):
显示的数据:
秒的高位、秒的低位、毫秒的高位、毫秒的低位。秒数据、毫秒数据定义。
数码管的段输入、位控制定义。
按键的定义、显示状态定义。
时间状态定义:
hour_h data 30h
hour_l data 31h
min_h data 32h
min_l data 33h
key1bit p3.2
key2 bit p3.3
key3 bit p3.4
addflag bit 20h
decfalg bit 21h
xsstate data 39h
secflagdata 3ah;定义50ms的次数
sectime bit 22h;定义1s到
主程
Org 0000h
Ajmp main
Cjnz a,60,shujuchuliend
Mov sec,#0
Inc min
Jnb decflag,anjianchuliend
Dec min
Clr decflag
Mov a,min
Cjnz a,255,anjianchuliend
Mov min,#59
Acall anjianchuliend
多功能数字钟程序
}
}
else
{
if(mode==3)mode=0;else mode++;//模式选择
}
}
}break;
default :break;
}
}
//***************************************** //定时0中断****************************
void incsec() interrupt 1
case 43: {
if(loose==0)
{
loose=1;
if(set_clock==1||set_time==1)//进入设置状态
{
if(set_time==1)
{
switch(select)
{
case 1:{ if(month==1)month=12;else month--;}break;//月份设置
if(j==3687)
{
second++;//加1秒
P2_2=~P2_2; P2_3=~P2_3;//使led闪烁
j=0;i=0;
}
}
void beep() interrupt 3
{
uchar mi,rui,duo;
k++;
if(k<2000)//mi响约46ms,四分之一拍
//*******************************************************************************************
void Delay(void)//数码管显示延时
{
uint i;
可设置八个闹钟的智能时钟(原理图+程序)
可设置8个闹钟时间的智能时钟广东珠海曾向文普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。
如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。
针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。
1、元件清单共阴极数码管8个4511七段译码芯片1片A TMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个10K欧电阻4个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。
注意LM317的输出应由低调高,以免烧IC。
2、电路图3、功能简介该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。
这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。
当然使用者可通过按钮对任何一个设置作修改。
数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。
调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。
用四节1.25V电池串联作后备电源,保证市电停电时时钟继续走时。
时钟的精度取决于晶振频率的精度。
4、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。
电子时钟设计DS++可调闹钟+程序清单
电子时钟设计DS++可调闹钟+程序清单本文主要介绍一种新型的电子时钟设计,名为DS++可调闹钟。
这种电子时钟不仅能够显示当前日期和时间,而且其可调节的闹钟功能也十分实用。
同时,我们还提供程序清单,供各位读者借鉴学习。
1. 电子时钟设计的背景和目标电子时钟已经成为人们日常生活中不可或缺的物品之一。
在市场上,人们可以买到各种各样的电子时钟,从简单的数字显示到智能语音交互。
然而,我们常常发现,在时钟设计中,用户体验常常被忽视。
比如,有的时钟功能繁杂,使用起来困难;有的时钟质量低劣,经常出现故障。
为了解决这些问题,我们决定设计一种更为智能且易用的电子时钟,就是DS++可调闹钟。
本次电子时钟设计的目标是:1)提供准确的时间显示和日期显示;2)提供可调闹钟功能和提示功能;3)简单易用,方便用户使用。
2. DS++可调闹钟设计方案2.1 电路原理图DS++可调闹钟的电路包括微处理器、振荡器、液晶显示模块、蜂鸣器、按键等部分。
主控芯片采用AT89S52(51系列微控制器),与液晶显示模块通过IIC总线通信。
振荡器采用32.768kHz的石英晶体振荡器,保证时钟的准确性。
2.2 功能模块设计液晶显示模块的设计是优化DS++可调闹钟的关键。
我们选用了1602A型液晶显示屏,显示内容包括日期、时间和闹钟状态。
闹钟模块是DS++可调闹钟的核心模块之一,它通过可调节的闹钟时间和闹钟提示音,方便用户设置并响铃提醒。
2.3 电路调试及测试在电路设计和焊接完成后,我们需要进行电路调试和测试。
在调试过程中,我们主要测试了电子时钟的时间显示、日期显示、闹钟设置等功能。
同时,我们还测试了与之相协调的同时供电设备,比如移动电源和插座电源。
3. 程序清单DS++可调闹钟的程序基于Keil/µVision IDE的汇编语言编写。
半个时钟周期内的指令流水线技术使得程序库在嵌入式微控制器上的表现达到质的提升,且运行速度更快。
DS++可调闹钟的程序清单如下:- 初始化电路;- 显示日期、时间;- 等待用户按键;-用户按键相应操作;- 播放闹钟提示音;- 关闭闹钟。
EDA课程设计 多功能数字钟设计程序清单 数字系统设计与verilog HDL(第四版) 王金明
EDA课程设计多功能数字钟设计程序清单数字系统设计与verilog HDL(第四版)王金明/*引脚锁定基于DE2一70,芯片为EP2C70F896,信号定义如下: Clk50m: 50MHz 时钟输,mode:模式选择0:计时模式1:设置闹钟模式mcheck:手动调整时间turn:手动调整时间,在时、分之间选择change:对选中的数据调整led hourl,led_hour0,led_minul,led_minu0,led_secl,led sec0;alert: 闹钟输出ld_alert: 是否设置了闹钟ld_hour,id_min,ld_sec:在调整时,指示选中了时,分还是秒*/moduleclock(clk50m,mode,turn,change,mreset,led_hour1,led_hour0,led_minu1,led_minu0, led_sec1,led_sec0, alert,ld_alert,ld_check,ld_hour,ld_min,ld_sec);input clk50m;input mode; // key0键input turn; //keyl键input change; // key2 键input mreset; //switch0复位,低电平有效output alert; //gpioO->IOAOoutput ld_alert; //ledgO-led19output ld_check; //ledgl-led22output ld_hour; //ledr3-led13output ld_min; //ledr9-led9output ld_sec; //ledr7-led7output[6:0] led_hour1;output[6:0] led_hour0;output[6:0] led_minu1;output[6:0] led_minu0;output[6:0]led_sec1;output[6:0]led_sec0;reg [1:0] modestate;//00: 计时模式10:闹钟模式; 01:手动调整模式;11:非法模式wire nowmode;//记录当前模式,0:计时模式;1: 设置闹钟模式wire ischecking; //是否在手动调整时间assign {nowmode, ischecking}=modestate;always@(negedge mode)//两个按钮都是低电平有效begincase (modestate)2'b00 : modestate<=2'b10; //设置闹钟模式优先2'b10: modestate<=2'b01; //手动调整模式2'b01: modestate<=2'b00;default :modestate<=2'b00;endcaseendwire reset, clk_1hz;switch #(8) rmjitter(clk50m,mresetr,reset);clk50mtol genlhz (clk50m, clk_1hz) ; //生成1Hz的时钟wire [2 : 0] selcode; //对turn信号在不同模式bitsel seldecoder (nowmode, ischecking, turn, selcode, reset);wire [3:0] clocktime0,clocktimel,clocktime2,clocktime3,clocktime4,clockthre5;//计时输出的时钟数值wire clockalarmon; //整点报时的闹钟输出wire [2 : 0] counterselcode;assign counterselcode=(modestate==2'b01)?selcode:3'b000;counter_time clock_time (clk_1hz,counterselcode,~change,clocktime5,clocktime4,clocktime3,clocktime2,clock time1,clocktime0,clockalarmon,reset);wire[3:0] alarmtime0,alarmtime1,alarmtime2,alarmtime3;wire alarmon;alarm_time alarm_time ( clk_1hz , nowmode , selcode [ 2 : 1] , change ,{clocktime5, clocktime4, clocktime3, clocktime2, clocktime1},{alarmtime3, alarmtime2, alarmtime1, alarmtime0} , alarmon, reset) ;wire voiceout ;alarm alarmvoice (clk50m,{clockalarmon, alarmon} ,voiceout, raset) ;//显示输出部分assign {ld_hour,ld_min,ld_sec}=(ischecking||nowmode)?selcode:3'b000; assign alert=voiceout;reg[3:0] showout2,showout3,showout4,showout5;led led5 (showout5,led_hour1) ; //led译码显示led led4 (showout4,led_hour0) ;led led3 (showout3,led_minu1) ;led led2 (showout2,led_minu0) ;led led1 (clocktime1,led_sec1) ;led led0 (clocktime0,led_sec0) ;alwaysbegin if ( nowmode)begin showout5=alarmtime3 ; showout4=alarmtime2 ;showout3=alarmtime1; showout2=alarmtime0 ; end else beginshowout5=clocktime5; showout4=clocktime4 ;showout3=clocktime3 ; showout2=clocktime2 ; end endassign ld_alert=nowmode; assign ld_check=ischecking;endmodule/*alarm.V:闹铃模块Clk50m: 50MHz输入时钟alarmon:闹铃是否打开,2'b00:不打开:2'b01:闹钟;2'b10:整点报时ala rmoUt:闹铃声音输出*/module alarm(clk50m,alarmon,alarmout,reset);input[1:0] alarmon;input clk50m,reset;output reg alarmout;reg[15:0] counter_1k;wire clk_1k;assign clk_1k=counter_1k[4];always@(posedge clk50m)begin if (counter_1k==20) counter_1k<=0;else counter_1k<=counter_1k+1'b1; endwire ddd_du_out,ddd_out;sound_ddd_du ddd_du (clk_1k,alarmon[1] ,ddd_du_out) ;sound_ddd ddd(clk_1k,alarmon[0],ddd_out);alwaysbegin if (!reset)begin if (alarmon [0]==1'b1) //ddd,闹钟的响铃优先级更高alarmout=ddd_out ;else if (alarmon==2'b10) alarmout=ddd_du_out;else alarmout=0 ;end else alarmout=0 ;endendmodule/*alarm_time.V:闹钟时间设定模块enable:使能信号Sel:在时、分之间切换选择10:时;01:分inc:对选中的信号自增basetime:基准时钟*/module alarm_time (clk_1hz , enable, sel, inc, basetime, alarmouttime, alarm_on, reset) ;input clk_1hz,enable, inc,reset;input[1:0] sel;input[4*5-1:0] basetime;output reg alarm_on;output [4*4-1: 0] alarmouttime;reg [ 3 : 0] hour1, hour0 , minu1, minu0 ; //存储的设定时间always@ (posedge inc or posedge reset)begin if (reset) //reset=1时复位begin { hour1, hour0,minu1, minu0 } <=16'h0 ; endelse beginif (enable) beginif (sel==2'b10) //设置时begin if({hour1,hour0}==8'h23) {hour1,hour0}<=8'h00;else if (hour0==9)begin hour0<=0;hour1<=hour1+1'b1; endelse hour0<=hour0+1'b1;endelse if(sel===2'b01)//设置分begin if({minu1,minu0}==8'h59) {minu1,minu0}<=8'h00;else if (minu0==4'h9)begin minu0<=4'h0;minu1<=minu1+4'h1;endelse minu0<=minu0+4'h1; endelse {hour1,hour0,minu1,minu0}<=16'h0;end endendalways //闹钟开始条件beginif(({hour1,hour0,minu1,minu0}==basetime[ (4*5-1) :4]) && (basetime[3:0]<2)) alarm_on=1'b1;else alarm_on=1'b0; endassign alarmouttime={ hour1,hour0,minu1,minu0};endmodule/*counter time,v:计时模块,并留有调整接;check:调整信号,3位,分别调整时、分、秒,调整方法:将计数输出给加法器,把调整信息转换成异步置数信息,将加法器的输出作为置数值;hour1,hour0,minul, minu0, sec1,sec0:输出的计时时钟;alarmout:整点报时输出*/modulecounter_time(clk_1hz,check,inc,hour1,hour0,minu1,minu0,sec1,sec0,alarmout,reset); input clk_1hz,inc,reset;input[2:0] check;output[3:0] hour1,hour0,minu1,minu0,sec1,sec0;output reg alarmout;reg clk_1hz_md;wire [6: 0] carryclk;reg[5:0] incplus;//自增脉冲wire [5 : 0] carry; //进位时钟wire [3 : 0] adderout0,adderout1,adderout2,adderout3,adderout4,adderout5;wire [3 : 0] timerout0,timerout1,timerout2,timerout3,timerout4,timerout5; hexcounter counter_sec0(carryclk[0],reset,4'd9,4'b0,timerout0,carry[0]); hexcounter counter_sec1(carryclk[1],reset,4'd5,4'b0,timerout1,carry[1]); hexcounter counter_minu0(carryclk[2],reset,4'd9,4'b0,timerout2,carry[2]); hexcounter counter_minu1(carryclk[3],reset,4'd5,4'b0,timerout3,carry[3]);wire [3:0] hour0max;assign hour0max=(timerout5==4'h2)?(4'h3) : (4'h9);hexcounter counter_hour0(carryclk[4],reset,hour0max,4'b0,timerout4,carry[4]); hexcounter counter_hour1(carryclk[5],reset,4'd2,4'b0,timerout5,carry[5]);//每个计时器的时钟,由前级进位和自堦脉冲相加得到assign carryclk[0]=(check==4'h0) ? clk_1hz_md:incplus[0];assign carryclk[1]=carry[0]|incplus[1];assign carryclk[2]=(check==4'h0) ? carry[1]:incplus[2];assign carryclk[3]=carry[2]|incplus[3];assign carryclk[4]=(check==4'h0) ? carry[3]:incplus[4];assign carryclk[5]=carry[4]|incplus[5];always //对异步置位信号进行解码begin case (check)3 'b001: begin clk_1hz_md=0;incplus={5 'b00000, inc} ;end3 'b010 : begin clk_1hz_md=0;incplus={3'b000,inc,2'b00};end3 'b100 : begin //在正常的调节状态中clk_1hz_md=0;incplus={1'b0, inc, 4'b000};enddefault:begin incplus=6'b000000;clk_1hz_md=clk_1hz ;endendcaseendalways begin if (((reset|check)==0)&&(timerout3==0) && (timerout2==0) && (timerout1<2)) alarmout=1;//时间小于20秒的时间内else alarmout=0;endassign hour1=timerout5;assign hour0=timerout4;assign minu1=timerout3;assign minu0=timerout2;assign sec1=timerout1;assign sec0=timerout0;endmodule/*Clk50mtol.v: 50mhz 时钟分频到lhz */module clk50mtol(clk50m,clk1hz);input clk50m;output clk1hz;reg [25:0]counter_1hz;//从50mhz 分频到lhz 的计数器assign clk1hz=counter_1hz[14];//assign clk1hz=counter_1hz[25];always@ (posedge clk50m)beginif(counter_1hz==20000) counter_1hz<=0;else counter_1hz<=counter_1hz+1'b1;endendmodule/*led.v:7段数码管(led)译码显示模块datain:4位,10进制数输入ledout:7位,数码管的7段*/module led(datain,ledout);parameter INWIDTH=4;parameter OUTWIDTH=7;input[INWIDTH-1: 0] datain;output [OUTWIDTH-1:0] ledout;reg[OUTWIDTH-1:0] dataout;assign ledout=dataout;always begincase (datain)0 : dataout<=7'b1000000;1 : dataout<=7'b1111001;2 : dataout<=7'b0100100;3 : dataout<=7'b0110000;4 : dataout<=7'b0011001;5 : dataout<=7'b0010010;6 : dataout<=7'b0000010;7 : dataout<=7'b1111000;8 : dataout<=7'b0000000;9 : dataout<=7'b0010000;default : dataout<=7'b1000000;endcaseendendmodule/*switch-v:对按键开关的消抖电路,采用一个频率较低的时钟,对输入进行采样,消除抖动*/module switch(clk,keyin,keyout);parameter COUNTWIDTH=8;input clk, keyin;output reg keyout;reg [COUNTWIDTH-1: 0] counter;wire clk_use; //频率较低的时钟assign clk_use=counter [COUNTWIDTH-1];always@ (posedge clk)counter<=counter+1'b1;always@ (posedge clk_use)keyout<=keyin;endmodule/*bitsel-v:将输出解码成对时、分、秒的选择(并且分闹钟设置模式还是计时模式)Alarmmode:是否是在设置闹钟模式checkmode:是否是在调整时间模式*/module bitsel(alarmmode, checkmode, sel, selcode, reset) ;input alarmmode, checkmode, sel, reset;output reg [2:0] selcode;reg [2:0] check_code ;reg [1:0] alarm_code ;always@ (negedge sel or posedge reset)begin if (reset) check_code<=3'b000; //reset=1 复位else begincase (check_code)3 'b000: check_code<=3 'b001;3 'b001: check_code<=3 'b010;3 'b010: check_code<=3 'b100;3 'b100: check_code<=3 'b001;default: check_code<=3 'b000;endcaseendendalways@ (negedge sel or posedge reset)begin if (reset) alarm_code<=2 'b00; //低电平复位else begincase (alarm_code)2'b00 : alarm_code<=2'b01;2 'b01 : alarm_code<=2 'b10 ;2 'b10 : alarm_code<=2 'b01;default : alarm_code<=2 'b00;endcaseendendalwaysbegin if (alarmmode^checkmode) //两个当中只有1个为1 begin if (checkmode) selcode=check_code;else selcode={alarm_code,1'b0}; endelse selcode=3 'b000 ;endendmodule/*adder.v:加法器*/module adder(in1, in2, out);parameter in1width=8;parameter in2width=8;parameter outwidth=8;input [in1width-1: 0] in1;input [in2width-1: 0] in2;output[outwidth-1: 0] out;assign out=in1+in2;endmodule/*excounter-v:16进制计数的一个计数器*/module hexcounter (clk, set, max, setdata, dataout, carryout) ; input clk,set;input[3:0] max,setdata;output carryout;output[3:0] dataout;reg[3:0] counter;reg carrybit;assign carryout=carrybit;assign dataout=counter;always@ (posedge clk or posedge set)begin if (set) //set是高电平有效begin counter<=setdata;carrybit<=0 ;endelse begin if( (counter==max)||(counter>max) )begin counter<=0 ;carrybit<=1;endelse begin counter<=counter+1'b1;carrybit<=0 ;endendendendmodule/*sound_ddd.V:发出嘀嘀嘀闹铃声模块*/module sound_ddd(clk_1k, on, out);parameter soundspace=30;parameter shotstopspace=20; //20ms,两个嘀声的时间距离parameter longstopspace=50;//50ms,连续三个嘀后的时间距离input clk_1k,on;output reg out;reg sound;always@ (posedge clk_1k)begin sound<=~sound; endreg[10:0] mscount;always@ (posedge clk_1k)begin if (mscount== (soundspace*3+shotstopspace*2+longstopspace-1) )mscount<=0;else mscount<=mscount+1'b1;endalways@ (negedge clk_1k)begin if (on)begin if ( (mscount>=0) && (mscount<soundspace) ) out<=sound;else if ( (mscount>=soundspace) && (mscount< (soundspace+shotstopspace) ) )out<=0;else if ( (mscount>= (soundspace+shotstopspace) ) && (mscount< (soundspace+shotstopspace) +soundspace) )out<=sound;else if ( (mscount>= (soundspace+shotstopspace) +soundspace) && (mscount< (soundspace+shotstopspace) *2) )out<=0;else if ( (mscount>= (soundspace+shotstopspace) *2)&&(mscount< ((soundspace+shotstopspace) *2+soundspace) ) )out<=sound;else out<=0;endelse out<=0 ;endendmodule/* sound ddd du,v:发出声音嘀嘀嘀一嘟声音模块*/module sound_ddd_du (clk_1k, on, out) ;parameter SOUNDSPACE=30;parameter shotstopspace=20;//20ms,两个嘀声的时间距离parameter longsoundspace=60; //嘟的长度input clk_1k, on;output reg out;reg sound_di, sound_du;always@ (posedge clk_1k) sound_di<=~sound_di;always@ (posedge sound_di) sound_du<=~sound_du;reg [ 11 : 0 ] mscount ;always@ (posedge clk_1k)begin if (on)begin if (mscount< (SOUNDSPACE+shotstopspace) *3+longsoundspace+10)mscount<=mscount+1'b1;endelse mscount<=0 ;endalways@ (negedge clk_1k)begin if (on)begin if ( (mscount>=0) && (mscount<SOUNDSPACE) ) out<=sound_di;else if ( (mscount>=SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) ) )out<=0 ;else if ( (mscount>= (SOUNDSPACE+shotstopspace) ) && (mscount< (SOUNDSPACE+shotstopspace) +SOUNDSPACE) )out<=sound_di ;else if ( (mscount>= (SOUNDSPACE+shotstopspace) +SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) *2) )out<=0;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *2) && (mscount< ( (SOUNDSPACE+shotstopspace) *2+SOUNDSPACE) ) )out<=sound_di;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *2+SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) *3) )out<=0;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *3) && (mscount< ( (SOUNDSPACE+shotstopspace) *3+longsoundspace) ) )out<=sound_du;else out<=0;endendendmodule。
数字钟汇编语言程序
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
;; 1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT1OUT: POP PSW ;恢复现场
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H ;
MOV 20H,#00H ;清20H(标志用)
MOV 7AH,#0AH ;放入"熄灭符"数据
MOV TMOD,#11H ;设T0、T1为16位定时器
CPL 02H ;0.3秒定时到对闪烁标志取反
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
MOV 72H,76H ;02H位为0时正常显示
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
第一个: ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
多功能电子钟程序(完全好使)
/*设计功能: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()//设定系统时间,时间格式:分-分。
数字时钟设计(含完整程序)
电子时钟设计一、实验目的学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
二、设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1.在4位数码管上显示当前时间,显示格式为“时时分分” ;2.由LED闪动做秒显示;3.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
三、工作原理及设计思路利用单片机定时器完成计时功能,定时器0计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,电路如右图,当P1.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
四、硬件电路设计及描述由于扩展了外部存储器,P0口只能作地址/数据总线,P2口只能作地址总线高8位,P3.7、P3.6作为外部数据存储器读写信号。
P3.0、P3.1作为串行输入、输出接口,在仿真模式下完成与PC机的通信,故也不可用。
实验仪上单片机可用作I/O的口仅有:P1.0--P1.7 ,8位;P3.2、P3.3、P3.4、P3.5 ,4位。
其中:P1.0 用作数据线SDA,P1.1用作时钟信号CLK,所以P1.0和P1.1应该接对应跳线的A 位,即跳线的中间和下面相连。
P1.3、P1.4、P1.5和P1.6是四个数码管的位扫描线,其中P1.6对应数码管W1,显示小时高位;P1.5对应数码管W2,显示小时低位;P1.4对应数码管W3,显示分钟高位;P1.3对应数码管W4,显示分钟低位。
P1.7连接蜂鸣器电路,输出不同频率的方波,使其发出不同的声音。
P1.2 用来控制秒的闪烁显示。
故,P1.2也应该接对应跳线的A 位。
简易数字时钟
简易数字时钟1、功能描述用四个7段数码管来显示时间,并可通过按键来调整时间。
2、元器件清单3、部分器件功能74HC574锁存器程序流程图5、电路原理图及仿真效果图附:程序#include<reg52.h>sbit hou_shi=P3^6;sbit hou_ge=P3^7;sbit min_shi=P3^5;sbit min_ge=P3^4;sbit sec_dian=P3^0;int num=0,hou=23,min=59,sec=0;/***************时钟子程序*******************/ void clock(){if(num==20){num=0;sec++;}if(sec==60){sec=0;min++;}if(min==60){min=0;hou++;}if(hou==24){hou=0;}}/****************延时子程序******************/ void delay(void){unsigned char a,b;for(a=40;a>0;a--)for(b=100;b>0;b--);}/****************分钟显示子程序******************/ void display_min(num_min){int a,b;a=num_min/10;b=num_min%10;min_shi=1; //开锁存器switch(a){case 0:P2=0x3F;delay();break;case 1:P2=0x06;delay();break;case 2:P2=0x5B;delay();break;case 3:P2=0x4F;delay();break;case 4:P2=0x66;delay();break;case 5:P2=0x6D;delay();break;case 6:P2=0x7D;delay();break;case 7:P2=0x07;delay();break;case 8:P2=0x7F;delay();break;case 9:P2=0x6F;delay();break;default:break;}min_shi=0; //关锁存器//delay(); //延时min_ge=1;switch(b){case 0:P2=0x3F;delay();break;case 1:P2=0x06;delay();break;case 2:P2=0x5B;delay();break;case 3:P2=0x4F;delay();break;case 4:P2=0x66;delay();break;case 5:P2=0x6D;delay();break;case 6:P2=0x7D;delay();break;case 7:P2=0x07;delay();break;case 8:P2=0x7F;delay();break;case 9:P2=0x6F;delay();break;default:break;}min_ge=0;}/***************小时显示程序*******************/ void display_hou(num_hou){int a,b;a=num_hou/10;b=num_hou%10;hou_shi=1;//delay();switch(a){case 0:P1=0x3F;delay();break;case 1:P1=0x06;delay();break;case 2:P1=0x5B;delay();break;case 3:P1=0x4F;delay();break;case 4:P1=0x66;delay();break;case 5:P1=0x6D;delay();break;case 6:P1=0x7D;delay();break;case 7:P1=0x07;delay();break;case 8:P1=0x7F;delay();break;case 9:P1=0x6F;delay();break;default:break;}hou_shi=0;//delay();hou_ge=1;switch(b){case 0:P1=0x3F;delay();break;case 1:P1=0x06;delay();break;case 2:P1=0x5B;delay();break;case 3:P1=0x4F;delay();break;case 4:P1=0x66;delay();break;case 5:P1=0x6D;delay();break;case 6:P1=0x7D;delay();break;case 7:P1=0x07;delay();break;case 8:P1=0x7F;delay();break;case 9:P1=0x6F;delay();break;default:break;}hou_ge=0;}/***************闪烁灯*******************/void display_sec(num_sec){if(num_sec%2==0)sec_dian=0;if(num_sec%2==1)sec_dian=1;}/****************主程序******************/void main(){IE=0x8d; //开总中断(EA=1),开定时器1(ET1=1),//开外部中断1(EX1=1),开外部中断0(EX0=1).TMOD=0x10; //选择定时器1的工作方式为方式1TH1=(65536-40000)/256; //装初值TL1=(65536-40000)%256;TCON=0x45; //启动定时器1(TR1=1),设置INT0和INT1负边沿触发。
简单的数字钟程序,做成实物时要给数码管加驱动,用74hc244或三.
简单的数字钟程序,做成实物时要给数码管加驱动,用74hc244或三极管都可以,具体驱动电路网上有很多,我这里主要是提供c程序。
初始时间设为12点,两个按键分别为小时加1和分钟加1仿真电路如下:c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit HOURADD=P3^0;//小时加1sbit MITADD=P3^1;//分钟加1uint tmcnt;//定时器计数uint hour=12,mit=0,sec=0;uchar codeseg7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};///共阴数码管0-9码值uchar code disp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位扫描uchar data disdata[6];void delay1ms(unsigned int i)//延时1毫秒(不准确的){ unsigned int a,b;for(a=0;a<i;a++)for(b=0;b<120;b++);}init_time(){TMOD=0x01;TH0=(65536-20000)/256;//定时20毫秒 TL0=(65536-20000)%256;EA=1;ET0=1;TR0=1;}void display()//扫描显示{ uchar i;disdata[0]=hour/10;//数据处理 disdata[1]=hour%10;disdata[2]=mit/10;disdata[3]=mit%10;disdata[4]=sec/10;disdata[5]=sec%10;for(i=0;i<6;i++){P0=0x00;P0=seg7[disdata[i]];P2=disp[i];delay1ms(2);}}void time0(void)interrupt 1 using 0 { TH0=(65536-20000)/256;TL0=(65536-20000)%256;if(++tmcnt==50)//计数50次为1秒{tmcnt=0;sec++;if(sec==60){sec=0;mit++;if(mit==60){mit=0;hour++;if(hour==24){hour=0;}}}}}void keyscan(){ if(HOURADD==0){delay1ms(10);if(HOURADD==0){while(HOURADD==0);hour++;if(hour==24){hour=0;}}}if(MITADD==0){delay1ms(10);if(MITADD==0){while(MITADD==0);mit++;if(mit==60){mit=0;}}}}main(){ init_time();while(1){ keyscan();display();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
--年月日模块
cni:in std_logic; --1 gongzuomoshi ;0 tiaojiemoshi ci:in std_logic; --di wei jin wei; dayh,dayl,moonh,moonl,yearh,yearl:out std_logic_vector(3 downto 0)); end nian; architecture one of nian is component day port(en,clk:in std_logic; cor:in std_logic_vector(1 downto 0); dayl,dayh:out std_logic_vector(3 downto 0):="0001"; co:out std_logic); end component ; component mcor port( moonl,moonh,yearl,yearh: in std_logic_vector(3 downto 0); cor:out std_logic_vector(1 downto 0)); end component ; component moon port(en,clk: in std_logic; co: out std_logic; moonh,moonl: out std_logic_vector(3 downto 0)); end component; component year port(en,clk: in std_logic; yearh,yearl: out std_logic_vector( 3downto 0)); end component; signal syearh,syearl:std_logic_vector(3 downto 0); signal smoonh,smoonl:std_logic_vector(3 downto 0); signal sclk:std_logic_vector(2 downto 0); signal sco:std_logic_vector(1 downto 0); signal scor:std_logic_vector(1 downto 0); begin p:process(cni,clk(0),ci) begin if cni='0' then sclk(0)<=clk(0) or ci; elsif cni='1' then sclk(0)<= ci; end if; end process; u4:day port map (en=>en(0),clk=>sclk(0),cor=>scor,dayl=>dayl,dayh=>dayh,co=>sco(0)); p4:process(cni,clk(1),sco(0)) begin if cni='0' then sclk(1)<=clk(1) or sco(0); elsif cni='1' then sclk(1)<=sco(0); end if; end process; u3:mcor port map (moonl=>smoonl,moonh=>smoonh,yearl=>syearl,yearh=>syearh,cor=>scor);
八、程序清单
--该部分是通过当前的年份和月份确定日计数器的进制; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mcor is port( moonl,moonh,yearl,yearh: in std_logic_vector(3 downto 0); cor:out std_logic_vector(1 downto 0)); --“00”表示 28 进制, ”11”表示 31 进制; end; architecture one of mcor is begin process(moonl,moonh,yearl,yearh) begin if ((moonh="0000" and moonl="0001") or (moonh="0000" and moonl="0011") or (moonh="0000" and moonl="0101") or(moonh="0000" and moonl="0111") or (moonh="0000" and moonl="1000") or (moonh="0001" and moonl="0000") or (moonh="0001" and moonl="0010")) then cor<="11"; elsif((moonh="0000" and moonl="0100") or (moonh="0000" and moonl="0110") or (moonh="0000" and moonl="1001") or (moonh="0001" and moonl="0001")) then cor<="10"; elsif moonh="0000" and moonl="0010" then if ((yearh="0000" and yearl="0100") or (yearh="0000" and yearl="1000") or (yearh="0001" and yearl="0010") or (yearh="0001" and yearl="0110") or (yearh="0010" and yearl="0000") or (yearh="0010" and yearl="0100") or (yearh="0010" and yearl="1000") or (yearh="0011" and yearl="0010") or (yearh="0011" and yearl="0110") or (yearh="0100" and yearl="0000") or (yearh="0100" and yearl="0100") or (yearh="0100" and yearl="1000") or (yearh="0101" and yearl="0010") or (yearh="0101" and yearl="0110") or (yearh="0110" and yearl="0000") or (yearh="0110" and yearl="0100") or (yearh="0110" and yearl="1000") or (yearh="0111" and yearl="0010") or (yearh="0111" and yearl="0110") or (yearh="1000" and yearl="0000") or (yearh="1000" and yearl="0100") or (yearh="1000" and yearl="1000") or (yearh="1001" and yearl="0010") or (yearh="1001" and yearl="0110")) then cor<ss(cor) begin if cor="00" then scaleh<="0010"; scalel<="1000"; elsif cor="01" then scaleh<="0010"; scalel<="1001"; elsif cor="10" then scaleh<="0011"; scalel<="0000"; elsif cor="11" then scaleh<="0011"; scalel<="0001"; end if; end process; u2:process(en,clk) begin if en='1' then if clk'event and clk='1' then if temp2=scaleh and temp1=scalel then temp1<="0001"; temp2<="0000"; co<='1'; elsif temp1="1001" then temp1<="0000"; temp2<=temp2+1; else temp1<=temp1+1; co<='0'; end if; end if; end if; end process; dayh<=temp2; dayl<=temp1; end one; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity nian is port (en,clk:in std_logic_vector(2 downto 0);