单片机实现数字时钟设计与调试

版权申诉
0 下载量 160 浏览量 更新于2024-06-27 收藏 1.23MB DOC 举报
这篇文档是一个关于单片机简易时钟课程设计的详细报告,涵盖了从概论到具体的设计、实现和调试过程。以下是该设计的主要知识点: 1. **单片机系统设计**:单片机系统设计包括硬件电路设计和软件编程两部分。硬件电路主要涉及各个功能模块的构建,而软件编程则是实现系统功能的关键。在本设计中,单片机被用来控制整个时钟系统,处理时间和闹钟等各项任务。 2. **虚拟仿真软件Proteus**:Proteus是一款用于单片机系统虚拟仿真的工具,可以避免实际制作电路板进行硬件测试,简化了开发流程,便于快速调试和验证设计。 3. **数字钟工作原理**:数字钟利用数字电路来显示时间,通常包含分、秒和小时的计时,并使用液晶或LED数码管进行显示。数字钟的精度得益于数字集成电路和石英晶体振荡器,它们能提供稳定的时基,确保高精度计时。 4. **系统功能**:系统具备基本的时间显示功能,同时可能包括闹钟设定、时间调整和复位等功能。此外,数字钟还能扩展到自动化控制场景,如定时开关设备、报警等。 5. **硬件设计**: - **硬件各部分功能**:包括时钟显示模块、按键输入模块、电源模块、时钟信号生成模块等,每个部分都有特定的作用,如显示时间、接收用户输入、产生稳定的时钟脉冲等。 - **电路图解分析**:详细阐述了各个电路模块的原理和操作,帮助理解如何实现各功能。 6. **软件设计**: - **主程序模块**:负责整体控制逻辑,协调各个子程序的运行。 - **数码管动态扫描模块**:用于驱动数码管显示,通过动态扫描技术减少硬件资源的使用。 - **计时模块**:使用单片机内部定时器进行时间计算,确保精确计时。 - **闹钟输入输出模块**:允许用户设置和触发闹钟,同时处理闹钟响铃时的响应。 - **时间调整模块**:允许用户通过按键修改当前时间。 - **复位模块**:提供系统初始化功能,重置时钟到默认状态。 7. **系统调试**: - **输入按键调试**:检查按键是否正常工作,能否正确识别用户输入。 - **复位电路调试**:验证复位功能是否有效,确保系统能正常重启。 - **显示电路调试**:确保数码管显示正确无误,时间更新流畅。 - **系统联调**:整合所有模块,测试整个系统的协同工作能力。 8. **性能分析与心得体会**:文档还包括了调试过程中的体验和对系统性能的评估,以及作者从设计和实现过程中获得的经验和感悟。 9. **参考资料**和**附录**:提供了进一步阅读和参考的文献,以及系统原理图和源代码,供读者深入理解和学习。 这个课程设计全面介绍了基于单片机的数字时钟从构思到实现的全过程,对于学习单片机控制、数字电路设计和系统调试等方面具有很高的参考价值。
2023-02-27 上传
目录 1.概论 1 2.整体设计思路 2 2.1硬件各部分所能完成的功能 3 2.2系统工作原理 4 2.3时钟各功能分析及图解 4 2.4.1电路各功能图解分析 4 2.4.2电路功能使用说明 7 3. 软件设计思路 8 3.1 主程序模块 8 3.2 数码管动态扫描模块 9 3.3 当前时间计时模块 9 3.4 闹钟输入输出模块 10 3.5 当前时间调整模块 12 3.6复位模块 13 4.系统的调试和性能分析 14 4.1系统的调试方法 14 4.1.1输入按键的调试 14 4.1.2复位电路的调试 14 4.1.3显示电路的调试 14 4.1.4整个系统的联调 14 4.2心得体会 15 参考文献 15 附录 16 附录A 系统原理图 16 附录B 程序源代码 17 电气信息学院课程设计评分表 28 1.概论 单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件电路设计和软件编程设 计两个方面, 其调试过程一般分为软件调试、硬件测试、系统调试3个过程。如果采用单片机系统的虚 拟仿真软件——Proteus,则不用制作具体的电路板也能够完成以上工作。数字钟是采用数 字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体 振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产 生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生 活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、 学习、工作带来极大的方便[4]。不仅如此,在现代化的进程中,也离不开电子钟的相关 功能和原理,比如机械手的控制、家务的自动化、定时自动报警、按时自动打铃、时间 程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定 时电气的自动启用等,所有这些,都是以钟表数字化为基础的。而且是控制的核心部分 。因此,研究数字钟及扩大其应用,有着非常现实的意义。 电子钟在工业控制和日常生活中是很重要的,它不仅可以用于计时、提醒又可用于对 机器的控制,在自动化的过程中必然有电子钟的参与,因此电子钟的应用会越来越广泛 。而且向着精确、低功耗、多功能发展。基于单片机设计的数字钟精确度较高, 因为在程序的执行过程中, 任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。从而,使 数字钟的精度仅仅取决于单片机的产生机器周期电路和定时器硬件电路的精确度。另外 ,程序较为简洁,具有可靠性和较好的可读性。如果我们想将它应用于实时控制之中, 只要对上述程序和硬件电路稍加修改,便可以得到实时控制的实用系统,从而应用到实 际工作与生产中去。 数字电子钟的设计方法有多种,例如,可用中小规模集成电路组成电子钟, 也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟还可以利 用单片机来实现电子钟等等。这些方法都各有特点, 其中,利用单片机实现的电子钟具有编程灵活, 便于功能扩充, 精确度高等特点。 2.整体设计思路 这部分主要介绍工作安排和整体设计的思想。工作过程规划如下: 图2.1 整体设计思路 针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦 写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准 MCS- 51指令系统及80C51引脚结构[7]。这样,既能做到经济合理又能实现预期的功能。 在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能 便于添加各项功能。程序可分为显示程序、调时显示运用这种方法,关键在于各模块的 兼容和配合,若各模块不匹配会出现意想不到的错误。 本电子钟设计主要是依照图2.1中的流程做出来的,时间分配比较均匀。首先,在编 程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否 则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据 想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和液晶电路 等。第三部分是软件部分:先学习理解C语言的编程方法再根据设计的硬件电路进行分块 的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图, 包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯 片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第 六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实 现想要的功能。 2.1硬件各部分所能完成的功能 (1)单片机发送的信号通过程序控制最终在数码管上显示出来。 (2)单片机通
2023-02-27 上传
数字电子时钟的制作 一、实现要求: 1、实现时和分的显示,秒钟用发光二极管闪烁指示。 2、实现一分钟倒计时功能,时间到,蜂鸣器自动报警。 3、扩展其他功能:根据自己的兴趣增加其他功能。 最低要求实现1和2的功能,扩展功能自我发挥,扩展功能是加分的关键。 注: 所有同学都必须做出实物,最终一个一个检查,并当场打分。 二、系统框图 三、接线图 用到端口及实物连接 实物链接图 最小系统板上的VCC和GND不够用,添加了插针(如图)。各模块的VCC/GND引脚都连在此 处。 四、程序流程图 Jieshao介绍…………。 五、源程序 /*数字时钟程序*/ /*相关说明 1.功能:功能键S1选择两种不同的功能,功能1,时钟显示,灯一秒钟闪烁一次 功能2,倒计时,倒计时1分钟,数码管显示,到0,蜂鸣器响。 2.接线 数码管接线:A~H接P0.0~P0.7 D1~D4接P1.0~P1.3 VCC接电源正极vcc 按键接线:S1接P3.2//外部中断0 GND接电源GND 灯接线:接P2.1 蜂鸣器接线:IO接P2.2 VCC,GND接电源 */ #include "reg52.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char sbit LED=P2^1;//灯接P21 sbit beep=P2^2;//蜂鸣器接P22,IO位0就响 /*共阳极数码管 段选P0 位选P1*/ uchar duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar wei[]={0x0e,0x0d,0x0b,0x07}; uchar k=0,j=0,i=0;//计数次数 uchar second=0,minute=0,hour=0,count=5; bit flag1=0;//功能选择键 bit flag2=0;// void delay(int x) { int y; for(;x>0;x--) for(y=100;y>0;y--) ; } void Time0_init(void)//50毫秒@12.000MHz { TMOD= 0x01; //设置定时器模式1,16位 TL0 = 0xB0; //设置定时初值(65536-50000)%256 TH0 = 0x3C; //设置定时初值(65536-50000)/256 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; } void time0(void) interrupt 1 {TL0 = 0xB0; TH0 = 0x3C; k++;j++; if(j==10) {j=0;LED=~LED;} //LED灯每0.5秒状态改变一次,即一秒闪烁一次 if(k==20)//计数20次,每次中断50ms,故20*50ms=1s {k=0;second++;} if(flag1==1)//在功能2 {if(flag2==1)//是否倒计时完成 { i++; if(i==20) {count--;i=0;} } } } void int0_init(void)//外部中断初始化 {EX0=1; IT0=1; } void int0(void) interrupt 0 { flag1=~flag1;//功能选择标志位 flag=1,倒计时界面,flag=0,时钟界面 if(flag1==1){count=5;flag2=1;} else count=5; } void Time_dispose(void) { if(second==60) {second=0; minute++; if(minute==60) {minute=0; hour++; if(hour==24) {hour=0; } } } } //显示函数 void display(void) { if(flag1==0) {P1=0xff;//清0 P0=duan[hour/10];//小时的十位 P1=wei[0]; delay(3); P0=duan[hour%10];//小时的个位 P1=wei[1]; delay(3); P0=duan[minute/10];//分的十位 P1=wei[2]; delay(3); P0=duan[minute%10];//分的个位 P1=wei[3]; delay(3); } else {if(flag1==1) {P1=0xff;//清0 P0=duan[count/10];//分的十位 P1=wei[2]; delay(3); P0=duan[count%10];//分的个位 P1=wei[3]