精华内容
下载资源
问答
  • 随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。
  • 本文利用 Verilog HDL 语言的设计方法设计多功能数字,并通过 vivado 2016.3 完 成综合实现。此程序通过下载到 FPGA 芯片后,可应用于实际的数字显示中,实现了基本 的计时显示(时分到分秒的切换)和设置,调整...
  • 大二多功能数字课程设计报告,内容详细有借鉴意义
  • 本文叙述了电子钟的整个设计过程,包括硬件设计和软件设计,并重点讨论了模块软件设计和编程思想,并在本文末尾进行了讨论和总结,提出了改进的方面和改进的方法。完成的电子钟具有走时准确;掉电长时间后时间不需...
  • 基于PROTEUS的 多功能数字电子钟设计报告
  • 多功能数字设计

    千次阅读 多人点赞 2020-11-13 21:32:33
    提示:电子综合实训包括很多实验,本实验课题选择多功能电子时钟设计,其中包括模拟电子技术和数字电子技术的知识的运用,本文使用的实验环境是win7(当然win10阔以的哦),仿真软件是Multisim10.0.1,打开界面...

    基于Multisim10.0.1的多功能数字钟的设计

    信息工程学院电子技术综合实训

    注:本实验报告,仅供参考,其中资料文献本文后面有注明来处,侵权删。


    课题前言

    电子综合实训包括很多实验,本实验课题选择多功能电子时钟的设计,其中包括模拟电子技术和数字电子技术的知识的运用,本文使用的实验环境是win7(当然win10可以的),仿真软件是Multisim10.0.1,打开界面如下:
    在这里插入图片描述


    提示:以下是本篇文章正文内容,下面案例供参考

    一、设计目的和要求

    设计一个多功能数字钟,能够准确记时并以数字化形式显示时、分、秒的时间,且该数字钟能够有以下功能:

    序号功能
    1校正时间
    2准点报时
    3定时闹钟

    二、选题的目的和意义

    数字钟从原理上来讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。目前,数字钟的功能越来越多,并且有多种专门的大规模集成电路可供选择,一般由数钟电路、放大执行电路、电源电路等组成。
    设计多功能数字电路,通过简单的电路结构,并更改设定电路,了解通过输入脉冲,达到设计时钟目的,同时运用芯片以及逻辑门来实现进制从而理解数字电路的应用。

    三、方案的可行性论证

    1、方案的设计要求

       1、时间以24小时为周期;
       2、显示时、分、秒;
       3、具有校时功能,可以分别对时、分、秒进行单独校时,使其校正达到标准时间;
       4、具有整点报时功能,即设置时间到达整点前10秒进行蜂鸣器报时;
       5、具有定时闹钟功能。
    

    2、各电路模块初步分析

    时间显示电路

    时间显示模块包括时、分、秒部分,可用显示译码器来显示,从而实现24制以及60制。

    时间校准电路

    时间校准包括时钟校准、分钟校准和秒钟校准三个模块,可在各模块中设置点动开关,需要校准时,对应的显示模块数值随点动开关连续变换,待调到所需要的数值时,停止校准,从而达到对各个模块的单独校时。

    整点报时电路

    将显示译码器电路中加逻辑门与其相连,当整点时,报时可通过蜂鸣器蜂鸣实现,并可设置蜂鸣器的长鸣时间。

    定时闹钟电路

    可通过开关组来设置闹钟时间,芯片与逻辑门

    3、工作原理及图例

    当秒计时器计60后向分计数器进位,分计数器计数60后向小时进位,小时计数器设置成24进制计数器,满24后清零,重新开始计时。计数器的输出直接送到LED显示器,当计时出现误差时可以用校时电路进行校时、校分,校时电路是由一开关接到一个高电位上,当按一下开关就传送一个高位脉冲,计数器加一。

    连续脉冲
    时校
    24进制
    译码器
    显示器
    分校
    24进制
    译码器
    显示器
    秒校
    60进制
    译码器
    显示器

    四、元件、器件明细表

    1、74LS161N:
    可预置四位二进制计数器(并清除异步)
    1.QA~QD:计数输出端,输出二进制代码
    2.A~D:预置数据输入端,输入二进制代码
    3.CLK:相当于CP,接单次脉冲端输入
    4.ENT,ENP:计数控制端
    5.~CLR:直接清零端
    6.~LOAD:预置数控制端
    7.RCO:进位输出端
    在这里插入图片描述
    2、74LS85D:
    四位数字比较器
    通过功能表可知,该比较器的比较原理和两位比较器的比较原理相同。两个4位数的比较是从芯片1的最高位A3和芯片2的最高位B3进行比较,如果它们不相等,则该位的比较结果可以作为两数的比较结果。若最高位A3=B3,则再比较次高位A2和B2,余类推。显然,如果两数相等,那么,比较步骤必须进行到最低位才能得到结果,即可从而达到定时闹钟的效果。
    在这里插入图片描述
    3、74LS04N:
    74LS04是六个单输入端的反相器.它的输出信号与输入信号相位相反。六个反相器共用电源端和接地端,其它都是独立的。输出信号手动负载的能力也有一定程度的放大。
    在这里插入图片描述
    4、7400 输入与非门:
    内含四个独立的2输入端与非门,其逻辑功能是:输入端全部为1时,输出为0;输入端只要有0,输出就为1.
    在这里插入图片描述
    5、74LS08J 2输入四与门:
    与门,详细地说是4二输入与门,即一片74LS08芯片内有共四路二个输入端的与门。
    在这里插入图片描述
    6、74LS20D 4输入双与非门:
    两个4输入与非门,内含两组4与非门。
    在这里插入图片描述
    7、元件、器件明细表:

    序号名称数量
    1显示译码器6
    2蜂鸣器2
    374LS161N6
    474LS85D4
    57400N8
    674LS08J3
    774LS20D2
    8瞬时开关3
    9开关组4
    10数字电源VCC5
    11时钟脉冲源1
    12单刀双置开关1
    13电子探针1

    附:74LS系列通用逻辑电路功能表

    五、各个电路模块分析

    1、闹钟电路

    闹钟电路蛮好做,如图,采用4片74LS85D芯片和4个拨码开关构成闹钟电路,从最低位(分个位)对应的比较器74LS85D(U21)的OAEQB端输出高电平,从而实现闹钟功能。

    在这里插入图片描述

    2、校时电路

    在分、秒的与非门与上一级的脉冲接口之间接瞬间开关即可。当开关按下时,产生一个低电平给计数器,从而在下降沿的时候计数器加一。
    注:瞬时开关是交互组件,在Multisim中可以通过键盘上的一个键或使用鼠标点击激活,
    在这里插入图片描述

    3、时记时电路

    24进制的实现用的是两片74LS161芯片以及与非门实现24进制(00~23)。时计时器的十位是二进制,个位是十进制,同时和与非门相连,实现满24时清零,由于小时位和分为、秒为不同,它是以十进制来显示24进制数,即它有两个清零信号,一是在小时的个位计数到10的瞬间,向本位发送一个清零信号,并同时向十位数发送一个进位脉冲。二是在小时的十位计数到2并且个数计数到4的瞬间,向个位和十位同时发送一个清零信号。
    在这里插入图片描述

    4、分、秒记时电路

    60进制的实现是采用两片74LS161芯片和与非门实现的,分、秒计数器的十位都是60进制,个位都是10进制,共同构成60精致。分、秒计时电路的控制是一样的,采用同一器件74LS161N的反馈置数法来实现10进制功能和6进制功能,根据芯片74LS161N的结构把输出端的0100(十进制为6)用一个与非门7400N引到CLR端便可置0,即当分(秒)的个位计数到10的瞬间,向本位发送一个清零信号,并同时向其个位发送一个进位脉冲。分(秒)的十位加法计数器在计数到6的瞬间,向本位发送一个清零信号,并同时向分(秒)位的个位发送一个进位脉冲。这样就构成了一个级联而形成的60进制带进位与清零的加法计数器。

    在这里插入图片描述

    六、总电路图

    - 不带闹钟总电路图:
    在这里插入图片描述
    - 带闹钟总电路图:
    在这里插入图片描述

    七、测试结果图

    连接好电路图后,准备开始仿真,同时可测试闹钟功能。
    结果如下:
    在这里插入图片描述

    文献

    1、参考作者以及网址

    https://blog.csdn.net/Jason_yesly
    https://blog.csdn.net/Jason_yesly/article/details/85297274


    https://wenku.baidu.com/view/64c63f1edd36a32d737581bc.html
    https://wenku.baidu.com/view/bb573f76700abb68a982fbe5.html

    2、书籍文献

    《电路基础与电子技术》
    《电类专业基础实践教程》

    总结

    以上,就是我对该实验的看法,通过实训,虽然最终电路设计有些缺陷和不足,但掌握了许多知识,学会了用Multisim仿真的基本操作,对改进电路和连接线路方面上有很充分的研究和认识,同时通过查阅大量书籍和网上资料,对元件的选用和代替以及不同元件的不同特性也作了比较到最终的选用,以及最终电路中某些开关以及小型元器件的参数调整进行了反复地测试,到达了基本本课题的基本要求,特别是对Multisim该软件的认识以及运用和该课题中所用到的模拟电子技术和数字电子技术的知识的运用。
    本博客,是我在CSDN上第一次发的博客,毕竟自己忙活了几周的结果,自己学到了不少知识,通过书本资料和网站确实不易。若有不当错误,望评论区订正。

    展开全文
  • 高精度、多功能体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。 本实验要求设计一个数字计时器,可以完成0分00秒~23小时59分59秒的计时...
  • 基于51单片机电子时钟

    万次阅读 多人点赞 2019-01-05 21:39:20
    3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时) 一、设计思路: 主体: 通过外部中断0来控制mod值;mod=0,1.2,3分别对应时钟模式,调整模式,闹钟设置...

    keil工程与protues仿真电路

    1 基于51单片机用LCD1602实现时-分的显示
    2. 按键控制时-分的调整
    3. 能实现整时报时的功能(蜂鸣器响)
    4. 闹钟模式
    5.按键切换模式(模式一:时-分显示,模式二:60秒倒计时)

    一、设计思路:
    主体:
    通过外部中断0来控制mod值;mod=0,1.2,3分别对应时钟模式,调整模式,闹钟设置模式,一分钟倒计时模式。
    细节:
    mod0
    通过定时计数器,每一秒增加变量秒(s),每60秒,增加1分(min)并且s置0,每60min,增加1小时h,当h>23,h=0;进行一天循环
    mod1
    按键控制增加min,h和s制0
    mod2
    另外设置变量min1,h1,当min=min1,h=h1时蜂鸣器响
    mod3
    设置变量daojishi=60, 通过定时计数器,每一秒daojishi减1,当daojishi<0时,蜂鸣器响
    另外:
    1.设置外部中断2,关闭蜂鸣器
    2.时间发送一次只能发送一个位

    程序:

    #include<reg52.h>
    //K1后K3加分钟,K4加时间,K2加秒,K1进入闹钟设置,K2退出
    //K2关闭闹钟
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    #define data8b P1
    
    sbit K1=P3^2;               //外部中断0
    sbit K2=P3^3;               //外部中断1
    sbit K3=P3^0;
    sbit K4=P3^1;
    
    sbit BUZ=P2^4;       //蜂鸣器,0响
    sbit RW=P2^5;        //4脚,数据(1)or命令(0)
    sbit RS=P2^6;        //5脚,读(1)写(0)
    sbit E=P2^7;         //6脚,使能信号
    
    u8 code dat1[]={0X30,0X31,0X32,0X33,
    	                               0X34,0X35,0X36,0X37,
    	                               0X38,0X39};
    
    void delay(u16 i)      //延时函数
    {
    	while(i--);
    }
    
    void open012()   //打开中断0,1,定时器中断0
    {
    	TMOD|=0X01;   //选择为定时器0模式,工作方式1
      
    	
    	ET0=1;        //打开定时器0中断允许
    	
    	EA=1;        //打开总中断
    	
    	TR0=1;       //打开定时器			
    	
    	EX0=1;              //打开外部中断0
    	IT0=1;             //边沿触发方式
    	EX1=1;              //打开外部中断1
    	IT1=1;             //边沿触发
      
    }
    
    
    void wrm(u8 dat)              //写入命令
    {
    	delay(1000);
    	RS=0;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    
    void wrd(u8 dat)             //写入数据
    {
    	delay(1000);
    	RS=1;
    	RW=0;
    	E=0;
    	data8b=dat;
    	E=1;
    	delay(1000);
    	E=0;
    }
    
    void zero()
    {
    	wrm(0X38);                 //八位数据,两行显示,5*7
    	wrm(0X0c);                  //无光标,打开显示
    	wrm(0X06);                  //光标右移,屏幕不移动
    	wrm(0X01);                  //清屏
    	wrm(0X80);                  //设置数据指针起点
    }
    
    u8 fg=0,sg=0,bfg=0,bsg=0;
    u16 i=0;
    u8 s=0;
    u8 mod=0;
    char dingshi;
    bit bell=0;
    bit zanting=1;
    
    void fangsong()
    {
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    
    
    void fangsong1()
    {
    	wrm(0X80);   
      wrd(dat1[sg/10]);                 //时十位
    	wrd(dat1[sg%10]);                 //时个位
    	wrd(0x3A);                     //:
    	wrd(dat1[fg/10]);                 //分十位
    	wrd(dat1[fg%10]);                 //分个位
    	wrd(0x3A);                     //:
    	wrd(dat1[(s/10)]);                 //秒十
    	wrd(dat1[(s%10)]);                 //秒个
    }
    void chuli()
    {
    	if(fg==60)
    	{
    		sg++;
    		fg=0;
    	}
    
    	if(sg==24)
    	{
    	
    		sg=0;
    	}
    	
    }
    
    
    
    void main()
    {
    	u8 shijian;
    	open012();
    	zero();
    	chuli();
    	fangsong();
    	shijian=100;
    	
    	
    	while(1)
    	{
    		while(mod==0)
    	{
    		EX1=1;              //打开外部中断1
    		if(s==60)
    		 {
    			 fg++;       //60秒转化为1分钟
    			 s=0;
    		 }
    				chuli();
    				if((fg==0)&&(shijian!=sg))
    				 {
    				  BUZ=0;
    					shijian=sg;
    				 }
    				fangsong1();
    				if((BUZ==0)&&(bell==0))
    			  {
    				delay(1000);
    				BUZ=1;
    			  }
    			if((fg==bfg)&&(sg==bsg)&&(bell==1))
    				BUZ=0;
    			else BUZ=1;
    			}
    	
    	
    			
    			while(mod==1)
    		{
    			EX1=0;              //关闭外部中断1
    			zero();
    	    fangsong();
    			if(K3==0)
    			  {
    				  delay(1000);
    				  if(K3==0)
    					  fg++;
    			   }
    			if(K4==0)
    			   {
    				  delay(1000);
    				  if(K4==0)
    					 sg++;
    			   }
    				 if(K2==0)
    			   {
    				  delay(1000);
    				  if(K2==0)
    					 s=0;
    			   }
    				 if(fg>59)
    				 {
    					 fg=0;
    				 }
    				  if(sg>23)
    				 {
    					 sg=0;
    				 }
    				 if(s>=59)
    				 {
    					 s=0;
    				 }
    	     }
    		
    			 
    			 
    			 while(mod==2)   //设置闹钟
    		{
    	    if(bfg==60)
    	    {
    		    bsg++;
    		    bsg=0;
    	    }
    	
    	    if(bsg==24)
    	    {
    		     bsg=0;
    	     }
    	    zero();
    			wrd(0x20);
    			wrd(0x20);
    			wrd(0x20);
    		  wrd(dat1[(bsg/10)]);                 //时十位
    	    wrd(dat1[(bsg%10)]);                 //时个位
    	    wrd(0x3A);                     //:
    	    wrd(dat1[(bfg/10)]);                 //分十位
    	    wrd(dat1[(bfg%10)]);                 //分个位
    			 if(K3==0)
    			{
    				delay(1000);
    				if(K3==0)
    					bfg++;
    			}
    			if(K4==0)
    			{
    				delay(1000);
    				if(K4==0)
    					bsg++;
    			}
    			bell=1;
    			zero();
    }
    		
    while(mod==3)
    {
    	while(zanting)
    	{
    	dingshi=60;
    	EX1=1;              //打开外部中断1
    	wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位
       }
       wrm(0X80);   
    	 wrd(dat1[(dingshi/10)]);                 //时十位
    	 wrd(dat1[(dingshi%10)]);            	//时个位	
    	while(dingshi<0)
    	{
    		wrm(0X80);   
    		 wrd(dat1[0]);                 //时十位
    	   wrd(dat1[0]);            	//时个位
    		BUZ=0;
    	}
    }
    }
    }
    
    void time0() interrupt 1
    {
       TH0=0XFC;	     //给定时器赋初值,定时1ms
    	 TL0=0X18;
    	 i++;
    	 if(i==1000)     //ms转化为s
    	 {
    		i=0;
    		 s++;
    		 dingshi--;
    	 }	
    }
    
    void key1() interrupt 0     //外部中断0,调整时间
    {
    	delay(1000);
    	if(K1==0)
    	  { 
    		  mod++;
    			while(!K1);
    	  }
    
    if(mod>3)
    {
    	mod=0;
    }
    	 zero();
    }
    
    void naozhong()  interrupt 2                     //开关闹钟
    {
    	if(K2==0)
    		{
    			delay(1000);           //消抖
    				if(K2==0)
    					{
    						bell=0;
    						BUZ=1;
    						zanting=~zanting;
    					}                       //关闭蜂鸣器
    						while(!K2);          //确认按键松开
         }
    }
    
    
    
    

    在这里插入图片描述

    二、收获
    1.更熟练掌握了定时器中断和外部中断的使用
    在这里插入图片描述

    在这里插入图片描述

    可以通过打开和关闭外部中断使同一个按键实现不同的功能

    2.了解到了一点寄存器操作

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.中断配置小结
    外部中断
    在这里插入图片描述
    定时器中断
    在这里插入图片描述

    串口通信
    在这里插入图片描述
    4.更熟练使用proteus
    制作了一个小型软件开发版
    在这里插入图片描述

    5.学会了如何学习一个新元器件(LCD1602)
    1.看说明书,重点是看时序图,真值表等
    2.按照时序图写程序
    3.一二都不成立时,查找相关资料
    6.下载原理
    单片机的烧写原理:
    单片机烧写,又称为单片机程序下载、烧录等,本质上是单片机和PC机按照芯片厂家规定的编程协议,通过芯片厂家规定的接口,把已编译好的程序传输到单片机,单片机把数据存储到自身存储器中。
    理解这个原理需要知道几个知识点:
    单片机内部是有程序的,是出厂时固化在硬件中,用户无法修改的(这也会被认为它内部没有程序),这些程序可以调用各种通信接口、内部存储器等;
    可以下载的通信接口:JTAG,SPI,UART,usb等;(还有很多可以扩展485、以太网等)
    编程协议:一般大厂都会公开的,在芯片的专用技术手册中会有;
    存储器:有很多种,掩膜,EPROM,EEROM,flash等寿命不一样,掩膜只能一次,而且要工厂做,flash擦写次数10000+;
    可以这样比喻性的理解:单片机就是电脑的主板,我们写的程序就是操作系统,主板里面装入引导操作系统的基本程序,下载程序就是给电脑装系统!

    7.其他
    1.理解了现在电子表的操作原理
    2.学会了借助现成品(电子表)作参考,写程序
    3.懂得了与人交流的重要性(受王同学的启发,完善了原有程序)

    三.后期计划
    1、继续32的学习
    2、练习焊功
    3、继续51其他外设的学习
    4、按兴趣学习电路、模电、数电、DXP等相关知识

    展开全文
  • 单片机课设-电子时钟设计(仿真图、代码全)

    千次阅读 多人点赞 2021-07-04 11:14:54
    电子时钟设计 1项目概述 1.1项目简介 项目内容:以C51单片机为核心,设计一个定电子时钟,8位LED数码管,分别显示“时-分-秒”。显示范围范围从0小时0分0秒到23小时59分59秒,通过定时器来定时一秒钟,每过一秒刷新...

    电子时钟设计

    1项目概述

    1.1项目简介

    项目内容:以C51单片机为核心,设计一个定电子时钟,8位LED数码管,分别显示“时-分-秒”。显示范围范围从0小时0分0秒到23小时59分59秒,通过定时器来定时一秒钟,每过一秒刷新一次显示时间。通过矩阵键盘设置小时、分钟和秒数的初值。按调时按键按下后开始进入调整时间模式,通过矩阵按键进行新一次时间调整,并且可以通过按键设置闹钟,当到达闹钟时间时间时,数码管会闪烁一段时间并停止刷新时间,当按下24-12进制切换按键后,时钟显示会在24时制和12时制之间切换。
    项目用途:电子时钟广泛用于生活中的各种场景,在人们的生活中不可或缺,在国防科技、工业制造领域也有着极其重要的地位。
    学习价值:利用C51单片机进行电子时钟设计,掌握了关于中断、定时器、数码管等知识,对今后关于部件图的绘制有了更深的理解。
    社会意义:此次进行单片机电子时钟的课程设计,我们懂得了时间的重要性,在以后的学习生活中要珍惜时间,在今后的学习中深入单片机领域的学习与探索。

    1.2功能需求分析
    (1)系统可以时间进行设计,显示格式为:“时”(第1,2位),“分”(第4,5位),“秒”(第7,8位)。
    (2)当调整时间键被按下时自动进入调整时间模式,时钟不再刷新时间,通过矩阵键盘的按下从左至右依次可以进行时间更改。
    (3)当24/12时制切换键被按下时,时钟显示自动切换另一种显示模式。
    (4)当时间到达设置的闹钟时间时,数码管显示自动停止刷新时间并开始闪烁一段时间。

    1.3系统开发环境、工具需求分析与选择
    PROTUES软件进行仿真、keil软件、PC机。

    2项目硬件系统设计

    2.1 系统方案原理图
    (1)项目主要硬件。
    硬件系统是指构成微机系统的实际装置,通常是由单片机、数码管显示、定时器计数、矩阵按键和外部中断等组成。单片机芯片选择AT89C51,显示区域使用8位LED数码管,键盘是34普通矩阵键盘以及外部中断INT0 INT1。
    在这里插入图片描述
    (2)项目主要模块介绍
    3
    4键盘:数据从此地方进行数据输入,将数值传给单片机。
    定时器:定时时间,使得显示数据按秒进行刷新。
    中断INT0、INT1:可进行24小时制与12小时制的转化以及时间设定开始开关。
    8位LED数码管:进行时间的显示。
    仿真图如下:
    在这里插入图片描述
    抽象为组件图如下:
    在这里插入图片描述
    2.2 外设原理介绍
    输入电路:主要完成信息的采集,本项目采用3*4动态按键扫描,由12个分别位于行和列的按键组成,4条行线分别接单片机的P1.0P1.3,3条列线分别接单片机的P1.4P1.6。两个中断开关分别连接到单片机的P3.2和P3.3口。
    输出电路:本项目采用8位LED数码管动态扫描显示电路,笔段A~DP分别与单片机的P0口相连,公共端分别受单片机的P2口控制。
    控制电路:通过定时器的定时1秒钟不断刷新来改变显示的数值,对输入的信息进行分析,本项目用C51单片机来实现。
    中断电路:通过INT0和INT1两个中断来增加了调整时间模式和24/12时制之间转换模式。
    2.3 键盘输入模块工作原理
    本设计之中使用的是3x4的普通键盘,我们可以使用其行列号来识别被按下的按键以此来获知被按键的信息,因此将行输出信号和列输出信号接入单片机芯片C51的 P1口,通过循环扫描,读取行列的数据来判断是否有按键被按下,如果有则调用按键识别程序来识别具体按键,并执行相应的操作,按键识别是根据按键时得到的列代码与行代码的结合,在汇编语言中进行查表来判断是哪个键。
    2.4 数码管显示模块工作原理
    8位一体共阳极LED数码管,这8个数码管的段选端在器件内部并联在了一起,外部引出了一个共用的段选端AG,DP。每一个数码管的公共端单独引出,分别对应引脚18。数码管段选信号由单片机的P0口输出,位选信号由P2.0~P2.7引脚控制。

    3系统软件体系设计

    3.1 项目软件系统总架构图
    在这里插入图片描述
    主程序流程图:
    在这里插入图片描述
    显示程序流程图:
    在这里插入图片描述
    中断程序流程图:
    在这里插入图片描述
    定时器流程图:
    在这里插入图片描述

    4项目运行效果展示

    下图为24时进制显示的16时9分57秒
    在这里插入图片描述下图为12时制显示的4时10分12秒
    在这里插入图片描述

    相关代码(全,更加详细解释图与介绍见我上传资源):

    #include <reg51.h>
    #include <intrins.h>                    
    unsigned char code table[] = { 0xc0,0xf9,0xa4,0xb0,0x99,
    				0x92,0x82,0xf8,0x80,0x90,0xff };
    unsigned char count = 0;//定时器 计数变量 
    unsigned char time[] = { 16,9,50 };//初始显示的时间  16-09-50 
    unsigned char p = 0;//调整时间时候,将要调整的位数 
    unsigned char num = 0;//按键接收值 
    unsigned char state = 0;//state=0 显示时间模式,state=1 调整时间模式 
    unsigned char change = 0;//change=0 24时显示时间,change=1 12时显示
    void delay(unsigned int z)
    {
    	unsigned int x, y;
    	for (x = z; x > 0; x--)
    		for (y = 110; y > 0; y--);
    }
    void disp()//数码管显示函数 
    {
    	P2 = 0x01;
    	P0 = table[time[0] / 10];
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = table[time[0] % 10];
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = 0xbf;
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = table[time[1] / 10];
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = table[time[1] % 10];
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = 0xbf;
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = table[time[2] / 10];
    	delay(3);
    
    	P2 = _crol_(P2, 1);
    	P0 = table[time[2] % 10];
    	delay(3);
    
    	P0 = 0xff;
    }
    void keyscan()//按键扫描函数 
    {
    	P1 = 0xfe;
    	while ((P1 & 0xf0) != 0xf0)
    	{
    		delay(3);
    
    		while ((P1 & 0xf0) != 0xf0)
    		{
    
    			switch (P1)
    			{
    			case 0xee:num = 1; break;
    			case 0xde: num = 2; break;
    			case 0xbe: num = 3; break;
    			}
    			if (state) p++;//在调整时间模式 每次按下按键自动调整为修改下一位 
    			delay(300);
    			while ((P1 & 0xf0) != 0xf0) disp();
    		}
    	}
    
    	P1 = 0xfd;
    	while ((P1 & 0xf0) != 0xf0)
    	{
    		delay(3);
    
    		while ((P1 & 0xf0) != 0xf0)
    		{
    
    			switch (P1)
    			{
    			case 0xed: num = 4; break;
    			case 0xdd: num = 5; break;
    			case 0xbd: num = 6; break;
    			}
    			if (state)p++;
    			delay(300);
    			while ((P1 & 0xf0) != 0xf0) disp();
    		}
    	}
    
    	P1 = 0xfb;
    	while ((P1 & 0xf0) != 0xf0)
    	{
    		delay(3);
    
    		while ((P1 & 0xf0) != 0xf0)
    		{
    
    			switch (P1)
    			{
    			case 0xeb: num = 7; break;
    			case 0xdb:num = 8; break;
    			case 0xbb: num = 9; break;
    			}
    			if (state)p++;
    			delay(300);
    			while ((P1 & 0xf0) != 0xf0) disp();
    		}
    	}
    	P1 = 0xf7;
    	while ((P1 & 0xf0) != 0xf0)
    	{
    		delay(3);
    
    		while ((P1 & 0xf0) != 0xf0)
    		{
    
    			switch (P1)
    			{
    			case 0xe7: num++; p--; break;
    			case 0xd7: num = 0; break;
    			case 0xb7: break;
    			}
    			if (state)p++;
    			delay(300);
    			while ((P1 & 0xf0) != 0xf0) disp();
    		}
    	}
    }
    void change_time()//调整时间模式 计算函数 
    {
    	if (state)
    	{
    		switch (p)
    		{
    		case 1:time[0] = (num * 10 + time[0] % 10); break;//num接受按键的值,小时的十位上改为num的值,个位不变 
    		case 2:time[0] = (num + (time[0] / 10 * 10)); break;//小时的个位上改为num的值,十位不变 
    		case 3:time[1] = (num * 10 + time[1] % 10); break;//num接受按键的值,分钟的十位上改为num的值,个位不变 
    		case 4:time[1] = (num + (time[1] / 10 * 10)); break;//分钟的个位上改为num的值,十位不变
    		case 5:time[2] = (num * 10 + time[2] % 10); break;//num接受按键的值,秒的十位上改为num的值,个位不变 
    		case 6:time[2] = (num + (time[2] / 10 * 10)); break;//秒的个位上改为num的值,十位不变
    		}
    		if (p >= 6)//全部调整完时间,进入正常时间显示模式,并打开定时器 
    		{
    			state = 0;
    			TR1 = 1;
    			p = 0;
    		}
    	}
    }
    void init_timer1()
    {
    	TMOD = 0x15;
    	IE = 0x85;
    	IP = 0x04;
    	TL1 = (65536 - 50000) % 256;
    	TH1 = (65536 - 50000) / 256;
    	TR1 = 1;
    	ET1 = 1;
    	EA = 1;
    }
    void main()
    {
    	init_timer1();//定时器中断初始化 
    	while (1)
    	{
    		disp();
    		keyscan();
    		change_time();
    	}
    }
    void TIME_1() interrupt 3//定时器计数 
    {
    	TL1 = (65536 - 50000) % 256;	//50ms 
    	TH1 = (65536 - 50000) / 256;
    	count++;
    	if (change) time[0] %= 12;//保证小时小于12 
    	else time[0] %= 24;//保证小时小于12 
    	time[1] %= 60;//保证分钟用于小于60 
    	if (count == 20)//到达1s 
    	{
    		count = 0;
    		time[2]++;//秒加一 
    		if (time[2] >= 60)//秒进位 
    		{
    			time[2] = 0;//秒清零 
    			time[1]++;//分加一 
    			if (time[1] >= 60)//分进位 
    			{
    				time[1] = 0;//分清零 
    				time[0]++;//小时加一 
    			}
    		}
    	}
    }
    void int0() interrupt 0//进入调整时间模式 
    {
    	state = 1;
    	TR1 = 0;//关闭定时器 
    }
    void int1() interrupt 2//切换24-12时间显示 
    {
    	change = ~change;
    }
    

    5总结与心得体会

    通过单片机课程设计,我们对单片机原理的学习更加掌握和了解,为以后的学习奠定了基础。这次课程设计基于每周做的单片机项目,使得我们对单片机整体构架有个初步的认识和见解,在课程设计的过程中,明白了合理的小组分工尤为重要,本课程设计我们制作电子时钟,完成了正常电子时钟的显示功能、定时闹钟和调整时间功能,并在此基础完善了增加了利用矩阵键盘进行调整时间的功能,实现显示“小时.分钟.秒”的定时功能和12时/24小时切换显示,可灵活实现小时加、分钟加等功能。本设计具有较强的灵活性,可实现性高,具有较高的应用价值。虽然进行了代码多次优化与调试,但是对于部分功能仍存在显示出错的问题,我们在以后的学习中会继续完善代码,将软件与硬件完美结合,在单片机领域更加努力的学习。

    展开全文
  • Verilog设计实例(7)基于Verilog的数字电子钟设计

    万次阅读 多人点赞 2020-06-17 21:51:43
    基于模块化的设计思想, 采用 Verilog HDL 语言设计一个能进行时、分、秒计时的二十四小时制的数字电子钟, 并具有整点报时功能。 采用数码管进行时间显示,要求显示格式为:小时-分钟-秒钟。


    写在前面

    前段时间,有几个小伙伴向我请教数字电子钟设计的问题,这个问题我在之前的BCD计数器以及数码管显示问题中已经分开谈过了,既然大家还有需求,不妨在这里集中总结一下!


    正文

    设计要求

    基于模块化的设计思想, 采用 Verilog HDL 语言设计一个能进行时、分、秒计时的二十四小时制的数字电子钟, 并具有整点报时功能。 采用数码管进行时间显示,要求显示格式为:小时-分钟-秒钟。

    在 EDA 软件中完成数字电子钟的源代码设计, 并进行仿真, 仿真结果要能够体现出时、分、秒各自的跳变过程, 并且能够给出整点报时控制信号的变化过程。
    1、独立完成设计任务;
    2、详细阐述设计方案,绘制系统设计框图;
    3、详细阐述系统调试方案,编写测试文件并进行仿真;
    4、撰写设计报告。详细阐述设计思想、指标论证、方案确定、结果分析等内容,并对所完成的设计做出总结和评价,对设计过程中遇到的问题及解决方法进行阐述。

    我只关注前面的部分,就是设计一个具有时、分以及秒计时的二十四小时计时器,还具有整点报时,并用数码管显示!

    设计思想

    首先是时、分以及秒的计数问题,对于分和秒的情况,肯定是用模60计数器,但是你能直接计数到59然后清零吗?包括时计数器,一定是模24计数器,但是你能直接计数到23清零吗?
    如果没有数码管显示的需求肯定没问题,我用十进制显示,仿真完美!
    但是需要数码管显示的话,我们需要6个数码管,时、分以及秒各需要两个!拿小时计数器来说,由于小时就有两个数字,十分位和个位,使用两个数码管显示小时,第一个数码管显示十分位,第二个数码管显示个位!明显是要将十分位和个位分开显示,需要使用8421BCD码计数器来处理。
    如果使用十进制的话,10就相当于0xa,如何显示呢?显示0a,这显示是不直观的,你家的时钟用a,b,c等等显示时间计数,你会不会打死设计师呢!
    因此,我们使用8421BCD码来进行计数,这一步完成了就解决了80%的问题!
    其次,便是数码管显示的问题,数码管显示时、分以及秒需要6个数码管,我们采用动态扫描的方式来显示,也就是控制片选轮流点亮数码管,只要你轮流的速度足够快,肉眼就会认为所有数码管一直亮!

    说了那么多,其实就总结为如下两个主要模块!

    • 设计计时模块,用到模60计数器,模24计数器;
    • 设计数码管显示模块

    我们严格遵守模块化的思想,设计文件结构如下:

    设计文件结构

    仿真文件结构:

    仿真文件结构

    设计文件

    设计思想已经谈过了,更多的细节请看参考资料,这里给出部分设计文件,如果需要全部设计文件的,可以关注我的微信公众号:FPGA LAB,后台回复:数字时钟,我会发给你资源设计文件链接!

    模60计数器
    由于分和秒计数都是60进制,因此,模60计数器模块是针对分秒计数功能的!
    模60计数器的设计采用的是8421BCD码计数方式,由模10计数器以及模6计数器组成:

    //模60计数器的Verilog HDL设计
    module counter60(clk, rst_n, en, dout, co);
     
    input clk, rst_n, en;
    output[7:0] dout;
    output co;
    wire co10_1, co10, co6;
    wire[3:0] dout10, dout6;
     
    counter10 inst_counter10(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1)); //模10计数器的进位为co10_1
    and u3(co10,en,co10_1); //co10_1与en的与为co10
    counter6 inst_counter6(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6)); //co10_1与en的与为co10,作为模6计数器的使能信号
    and u4(co, co10, co6); //模6计数器的进位和模6的使能信号co10的与作为模60计数器的进位
     
    assign dout = {dout6,dout10}; //模60计数器的输出,高位为模6计数器的输出,低位为模10计数器的输出,读法是8421BCD码读法
     
    endmodule
    

    可见,模60计数器例化了模10以及模6计数器,下面给出模10以及模6计数器的设计:

    模10计数器

    //模10计数器模块
    module counter10(clk, rst_n, en, dout, co);
     
    input clk, rst_n, en;
    output[3:0] dout;
    reg [3:0] dout;
    output co;
     
    always@(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    		dout <= 4'b0000;        //系统复位,计数器清零
    	else if(en)
    		if(dout == 4'b1001)     //计数值达到9时,计数器清零
    			dout <= 4'b0000;
    		else
    			dout <= dout + 1'b1; //否则,计数器加1
    	else
    		dout <= dout;
     
    end
     
    assign co = dout[0]&dout[3];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位
     
    endmodule
    

    模6计数器

    //模6计数器模块
    module counter6(clk, rst_n, en, dout, co);
     
    input clk, rst_n, en;
    output[3:0] dout;
    reg [3:0] dout;
    output co;
     
    always@(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    		dout <= 4'b0000;        //系统复位,计数器清零
    	else if(en)
    		if(dout == 4'b0101)     //计数值达到5时,计数器清零
    			dout <= 4'b0000;
    		else
    			dout <= dout + 1'b1; //否则,计数器加1
    	else
    		dout <= dout;
     
    end
     
    assign co = dout[0]&dout[2];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位
     
    endmodule
    

    如果你觉得这样太繁琐,可以合起来写呀!

    再给出模24计数器设计:

    //8421BCD码计数器,模24
    module counter24(clk, rst_n, en, dout);
     
    input clk, rst_n, en;
    output[7:0] dout;
    reg[7:0] dout;
     
    always@(posedge clk or negedge rst_n)          //异步复位
    begin
    	if(!rst_n)       //复位信号有效时,输出清零
    		dout <= 8'b00000000;
    	else if(en == 1'b0)   //计数使能无效时,输出不变
    		dout <= dout;
    	else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) )  //计数达到23时,输出清零
    		dout <= 8'b00000000;
    	else if(dout[3:0] == 4'b1001)       //低位达到9时,低位清零,高位加1
    	begin
    		dout[3:0] <= 4'b0000;
    		dout[7:4] <= dout[7:4] + 1'b1;
    	end
    	else                     //上述情况都没有发生,则高位不变,低位加1
    	begin
    		dout[7:4] <= dout[7:4];
    		dout[3:0] <= dout[3:0] + 1'b1;
    	end
    end
    endmodule
    

    将三面的模块例化进数字时钟模块内,构成24小时计时器!

    //数字时钟计数器
    module digital_clock(
    	input clk,
    	input rst_n,
    	input en,
    	output [7:0] hour,
    	output [7:0] min,
    	output [7:0] sec,
    	output tweet
    
    	);
     
     
    wire co_sec1,co_sec,co_min,co_min1;
     
    counter60 inst_sec(.clk(clk), .rst_n(rst_n), .en(en), .dout(sec), .co(co_sec1));
    and inst_and_sec(co_sec,en,co_sec1);
    counter60 inst_min(.clk(clk), .rst_n(rst_n), .en(co_sec), .dout(min), .co(co_min1));
    and inst_and_min(co_min,co_sec,co_min1);
    
    assign tweet = (min == 0)&&(sec == 0) ? 1 : 0; // report time signal
    
    counter24 inst_hour(.clk(clk), .rst_n(rst_n), .en(co_min), .dout(hour));
     
    endmodule
    

    代码部分就展示到这里吧,全部贴出来占用太多空间,需要全部代码的可以在公众号FPGA LAB 后台回复:数字时钟!

    仿真文件

    仿真文件再简单不过了,只需要给出使能以及时钟即可!

    module digital_clock_tb(
    
        );
    
    	reg clk;
    	reg rst_n;
    	reg en;
    	wire [7:0] hour;
    	wire [7:0] min;
    	wire [7:0] sec;
    	wire tweet;
    
    
    	initial begin
    		clk = 0;
    		forever begin
    			#5 clk = ~clk;
    		end
    	end
    
    	initial begin
    		rst_n = 0;
    		en = 0;
    		# 50
    		@(negedge clk) 
    		rst_n = 1;
    		@(negedge clk) 
    		en = 1;
    
    		// #10000000 $finish;
    
    
    	end
    
    	digital_clock inst_digital_clock(
    		.clk(clk),
    		.rst_n(rst_n),
    		.en(en),
    		.hour(hour),
    		.min(min),
    		.sec(sec),
    		.tweet(tweet)
    		);
    
    
    endmodule
    

    仿真波形

    秒计数
    秒计满,分加1

    分计数

    分计满,小时加1

    整点加1

    就到这里吧!


    参考资料


    交个朋友

    展开全文
  • 【数字电路】数字电子时钟设计

    千次阅读 2021-04-21 14:32:33
    开源协议: GPL 3.0 这里写目录标题简介:1.设计目的2.数字功能以及要求3.制作主要元器件4.设计原理5.各部分原理解析(1)石英晶体振荡电路(2)分频器电路(3)计数...基于纯数字芯片及石英晶体振荡的电子时钟
  • 本实验利用QuartusII软件,结合所学的数字电路的知识设计一个24时多功能数字,具有正常分、秒计时,动态显示,保持、清零、快速校分、整点报时、闹钟功能。 文章分析了整个电路的工作原理,还分别说明了各子模块...
  • 此题目是学院的一个科技竞赛题目,科技含量比较低,但是重在贴近生活,而且比较考验同学的编程能力,设计思路灵活,也算一个中肯的题目。 本篇博客中,依旧按照从拿到题目到完成题目的顺序进行介绍,重难点,博主会...
  • 数字电子钟设计与制作

    万次阅读 多人点赞 2018-04-14 09:35:28
    学号姓名实物演示(60%)论文成绩(30%)平时成绩(10%)总成绩0144300 0144297 评语:该小组基于单片机设计了一个系统,主要实现了数字时钟实时显示和远程通信的功能,硬件和软件系统工作正常,达到了设计要求。...
  • 系统完成的主要功能: (1)时间、日期显示:系统时间采用24小时制。日期显示可判断大、小月、润月和闰年。 (2)设置功能:用户可以对系统的时间、日期进行调整。 包含电路图、实验报告、源代码
  • 解决的方法有很,这里主要阐述在Web项目中填写日历,自己动手开发一个电子日历,供用户 选择合适的日期. 基于Web的电子日历很简单,其原理如下: 构造一个日历对象 改变相应的年份和月份 显示此年此月的月历.
  • 51单片机初学3-从零开始制作一款电子时钟

    千次阅读 多人点赞 2021-03-06 16:30:44
    今天我们来用STC89C52做一个简单的单片机作品:电子时钟。含原理图、元器件归纳、C语言程序,还有详细的制作过程。就算是零基础,只要愿意动手就能完成。
  • 多功能数字电子钟

    千次阅读 2014-08-10 22:27:57
    多功能数字电子钟             姓 名:张士卫  班 级:计135班  学 号:201358501149 指导老师:沈春华      ●设计要求  在Quartus II环境下设计芯片完成二十四小时制计时、显示、整点报时、时间...
  • 多功能电子钟 可与PC通信的实时时钟 我们将主要介绍扫描频率可改变的电子钟 扫描频率可改变的电子钟 实验现象 数字钟是通过计数模拟时钟,将计数值转换成时间形式,以格式时-分-秒在LED数码管上进行显示,并通过...
  • 用VHDL语言实现电子计时时钟

    千次阅读 2020-09-15 19:33:29
    6. 设计总结 一、设计任务及要求 1.1设计任务 利用VHDL语言,实现电子计时时钟,要求能够显示分钟、秒钟,显示输出为共阴极数码管,要求: 1、电子计时时钟具有清零功能 2、驱动的数码管为共阴极数码管 1.2要求: ...
  • 设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期、时间的校准。具有走时精确,功耗低,显示...
  • 基于VHDL语言的数字电子钟设计 【内容摘要】 数字电子钟是一种用数字显示秒、分、时的记时装置,该数字电子钟的功能和特点有:时钟源产生1Hz时钟脉冲,用以提供“秒”的计数;设计两个六十进制的计数器对“分”、...
  • 当前多功能电能表的研究现状及其发展趋势,探讨基于高性能单芯片SoC的电子多功能电能表的研究意义,并指出本论文的工作设计重心;第2章详细介绍多功能 电能表的主芯片7lM6513的结构、特点、工作原理以及芯片在...
  • 时分秒电子钟设计报告 设计目的 (1)掌握时分秒电子钟的设计方法 (2)明白时分秒电子钟的组成原理及工作原理 (3)通过综合性实验项目的设计与实现,进一步加深理论教学与实验软硬件平台的实践训练,为设计性实验...
  • STM32电子时钟 WATCHX-NWATCH( 开源)

    千次阅读 2020-11-15 15:15:05
    话不说,先看成果 主页面 目录 游戏 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录话不说,先看成果项目介绍一、来源二、使用步骤1.引入库2.读入数据总结 项目介绍 一、来源 ...
  • 3.能实现整时报时的功能(蜂鸣器响)。 4.了解下载模块、下载原理。 5.PCB板的绘制及焊接(包括下载模块)。 6.设计思路以及实现原理。 7.收获及以后的学习计划。 ///////////////////////////////////////////...
  • 基于单片机的电子万年历的设计

    千次阅读 2020-09-24 20:29:36
                           基于51单片机的电子万年历的设计                                    摘 要    电子万年历是单片机系统的一个应用,由硬件和软件相配合使用。硬件由主控器...
  • 数字电子技术课程设计——盲人报时

    千次阅读 多人点赞 2012-12-26 21:41:00
    数字电子技术课程设计   盲人报时   任务书 0.1 设计课题 盲人报时 0.2 设计目的 (1) 掌握盲人报时设计、组装和调试方法。 ...
  • 这是我自己做的关于LED显示电子钟的制作。 目录 摘要: 1 关键词:单片机;LED点阵;数字时钟 1 1.电路设计的目的、任务、指标指标及工艺要求 2 1.1 课程设计的目的 2 1.2 课程设计的任务 2 1.3 课程设计的指标 3 ...
  • FPGA数字项目总结

    2020-07-28 10:20:37
    一、QUARTUS软件破解 首先我我们找到电脑中的破解软件打开 ...然后我们按下电脑键盘上的win+r键输入cmd确定打开命令行窗口然后输入ipconfig/all回车,找到物理...Verilog是一门类C语言 ,语法与C接近,但Verilog是硬件设计

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,172
精华内容 4,068
关键字:

多功能电子时钟设计总结