LED数码管显示电子钟设计.docx

上传人:b****5 文档编号:14281433 上传时间:2023-06-22 格式:DOCX 页数:22 大小:56.11KB
下载 相关 举报
LED数码管显示电子钟设计.docx_第1页
第1页 / 共22页
LED数码管显示电子钟设计.docx_第2页
第2页 / 共22页
LED数码管显示电子钟设计.docx_第3页
第3页 / 共22页
LED数码管显示电子钟设计.docx_第4页
第4页 / 共22页
LED数码管显示电子钟设计.docx_第5页
第5页 / 共22页
LED数码管显示电子钟设计.docx_第6页
第6页 / 共22页
LED数码管显示电子钟设计.docx_第7页
第7页 / 共22页
LED数码管显示电子钟设计.docx_第8页
第8页 / 共22页
LED数码管显示电子钟设计.docx_第9页
第9页 / 共22页
LED数码管显示电子钟设计.docx_第10页
第10页 / 共22页
LED数码管显示电子钟设计.docx_第11页
第11页 / 共22页
LED数码管显示电子钟设计.docx_第12页
第12页 / 共22页
LED数码管显示电子钟设计.docx_第13页
第13页 / 共22页
LED数码管显示电子钟设计.docx_第14页
第14页 / 共22页
LED数码管显示电子钟设计.docx_第15页
第15页 / 共22页
LED数码管显示电子钟设计.docx_第16页
第16页 / 共22页
LED数码管显示电子钟设计.docx_第17页
第17页 / 共22页
LED数码管显示电子钟设计.docx_第18页
第18页 / 共22页
LED数码管显示电子钟设计.docx_第19页
第19页 / 共22页
LED数码管显示电子钟设计.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

LED数码管显示电子钟设计.docx

《LED数码管显示电子钟设计.docx》由会员分享,可在线阅读,更多相关《LED数码管显示电子钟设计.docx(22页珍藏版)》请在冰点文库上搜索。

LED数码管显示电子钟设计.docx

LED数码管显示电子钟设计

 

《单片机原理及应用》

课程设计说明书

题目

LED数码管显示电子钟设计

系(部)

专业(班级)

姓名

学号

指导教师

起止日期

 

课程设计任务书

系(部):

专业:

课题名称

LED数码管显示电子钟设计

设计要求

1、课题内容:

设计一种基于AT89S52单片机的数码管显示电子时钟,要

求如下:

(1)、能正确显示时间,时钟由八位数码管显示,显示格式为:

XX小时——XX分-—XX秒。

(2)、时间能够由按键调整,误差小于1S.

(3)、闹钟功能:

时间运行到及闹钟设定时间时,闹钟响(持续响3秒)

(4)、报时功能:

时间运行到正点时间时,闹钟响,几点钟就响几声(每

声持续响2秒,每两声之间时间间隔1秒)。

(5)、通过按键切换,可以显示当前日期,显示格式为:

XX年¾XX月

¾XX日,5秒钟后自动返回时间显示模式。

2、要求:

完成该系统的硬件和软件的设计,在Proteus软件上仿真通过,并提

交一篇课程设计说明书。

设计工作量

1、汇编或C51语言程序设计;

2、程序调试;

3、在Proteus上进行仿真成功;

4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序

分析、仿真分析、调试过程,参考文献、设计总结等.

工作计划

起止日期

工作内容

第一天

课题介绍,答疑,收集材料,C51介绍

第二天

设计方案论证,练习编写C51程序

第三天~第六天

程序设计

第六天~第八天

程序调试、仿真

第九天~第十天

系统测试并编写设计说明书

教研室

意见

 

年月日

系(部)主

管领导意见

 

年月日

一、摘要

单片机全称为单片机微型计算机(SingleChipMicrosoftcomputer).从应用领域来看,单片机主要用来控制,所以又称为微控制器(MicrocontrollerUnit)或嵌入式控制器。

单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。

单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。

时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础.在一个单片机应用系统中,时钟有两方面的含义:

一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:

一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:

DS1302,DS12887,X1203等都可以满足高精度的要求。

二、设计内容

2.1、任务要求

