数码管显示数字时钟
51单片机数码管显示时钟(C语言)

* 输出
:无
*******************************************************************************
/
void main() {
Ds1302Init(); Timer0Configuration(); while(1) {
Ds1302ReadTime(); disp[7] = DIG_CODE[TIME[0]&0x0f]; disp[6] = DIG_CODE[TIME[0]>>4]; disp[5] = 0X40; disp[4] = DIG_CODE[TIME[1]&0x0f]; disp[3] = DIG_CODE[TIME[1]>>4]; disp[2] = 0X40; disp[1] = DIG_CODE[TIME[2]&0x0f]; disp[0] = DIG_CODE[TIME[2]>>4]; }
/
void DigDisplay() interrupt 1 { //定时器在工作方式二会自动重装初,所以不用在赋值。 // TH0=0X9c;//给定时器赋初值,定时 1ms // TL0=0X00;
DIG=0; //消隐 switch(Num) //位选,选择点亮的数码管, {
case(7): LSA=0;LSB=0;LSC=0; break;
uchar n;
EA = 0; RST = 0; _nop_();
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1; //然后将 RST(CE)置高电平。 _nop_();
for (n=0; n<8; n++)//开始传送八位地址命令 {
PLC控制的数字显示电子钟

PLC控制的数字显示电子钟1.引言随着现代科技和自动化控制技术的发展,电子钟被广泛应用于各类场合,特别是工业生产环境中的自动化生产和管理过程中,电子钟可以起到非常重要的作用。
PLC是当前工业自动化领域中使用最为广泛的控制系统之一,它可以在工业生产过程中对自动控制系统进行精确的操作和控制,PLC控制的数字显示电子钟因此也得到了广泛的应用。
本文将对PLC控制的数字显示电子钟进行详细地介绍和分析。
2.数字显示电子钟的基本构成数字显示电子钟主要由以下几部分组成:时钟芯片、数字显示器、数码管驱动芯片和电源等。
2.1 时钟芯片时钟芯片是数字显示电子钟中最核心的部分,它可以实现时钟的实时显示和管理,时钟芯片通常包括实时时钟计数器、控制器和数据存储器等,它可以通过对实时时钟计数器进行计时,实现时钟的精准控制和显示。
2.2 数字显示器数字显示器即为显示时间的数码管,它可以显示时钟芯片所计时的具体时间,数码管可以是七段数码管或者十六段数码管,根据需要,任意数量的数码管可以连接在一起。
2.3 数码管驱动芯片数码管驱动芯片是数字显示电子钟中实现数码管显示的最关键部分,它通常由多个芯片组成,包括每个数码管的控制器、数据锁存器和驱动器等。
数码管驱动芯片可以控制数码管的显示状态,使得数字显示电子钟可以非常准确地控制和显示时间。
2.4 电源电子钟的电源主要供给时钟芯片、数字显示器和驱动芯片等电子器件使用,它通常需要稳定的电压和电流输出,以确保电子元器件的正常运行。
3.PLC控制的数字显示电子钟的设计原理PLC控制的数字显示电子钟的基本设计原理包括如下步骤:3.1 时钟芯片和数字显示器的连接时钟芯片通常需要通过串行接口和其它数字电路板连接起来,而数码管可以通过直接连接或者通过驱动芯片的方式进行连接,其连接方式有四种:单共阴连接、单共阳连接、多位直接连接和分时多位共阴/共阳连接。
3.2 PLC和时钟芯片的连接PLC控制器需要通过读取和写入时钟芯片的输入/输出口来控制时钟芯片的工作状态,PLC控制器通常需要通过时钟芯片的串行接口或并行接口与时钟芯片连接。
数码管功能

数码管功能数码管是一种常见的显示元件,由许多发光二极管(LED)组成,常用于显示数字和字符等信息。
在我们的日常生活中,数码管被广泛应用于各种设备中,如电子钟、电子秤、温度计、计时器等。
数码管的功能主要体现在以下几个方面:1. 数字显示:数码管最基本的功能就是显示数字。
它由七个发光二极管组成,用来表示不同的数字。
每个发光二极管代表一个数字,通过控制电流的通断来显示特定的数字。
数码管可以显示0-9的数字,通过不同的组合方式还能显示英文字母和特殊字符。
2. 字符显示:除了显示数字,数码管还可以显示一些英文字母和特殊字符。
通过特定的电流通断组合,数码管可以显示A-F的英文字母,以及一些特殊字符如"-"、"."等。
这样就可以在数码管上显示更多的信息,方便用户获取更多的信息。
3. 多位显示:常见的数码管有单位数码管和多位数码管。
单位数码管只能显示一个数字或字符,而多位数码管可以同时显示多个数字或字符。
多位数码管通常由4位或6位单元组成,每个单元可以显示一个数字或字符。
通过控制不同单元的电流通断,多位数码管可以显示更多的数字或字符,提供更多的信息。
4. 时钟显示:数码管可以用于显示时间。
通过在数码管上显示不同的数字,就可以构成一个时钟。
通常使用4位数码管,前两位显示小时,后两位显示分钟。
通过不断刷新数码管上的数字,就可以实现实时的时钟显示。
5. 其他应用:除了上述常见的功能,数码管还可以用于其他许多应用。
比如在电子秤上,数码管可以显示重量;在温度计上,数码管可以显示温度;在计时器上,数码管可以显示计时的时间等等。
这些应用都将数码管的显示功能发挥到了极致,提供了更多的信息和便利。
总之,数码管作为一种常见的显示元件,具有多种功能。
它可以显示数字、字符和一些特殊字符,可以单独显示一个数字或字符,也可以通过多位数码管同时显示多个数字或字符。
数码管还可以用于显示时间、重量、温度等信息,满足不同设备的需求。
四位数码管显示时间的原理

四位数码管显示时间的原理
四位数码管是一种常见的显示器件,用于显示数字。
它由四个七段数码管组成,每个数码管有七个段(a-g)用于显示数字0-9。
通过控制这些段的亮灭,可以显示不同的数字。
数码管显示时间的原理如下:
1. 时钟信号:时钟信号是一个周期性的信号,用于控制数码管的刷新频率。
通常,数码管的刷新频率为几十赫兹,即每秒刷新几十次。
2. 数字转换:将当前的时间转换为需要显示的数字。
例如,将小时、分钟和秒分别转换为四个数字。
3. 数字显示:将转换后的数字依次显示在四位数码管上。
通过控制数码管的七段,可以让特定的段亮起,显示对应的数字。
4. 刷新:由于刷新频率较高,每个数码管只能持续亮起很短的时间,然后迅速切换到下一个数码管。
通过快速刷新,人眼会感觉到所有数码管都同时亮起。
这样,通过不断地刷新和更新显示的数字,就可以实现数码管显示时间的功能。
需要注意的是,数码管只能显示数字,不能直接显示字母和其他符号。
如果需要显示字母、符号或者更复杂的信息,可能需要使用其他类型的显示器件。
电子设计自动化(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.设计时钟源:选择合适的晶振作为时钟源,并将时钟信号输入到单片机的计时部分,生成一个恒定频率的脉冲信号。
4.编程设计:根据单片机类型选择相应的开发工具,编写程序实现时钟的计数、显示和控制功能。
其中,需要实现时钟的秒、分、时等单位的计数和显示、时钟调节和设置等功能。
5.数码管接口设计:根据数码管的数量和接口方式,进行接口设计。
常用的接口方式有共阳和共阴两种方式。
通过连接适当的电阻和引脚控制,实现对数码管进行数字显示。
6.硬件设计:根据实际需求和电路原理进行电路设计,包括电源电路、晶振电路和数码管显示电路。
注意电源的稳定性以及数码管的驱动电流和电压等参数。
7.调试和测试:完成硬件设计后,进行电子时钟的调试和测试工作。
通过对时钟进行时间设置和调整,验证时钟的计时和显示功能是否正常。
8.最终优化:对电子时钟的功能和性能进行评估,并进行必要的优化。
可以考虑添加闹钟功能、温度显示等扩展功能。
三、实现方法电子时钟的实现方法主要有两种,一种是基于单片机开发板实现,另一种是自己设计和制作。
数码管上的时钟数字显示

/*******************************************************************//* 数码管上的时钟数字显示*//* 2012年5月*//* 作者:雷国强*//* 邮箱:940762196@ *//*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!*//* *//*******************************************************************///开始运行时,数码管个位一秒加一到59时分钟加一,到59:59时归0//有3*4的键盘,按下数字键时调节时钟定时,按*或者#时时钟继续走//用到proteus 6 画图//画图器件at89c52 两个两位数码管两个led灯1个四位与门两个330k电阻/*******************************************************************/#include <reg52.h>#include <INTRINS.H>#define uchar unsigned char //宏定义#define uint unsigned intsbit com1=P3^2;sbit com2=P3^5;sbit com3=P3^6; //定义位sbit com4=P3^7;sbit key1=P3^0;sbit key2=P3^1;uchar value1=0,value2=0,value3=0,value4=0,value=0,time,flag;fl;uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay_ms(uint z);void init(void);void display(void);/****************************************************************************** *************************//****************************************************************************** *************************/main(){init();while(1){ //主函数display(); //显示子函数}}/****************************************************************************** *************************//****************************************************************************** *************************/void init(void) //初始化{//定时器1TMOD=0x01;TH0=(65536-50000)/256; //初值50msTL0=(65536-50000)%256;TR0=1; //打开控制位ET0=1;EX1=1;IT1=1; //中断1EA=1;PT0=1;P2=0xff;P2=0x0f;}void key(void) interrupt 2 //判断按键并定时{uchar i=0,j=1,temp,temp0;delay_ms(5);temp=P2;if(temp!=0x0f){TR0=0;flag=1;temp0=temp&0x01;while(temp0!=0x0){temp>>=1;temp0=temp&0x01;i++;}P2=0xff;P2=0xf0;temp=P2;temp<<=1;temp0=temp&0x80;while(temp0!=0x00){temp<<=1;temp0=temp&0x80;j++;}value=i*3+j; //确定按键if(value==11)value=0;if(value!=10&&value!=12){ value4=value3;value3=value2;value2=value1;value1=value;}elseTR0=1;while(P2!=0xf0) delay_ms(5);}P2=0xff;P2=0x0f;if(flag==1){P1=table[value1];com4=0;com3=1;com2=1;com1=1;delay_ms(2);flag=-1;}else if(flag==-1){P1=table[value2];com4=1;com3=0;com2=1;com1=1;delay_ms(2);flag=0;}else if(flag==0){P1=table[value3];com4=1;com3=1;com2=0;com1=1;delay_ms(2);flag=-3;}else if(flag==(-3)) {P1=table[value4];com4=1;com3=1;com2=1;com1=0;delay_ms(2);flag=1;}}void time0(void) interrupt 1 //定时器0,实现时钟工作{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;fl++;if(time==20){time=0;P1=table[value1];value1++;com1=1;com2=1;com3=1;com4=0;delay_ms(5);if(value1==10){value1=0;value2++;P1=table[value2];com1=1;com2=1;com3=0;com4=1;delay_ms(2);if(value2==6){value2=0;value3++;P1=table[value3];com1=1;com2=0;com3=1;com4=1;if(value3==10){value3=0;value4++;P1=table[value4];com1=0;com2=1;com3=1;com4=1;delay_ms(2);if(value4==6)value4=0;}}}}if(fl==10) //控制led等0.5s时灭,1s时亮{key1=1;key2=1;}if(fl==20){ fl=0;key1=0;key2=0;}}void display(void) //显示{P1=table[value1];com4=0;com3=1;com2=1;com1=1;delay_ms(2);P1=table[value2];com4=1;com3=0;com2=1;com1=1;delay_ms(2);P1=table[value3];com4=1;com3=1;com2=0;com1=1;delay_ms(2);P1=table[value4];com4=1;com3=1;com2=1;com1=0;delay_ms(2);}void delay_ms(uint z) //延时函数{uint x;while(z--)for(x=0;x<110;x++) ; //1ms}。
汇编数字钟-8位数码管显示

汇编数字钟(8位数码管显示)这款数字钟是笔者亲自试验过的作品,电路图和程序都经过优化,供爱好者制作参考。
显示格式依然是23-59-59(同样是小时十位如果为0则不显示),调整时间增加了一只按钮,通过调整选择键SET_KEY选择调整位,选中位开始闪烁,此时再按增加键ADD_KEY或减少键DEC_KEY调整选中位,如果长按ADD_KEY或DEC_KEY,系统识别后则进行调时快进,此时停止闪烁,方便人眼观察。
同时还增加了调秒功能:如果选中位是秒,则按增加键或减少键都是将秒清零。
汇编程序设计:/**************************************************************程序名称:51单片机8位数码管数字钟汇编程序简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒显示格式:23-59-59(小时十位如果为0则不显示)通过3只按键来调整时间调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁增加键ADD_KEY:P1.1;按一次使选中位加1减少键DEC_KEY;P1.2;按一次使选中位减1如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁如果选中位是秒,则按增加键或减少键都是将秒清零P0口输出数码管段选信号,P2口输出数码管位选信号。
晶振12M编写:最后更新:08/12/31晚**************************************************************/ ORG 0000H ;程序入口地址LJMP STARTORG 000BH ;定时器0中断入口地址LJMP TIMER_0ORG 0300H/*****程序开始,初始化*****/START:SETB 48H ;使用一个bit位用于调时闪烁标志SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒MOV 20H,#00H ;用于控制秒基准时钟源的产生MOV 21H,#00H ;清零秒寄存器MOV 22H,#00H ;清零分寄存器MOV 23H,#00H ;清零时寄存器MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生MOV IP,#02H ;IP,IE初始化MOV IE,#82HMOV TMOD,#01H ;设定定时器0工作方式1MOV TH0,#3CHMOV TL0,#0B0H ;赋定时初值,定时50msSETB TR0 ;启动定时器0MOV SP,#40H ;重设堆栈指针/*****主程序*****/MAIN:LCALL DISPLAY ;调用显示子程序LCALL KEY_SCAN ;调用按键检测子程序JZ MAIN ;无键按下则返回重新循环LCALL SET_KEY ;调用选择键处理子程序JB 46H,MAIN ;如果已进行长按调整(调时快进),则不再执行下面的单步调整LCALL ADD_KEY ;调用增加键处理子程序,加一LCALL DEC_KEY ;调用减少键处理子程序,减一LJMP MAIN ;重新循环/*****定时器中断服务程序*****/TIMER_0:PUSH ACCPUSH PSW ;保护现场MOV TH0,#3CHMOV TL0,#0B0H ;重新赋定时初值CPL 47H ;产生脉冲用于调时快进时基INC 24HMOV A,24HCJNE A,#10,ADD_TIME ;产生0.5秒基准时钟,用于调时闪烁CPL 48H ;取反调时闪烁标志位MOV 24H,#00HADD_TIME: ;走时INC 20HMOV A,20HCJNE A,#20,RETI1 ;产生1秒基准时钟MOV 20H,#00H ;一秒钟时间到,清零20H MOV A,21HADD A,#01HDA A ;作十进制调整MOV 21H,ACJNE A,#60H,RETI1MOV 21H,#00H ;一分钟到MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETI1MOV 22H,#00H ;一小时到MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETI1MOV 23H,#00H ;到24点,清零小时RETI1:POP PSWPOP ACC ;恢复现场RETI ;中断返回/*****显示处理*****/DISPLAY:MOV A,21H ;秒ANL A,#0FHMOV 2FH,A ;转换出秒个位,存入2FHMOV A,21HANL A,#0F0HSWAP AMOV 2EH,A ;转换出秒十位,存入2EHJB 46H,MIN ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#3,MIN ;如果R1为3,闪烁秒位待调整JB 48H,MINMOV 2FH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2EH,#0AHMIN:MOV A,22H ;分ANL A,#0FHMOV 2DH,A ;转换出分个位,存入2DHMOV A,22HANL A,#0F0HSWAP AMOV 2CH,A ;转换出分十位,存入2CHJB 46H,HOUR ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#2,HOUR ;如果R1为2,闪烁分位待调整JB 48H,HOURMOV 2DH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2CH,#0AHHOUR:MOV A,23H ;时ANL A,#0FHMOV 2BH,A ;转换出时个位,存入2BHMOV A,23HANL A,#0F0HSWAP AMOV 2AH,A ;转换出时十位,存入2AHJB 46H,DISP ;如果长按按键(调时快进),则跳过闪烁处理程序CJNE R1,#1,DISP ;如果R1为1,闪烁时位待调整JB 48H,DISPMOV 2BH,#0AH ;使该位为10,查表得到使该位不显示的输出MOV 2AH,#0AH/*****数码管动态扫描显示*****/DISP:MOV DPTR,#TABLEMOV A,2FHMOVC A,@A+DPTRMOV P0,ACLR P2.7LCALL DELAYSETB P2.7 ;显示秒个位MOV A,2EHMOVC A,@A+DPTRMOV P0,ACLR P2.6LCALL DELAYSETB P2.6 ;显示秒十位MOV A,#0BFHMOV P0,ACLR P2.5LCALL DELAYSETB P2.5 ;显示“-”MOV A,2DHMOVC A,@A+DPTRMOV P0,ACLR P2.4LCALL DELAYSETB P2.4 ;显示分个位MOVC A,@A+DPTRMOV P0,ACLR P2.3LCALL DELAYSETB P2.3 ;显示分十位MOV A,#0BFHMOV P0,ACLR P2.2LCALL DELAYSETB P2.2 ;显示“-”MOV A,2BHMOVC A,@A+DPTRMOV P0,ACLR P2.1LCALL DELAYSETB P2.1 ;显示时个位MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0MOV A,2AHMOVC A,@A+DPTRMOV P0,ACLR P2.0LCALL DELAYSETB P2.0 ;显示时十位RET/*****按键检测子程序*****/KEY_SCAN:CLR 46H ;关闭长按调整(调时快进)标志MOV P1,#0FFH ;将P1口设置成输入状态MOV A,P1CPL AANL A,#07H ;P1口低3位连接3个按键,只判断该3位JZ EXIT_KEY ;无键按下则返回LCALL DELAY ;延时去抖动MOV A,P1 ;重新判断CPL AJZ EXIT_KEY ;键盘去抖动MOV R5,A ;临时将键值存入R5MOV R4,#00H ;用于控制调时快进速度;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进LOOP: ;进入长按处理LCALL DISPLAY ;使长按时显示正常MOV A,P1CPL AANL A,#07HJB 47H,LOOP1INC R4 ;调时快进间隔时间基准加1LOOP1:CJNE R1,#03H,LOOP2 ;如果调秒时长按,则不处理LJMP LOOP3LOOP2:CJNE R4,#99H,LOOP3MOV R4,#70H ;确认用户长按后,重新设定起始值,加快调时快进速度SETB 46H ;长按调整(调时快进)标志LCALL ADD_KEYLCALL DEC_KEYLOOP3:JNZ LOOP ;等待键释放MOV A,R5 ;输出键值RETEXIT_KEY:RET/*****延时子程序*****/DELAY:MOV R7,#150DJNZ R7,$RET/*****选择键处理子程序*****/SET_KEY:CJNE R5,#01H,EXIT ;选择键键值INC R1 ;调整选择功能标志加一CJNE R1,#4,EXITMOV R1,#0MOV 24H,#00H ;调时闪烁基准清零RET/*****增加键处理子程序*****/ADD_KEY:CJNE R5,#02H,EXIT ;增加键键值CJNE R1,#01H,NEXT1 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,EXITMOV 23H,#00HNEXT1:CJNE R1,#02H,NEXT2 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,EXITMOV 22H,#00HNEXT2:CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如增加键按下直接清零秒RET/*****减少键处理子程序*****/DEC_KEY:CJNE R5,#04H,EXIT ;减少键键值CJNE R1,#01H,NEXT3 ;选择键功能标志为1,调时,否则跳出MOV A,23HADD A,#99HDA AMOV 23H,ACJNE A,#99H,EXITMOV 23H,#23HNEXT3:CJNE R1,#02H,NEXT4 ;选择键功能标志为2,调分,否则跳出MOV A,22HADD A,#99HMOV 22H,ACJNE A,#99H,EXIT MOV 22H,#59HCJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出MOV 21H,#00H ;如较少键按下直接清零秒RET/*****万用返回子程序*****/EXIT:RET/*****数码管字形编码表*****/TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形显示编码TABLE1:DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小时位的十位数编码,该位如果为0则不显示END ;程序结束(注:可编辑下载,若有不当之处,请指正,谢谢!)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编写目的
巩固和提高学过的基础理论和专业知识 提高运用所学专业知识进行独立思考和综合分 析、解决实际问题的能力 培养掌握正确的思维方法和利用软件解决问题 的基本技能 掌握分析处理方法,进行调试、设计等基本技 能的训练,使之具有一定程度的实际工作能力
主要硬件
单片机:本设计中采用型号为AT89C52的单片机,AT89C52是一个低功 耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同 时内含6个中断源,3个16位可编程定时计数器,2个全双工串行通信口, 片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和256B的随 机存取数据存储器(RAM),兼容标准MCS-52指令系统,片内置通用 8位中央处理器和Flash存储单元。 数码管:分段式显示器(LED数码管)由7条线段围成8字型,每一段包 含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要 按规律控制各发光段亮、灭,就可以显示各种字形或符号。LED数码管 有共阳、共阴之分。
致谢
通过不断努力,终于完成了此次毕业设计.在此, 首先感谢导师曲鸣飞老师,正是他在万忙之中 抽出宝贵的时间对我进行精心的指导,才使我 顺利完成了毕业设计.同时也感谢自动化工程 学院的各个老师对我四年来的关心和帮助.使 我在学校学到了许多宝贵的知识和经验.在此, 由衷的感谢!!
结束
放映结束,谢谢大家 放映结束 谢谢大家
论文结构
绪论 硬件设计 主流程图 程序源代码 系统调试与仿真
Proteus软件简介 软件简介
Proteus软件是英国Labcenter electronics公司出版的EDA工具软 件(该软件中国总代理为广州风标电子技术有限公司)。它不仅 具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。 它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推 广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致 力于单片机开发应用的科技工作者的青睐。Proteus是世界上著 名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与 外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到 产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计 软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持 8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、 8086和MSP430等,2010年即将增加Cortex和DSP系列处理器, 并持续增加其他系列处理器模型。在编译方面,它也支持IAR、 Keil和MPLAB等多种编译器。
硬件设计
工作流程图
程序源代码
详情请见论文
MedWin V3.0进行程序调试 进行程序调试
Proteus 进行仿真
首先载入生成的.h文件
Proteus 仿真如下
实现功能
(1)实现基本的走时和显示时间的时、分、秒,上电自动显示 初始时间00-00-00,且控制闹钟状态的的蓝色led灯为亮的状态。 (2)当第一次按下模式键时,可对时位置进行加时间/减时间. (3)当第二次按下模式键时,可对分钟位置进行加时间/减时间. (4)当第三次按下模式键时,可对秒位置进行加时间/减时间. (5)当第四次按下模式键时,进入设定闹钟状态,此时可对时位置 进行加时间/减时间. (6)当第五次按下模式键时,进入设定闹钟状态,此时可对分位置 进行加时间/减时间. ( 7 ) 当第六次按下磨时间时,恢复正常计时, 设置时间/闹钟期间 计时未停止.