基于单片机的智能电子钟设计与实现

版权申诉
0 下载量 36 浏览量 更新于2024-06-27 1 收藏 273KB DOC 举报
"LED电子钟设计.doc" 这篇文档是关于基于单片机的LED电子钟设计的详细报告。项目设计的背景讲述了数字钟由于其高精度和广泛应用,已经成为现代生活和工业控制中的必需品,尤其在自动化领域发挥着关键作用。设计目的是通过单片机项目设计课程,提升学生对单片机原理的理解和实践能力。 项目系统方案设计部分包括设计任务和要求。设计任务涉及制作智能电子钟,实现精确计时,并具备闰年自动判断、自定义开关屏时间和微调设置等功能。设计要求计时精度达到1秒/月,并使用动态扫描键盘。项目方案设计中,采用了89C52单片机,结合DS1302时钟采集模块和LCD1602液晶显示屏,以实现时间的显示和控制。 在器件连接部分,文档提供了LCD1602和DS1302与开发板的连接图,便于理解硬件布局。原理图和仿真图展示了电路的工作原理和预期效果。实验结果显示了实物的整体实现和时钟调节功能,其中时钟的调整通过软件译码和进制转换完成,并通过按键查询进行操作。 在设计总计中,提到了调试过程中遇到的问题,例如自动开关屏按键导致的屏幕闪烁过快,这可能是因为消抖处理不足导致的。同时,作者分享了设计过程中的心得体会,强调了实践操作和问题解决的重要性。 附录中包含源程序代码,这是实现电子钟功能的关键,通过阅读和分析代码,可以深入了解单片机如何控制硬件以实现时钟功能。整个设计报告详细地记录了从概念到实现的全过程,为学习单片机应用和电子钟设计提供了宝贵的参考资料。
2023-02-27 上传
电子闹钟设计 电子闹钟设计 本设计电子时钟主要功能为: 1. 具有时间显示和手动校对功能,24小时制; 2. 具手动校对功能; 3. 具有闹铃功能; 4. 具有环境温度采集和显示功能; 5. 掉电后无需重新设置(即储存功能); 采用交直流供电电源。交流供电为主,直流电源为后备辅助电源,并能自动切换。 窗体顶端 基于51单片机的电子闹钟 窗体底端 切换视角 切换视角 产品型号: 基于51单片机的电子闹钟 产品规格: 发布日期: 2011-1-2 12:55:58 产品描述: 基于在对单片机研究的基础上,本文提出了一种以AT89C51为核心的单片机构成数字 电子钟的看法。AT89C51芯片是美国ATMEL公司生产的低电压、高性能8位单片机 ,片内含2KB的可反复擦写的只读程序存储器128 bytes的随机存储数据存储器(RAM),器件采用高密度,非易失性存储技术生产 ,兼容标准MCS- 51指令系统,片内置通用中央处理器和flash存储单元。因此,在此基础上进行 了数字电子钟设计的工作,给出数字电子钟的软件和硬件的设计。考虑到存在的 各种干扰对系统的影响,从软件和硬件设计方面进行分析,采用相应的措施以增 强系统的抗干扰能力。 该钟的显示电路采用LED数码管与AT89C51的外部I/O引脚,即采用P0口为输出口,P2 口为位选,P1用来与外部输入按钮相连接,以用来控制数字钟的各个功能。P0口 要直接驱动8位LED是不够的,我们通过两片74LS245对功率进行放大,如果没有 ,LED管将不能正常显示。 §§§ 基于51单片机的电子闹钟设计 §§§ 此电子闹钟用两个四联数码管显示时、分、秒,中间用"- "隔开,有两个功能按键,一个是"加一"功能按键,另一个是"设置"功能按键;刚上电后 数码管显示为"00-00- 00",(一)若不想设置闹铃,然后快速按下"设置"按键,第一个数码管会显示"P",然后变 为"00-00- 00",此时进入时间调整状态,可以用"设置"按键改变位,用"加一"按键改变数字,设置 完后,再一次按下"设置"按键,电子闹钟就开始工作了;(二)若想设置闹铃,应先按下 复位按键,然后长时间按下"设置"按键,第一个数码管会显示由"P"变为"C",然后变为" 00-00- 00",此时进入闹铃设置状态,设置方法跟上面一样,闹铃设置完后,下一步要设置当前 时间,调整方法跳到第一步。这样设置好后,她就能按照主人的意思,定时的把你闹醒 啦! 原理图如下: 目 录 摘 要.............................................................1 引 言.............................................................2 第一章 概述........................................................3 §1.1目的和要求..................................................3  §1.2 按键功能说明...............................................3  §1.3 操作流程说明...............................................4 第二章 电路的硬件设计..............................................5 §2.1 设计框图...................................................5 §2.2 电源电路设计...............................................5 §2.3 数码管显示电路.............................................6 §2.4 复位电路...................................................6 §2.5 按键电路...................................................7 §2.6 晶振和闹铃电路.............................................7 第三章 软件程序的设计..............................................8 §3.1 实时时钟实现的基本方法.....................................8 §3.2 实时时钟程序设计步骤......................
2023-02-27 上传
Dianzishizhongsheji 目 录 一、设计要求 1 二、设计目的 1 三、设计的具体实现 1 1、系统概述 1 2、单元电路设计 2 2.1、8255初始化: 3 2.2、8253初始化: 3 2.3、8259初始化: 4 3、软件程序设计和调试 5 3.1、主程序流程图: 5 3.2、电子时钟中断处理程序流程图: 6 3.3、显示模块流程图: 7 3.4、程序代码: 7 四、结论与展望 14 五、心得体会及建议 14 六、附录 15 七、参考文献 15 电子时钟的设计报告 一、设计要求 利用8259A中断控制器、8253定时/计数器、8255A接口芯片以及键盘和数码显示电路 ,设计一个电子时钟,由8253中断定时,小键盘控制电子时钟的启停及初始值的预置。 电子时钟的显示格式HH:MM:SS由左到右分别为时、分、秒,最大记时59:59:59超过 这个时间时分秒位都清零从00:00:00重新开始。 1. 电子时钟具有二十四小时循环记时功能,走时要准。 2. 显示格式,时:分:秒。 3. 利用8253作为定时器。 二、设计目的 通过本次课程设计学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理 论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通 过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使设计者的 设计水平和对所学知识的应用能力以及分析问题解决问题的能力得到全面提高。 1. 熟练掌握8086/88教学系统的基本操作和调试程序的各种指令。 2. 掌握8259中断控制器的工作原理和应用编程方法,练习编写中断程序的方法。 3. 掌握8255的各种工作方式及其应用编程。 4. 掌握8253定时/计数器的工作原理、工作方式及其应用编程。 5. 熟悉编程及调试程序的方法。 6. 练习LED-KEYBOARD UNIT的使用方法和数码管的显示编程方法。 三、设计的具体实现 1、系统概述 基本工作原理:系统设计的电子时钟主要由显示模块、时钟控制模块和时钟运算模块 三大部分组成。以8086微处理器作CPU,用8253做定时器产生时钟频率提供一个频率为1 0kHz的时钟信号,要求每隔10ms完成一次扫描键盘的工作。在写入控制字与计数初值后, 每到10ms定时器就启动工作,即当计数器减到1时,输出端OUT0输出一个CLK周期的低电 平,向CPU申请中断,当达到100次时,则输出端OUT1输出1s,向CPU申请中断,由8255控制 一个数码管显示,当计数到60s时,则输出端OUT2向CPU申请中断,由另一数码管显示1min, 同理由数码管显示1h.CPU处理,使数码管的显示发生变化。 本设计由8259A中断控制器、8253定时/计数器、8255A接口芯片、LED数码显示管和两 个按键组成。主要用8259A的IRQ7的中断服务程序完成秒、分、时的运算即计时功能,I RQ6的中断服务程序完成调时、调分功能。8253用来产生50ms的脉冲信号作为IRQ7的中断 请求信号。按键KK1+和KK2+分别作为IRQ2和IRQ6的中断请求信号。按键KK1+启动/关闭对 时功能。它决定是否屏蔽IRQ7和IRQ6中断源。8255A负责将内存里的时位和分位值输出到 数码管。 电子时钟的显示格式HH:MM:SS由左到右分别为时、分、秒,每百分之一秒对百分之 一秒寄存器的内容加一,并依次对秒、分、小时寄存器的内容加一,六个数码管动态显 示时、分、秒的当前值。最大记时59:59:59超过这个时间时分秒位都清零从00:00: 00重新开始。 2、单元电路设计 8259A的主要功能: (1)每片8259A可管理8级优先级中断源,通过开关,最多可管理64级优先权的中断 源。 (2)对任何一个级别的中断源都可单独进行屏蔽,使该级中断请求暂时被挂起,直 到取消屏蔽时为止。 (3)能向CPU提供可编程的标识码。 (4)具有多种中断优先权管理方式。有完全嵌套方式、自动循环方式、特殊循环方 式、特殊屏蔽方式和查询方式五种。这些管理方式均可通过程序动态地进行变化。在本 设计中用到了这四种功能,电子时钟的灵活调时功能就是通过对级别的屏蔽或开启来实 现的。 8255A的主要功能: 可编程外设接口芯片可由程序改变其功能,通用性强、使用灵活。通过8255A,CPU可 直接同外设相连接,其负责CPU和外设之间的数据传送。 8253的主要功能: 可编程定时器/计数器,其定时与计数功能可由程序灵活地设定,设定后与CPU并行工 作,不占用CPU的时间。通道2工作在3方式下,提供计算一秒的中断请求信号。 该系统是一个简单的利用8253定时器、8255可并行通信接口和中断控制器8259设计的 电子时钟系统,在该系统中设有一个启动键,启动键未按下时,
2023-02-27 上传
#include<reg51.h> #define uint unsigned int //宏定义,将unsigned int 用uint代替,下同 #define uchar unsigned char sbit S1=P1^0; sbit S2=P1^1; sbit S3=P1^2; sbit S4=P1^3; char second; char minute; char hour; uchar T_time;//计数变量 int a=0; uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9 void delay(uint k) { uint i; for(i=0;i<k;i++); } void keyscan(); void Displaysecond(uchar); void Displayminute(uchar); void Displayhour(uchar); void main() { TMOD=0x01; //定时器/计数器T0的工作方式1 EA=1; //总中断允许 ET0=1; //计时器T0中断允许位 TR0=1; //开始计数 TH0=(65536-46083)/256; TL0=(65536-46083)%256; minute=0; second=0; hour=0; T_time=0; while(1) { keyscan(); Displaysecond(second); delay(100); Displayminute(minute); delay(100); Displayhour(hour); delay(100); } } void Displaysecond(uchar s) { P2=0xbf; //"秒十位"位选端 P0=tab[s/10]; //刚开始显示数字0 delay(100); //延时一段时间 P0=0x00; //消隐 P2=0x7f; //"秒个位"位选端 P0=tab[s%10]; //显示段码 delay(100); //延时一段时间 P0=0x00; //消隐 } void Displayminute(uchar m) { P2=0xf7; //"分十位"位选端 P0=tab[m/10]; //刚开始显示数字0 delay(100); //延时一段时间 P0=0x00; //消隐 P2=0xef; //"分个位"位选端 P0=tab[m%10]; //显示段码 delay(100); //延时一段时间 P0=0x00; //消隐 P2=0xdf; //分隔符位选端 P0=0x40; //显示分隔符 delay(100); //延时一段时间 P0=0x00; //消隐 } void Displayhour(uchar h) { P2=0xfe; //"小时十位位选端" P0=tab[h/10]; //显示段码1 delay(100); P0=0x00; //消隐 P2=0xfd; //小时个位位选端 P0=tab[(h)%10]; //显示段码2 delay(100); P0=0x00;//消隐 P2=0xfb; P0=0x40; delay(100); P0=0x00;//消隐 } void keyscan() { if(S1==0) //S1的功能是秒加1 { delay(100); if(S1==0) { if(a==0) { second++; if(second>=60) { minute++; if(minute>=60) { minute=0; hour++; if(hour>=24) { hour=0; } } second=0; } } if(a==1) { minute++; if(minute>=60) { hour++; if(hour>=24) hour=0; minute=0; } } if(a==2) { hour++; if(hour>=24) hour=0; } while(!S1) { Displaysecond(second); delay(100); Displayminute(minute); delay(100); Displayhour(hour); delay(100); } } } if(S2==0) //S2的功能是秒减1 { delay(100); if(S2==0) { if(a==0) { second--; if(second<=-1) { minute--; if(minute<=-1) { hour--; if(hour<=-1) hour=23; minute=59; } second=59; } }