本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的年、月、日、时、分、秒,还有设定闹钟,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:

键盘、芯片、扬声器、LED显示即可满足设计要求.

2。

2、设计程序方案

设计程序思路:

1.实现8位数码管动态扫描显示

voidDisplay_1Code(unsignedcharpos,unsignedcharcode1);

voidDisplay_2Num(unsignedcharpos,unsignedcharnum,unsignedcharpoint);

数码管动态扫描就是:

段显位选延时显示消影

因为我们用的是共阳数码管,而段码表用的共阴的,所以对code1取反

共阳数码管高电平点亮,所以P2移位后不用取反,从高位开始是第1个数码管

掩饰显示1ms,P2给全0全部熄灭,消影作用.

2。

时间显示

采用实时时钟芯片DS1302,读芯片的datasheet,根据时序等说明编写驱动程序。

1)初始化

voidDS1302_Init(void)

2)底层基本读写函数

voidDS1302_WriteByte(unsignedcharbyte)

unsignedcharDS1302_ReadByte(void)

3)对芯片寄存器的读写函数

voidDS1302_WriteData(unsignedcharaddr,unsignedcharmdata)

unsignedcharDS1302_ReadData(unsignedcharaddr)

4)修改时间函数

voidDS1302_RWriteData(unsignedcharaddr,unsignedcharmdata)

这些函数的实现就看dagasheet了,主要是时序

a.时钟上升沿写入数据

b。

时钟下降沿读出数据

c。

秒寄存器最高位为1关闭时钟,为0则开启时钟

5)显示时间和日期

voidDisplay_Time(void)

显示时分秒,0x40为显示横,如12-30-00

voidDisplay_Date(void)

显示日期,如20131230,中间没有横杆,但是在年月日上有小数点,通过

Display_2Num最后一个参数控制

voidDisplay(void)根据dis_mode变量选择当前显示的是时间还是日期还是闹钟。

GetDateTime读取时间并及闹钟时间做比较,检测是否到达闹钟时间。

6)扫描方式

动态扫描,定时器0控制扫描周期,10ms扫描一次

voidTimer0_OVF(void)interrupt1

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

}

3.按键调时

voidKeyScanf(void)

flag_alarm_mode是闹铃模式则按键退出闹铃并返回,一键关闭闹钟

然后对setting_item变量自加,依次表示设置秒、分、时、天、月等等,设置项对应的小数点位点亮.

加键一样的过程,根据setting_item的值加不同的量:

秒、分、时。

记住改变时间后要修改DS1302芯片的寄存器才能真正修改时间。

2。

3设计电路仿真图

数码管显示模块:

 

图1数码管显示模块

数码管是一种把多个LED显示段集成在一起的显示设备。

有两种类型,一种是共阳型,一种是共阴型。

共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。

共阴型就是把多个LED显示段的阴极接在一起,即为公共商.阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极.通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段.系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线.动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。

本设计采用共阳极数码管。

晶振电路模块:

在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2.而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。

时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

 

图2晶振电路

按键模块:

时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器、时个位和时十位计数器及星期计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,时个位和时十位计数器为24进制计数器.

 

图3按键模块

时钟芯片电路:

X1X2:

32.768晶振管脚

GND:

RST:

复位脚

I/O:

数据输入/输出引脚

SCLK:

串行时钟

VCC1,VCC2:

电源供电管脚

 

图4时钟芯片电路

电路总体设计仿真图:

图5总体仿真图

按菜单/显示时间键会出现一个小光标点,再按菜单/显示时间键,光标点会左移,按加速或者减速键会加减数值。

继续按菜单/显示时间键跳到显示日期、闹钟时,也可以用加速或者减速键调整时间。

按减速/显示闹钟键会显示闹钟.按加速/显示日期键会显示日期。

5s后会自动恢复到显示时间。

操作方便简洁.

图6日期显示

图7闹钟显示

三、心得体会

单片机作为我们主要的专业课程之一,我觉得单片机课程设计很有必要,而且很有意义.在这次课程设计中,运用到了很多以前的专业知识,虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的一大收获。

站在库的位置上想问题。

另外,要做好一个课程设计,就必须做到:

