单片机智能电子数字钟设计说明.docx
《单片机智能电子数字钟设计说明.docx》由会员分享,可在线阅读,更多相关《单片机智能电子数字钟设计说明.docx(19页珍藏版)》请在冰点文库上搜索。
单片机智能电子数字钟设计说明
建筑工程学院
单片机课程设计报告
题目名称:
智能电子数字钟设计
系:
电气工程系
专业:
电气工程及其自动化
班级:
XXX
学号:
XXXXXXXX
学生:
XXX
指导教师:
XXX
职称:
讲师
2012年6月28日
摘要
近年来,随着电子产品的发展,人们对数字时钟的要求越来越高,本文针对人们的这一需求,设计了一种由单片机控制的智能化数字时钟,功能强大,界面友好,更好的满足了人们对它的智能化要求。
智能电子数字钟是采用AT89C51单片机部定时器来实现定时功能的,并且通过LED驱动器MC14543来实现LED动态扫描驱动。
能通过增量键盘预置和调整时间、星期。
秒计数器满60向分计数器进位,分计数器满60向时计数器进位,时计数器以24为一个周期。
AT89C51单片机部计数器的输出经LED动态扫描驱动器MC14543送到七位共阴显示器,可将星期、时、分、秒在相应位置正确显示,并实现整点报时功能。
关键词:
智能数字钟;AT89C51;LED
一、系统总体方案设计
近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子时钟、数字时钟等等。
这些方法都各有特点,其中,利用单片机实现的电子钟具有编程灵活,便于电子钟功能的扩充,精确度高等特点。
单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。
但是却很少知道它的部结构以及工作原理。
由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行定时、校时功能。
输出设备显示器可以用液晶显示技术和数码管显示技术。
单片机芯片作为控制系统的核心部件,它除了具备微机CPU的数值计算功能外,还具有灵活强大的控制功能,以便实时检测系统的输入量、控制系统的输出量,实现自动控制。
在本次设计中采用单片机技术来实现数字钟的功能。
微处理器的选择,本设计采用AT89C51单片机。
显示电路的选择,本设计采用由LED驱动器MC14543构成的7位LED显示电路。
还有一些其他控制电路,如:
晶振电路,复位电路,键盘电路和报警电路。
[1]
1、系统结构框图
根据系统总体要求,以单片机为核心,共六个模块组成,既:
单片机模块、晶振电路模块、复位电路模块、独立键盘模块、显示电路模块和报警电路模块。
按照系统设计功能的要求。
电路系统构成框图如图1所示。
报警电路
显示电路
独立键盘
单片机
AT89C51
晶振电路
复位电路
图1系统构成框图
电源电路
2、系统的基本原理及设计思想
本设计采用9V干电池经LM7805稳压,再经稳压管D1稳压后输出+5V直流电,供给AT89C51单片机模块、晶振电路模块、复位电路模块、独立键盘模块、显示电路模块和报警电路模块所需的工作电源,电源正常工作由LED指示灯指示。
晶振电路用于产生AT89C51单片机工作时所必需的控制信号。
AT89C51单片机的部电路正是在时钟信号的控制下,严格地按时序执行指令进行工作。
在执行指令时,CPU首先到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号完成指令所规定的操作。
复位是单片机的初始化操作,只需给AT89C51的复位引脚RESET加上大于2个机器周期的高电平就可使AT89C51复位。
当AT89C51进行复位时,PC初始化为0000H,使AT89C51单片机从程序存储器的0000H单元开始执行程序。
除了进入系统的正常初始化之外,当程序运行出错(如程序“跑飞”)或操作错误使系统处于“死锁”状态时,也需要按复位键即RESET为高电平,使AT89C51摆脱“跑飞”或“死锁”状态而重新启动程序。
键盘的任务有三项:
(1)首先判别是否有键按下。
若有,进入下一步工作。
(2)识别哪一个键被按下,并求出相应的键值。
(3)根据键值,找到相应键值的处理程序入口。
在本设计中,键盘具有向单片机输入数据、命令等功能,是人与单片机对话的主要手段。
通过键盘,可以预置时间、星期。
常见的LED数码管为“8”字型的,共计8段。
每一个段对应一个发光二极管。
这种数码管显示器有共阳极和共阴极两种,本文采用共阴极接法。
共阴极LED数码管的发光二极管的阴极连接在一起,通常此公共阴极接地。
当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。
采用MC14543作为LED驱动器来实现LED的动态扫描驱动,通过七位共阴LED显示星期、时、分、秒。
通过加入一个使用晶体管驱动的蜂鸣器报警电路,当时间到底整点时,报警电路进行报时。
工作原理为:
P1.7接晶体管基极输入端,当P1.7输出高电平时,晶体管导通,压电式蜂鸣器两端获得+5V电压而鸣叫;当P1.7输出低电平时,晶体管截止,蜂鸣器停止发声。
[2]
3、计时方案
电脑数字钟的秒信号是利用AT89C51单片机部定时器TO产生的。
由于振荡器的晶振频率为6MHz,使得TO的最大定时时间远远小于1秒,因此,在设计时采用了硬件计数与软件计数相结合的方式,即通过TO产生0.1S的时基信号,然后再利用软件进行计数,从而产生1秒钟的时间信号。
在设计中,定时器TO采用了中断方式。
当定时时间到时,定时器向CPU申请一次中断,CPU响应中断后转入中断服务程序,在TO的中断服务程序中实现时、分、秒的累加,即每产生一次中断,0.1S时基单元的容加1,当0.1S时基单元的容等于10时,便产生1S信号,使秒计数单元的容加1,并将0.1S时基单元的容清0;当秒计数单元计满60后,向分计数单元进位,使分计数单元的容加1,并将秒计数单元的容清0;当分计数单元计满60后,向时计数单元进位,使时计数单元的容加1,并将分计数单元的容清0;时计数单元计满24后清O。
[3]
二、系统硬件设计
硬件电路是一个系统的重要部分,在本次设计中主要是以AT89C52为核心控制器,外加一些控制电路来实现数字钟的基本功能。
下面分别介绍各个控制电路模块的功能及其工作原理。
1、电源模块
电源模块如图2电源电路,考虑到测量仪器的应用方便,本设计采用9V干电池经LM7805稳压,再经稳压管D1稳压后输出+5V直流电,供给AT89C51单片机模块、晶振电路模块、复位电路模块、独立键盘模块、显示电路模块和报警电路模块所需的工作电源,电源正常工作由LED指示灯指示。
图2电源模块
2、单片机模块
本设计采用AT89C51单片机。
AT89C51单片机是一种低功耗、高性能CMOS8位微控制器,具有8K在线可编程存储器。
AT89C51有5个中断源,2个可编程的16位定时器/计数器。
低功耗节电模式有空闲模式和掉电模式。
AT89C51的引脚图如下图所示:
(1)RESET:
复位信号输入端,高电平有效。
(2)/VP:
是外部程序存储器访问允许控制端。
(3)XTAL1/XTAL2:
片振荡器反向放大器和时钟发生器电路的输入/输出端。
(4):
片外程序存储器的读选通信号,低电平有效。
(5)ALE/:
ALE为CPU访问外部程序存储器或外部数据存储器提供一个地址锁存信号,将低8位地址锁存在片外的地址锁存器中。
[4]
(6)P0口:
8位,漏极开路的双向I/O口。
(7)P1口:
8位,准双向I/O口,具有部上拉电阻。
(8)P2口:
8位,准双向I/O口,具有部上拉电阻。
(9)P3口:
8位,准双向I/O口,具有部上拉电阻。
还可提供第二功能。
图3单片机模块
3、晶振电路模块
晶体振荡器电路给数字钟提供一个频率稳定准确的12MHz的方波信号,可保证数字钟的走时准确及稳定。
AT89C51部有一个用于构成振荡器的高增益反相放大器,它的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器,图4为AT89C51部时钟方式的电路。
图4晶振电路模块
电路中的两个电容典型值通常选择为30pF,该电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
晶体振荡的围通常是在1.212MHZ。
晶体的频率越高,系统的时钟频率越高,单片机的运行速度也就越快。
[5]
4、LED显示电路模块
系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线。
动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。
图中的MC14543作为LED驱动器来实现LED的动态扫描驱动,而7个4.7千欧姆电阻则起限流作用。
由LED驱动器MC14543构成的7位LED显示电路如图5所示。
图5显示电路模块
要想让数码管那一段亮,在该数码管位控段为高电平的情况下给这段送高电平就可以了。
显示电路结构采用动态扫描的方式,所有数码管的段控端公用LED驱动器MC14543的7根输出线,数码管的段控端a、b、c、d、e、f、g分别通过一个510欧姆的电阻接到MC14543输出口的a、b、c、d、e、f、g口线上,每个数码管的位控线单独占用单片机P2口一根输出口线,7位数码管从高位到低位分别接P2.0~P2.6引脚。
段控码(高电平有效)由P0口输出经上拉电阻上拉电压后通过驱动器MC14543送到数码管的段控端,位控码由P2口输出经三极管S9012驱动后送到数码管的位控端。
[6]
5、独立键盘模块
独立式键盘的特点是:
一键一线,各键相互独立,每个按键各接一条I/O口线,通过检测I/O输入线的电平状态,可以很容易地判断哪个按键被按下。
图6中的上拉电阻保证按键释放时,输入检测线上有稳定的高电平,当某一按键按下时,对应
图6键盘电路模块
的检测线就变成了低电平,与其它按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,就很容易识别出哪个按键被按下。
在本设计中,用四个键来实现对星期和时间的校对,按Kweek来调节星期,按Khour来调节小时的时间,按Kmin来调节分针的时间,按Ksec来调节秒的时间。
6、复位电路模块
图7所示为复位电路原理图,复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。
按键手动复位有电平和脉冲两种方式,本设计采用按键电平复位电路,它是通过复位端RESET经电阻与Vcc电源接通而实现的,它兼具上电复位功能。
因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2μS才能完成复位操作。
[7]
图7复位电路模块
7、报警电路模块
当LED显示器所显示的时间为整点时,单片机系统能够发出提醒声音使人们警觉,使用单片机系统的I/O口很容易实现该功能。
在图8中,P1.7接晶体管的基极输入端。
当P1.7输出高电平时,晶体管导通,压电蜂鸣器两端获得约+5V电压而鸣叫;当P1.7输出低电平时,晶体管截止,蜂鸣器停止发声。
[8]
图8报警电路模块
三、系统软件设计
单片机的程序设计有其自身的特点。
在单片机系统中,硬件与软件紧密结合,由于硬件电路的设计不具有通用性,所以必须根据具体的硬件电路来设计对应的软件,硬件设计的优劣直接影响到软件设计的难易,软件设计的优劣又直接影响到硬件的发挥。
在很多时候,软件可以替代硬件的功能。
软件程序的设计是根据硬件电路图的连接和各个元器件的功能进行设计。
在编写软件时,可以按各个程序的功能将软件细分为各个功能模块,再通过主程序的调用来实现整个软件系统。
而一般编写的程序都是根据事前所用的流程图来编写的,而且,流程图中也包含了对设计所得结果的要求,因此,流程图的设计直接影响到源程序的设计。
[9]
1、主程序流程图
主程序是软件设计的总体框架,因此主程序流程图的设计决定了程序编写的好坏,主程序的功能主要是读时间,将时间数据送到LED数码管显示,再判断是否有按键按下,从而进行校时功能。
当到达整点时,发出报警音。
其流程图如图8所示。
开始
初始化
启动定时器
按键检测
时间显示、等待定时中断
调整时间
整点时间
时间调整子程序
发“嘀”一声
Y
N
N
Y
图8主程序流程图
主程序的功能是完成系统的初始化,然后启动定时器,定时器启动后再进行按键检测,检测完后,就可以显示时间。
[10]
2、按键检测子程序流程图
按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就把时间显示出来。
按键检测子程序流程图如图9所示:
开始
秒按键是否按下?
取秒键值
返回
N
Y
Y
Y
N
N
N
分按键是否按下?
取分键值
Y
取时键值
分按键是否按下?
星期按键是否按下?
取星期键值
图9
图9按键检测子程序流程图
3、定时器中断子程序流程图
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加l;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
定时器中断流程图如图10所示:
开始
1秒时间到?
秒单元加1
秒单元清零,分单元加1
分单元清零,时单元加1
60秒时间到?
60分钟到?
24小时到?
时间显示
时单元清零
中断返回
N
Y
Y
Y
Y
N
N
N
图10定时器中断子程序流程图
4、时间显示子程序流程图
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
时间显示子程序流程图如图11所示:
开始
秒个位计算显示
秒十位计算显示
分十位计算显示
分个位计算显示
时个位计算显示
时十位计算显示
时十位计算显示
星期计算显示
结束
图11时间显示子程序流程图
结论
我在本次智能电子数字钟课程设计的设计过程中受益匪浅。
通过对自己在大学三年时间里所学知识的回顾,并充分发挥对所学知识的理解和对本课程设计的思考,最终完成了本次设计。
这为自己今后对单片机的进一步学习积累了宝贵的经验。
撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计。
提高了我分析和解决问题的能力,也培养了我运用所学知识解决实际问题的能力。
通过这次课程设计,使我意识到,只有理论水平提高了,才能够将课本知识与实践相整合,以增强自己的动手能力。
也使我知道了理论和实际的距离,也知道了理论和实际想结合的重要性,通过实际动手和去网上以及图书馆查找一些资料,我从中学到了很多书本上无法学到的知识。
参考文献
[1] 朝青.单片机原理及接口技术(简明修订版)[M].:
航空航天大学,1998.
[2] 广弟.单片机基础[M].:
航空航天大学,1994.
[3]高吉祥.电子技术基础实验与课程设计[M].电子工业,2002.
[4]康华光.电子技术基础[M].:
高等教育,2002.
[5]中发.数字电子技术[M].:
中国水利水电,2004:
302一306.
[6]胡汉才.单片机原理及其接口技术[M].:
清华大学,2004.
[7]康光华.电子技术基础模拟部分[M].:
高等教育,2006.
[8]梅丽凤、王艳秋等.单片机原理及接口技术[M].:
清华大学,2004.
[9]阎石.数字电子技术基础(第四版)[M].:
高等教育,1998.
[10]郁汉琪.数字电子技术实验及课程设计[M].:
高等教育,1995.
附录
1、源程序
表1P1口对应段码及数值
显示
数字
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
16进制代码
dp
g
f
e
d
c
b
a
0
0
0
1
1
1
1
1
1
3FH
1
0
0
0
0
0
1
1
0
06H
2
0
1
0
1
1
0
1
1
5BH
3
0
1
0
0
1
1
1
1
4FH
4
0
1
1
0
0
1
1
0
66H
5
0
1
1
0
1
1
0
1
6DH
6
0
1
1
1
1
1
0
1
7DH
7
0
0
0
0
0
1
1
1
07H
8
0
1
1
1
1
1
1
1
7FH
9
0
1
1
0
1
1
1
1
6FH
2、主程序
#include
sbitksec=P1^0;
sbitkmin=P1^1;
sbitkhour=P1^2;
sbitkweek=P1^3;
unsignedcharsecshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,week=0;
unsignedintnum=0,sec=0,min=0,hour=0,week=0;
unsignedcharcode
table[10]={0x3f,0xxx,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voiddelay(unsignedint);
voidkeyscan();
voiddisplay();
main()
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
while
(1)
{display();
keyscan();}
}
voiddelay(unsignedintz)
{unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;Y--);}
3、定时器中断子程序
voidtime0()interrupt1
{num++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
4、LED显示子程序
voiddisplay()
{if(num==20)
{num=0;
sec++;
if(sec==60)
{sec=0;
min++;
if(min==60)
{min=0;
hour++;
if(hour==24)
{hour=0;
min=0;
sec=0;
}
}
}
}
secge=sec%10;
secshi=sec/10;
minge=min%10;
minshi=min/10;
hourge=hour%10;
hourshi=hour/10;
P2=0xfe;
P0=table[secge];
delay(5);
P2=0xfd;
P0=table[secshi];
delay(5);
P2=0xfb;
P0=0x40;
delay(5);
P2=0xf7;
P0=table[minge];
delay(5);
P2=0xef;
P0=table[minshi];
delay(5);
P2=0xdf;
P0=0x40;
delay(5);
P2=0xbf;
P0=table[hourge];
delay(5);
P2=0x7f;
P0=table[hourshi]
delay(5);
}
5、按键控制子程序
voidkeyscan()
{if(ksec==0)
{delay(10);
if(ksec==0)
{sec++;
if(sec>=60)
sec=0;
}
while(ksec==0)
display();
}
if(kmin==0)
{delay(10);
if(kmin==0)
{min++;
if(min>=60)
min=0;
}
while(kmin==0)
display();
}
if(khour==0)
{delay(10);
if(khour==0)
{hour++;
if(hour>=60)
hour=0;
}
while(khour==0)
display();
}
}
6、总电气原理图