LED电子钟的制作

东北石油大学课程设计任务书

课程单片机课程设计

题目LED电子钟的制作

一、任务

以AT89C51单片机为控制核心,制作一个利用六位LED显示的智能电子钟。

二、设计要求

[1] 计时显示:秒、分、时;

[2] 可以利用独立键盘,完成电子钟的调时、预约定时等基本功能;

[3] 计时精度:误差≤1秒/月(具有微调设置);

[4] 基本电路包括:单片机最小系统、LED显示电路、蜂鸣器电路、独立键盘

电路等;

[5] 提交设计报告、电路图及程序源码。

三、参考资料

[1] 吴杰.基于ISP 技术的电子公告牌系统[J].科技资讯2008.NO.14:83-87.

[2] 万光毅.单片机实验与实践教程[M]. 北京:北京航空航天大学出版社.2005.1.

[3] 张毅刚.单片机原理及应用[M]. 北京:高等教育出版社.2003:160-190.

[4] 马忠梅.单片机的C 语言应用程序设计[M].北京:北京航空航天大学出版

社.2006

[5] 周润景.基于Proteus的电路与单片机仿真系统设计与仿真[M]. 北京:北京航

空航天大学出版社. 2005.

目录

第1章绪论 (1)

1.1 LED数码管概述 (1)

1.2 LED数码管的驱动方式 (1)

1.3 本设计任务 (2)

第2 章总体方案论证与设计 (3)

2.1 数字时钟方案 (3)

2.2 LED显示方案 (3)

2.3 总体硬件组成框图 (4)

第3章系统硬件设计 (5)

3.1 LED显示模块的硬件设计 (5)

3.2 蜂鸣器电路设计 (6)

3.3 独立键盘模块的设计 (6)

第4章系统的软件设计 (7)

4.1 程序设计 (7)

第5章系统调试与测试结果分析 (8)

5.1 使用的电路器件 (8)

5.2 系统调试 (8)

5.3 测试结果 (9)

结论 (10)

参考文献 (11)

附录1 程序 (12)

附录2 仿真效果图 (14)

第1章绪论

LED数码管,实际上是由七个发光管组成8字形构成的,加上小数点就是8个。当数码管特定的段加上电压后,这些特定的段就会发亮。LED数码管以发光二极管作为发光单元,颜色有单红,黄,蓝,绿,白,七彩效果,它属于一种照明装饰、亮化灯具。主要用于楼体墙面,广告招牌、高档的DISCO、酒吧、夜总会、会所的门头广告牌等方面[1]。

1.1 LED数码管概述

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管。

按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮[2]。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。

1.2 LED数码管的驱动方式

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

1.2.1静态显示驱动

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机

可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

1.2.2 动态显示驱动

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动[3]。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

1.3 本设计任务

数码管是一类显示屏通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数。由于它的价格便宜、使用简单。在电器,特别是家电领域应用极为广泛,空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。

本研究即以AT89C51单片机为控制核心,制作一个利用六位LED显示的智能电子钟。

第2 章总体方案论证与设计

本系统采用单片机AT89C51为LED电子钟的控制核心,系统主要包括单片机最小系统、LED显示电路、蜂鸣器电路、独立键盘电路等。下面对电路的设计逐一进行论证比较。

2.1 数字时钟方案

数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。

方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作[4]。

基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。

2.2 LED显示方案

方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到

整个显示,但必须保证扫描速度足够快,字符才不闪烁[5]。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。

比较以上两种方案,系统设计中采用方案二。

2.3 总体硬件组成框图

图2-1 总体硬件组成框图

系统框图如图2-1所示,系统主要由三大模块组成即LED显示模块、蜂鸣器模块、独立键盘模块。

第3章系统硬件设计

为使该模块化LED电子钟控制系统具有更加方便和灵活性,我们对系统的硬件做了精心设计。硬件电路包括LED显示模块、蜂鸣器模块、独立键盘模块等三大模块。

3.1 LED显示模块的硬件设计

LED显示模块是LED电子钟设计的关键部分,显示电路设计的好坏直接关系到时间显示、定时、秒表等重要问题。本次设计中LED的显示是通过三极管和六位数码管显示实现的。

三极管最基本的作用是放大作用,它可以把微弱的电信号变成一定强度的信号,当三极管的基极上加一个微小的电流时,在集电极上可以得到一个是注入电流β倍的电流,即集电极电流[6]。集电极电流随基极电流的变化而变化,并且基极电流很小的变化可以引起集电极电流很大的变化,这就是三极管的放大作用[7]。NPN三极管管脚图如图3-1所示:

图3-1 NPN三极管管脚图

本实验中,LED的数据输入端口接到单片机89C51的P0口,使用P2.0~P2.5分别通过一个三极管来控制数码管的1~6位[8]。LED显示电路原理如图3-2所示:

图3-2 LED显示电路原理图

3.2蜂鸣器电路设计

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型[9]。蜂鸣器电路的设计原理图如图3-3所示:

图3-3 蜂鸣器电路设计原理图

由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的(但A VR可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了[10]。

3.3 独立键盘模块的设计

该部分电路原理图如图3-4所示:

图3-4 独立键盘原理图

如图3-4所示,按键的一端连接到电源地,另一端直接连到51单片机的I/O 引脚上。本实验中独立按键接于P3口,所以无需外接上拉电阻[11]。当按键被按下时,单片机的I/O引脚直接连接到电源地,其上被加了一个低电平。

第4章系统的软件设计

软件是该LED电子钟控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。

4.1 程序设计

本系统中下位机(单片机89C51)的主要功能就是实现LED电子钟计时显示、调时、预约定时等功能。其程序流程如图4-1所示:

图4-1 主程序流程图

第5章系统调试与测试结果分析

5.1 使用的电路器件

表5-1使用的电路器件

5.2 系统调试

根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:LED显示的调试,独立键盘的调试,蜂鸣器模块的调试等,最后将各模块组合后进行整体测试。

5.2.1硬件调试

对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。

5.2.2软件调试

软件调试采用单片机仿真器Proteus及Keil C,将编好的程序进行调试,主要是检查语法错误。

5.2.3硬件软件联调

将调试好的硬件和软件进行联调,主要调试系统的实现功能。

5.3 测试结果

此次系统设计结果较好,LED电子钟能很好的显示信息。实现了调时、预约定时、秒表的功能。

结论

本系统是以AT89C51单片机为核心,使用定时器与软件结合、动态扫描技术,利用人眼视觉暂留现象实现时间显示的LED数码管显示。

系统总体电路由最小系统电路,LED显示电路,独立键盘电路和蜂鸣器电路构成。LED显示电路由NPN型三极管进行电流放大实现单片机数据传输,完成将数模向外部数模数组的传递过程。通过软件完成对LED数码管显示的驱动,实现数模信息于LED显示上亮灭的转变过程。其中外部中断0和外部中断1实现了在调时与预约定时时对时位和分位的调整。

在最初的软硬件的仿真调试中,虽然实现了LED电子钟时间的显示,形式为“时时分分秒秒”。但调整时和分的时候,出现按一次按键就加4或5的状况,经过查找资料,发现是按键的抖动引起的。于是在每次判断后加了两次延时,实现了加一的功能。之后,经过多次电路图调整与程序修改,最终完整实现了本次课程设计LED电子钟的基本功能:LED时间显示、调时、预约定时、秒表。其中,预约定时时显示为“时时分分”,秒表显示为“0000秒秒”。本次设计中LED数码管所展现的功能较为简单,但在实际应用中,功能不仅仅于此,通过对程序的稍做修改,可以实现年月日与时分秒的切换显示,以及定时报点等,并且都可以和上位机进行通信实现时间的更新。

参考文献

[1] 吴杰.基于ISP 技术的电子公告牌系统[J].科技资讯2008.NO.14:83-87.

[2] 万光毅.单片机实验与实践教程[M]. 北京:北京航空航天大学出版社.2005.1.

[3] 张毅刚.单片机原理及应用[M]. 北京:高等教育出版社.2003:160-190.

[4] 马忠梅.单片机的C 语言应用程序设计[M].北京:北京航空航天大学出版

社.2006

[5] 周润景.基于Proteus的电路与单片机仿真系统设计与仿真[M]. 北京:北京航

空航天大学出版社. 2005.

[6] 金炯泰,金奎焕. 如何使用KEIL8051C编译器[M]. 北京:北京航空航天大学出

版社.2002.

[7] 于海生.微型计算机控制技术[M] .北京:清华大学出版社.1999.6.

[8] 孙涵芳.MCS-51系列单片机原理及应用[M] .北京:北京航空航天大学出版

社.1996.4.

[9] 杨欣等.电子设计从零开始[M] .北京:清华大学出版社.2005.10.

[10] 夏路易,石宗义.电路原理图与电路设计教程Protel 99SE[M] .北京:北京

希望电子出版社.2002.

[11] 王毓银.数字电路逻辑设计[M] .北京:高等教育出版社.2004.2.

附录1 程序

#include

#define uchar unsigned char

#define uint unsigned int

sbit sw1=P3^1;

sbit k1=P3^2;

sbit k2=P3^3;

sbit sw2=P3^6;

sbit sw3=P3^7;

sbit FMQ=P1^7;

uchar tab[]={0xC0,0xF9,0xA4,0xB0, 0x99, 0x92,0x82,0xF8,0x80,0x90,0xff}; uchar dis_buff[6];

uchar sec100,sec101,sec,min,hour; uchar setm,seth,sets;

void delay(uint k)

{uint m,n;

for(m=0;m

{for(n=0;n<120;n++);}

}

void display(void)

{P2=0x10;

P0=tab[dis_buff[1]];

delay(2);

P2=0x08;

P0=tab[dis_buff[2]];

delay(2);

P2=0x04;

P0=tab[dis_buff[3]];

delay(2);

P2=0x02;

P0=tab[dis_buff[4]];

delay(2);

if(sw2==0) P2=0x00;

else P2=0x20;

P0=tab[dis_buff[0]];

delay(2);

if(sw2==0) P2=0x00;

else P2=0x01;

P0=tab[dis_buff[5]]; delay(2);

}

void disp_data(void)

{if(sw2==0)

{dis_buff[4]=seth/10; dis_buff[3]=seth%10; dis_buff[2]=setm/10;

dis_buff[1]=setm%10;} else if(sw2!=0&sw1==0) {dis_buff[5]=0;

dis_buff[4]=0;

dis_buff[3]=0;

dis_buff[2]=0;

dis_buff[1]=sets/10;

dis_buff[0]=sets%10;} else

{dis_buff[5]=hour/10; dis_buff[4]=hour%10; dis_buff[3]=min/10;

dis_buff[2]=min%10; dis_buff[1]=sec/10;

dis_buff[0]=sec%10;}

}

void inc_hour(void) {hour++;

if(hour>23) {hour=0;} }

void inc_min(void) {min++;

if(min>59)

{min=0;inc_hour();}

}

void inc_sec(void) {sec++;

if(sec>59)

{sec=0;inc_min();}

}

void inc_seth(void)

{ if(seth>23) seth=0; }

void inc_setm(void)

{ if(setm>59) setm=0; }

void inc_sets(void)

{if(sw2!=0&sw1==0)

{sets++;

if(sets>59) sets=0; }

if(sw1!=0) sets=0;

}

void int0() interrupt 0

{delay(100);

if(sw2!=0&INT0==0)

{delay(150);

if(sw2!=0&INT0==0)delay(100); if(sw2!=0&INT0==0)inc_hour();} }

void int1() interrupt 2

{delay(100);

if(sw2!=0&INT1==0)

{delay(150);

if(sw2!=0&INT1==0)delay(100); if(sw2!=0&INT1==0)inc_min();} }

void set1()

{delay(100);

if(sw2==0&INT0==0)

{delay(150);

if(sw2==0&INT0==0)delay(100); if(sw2==0&INT0==0)inc_seth();} }

void set2()

{delay(100);

if(sw2==0&INT1==0)

{delay(150);

if(sw2==0&INT1==0)delay(100); if(sw2==0&INT1==0)inc_setm();} }

void timer0() interrupt 1

{TH0=0xDC;

TL0=0x00;

sec100++;sec101++; if(sec100>=100)

{sec100=0;inc_sec();}

if(sec101>=100)

{sec101=0;inc_sets();}

}

void int_init(void)

{TMOD=0x01;

TH0=0xDC;

TL0=0x00;

TR0=1;

ET0=1;

EX0=1;

IT0=0;

EX1=1;

IT1=0;

EA=1;}

void FM()

{if(sw3==0)

{if(hour==seth&min==setm&sec== 0) {FMQ=1;

delay(500);

FMQ=0;

delay(500);}}

}

void main(void)

{int_init();

P0=0xFF;

P2=0x00;

hour=12;

min=0;

sec=0;

sec100=0;

sec101=0;

seth=0;

setm=0;

sets=0;

FMQ==0;

while(1)

{disp_data();display();}

}

附录2 仿真效果图

东北石油大学课程设计成绩评价表

指导教师:年月日

相关文档
最新文档