四、单片机之电子时钟设计

目录

前言

一、电子时钟原理

1、输入电路原理

2、输出电路原理

3、控制电路

二、单片机原理图绘制

1、所需元件名称

2、绘制原理图

三、编写程序

总结


前言

今天我们来学习单片机AT89C52控制电子时钟,此时钟可以分别显示“时-分-秒”,并且可以通过按键调节时间。期间我们用到的软件有proteus和keil两个软件,欢迎大家提问已经寻找错误,请大家点个关注和收藏,后续还会更新。


一、电子时钟原理

1、输入电路原理

主要是通过按键完成信息的采集,咱们是通过七个I/O口分别对七个按键进行检测。

2、输出电路原理

本实验采用8位LED数码管动态扫描显示电路,其A~DP分别与单片机的P2口相连,受P2口控制,位控制端由P3口连接。

3、控制电路

通过单片机内置定时器定时1秒不断刷新在显示屏中显示数值,对输入信息进行分析显示,实验中采用C52单片机进行控制

二、单片机原理图绘制

1、所需元件名称

proteus原理图中名称对应:

AT89C52——52单片机芯片;

BUTTON——按钮(复位按键);

CAP——无极性电容;

CAP-ELEC——电解电容;

CAP-POL——极性电容;

CRYSTAL——晶振;

RES——电阻;

7SEG-MPX8-CA-BLUE——共阳极数码管显示器;

以上就是我们这次设计需要用到的所有元器件,接下来我们就需要创建新工程,然后在右面添加元器件进行绘制。

2、绘制原理图

首先是绘制最小系统,将AT89C52、复位电路、时钟电路绘制出来。

然后就是咱们的输出电路,将数码管显示器加入原理图,将对应引脚与I/O口相连。

然后咱们对输出电路进行绘制。

这里我采用了网络标号的连接方法进行连接,可以增加原理图的整洁度,可以一眼看到是如何连接的。

至此,咱们的原理图就绘制完成,接下来咱们可以开始编写程序。

三、编写程序

这里咱们分出三部分分别展示程序,分别为输出电路、输入电路、控制电路。

1、输出电路

u8 gsmg_code[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳
u8 place_code[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void smg_display(void)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
       switch(i)
			 {
				 case 0:PLACE=0x01;SMG_A_DP_PORT=gsmg_code[hour/10];break;
				 case 1:PLACE=0x02;SMG_A_DP_PORT=gsmg_code[hour%10];break;
			    case 2:PLACE=0x04;SMG_A_DP_PORT=0xbf;break;
				 case 3:PLACE=0x08;SMG_A_DP_PORT=gsmg_code[min/10];break;
				 case 4:PLACE=0x10;SMG_A_DP_PORT=gsmg_code[min%10];break;
			    case 5:PLACE=0x20;SMG_A_DP_PORT=0xbf;break;
				 case 6:PLACE=0x40;SMG_A_DP_PORT=gsmg_code[sec/10];break;
				 case 7:PLACE=0x80;SMG_A_DP_PORT=gsmg_code[sec%10];break;
				 
			 }				 
			 delay(1);
	}
}//PLACE对应的是1~8位控制端的I/O口;SMG_A_DP_PORT对应的是8位共阳极数码管A~DP的I/O口;hour、min、sec分别代表小时、分钟、秒。

2、输入电路

void Button_c()
{
   BUTTON=0xFF;//P1口控制七个按键进行控制
	if(BUTTON!=0xFF)
	{
		delay(1);
		if(BUTTON!=0xFF)//消抖处理
      {
		   switch(BUTTON)
			{
			   case 0xBF:sec--;break;
				case 0xDF:sec++;break;
				case 0xEF:min--;break;
				case 0xF7:min++;break;
				case 0xFB:hour--;break;
				case 0xFD:hour++;break;
				case 0xFE:sec=0;min=0;hour=0;break;
			}
		while(BUTTON!=0xFF);//按钮按一下做出一次反应
		}
	}
}

3、控制电路

void time0_int(void)//定时
{
   TMOD|=0x01;
	TH0=0xfc;
	TL0=0x66;
	ET0=1;
	EA=1;
	TR0=1;
}
void main()
{
	time0_int();
while(1)
	{
	  smg_display();//输出
	  Time_Line_Negative();//此函数是对00:00:00时继续进行减操作的限制行为,继续减会到23:59:59
	  Time_Line_Add();//此函数是对24:60:60时继续进行加操作的限制行为,继续加会到00:00:00
		Button_c();//输入
	}
}
void time0() interrupt 1//定时
{
static u16 i=0;
	TH0=0xfc;
	TL0=0x66;
	i++;
	if(i==1000)
	{
	   i=0;
		sec++;
		LED1=!LED1;
	}

}

至此,程序编写完成。

代码效果:

根据以上步骤,咱们就可以得到想要的实验效果啦!


总结

以上就是咱们的实验步骤,在实验中咱们需要注意定时器初始化,以及8位共阳极数码管的显示。通过porteus和keil对电子时钟进行了简单的设计。希望对你有帮助,后续我还会持续更新,帮忙点赞收藏,欢迎大家来看。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值