单片机AT89C51数码管数字时钟和闹钟二

一、课题的方案设计与论证

1.1摘要

  本次做的数字钟是以单片机(AT89C51)为核心,结合相关的元器件(共阴极LED数码显示器、三极管、蜂鸣器、上拉电阻等),再配以相应的软件,达到制作简易数字钟的目的。数字时钟具备整点报时,手动校时、校分,还有闹钟功能。其软件部分使用proteus.仿真,难点在于中断的使用,硬件部分难点在于元器件的选择、布局及焊接。

1.2设计目的

①复习和巩固所学过的知识,利用此课程设计正好可以对所学习过的知识进行系统的回顾和总结
②拓展知识面,课堂的知识是远远满足不了设计的要求的,这就需要我们去主动找寻更多的资料,了解更多的知识.
③培养了设计能力和解决实际实际问题的能力,同时增强了自学能力,通过设计完整的单片机系统也初步掌握了组成系统、编程、调试等能力。
④通过本LCD电子种的设计初步了解了单片机应用系统开发研制过程,软件和硬件设计的方法.

1.3设计方案

  在硬件电路的搭建之前必须明确设计的方案,通过各个模块之间进行比较选择出最适合本设计的硬件,以发挥器件的最大功效。
1.3.1 主控芯片的选择
方案一:
  采用AT89C51单片机作为主控芯片。AT89C51单片机具有的开发简单、可在线编程下载是非常不错的选择。
方案二:
  采用MSP430单片机作为主控芯片。该系列单片机多应用于需要电池供电的便携式仪器仪表中。所以在一些简单的设计中不宜采用。

1.3.2 显示器件的选择
方案一:
  采用LED数码管动态扫描显示。LED数码管,对于显示数字或者简单的字母会比较合适。
方案二:
  采用LCD1602液晶显示屏。LCD1602液晶又叫LCD1602字符型液晶LCD1602采用并行数据传输也可以采用串行数据传输,控制简单,控制原理完全相同。

1.4设计任务与要求

(1)8个数码管显示时分秒及按键校时。
(2)闹钟时间显示及设定闹钟。
(3)当设定闹钟的时间等于时钟时间,蜂鸣器间隔一秒响一次,响6秒停止报警。
  时间计数电路采用24进制,从00开始到23后再回到00;各用2位数码管显示时、分、秒;具有手动调整时间和闹钟时、分功能;具有闹钟功能,可以自由设定时间作为报时时间,实现任意报时作用,可以当作闹钟。
  本设计采用AT89C51单片机对电子时钟进行开发,通过Proteus软件来实现电子时钟系统的设计与仿真,并应用LED 显示相应的时间。

二、硬件设计

2.1设计系统简介

2.1.1电子钟的工作原理

  本设计的电子时钟是由AT89C51,八段数码管等构成,采用晶振电路作为驱动电路,由计时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。电路中的四个控制键拥有多种不同的功能,按下又松开,可以实现校对时间以及定时的功能,还可以达到省电的目的。

2.1.2电子时钟的设计流程
在这里插入图片描述

2.2总体方案设计

2.2.1硬件电路的设计方案
本设计的硬件电路设计框图如图所示:
在这里插入图片描述

          图 总体结构框图
  由图可以看出:本设计电路的硬件部分共由五部分组成,分别为按键模块、复位电路模块、振荡电路模块、发声模块、时间显示模块。
2.3仿真原理总图
由上面的设计框图可以进一步得出本系统的电路原理图。

在这里插入图片描述

2.4电路各模块

在这里插入图片描述

            图 晶振电路
  再来就是复位电路,复位电路分为:上电自动复位和开关复位。

            图 复位电路
完整的AT89C51单片机最小系统电路图如图3-3所示。

r)

        图3-3 AT89C51单片机最小系统

2.4.2独立按键
  本设计中设置有按键电路,通过几个独立按键进行人机交互。按键通过一点连接单片机的I/O口一端连接电源地。
在这里插入图片描述

2.4.3数码管
2.4.3.1数码管的接线
  数码管的段选端与AT89C51芯片P0引脚对应相连,数码管的位选端与AT89C51芯片P2引脚对应相连。
在这里插入图片描述

2.4.4 蜂鸣器电路的设计

在这里插入图片描述

三、软件设计
KEIL集成开发环境简介
  Keil C51是Keil Software公司出品的51系列兼容单片机C语言软件开发系统。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

3.1、 主流程图
在这里插入图片描述

3.2按键流程图

3.3闹钟流程图

3.4设计过程
  利用keil编写代码,并进行编译、调试,生成.hex文件。在proteus中按照设计原理和设计框架画图。在proteus中加载.hex文件进行仿真,观察现象。若与预期不一致则检查电路或修改代码,直至与设计方案一致。

