一、课题的方案设计与论证
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文件进行仿真,观察现象。若与预期不一致则检查电路或修改代码,直至与设计方案一致。
1、
if(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); //显示闹钟分钟个位数
}
此段为显示时间程序,通过时分秒变量把此时时钟时间一位一位发送到数码管中。
2、
void 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;
}
}
}
此段是按键设置时间,设置闹钟函数,通过这个可以校正显示时间,以及设置闹钟。
3、
void 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,清零。
4、
void 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