在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美及否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中.虽然有些程序不是那么清楚理解,自己好好查阅资料,不懂还可以请教老师、同学.当我有什么不明白的地方去向其他同学请教时,即使他们正在忙于思考,也会停下来帮助我。

当我有什么想法告诉他们的时候,他们不会因为我得无知而不耐心听我讲,反而会指出我的不足,一起提高.学到了共同探讨、共同前进的精神,也让我明白谦虚好学的真谛设计过程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。

在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用。

在以后的学习过程中我会努力的。

四、参考文献

[1]谢自美.电子线路设计·实验·测试[M].武汉:

华中理工大学出版社,1992.

[2]何立民.单片机应用系统设计[M].北京:

北京航空航天大学出版社,1993.

[3]楼然笛.单片机开发[M].北京:

人民邮电出版社,1994.

[4]付家才.单片机控制工程实践技术[M].北京:

化学工业出版社2004.3.

[5]李光才.单片机课程设计实例指导[M].北京:

北京航空航天大学出版社2004。

[6]刘湘涛.江世明.单片机原理及应用[M].北京:

电子工业出版社2006。

 

程序:

/***************************************************************

*程序功能:

数码管+DS1302的可调时钟(含一个闹钟功能)*

*CPU型号:

AT89C51*

*晶振频率:

12.0000MHz*

*时间:

2013-12—29*

*作者:

唐蜜珠*

*学号:

20110261xx*

*班级:

11电子1班*

*说明:

单片机课程设计*

***************************************************************/

#include

h〉

/*设置项序号宏定义*/

#defineSETTING_NONE0

#defineSETTING_SECOND1

#defineSETTING_MINUTE2

#defineSETTING_HOUR3

#defineSETTING_DAY4

#defineSETTING_MONTH5

#defineSETTING_YEAR6

#defineSETTING_ALARM_SECOND7

#defineSETTING_ALARM_MINUTE8

#defineSETTING_ALARM_HOUR9

/*显示状态宏定义*/

#defineDIS_MODE_TIME1/*显示时间*/

#defineDIS_MODE_DATE2/*显示日期*/

#defineDIS_MODE_ALARM4/*显示闹钟*/

/*闹钟响/停控制宏定义*/

#defineALARM_ON1/*闹钟响*/

#defineALARM_OFF0/*闹钟停*/

#defineALARM_MODE_NONE0

#defineALARM_MODE_ALARM1

#defineALARM_MODE_POINT2

#defineALARM_MODE_DELAY3

/*DS1302时钟芯片引脚定义*/

sbitDS1302_DATA=P1^0;

sbitDS1302_SCLK=P1^1;

sbitDS1302_CE=P1^2;

/*按键引脚定义*/

sbitKeyMenu=P3^5;

sbitKeyAdd=P3^6;

sbitKeyDec=P3^7;

/*闹钟蜂鸣器引脚定义*/

sbitBeep=P1^7;

/*共阴数码管段码表*/

unsignedcharcodecodeSeg7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};

/*时间/日期相关变量*/

unsignedcharcentury=21,year,month,day,hour,minute,second;

/*闹钟变量*/

unsignedcharalarm_hour,alarm_minute,alarm_second;

/*当前设置项序号变量,初始化为SETTING_NONE表示非设置模式*/

unsignedcharsetting_item=SETTING_NONE;

/*显示状态变量,初始化为DIS_MODE_TIME显示时间*/

unsignedchardis_mode=DIS_MODE_TIME;

/*闹钟响标志:

0-闹钟没响1—闹钟响*/

unsignedcharflag_alarm_mode=0;

/*闹钟响延时时间控制变量,16位*/

unsignedintalarm_delay;

unsignedcharpoint_count;

/********************************/

/*函数功能:

约xms毫秒延时*/

/*入口参数:

xms—延时xms毫秒*/

/*出口参数:

无*/

/********************************/

voidDelayMs(unsignedintxms)

unsignedinti,j;

for(i=xms;i〉0;i—-)

for(j=110;j〉0;j—-);

}

/*****************************************************************************************************/

/*函数功能:

定时器延时控制*/