1if(setflag==0)
		{
			if(MODE != 1 || T_CYCLE)
			{
				display(HH/10,0);  //显示小时十位数
				display(HH%10,1);  //显示小时个位数
			}
			display(10,2);  //显示-
			if(MODE != 2  || T_CYCLE)
			{
				display(MM/10,3);  //显示分钟十位数
				display(MM%10,4);  //显示分钟个位数
			}
			display(10,5);  //显示-
			if(MODE != 3  || T_CYCLE)
			{
			display(SS/10,6);  //显示秒十位数
			display(SS%10,7);  //显示秒个位数
			}
		}
		 if(setflag==1)
		 {
			if(SET_MODE != 1 || T_CYCLE)
			{
				display(set_hour/10,0);  //显示闹钟小时十位数
				display(set_hour%10,1);  //显示闹钟小时个位数
			}
				display(10,2);  //显示-
			if(SET_MODE != 2  || T_CYCLE)
			{
				display(set_min/10,3);  //显示闹钟分钟十位数
				display(set_min%10,4);  //显示闹钟分钟个位数
			}	



此段为显示时间程序,通过时分秒变量把此时时钟时间一位一位发送到数码管中。
2void key()
{	
 	if(key1==0)
	{
		delay(2);
		if(key1==0)
		{
			while(!key1);
	      	TR0=0;
		 	setflag=0;
	      	if(MODE == 3) MODE = 1;
		 	else MODE ++;		
        }
   }			
  	if(key2==0)
	{
		delay(2);
		if(key2==0)
		{
			while(!key2);
			 if(MODE == 1) H_Increase() ;
			 if(MODE == 2) M_Increase() ;
			  if(MODE == 3) S_Increase() ;
			  if(SET_MODE==1)
			  {
				set_hour++;
				if(set_hour==24)set_hour=0;
			  }
			  if(SET_MODE==2)
			  {
				 set_min++;
				 if(set_min==60)set_min=0;
			  }		  
			  
     	}
	 }	
	if(key3==0)
	{
		delay(2);
		if(key3==0)
		{
			while(!key3);
		    if(MODE == 1) H() ;
			 if(MODE == 2) M() ;
			  if(MODE == 3) S() ;
			 if(SET_MODE==1)
			  {
				 set_hour--;
				if(set_hour==0)set_hour=23;
			  }
			  if(SET_MODE==2)
			  {
				 set_min--;
				if(set_min==0)set_min=59;
			  } 
           }
	 }
	 if(key4==0)
	  {
		delay(2);
		if(key4==0)
		{
			while(!key4);
	        TR0=1;
			MODE=0;	
			SET_MODE=0;
			setflag=0;
        }
	 }
	  if(key5==0)
	{
		delay(2);
		if(key5==0)
		{
			while(!key5);
			setflag=1;
			SET_MODE++;
			if(SET_MODE >2)SET_MODE =1;     	
         }
	 }
} 
此段是按键设置时间,设置闹钟函数,通过这个可以校正显示时间,以及设置闹钟。
3void T0_INTSrv(void) interrupt 1
{
	//定时器重新开始计时。
	TH0 = 0xd8;
	TL0 = 0xf0;
	u1_10ms ++;
	if (u1_10ms>99)	// 1000 ms = 1 second
	{
		u1_10ms = 0;
		SS++;
		if(SS==60)
		{
			SS=0;
			MM++;
			if(MM==60)
			{
				MM=0;
				HH++;
			    if(HH==24)
				HH=0;
    		}
		}
	}
}
此段为定时器计时函数,通过定时器0定时10MS,中断100次就是1秒,满60秒,分钟加1,分钟满60,小时加1,小时满24,清零。
4void beep ()	//闹钟检查
{
	if((set_hour==HH)&&(set_min==MM)&&(SS<6))// 判断走时与闹钟时间相等
	{
			 if(SS%2==0)
			 {
				BZ=0;
			 }
			 else
			 {
				BZ=1;
			 }	 
	}
}
此段为闹钟子函数,判断此时时钟时间是否与设定的闹钟时间相等,若相等则启动蜂鸣器报警,工作时间为6s,到时则蜂鸣器停止工作。

四、仿真及结果

  Proteus软件是目前世界上最先进的嵌入式系统设计与仿真平台,可以实现模拟电路、数字电路及各种电路系统的仿真和PCB设计等功能,是目前唯一一个能够对各种处理器进行实时仿真、调试与测试的EDA工具。微控制器系统相关的仿真需建立编译和调试环境,可选择Keil5软件。该软件支持许多芯片,集编辑、编译和程序仿真于一体,同时还支持汇编和C语言的程序设计。它的界面简单易学,在调试程序、软件仿真方面有很强大的功能。

4.1开始仿真

时间从12:59:50开始运行
在这里插入图片描述

4.2调整时间
调为17:00:00
在这里插入图片描述

设置闹钟17:51
在这里插入图片描述

  • 35
    点赞
  • 303
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值