基于单片机的数字钟设计82465.doc
学生毕业设计(毕业论文)系别:专业:班 级:学 生 姓 名:傅浩学 生 学 号:设计(论文)题目: 基于单片机的数字钟设计 指 导 教 师:设 计 地 点:起 迄 日 期:毕业设计(论文)任务书专业电子信息工程班级 电子085傅浩一、课题名称: 基于单片机的数字钟设计 二、主要技术指标:1具有时间显示和手动校对功能。224小时制;具有闹铃功能。3可逆调整时分。4走时月误差 < ±5S.三、工作容和要求: 主要有数字钟的发展与其应用,单片机的设计方案,数字钟硬件设计(IC芯片的选择,电子时钟硬件电路)数字钟软件设计(主程序设计,软件实现与流程),系统调试(硬件调试,软件调试) 四、主要参考文献: 1、 康华光电子技术基础数字部分 【M】 : 高等教育 2000 2、 顾永杰 电工电子技术实训教程 【M】 XX:XX交通大学 1999 3、 可数字钟电路与应用【M】 :电子工业1996 4、 光飞 楼然庙 胡佳文等编著【M】单片机课程设计-实例指导 :航天航空大学 5、 建领 51系列单片机开发实例【M】中国电力2010 学 生(签名) 年 月 日 指 导 教师(签名) 年 月 日 教研室主任(签名) 年 月 日系 主 任(签名) 年 月 日毕业设计(论文)开题报告设计(论文)题目基 于 单 片 机 的 数 字 钟 设 计一、 选题的背景和意义:毕业设计是一次难得的对所学知识进行实践的机会,我希望通过毕业设计独立设计一个简单的单片机数字钟从而达到强化课本知识并灵活运用的目的.数字钟是日常生活中随处可见的简单系统,是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。数字钟的设计方法有许多种,例如,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路与其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。现在单片机的应用正在不断地走向深入,而近年来随着科技的飞速发展,它带动了日新月益更新的传统控制检测。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以与针对具体应用对象特点的软件结合,以作完善。 由于本人对数字钟的原理有浓厚的兴趣加之于单片机的广泛应用。且通过单片机实现的数字钟的编程具有灵活性,更能有助于功能扩展。故本人选取基于单片机的数字钟设计。二、 课题研究的主要容:a) 数字钟设计分析: 数字钟的发展, 数字钟的应用 单片机设计方案b) 数字钟的硬件设计: 主要IC芯片选择,电子时钟硬件电路。c) 数字钟的软件设计: 主程序设计, 软件实现与流程d) 系统调试: 硬件调试 软件调试三、 主要研究(设计)方法论述:这次的数字钟设计,主要是针对单片机与数字钟的发展与影响在现在社会生活和学习中产生了越来越重要的影响,因此我以单片机数字钟作为研究对象,而且,由单片机控制的智能化数字时钟,集成度高、体积小、有很高的可靠性。功能强大,界面友好,更好的满足了人们对它的智能化要求。首先通过上网查阅相关的资料,大体上得到关于单片机与数字钟的信息,自己经过整合,确定下我的研究(设计)方向,再到图书馆借阅图书,整理出单片机数字钟的笔记,在设计过程中看单片机和数字钟课程设计时的笔记和相关试验指导手册四、设计(论文)进度安排:时 间工 作 容2010.5.102010.5.15先选好自己感兴趣的题目交由老师审核同时在网上搜索资料,寻找相关论文与设计的基本原理和相关知识进行作为参考2010.5.152010.5.23将搜索好的资料进行整理,然后按照自己的结构和思路,并将初稿大致定好2010.5.232010.5.27将初稿完成并上交老师评阅审核 2010.5.272010.7.3等待老师修正建议并对初稿进行具体修改、充实、完善五、指导教师意见: 指导教师签名: 2010 年 5 月 10 日六、系部意见: 系主任签名: 2010年 5 月11 日30 / 36目录摘要Abstract第1章 前言31.1数字钟设计研究的背景和意义31.2数字钟的设计的功能3第2章 有关数字钟设计分析42.1数字钟的发展42.2数字钟的应用42.3单片机设计方案5第3章 数字钟的硬件设计63.1主要IC芯片选择63.2电子时钟硬件电路7第4章 数字钟的软件设计114.1主程序设计114.1.1C语言程序124.1.2原理图354.2软件实现与流程354.2.1定时和串口程序354.2.2键盘响应程序36第5章 系统调试385.1硬件调试385.2软件调试40第6章 结束语41答谢辞附录参考文献摘 要以8051为主芯片制作多功能数字钟的方案中,时钟信号主要由8051单片机的定时器/计数器来提供,对时间进行设置和进行闹铃设置主要用到单片机的外部中断。外部控制电路与显示电路都用到了他的I/O口,用单片机做一个数字钟是单片机应用中的一个典型例子.本设计充分利用8051单片机的4个I/O口,外加两片74LS07作数码管驱动电路,12位数码管的片选信号由74LS138译码器提供,采用动态显示。为增加驱动能力,又在数码管的阴极端加9013驱动管。我们设计出的电子钟采用24小时制计时,其中添加了整点报时和闹铃提示功能。关键词: 动态显示; 译码器 AbstractIt is a typical example to make a digital clock with the MCU. This design makes a good use of the I/O redirections,And we use two pieces of 74ls07 as the drivers for the LED, two pieces of 74ls138 as the encoders. We desplay the time in dynamic mathod. For the purpose of improving the ability of driving ,we add the 9013 as the driver for the LED.The work we design use 24 hour format, we add a alarm, so the clock can remind us at the time we set ahead. Moreover for the sake of demand, we still add the stop-watch function.Keywords: drive dynamic display ; encoder第1章 前言1.1 数字钟设计研究的背景和意义时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以与当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。这是有个简单的逻辑电路设计,它是由中小型集成电路构成数字钟的设计。数字钟是采用数字电路实现对时分秒数字显示的计时装置。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,稳定度远远超过了我们以前所用的老式机械表。在数字显示方面目前已有集成的计数,译码电路,它可以直接驱动数码显示器。由于这些电路装置十分简单,个体小巧,安装使用也十分方便。所以它是我们这些初学者的首选之材。1.2 数字钟的设计的功能电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟品类繁多,外形小巧别致。也有体型较大的,诸如公共场所的大型电子报时器等。电子时钟首先是数字化了的时间显示或报时器,在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历,USB扩展口功能等。本设计电子时钟主要功能为:1. 具有时间显示和手动校对功能,24小时制;2. 具有年、月、日显示和校对功能;3. 具有闹铃功能;第2章 有关数字钟设计分析2.1数字钟的发展根据2010-2012年中国数字钟行业市场运行与投资前景研究报告2010-2012年中国数字钟行业市场运行与投资前景研究报告在大量周密的市场调研基础上,主要依据了国家统计局、国家商务部、国家发改委、国务院发展研究中心、中国海关总署、数字钟行业相关协会、国外相关刊物的基础信息以与数字钟行业专业研究单位等公布和提供的大量资料,结合深入的市场调查资料,立足于当前金融危机对全球与中国宏观经济、政策、主要行业的影响,重点探讨了数字钟行业的的整体与其相关子行业的运行情况,并对未来数字钟行业的发展环境与发展趋势进行探讨和研判,最后在前面大量分析、预测的基础上,研究了数字钟行业今后的应对策略,给予了合理的授信风险建议,为数字钟企业在当前环境下,激烈的市场竞争中洞察先机,根据行业环境与时调整经营策略,为战略投资者选择恰当的投资时机和公司领导层做战略规划提供了准确的市场情报信息与科学的决策依据,同时对银行信贷部门也具有极大的参考价值。2.2数字钟的应用现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。从古至今,时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。尤其在医院,每次护士都会给病人作皮试,测试病人是否对药物过敏。注射后,一般等待5分钟,一旦超时,所作的皮试试验就会无效。手表当然是一个好的选择,但是,随着接受皮试的人数增加,到底是哪个人的皮试到时间却难以判断。所以,要制作一个定时系统。随时提醒这些容易忘记时间的人。 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟与扩大其应用,有着非常现实的意义。2.3 单片机设计方案单片机是微型机的一个主要分支,它在结构上的最大特点使把CPU、存储器、定时器和多种输入/输出接口电路集成在一块超大规模集成电路芯片上。就其组成和功能而言,一块单片机芯片就是一台计算机。单片机具有如下特点:有优异的性能价格比;1 集成度高、体积小、有很高的可靠性;2 控制功能强;3 低功耗、低电压,便于生产便携式产品;4 外部总线增加了I2C、SPI等串行总线方式,进一步缩小了体积,简化了结构;5 单片机的系统扩展、系统配置较典型、规,容易构成各种规模的应用统。所以单片机的应用非常广泛,在智能仪表、机电一体化、实时控制、分布式多机系统以与人们的生活中均有用武之地。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思路和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种用软件代替硬件的控制技术,是对生产控制技术的一次革命。利用单片机的智能性,可方便地实现具有智能的电子钟设计。单片机均具有时钟振荡系统,利用系统时钟借助微处理器的定时器/计数器可实现电子钟功能。然而系统时钟误差较大,电子钟的积累误差也可能较大,所以可以通过误差修正软件加以修正,或者在设计中加入高精度时钟日历芯片,以精确时间。另外很多功能不同的单片机是兼容的,这就更便于实现产品的多功能性。第3章 数字钟的硬件设计3.1 主要IC芯片选择目前在单片机系统中,8XC5X系列单片机均采用标准MCS-51核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。例如比较常用的AT89C2051单片机,带有2KB Flash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。拥有15条可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出。仅仅是为了完成时钟设计或者是环境温度采集设计,应用AT89C2051单片机完全可以实现。但是将两种功能结合在一片单片机上,就需要更多的I/O引脚,故本设计采用具有32根I/O引脚的AT89C51单片机。AT89C51单片机是一款低功耗,低电压,高性能CMOS 8位单片机,片含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-51兼容。片的FLASH存储器允许在系统可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C51是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。AT89C51具有以下主要性能:1. 4KB可改编程序Flash存储器;2. 全静态工作:024Hz;3. 128×8字节部RAM;4. 32个外部双向输入/输出(I/O)口;5. 6个中断优先级; 2个16位可编程定时计数器;6. 可编程串行通道;7. 片时钟振荡器。此外,AT89C51是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式空闲方式(Idle Mode)和掉电方式(Power Down Mode)。在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。在掉电方式中,片振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片RAM中的容,直到下一次硬件复位为止8。图3-1 AT89C51芯片PDIP封装引脚图AT89C51为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。3.2 电子时钟硬件电路如图3-2所示,AT89C51单片机P1.7直接接DS1302的RST端,上电后,AT89C51的P1.7脚自动输出高电平。P1.5作为串行时钟接口,P1.6作为时钟数据的I/O。DS1302采用双电源供电,平时由+5V电源供电,当+5V掉电之后,由图中BT1(+3V备用电池)供电。特别需要注意X1和X2两端连接的晶振Y1,该晶振频率为32.768KHz。图3-2 时钟电路显示电路就时钟而言,通常可采用LCD显示或LED显示。对于一般的段式LCD,需要专门的驱动电路,而且LCD显示的可视性较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般采用并行接口,对微处理器的接口要求较高,占用资源多。另外,AT89C51本身没有专门的液晶驱动接口。市场上也有专门的时钟显示组合LED。故本设计中应用7位8段共阴LED实现显示部分。LED显示分动态显示和静态显示:动态显示方式的硬件电路简单。但设计上如果处理不当,易造成亮度低,闪烁问题。因此合理的设计既应保证驱动电路易实现,又要保证图像稳定,无闪烁。动态显示采用多路复用技术的动态扫描显示方式,复用的程度不是无限增加的, 因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的暂留效应和发光二极管发光时间的长短,发光的亮度等因素。静态显示,是由微型计算机一次输出显示模型后,就能保持该显示结果,直到下次发送新的显示模型为止。静态显示驱动程序简单,且CPU占用率低,但每个LED数码管需要一个锁存器来锁存每一个显示位的笔段代码,硬件开销大,仅适合显示位数较少的场合。为了在显示部分节省单片机I/O口,故采用动态扫描方式。74LS164是8位移位寄存器,应用该芯片驱动LED做显示部分,其优点在于连线简单,节省单片机I/O口,软件编程容易。按键电路设计根据功能需要,本时钟需要设置以下功能键:校对选择键,加1操作键,减1操作键,显示日期键,显示温度键,闹铃开关键。按照键盘与CPU的连接方式可分为独立式键盘和矩阵式键盘。独立式键盘是各个按键相互独立,每个按键占用一个I/O口线,每根I/O口线上的按键不会影响其他I/O口上按键工作状态。独立式键盘电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口,在按键数量较多时,I/O口线浪费较大,且电路结构复杂。矩阵式键盘适合按键较多时使用。由于本设计的电子钟最多需要7个按键,若采用矩阵式键盘时会有按键浪费,故采用的是独立式键盘,电路如3-3所示。图3-3 键盘电路其中K1、K2、K7为带自锁按键,每次按下后,其对应的P2.7、P2.6、P2.1管脚接地,从高电平被拉至低电平。只有再次按下,按键弹出,与之连接的单片机管脚才会重新被拉回高电平。K3、K4、K5、K6键为自动复位按键。每次按下后,会自动弹出。单片机管脚只有在按键按下时为低电平,按键弹出后重新恢复高电平。闹铃电路设计闹铃音乐可以直接采用蜂鸣器闹铃,如当前时刻与闹铃时间相同,单片机向蜂鸣器送出高电平,蜂鸣器发声。采用蜂鸣器闹铃结构简单,控制方便,不足的是音乐简单、单一。闹铃的音乐不是本设计中的重点,故采用最简单的方法,占用单片机一根I/O口P2.0, 中间用PNP型三极管S9012连接P2.0和蜂鸣器。当P2.0引脚为低电平时,S9012的发射极和集电极导通,使蜂鸣器发声。当响铃标志位为“1”时,P2.0送一定频率脉冲,使蜂鸣器U11发出声音。如图3-4。图3-4 闹铃电路第4章 数字钟的软件设计4.1主程序设计单片机依次开始调用键盘扫描子程序、DS1302子程序、闹铃子程序,经过延时,返回程序开头循环运行。系统设计中用到 89 C51单片机的部分功能:包括部定时器,键盘扩展,程序中断, 串口通信等。用一个四联体的共阴极八段显示器,可通过一个输入输出口作为显示器数据发送端;另一个输入输出口的四位作为显示器各位的片选信号,另四位作为键盘扩展口使用。采用一个频率为32.768k Hz 的晶振构成时钟电路。结构图如图4-1所示:图4-1 系统原理图系统的功能完全符合设计任务的要求,经过大量的测试数据显示, 系统的可靠性已经完全达到了实际电子钟的设计要求。同时系统具有很强的扩展性:添加 A/D 转换器可更改成数值仪表,而添加 D/ 转换器则可以设计成波形发生器,同时扩充串口的功能可以道到很好的计算机控制系统。系统扩展图如图4-2所示:图4-2 系统功能扩展原理图4.1.1 C语言程序:#include "reg51.h" /头文件;#include "typedef.h"#include "key.h"#include "alarm_clock.h"#include "ds1302.h"sbit DAT=P10; /74LS164的A、B脚接单片机P1.0;sbit CLK=P11; /74LS164的CLOCK脚接单片机P1.1;sbit Calendar=P27; /定义日历显示按键K7接单片机P2.7;sbit WDZ=P26; /定义温度显示按键K6接单片机P2.6;sbit FUN=P25; /定义功能选择键K5接单片机P2.5;sbit UP=P24; /定义加1键K4接单片机P2.4;sbit DOWN=P23; /定义减1键K3接单片机P2.3;sbit Ente_Snooze=P22; /定义确认键K2接单片机P2.2;sbit Alarm=P21; /定义闹铃开关键K1接单片机P2.1;sbit beeper=P20; /定义闹铃接口P2.0;#define uint unsigned int#define uchar unsigned char#define true 1 /定义true=1;#define false 0 /定义false=0;#define FUNCTION 0xDF /定义FUN键值为DFH;#define UP 0xEF /定义UP键值为EFH;#define DOWN 0xF7 /定义DOWN键值为F7H;#define ALARM 0xFB /定义ALARM键值为FBH;#define Ente_Snooze 0xFB /定义E/S键值为BFH;void key_task(void);void process(uchar current_key);extern bit flash_flag; /定义全局变量(标志位);extern uchar function_count;extern bit alarm_flag;extern bit key_enable;void dis(); void sendbyte();voidreset_3w();voidwbyte_3w(uchar);ucharrbyte_3w();voidwrite_byte(uchar Clock_Add,uchar Clock_Data);uchar read_byte(uchar);void write_clock_burst();voidds1302_init();void ds1302_task();void lcd_disp_time1();void dis_WD();voidds18b20();void alarm_clock(void);void delay(unsigned int time) /10ms延时unsigned char a,b,c; for(a=0;a<time;a+) for(b=0;b<10;b+) for(c=0;c<120;c+);void main() /主程序;ds1302_init(); /初始化DS1302;beeper=1; /初始化闹铃管脚;while(1) /循环;key_task(); /扫描键盘子程序; ds1302_task(); /DS1302子程序;ds18b20(); /DS18B20子程序;alarm_clock(); /闹铃子程序;disp_time(); /时间显示子程序;delay(55); /延时;beeper=1; /闹铃管脚置1; 程序A.2子程序/主要是用于对时间的设定与调整#include "reg51.h"#include "typedef.h"#include "key.h"#include "ds1302.h"uint wait_time;bit key_enable;bit flash_flag;bit alarm_flag;uchar flash_count;uchar function_count=0;uchar key;uchar key_push;uchar key_l;void key_scan() /扫描键盘; uchar l,a,PUSH; PUSH=P2&0xFF; if( PUSH!=0xFF) for(l=500;l>0;l-) /延时; for(a=50;a >0;a-) ; if( PUSH!=0xFF) key_push=P2&0xFF; key=key_push; /key等于键值; void process(uchar current_key) /按键功能子程序;switch (current_key)case FUNCTION: /功能选择键;key_enable=true;function_count=function_count+1;if(function_count>=9)function_count=1; break; case UP: /加1操作键; if(function_count=1) /function_count=1,则秒加1操作; sec+; if(sec>=60) /秒加到60,则被置0; sec=0; write_byte(WRITE_SEC_ADD,hex2bcdsec); /写入秒寄存器; if(function_count=2) /function_count=2,则分加1操作; min+; if(min>=60) /分加到60,则被置0; min=0; write_byte(WRITE_MIN_ADD,hex2bcdmin); /写入分寄存器; else if(function_count=3) /function_count=3,则小时加1操作; hour+; if(hour>=24) /小时加到24,则被置0; hour=0; write_byte(WRITE_HOUR_ADD,hex2bcdhour);/写入小时寄存器; else if(function_count=4) /function_count=4,则闹铃分钟加1操作; clk_min+; if(clk_min>=60) /分钟加满60自动置0; clk_min=0; else if(function_count=5) /function_count=5,则闹铃小时加1操作; clk_hour+; if(clk_hour>=24) /小时加满24自动置0; clk_hour=0; else if(function_count=6) /function_count=6,则年加1操作; year+;if(year>99) year=0; write_byte(WRITE_YEAR_ADD,hex2bcdyear); else if(function_count=7) /function_count=7,则月加1操作; month+; if(month>=13) month=1; write_byte(WRITE_MONTH_ADD,hex2bcdmonth); else if(function_count=8) /function_count=8,则日加1操作; date+;if(date>=31)date=0; write_byte(WRITE_DATE_ADD,hex2bcddate);break;case DOWN: /键盘减1操作功能 if(function_count=1) if(sec=0) sec=60;-sec; write_byte(WRITE_SEC_ADD,hex2bcdsec); if(function_count=2) if(min=0) min=60; -min; write_byte(WRITE_MIN_ADD,hex2bcdmin); else if(function_count=3) if(hour=0) hour=24; -hour; write_byte(WRITE_HOUR_ADD,hex2bcdhour); else if(function_count=4) if(clk_min=0) clk_min=60; -clk_min; else if(function_count=5) if(clk_hour=0) clk_hour=24; -clk_hour; else if(function_count=6) if(year=0) year=100; -year; write_byte(WRITE_YEAR_ADD,hex2bcdyear); else if(function_count=7) if(month=1) month=13;-month; write_byte(WRITE_MONTH_ADD,hex2bcdmonth); else if(function_count=8) if(date=0) date=31;-date; write_byte(WRITE_DATE_ADD,hex2bcddate); break; case ALARM: alarm_flag=(alarm_flag); break;case Ente_Snooze Time= true; /确认键;if(alarm_