/*入口参数:

mode-闹钟、整点报时、5s回显时间模式控制alarmonoff—闹钟响

(1)不响(0)delay-延时时间(秒)*/

/*出口参数:

无*/

/*****************************************************************************************************/

voidAlarm(unsignedcharmode,unsignedcharalarmonoff,unsignedchardelay)

flag_alarm_mode=mode;/*保存显示模式设置*/

Beep=!

alarmonoff;/*操作蜂鸣器,硬件电路为0响*/

alarm_delay=delay*100;/*alarm_delay为定时器0溢出中断计数,10ms时基,乘以100为1s*/

}

/********************************/

/*函数功能:

DS1302写字节*/

/*入口参数:

byte-写入字节*/

/*出口参数:

无*/

/********************************/

voidDS1302_WriteByte(unsignedcharbyte)

unsignedchari;

for(i=0;i<8;i++)

{

DS1302_SCLK=0;

byte〉>=1;/*BIT0数据移到CY寄存器*/

DS1302_DATA=CY;/*将CY寄存器的值写到DS1302数据引脚*/

DS1302_SCLK=1;/*在时钟上升沿写入*/

}

/********************************/

/*函数功能:

DS1302读字节*/

/*入口参数:

无*/

/*出口参数:

返回读取的字节数据*/

/********************************/

unsignedcharDS1302_ReadByte(void)

{

unsignedchari,byte=0;

DS1302_SCLK=1;

for(i=0;i<8;i++)//读数据

byte〉>=1;

DS1302_SCLK=0;/*时钟下降沿读取*/

if(DS1302_DATA)/*读取引脚状态*/

byte|=0x80;/*保存*/

DS1302_SCLK=1;

}

return(byte);

}

/******************************************/

/*函数功能:

写DS1302*/

/*入口参数:

addr—写目标地址,mdata—待写数据*/

/*出口参数:

无*/

/******************************************/

voidDS1302_WriteData(unsignedcharaddr,unsignedcharmdata)//向DS1302写数据

{

DS1302_CE=0;

DS1302_SCLK=0;

DS1302_CE=1;/*使能DS1302*/

DS1302_WriteByte(addr);/*写入地址*/

DS1302_WriteByte(mdata);/*写入数据*/

DS1302_CE=0;

}

/********************************/

/*函数功能:

读DS1302*/

/*入口参数:

addr—读目标地址*/

/*出口参数:

返回读到的数据*/

/********************************/

unsignedcharDS1302_ReadData(unsignedcharaddr)//向DS1302读数据

{

unsignedcharmdata,mdatah,mdatal;

DS1302_CE=0;

DS1302_SCLK=0;

DS1302_CE=1;

DS1302_WriteByte(addr);/*写入地址*/

mdata=DS1302_ReadByte();/*读出数据*/

DS1302_CE=0;

mdatal=mdata&0x0F;

mdatah=(mdata>>4)&0x0F;

mdata=mdatal+mdatah*10;/*十六进制转化为十进制*/

return(mdata);

/**********************************************/

/*函数功能:

修改DS1302的时间值*/

/*入口参数:

addr—写目标地址,mdata-修改值*/

/*出口参数:

无*/

/**********************************************/

voidDS1302_RWriteData(unsignedcharaddr,unsignedcharmdata)

unsignedcharmdatah,mdatal;

mdatal=mdata%10;

mdatah=mdata/10;

mdata=mdatal+(mdatah〈〈4);/*十进制转化为十六进制*/

DS1302_WriteData(0x8e,0x00);/*关闭写保护*/

DS1302_WriteData(addr,mdata);/*写入修改数据*/

DS1302_WriteData(0x8e,0x80);/*写保护使能*/

}

/********************************/

/*函数功能:

初始化DS1302*/

/*入口参数:

无*/

/*出口参数:

无*/

/********************************/

voidDS1302_Init(void)

unsignedcharmdata;

DS1302_CE=0;

DS1302_SCLK=0;

DS1302_CE=1;

DS1302_WriteByte(0x81);

mdata=DS1302_ReadByte();/*读秒寄存器*/

if(mdata&0x80)/*秒寄存器最高位为时钟关闭位,1—关闭0-开启

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2