电子时钟设计实验报告

合集下载

数字电子时钟实习报告

数字电子时钟实习报告

一、实习目的本次实习旨在通过设计和制作数字电子时钟,加深对数字电路基本原理、电子元器件性能及电路设计方法的理解。

通过实际操作,掌握数字电子钟的设计、制作、调试和故障排除等技能,提高动手能力和创新意识。

二、实习内容1. 数字电子钟电路设计(1)电路组成:数字电子钟主要由振荡器、分频器、计数器、译码显示、报时电路和校时电路等部分组成。

(2)电路设计:采用555定时器构成振荡器产生1Hz的脉冲信号,通过分频器得到1Hz的秒脉冲信号。

计数器采用异步十进制计数器74LS90,实现秒、分、时的计数。

译码显示采用共阳极LED数码管,显示当前时间。

报时电路由门电路和蜂鸣器构成,实现整点报时功能。

校时电路由按键和计数器构成,实现手动校时功能。

2. 元器件选型(1)振荡器:选用555定时器,其频率稳定,易于调整。

(2)分频器:选用CD4060,具有分频功能,可方便地实现秒、分、时的计数。

(3)计数器:选用74LS90,具有异步计数功能,可方便地实现秒、分、时的计数。

(4)译码显示:选用共阳极LED数码管,显示清晰,功耗低。

(5)报时电路:选用门电路和蜂鸣器,实现整点报时功能。

(6)校时电路:选用按键和计数器,实现手动校时功能。

3. 电路制作与调试(1)电路制作:根据电路原理图,焊接电路板,连接元器件。

(2)电路调试:首先检查电路连接是否正确,然后逐个模块进行调试。

调试过程中,注意观察数码管显示是否正常,报时是否准确,校时是否方便。

三、实习过程1. 设计电路原理图:根据数字电子钟的功能和性能要求,设计电路原理图。

2. 选择元器件:根据电路原理图,选择合适的元器件。

3. 制作电路板:根据电路原理图,制作电路板。

4. 焊接元器件:将元器件焊接在电路板上。

5. 电路调试:逐个模块进行调试,确保电路功能正常。

6. 故障排除:在调试过程中,若出现故障,分析原因,进行修复。

四、实习结果1. 成功设计并制作了数字电子钟,实现了秒、分、时的计数,整点报时和手动校时等功能。

多功能电子时钟数字系统课程设计设计实验报告

多功能电子时钟数字系统课程设计设计实验报告

多功能电子时钟数字系统课程设计设计实验报告数字系统课程设计设计实验报告———多功能电子时钟目录一、电子时钟的功能及工作介绍 01、本设计电子时钟具有的功能 02、本设计电子时钟工作介绍 0二、设计思路 0三、各模块具体介绍 (1)计数器模块: (1)控制模块: (3)四、仿真 (6)五、实验成果 (6)六、实验总结和感想 (6)1、实验错误排查和解决 (6)2、实验感想 (7)七、各模块代码 (8)1、计数器模块 (8)2、控制模块 (20)一、电子时钟的功能及工作介绍1、本设计电子时钟具有的功能1)具有显示时、分、秒的功能,能准确显示时间2)能够手动设置时间3)具有闹钟功能,可以设置闹钟的时间,然后再实际时间与设定时间相等是闹钟响,并有闹钟开关,可控制其是否响4)具有秒表功能,可以累计计时2、本设计电子时钟工作介绍此电子时钟开机后即会显示时间,其中后两位数码管显示秒,前两位数码管显示分,还可以通过拨盘开关S1来使得前两位数码管显示小时。

(开机后,按下按键1一次,会继续显示时间。

)此后,每按下按键1一次,会显示设置小时界面,按下按键1两次会显示设置分钟界面,按下按键1三次会显示闹钟设置小时界面,按下按键1四次会显示闹钟设置分钟界面,按下按键1五次会显示秒表界面。

而在每一个界面,按下按键2相应的位会开始跳动,在按下按键2时,跳动停止,此时按下按键3,即确认键,则会返回时间显示状态。

二、设计思路设计一个电子时钟,必然要用到计时器,而需要设置时间和闹钟,又需要控制器来控制系统所处的状态。

我们采用外部一个按键来切换系统的状态,用另一个按键来调整时间和启动秒表,再有一个按键来确认操作,并返回显示状态,继续等待命令。

在控制器中,需要接受外部信号,并给出信号给计时器,使其做出相应的动作。

电子时钟设计实验报告

电子时钟设计实验报告

单片机电子时钟设计报告一、设计任务本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。

电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。

二、系统硬件设备及芯片简介数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。

字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。

本系统设计采用字符型液品显示模块LCD1602 作为显示器件,这样不仅简化了系统的硬件设计,而且极大地提高了系统的可靠性。

1 LCD1602简介字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。

LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

2 LCD1602功能介绍2.1 引脚功能LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚功能见表1。

表1 引脚功能2.2 LCD1602读写指令LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:①写指令38H:显示模式设置;②写指令08H:显示关闭;③写指令01H:显示清屏;④写指令06H:显示光标移动设置;⑤写指令0CH:显示开及光标设置。

2.3 LCD1602 读写操作时序LCD1602 读写操作时序总体上来说是比较简单的,掌握其有两种方法:一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。

很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。

(1)读状态:输入:RS=L,RW=H,E=H。

输出:D0-D7=状态字。

(2)写指令:输入:RS=L,RW=L,D0-D7=指令码,E=上升沿。

简易电子时钟设计报告

简易电子时钟设计报告

简易电子时钟设计报告1. 引言电子时钟是一种用数字形式显示时间的时钟,广泛应用于日常生活中。

本文将介绍一种简易的电子时钟设计方案,包括硬件设计和软件实现。

该电子时钟采用数字LED显示屏,并通过开发板上的微控制器控制时间的显示。

2. 硬件设计2.1 硬件组成该电子时钟的主要硬件组成包括:- 数字LED显示屏:用于显示时钟的小时和分钟数。

该显示屏采用共阳极的数码管,每个数字有7个段可以点亮。

- 微控制器:使用STM32F103C8T6微控制器,具备足够的输入输出和处理能力。

- 调节按钮:用于调节时钟的小时和分钟数。

2.2 电路设计数字LED显示屏的每个段通过一个继电器和一个可控硅管来控制。

继电器通过微控制器的输出口来控制,可控硅管则通过脉宽调制(PWM)来控制。

微控制器通过GPIO口读取调节按钮的状态,根据按钮的操作来调整时钟的小时和分钟数。

同时,微控制器通过定时器中断来实现时钟的运行和显示。

电路设计如下图所示:![电子时钟电路设计图](clock_circuit_design.png)3. 软件实现3.1 开发环境本设计使用Keil MDK开发环境进行软件的编写和调试。

Keil MDK 是一款常用的嵌入式开发工具,提供了强大的代码编辑、编译和仿真功能。

3.2 时钟控制软件中定义了一个结构体`Time`,包含了小时数和分钟数的变量。

通过定时器中断,每隔一秒钟将时钟的秒数加一,并根据秒数的变化更新时钟的小时和分钟数。

具体实现如下:cstruct Time {int hour;int minute;int second;void TIM2_IRQHandler(void) {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); time.second++;if (time.second >= 60) {time.second = 0;time.minute++;}if (time.minute >= 60) {time.minute = 0;time.hour++;}if (time.hour >= 24) {time.hour = 0;}}3.3 数字显示根据时钟的小时和分钟数,将数字转换成BCD码,然后通过GPIO 口控制数字LED显示屏的每个段点亮或熄灭。

数字电子钟实习报告_2

数字电子钟实习报告_2

实习报告《数字电子时钟设计》班级:学号:姓名:一、设计指标① 数字电子钟一一昼夜24小时为一个计数周期。

② 具有“时”“分”“秒”计时显示。

二、设计原理● 555定时器组成的多谐振荡器电路:其输出频率为 :f=1/T=1/(T1+T2)=1.44/(R1+R2)C 其中:T1=0.7R2C,T2=0.7R2C占空比:q=T1/T2+T2=(R1+R2)/(R1+2R2),当R2>>R1时,占空比近似50%。

● 分频电路由于振荡器产生的频率很高,要得到秒脉冲,需要分频电路,经过三次10分频和一次2分频可得到1Hz 的秒脉冲。

本次设计采用CC4518进行分频。

电路:A1555_VIRTUALGNDDIS OUTRST VCC THR CONTRI U12A4518BP_5V 1A 31B 41C 51D6EN12MR17CP11U13A4518BP_5V1A 31B 41C 51D6EN12MR17CP11U1A4518BP_5V 1A 31B 41C 51D6EN12MR17CP11U5A4518BP_5V 1A 31B 41C 51D6EN12MR17CP11GNDGNDGNDGND计数、译码、显示电路:获得秒脉冲信号后,可根据60秒为一分钟,60分钟为一小时,24小时为一天为一个计数周期的计数规律,分别确定秒、分、时的计数器。

由于秒和分的显示均为60进制,因此它们可以由二级十进制计数器组成,其中秒和分的个位为十进制的计数器,十进制为六进制的计数器,采用异步置零发来实现。

时计数器应为24进制计数器,采用两片4518集成电路来实现,采用异步置零法,当计数器输出的第24个进位信号时,计数器复位,完成一个计数周期。

计数单元由三片4518和两片74LS00与非门组成。

分和秒为60进制,其设计理为:当十位为6时,向前一位产生进位信号,进位信号同时使十位置零,进位信号为2、3管脚通过一个与门。

电子工艺实训报告电子钟

电子工艺实训报告电子钟

一、实习目的本次电子钟实训的目的是通过实际操作,使学生熟悉电子钟的基本原理和制作方法,掌握电子元器件的识别和选用,提高动手能力和实际操作技能,培养学生的创新意识和团队合作精神。

二、实习时间2022年X月X日~2022年X月X日三、实习地点XX职业学院电子实验室四、实习内容1. 电子钟原理及电路分析电子钟是一种利用电子元件实现的计时工具,其基本原理是通过振荡器产生稳定的脉冲信号,通过分频器将脉冲信号进行分频,最终得到1秒的脉冲信号,驱动计时机构实现计时。

2. 电子元器件的识别和选用(1)振荡器:选用555定时器作为振荡器,其内部结构简单,稳定性好,易于调试。

(2)分频器:选用CD4060十进制计数器作为分频器,其内部结构复杂,可分频10次,满足电子钟的计时需求。

(3)计时机构:选用LED数码管显示计时,LED数码管具有低功耗、高亮度、可视角度大等优点。

(4)电源:选用9V电池作为电源,方便携带和使用。

3. 电路板设计与制作(1)设计电路图:根据电子钟的原理,绘制电路图,包括振荡器、分频器、计时机构和电源等部分。

(2)制作电路板:按照电路图,在电路板上焊接各个元器件,注意焊接顺序和焊接质量。

4. 电子钟的调试与测试(1)调试振荡器:调整555定时器的R1、R2电阻,使振荡器产生稳定的脉冲信号。

(2)调试分频器:调整CD4060计数器的时钟输入端,使分频器输出1秒的脉冲信号。

(3)调试计时机构:调整LED数码管显示的时、分、秒,使电子钟准确计时。

(4)测试电子钟:观察电子钟的计时准确性,检查是否存在故障。

五、实习总结1. 通过本次电子钟实训,使学生掌握了电子钟的基本原理和制作方法,熟悉了电子元器件的识别和选用。

2. 提高了学生的动手能力和实际操作技能,培养了学生的创新意识和团队合作精神。

3. 使学生对电子技术有了更深入的了解,为今后从事电子技术相关领域的工作奠定了基础。

4. 在实习过程中,学生之间相互交流、共同探讨,提高了团队协作能力。

数字钟电子实习报告

数字钟电子实习报告

实习报告实习时间:2023年7月1日至2023年7月31日实习单位:XX科技有限公司实习内容:数字钟的设计与制作一、实习目的通过本次实习,我希望能够掌握数字钟的设计原理,了解数字钟的制作流程,提高自己的实际操作能力,培养自己的创新意识和团队协作能力。

二、实习要求1. 熟悉数字钟的设计原理和制作流程。

2. 能够独立完成数字钟的设计和制作。

3. 了解常用电子元器件的性能和使用方法。

4. 具备一定的电路调试和故障排除能力。

三、实习过程1. 设计阶段:在实习的第一周,我们学习了数字钟的设计原理,包括时钟芯片的使用、显示模块的连接、电路图的设计等。

在导师的指导下,我们独立完成了数字钟的设计方案,并进行了讨论和修改。

2. 制作阶段:在实习的第二周,我们开始着手制作数字钟。

我们按照设计方案,选择了合适的电子元器件,进行了电路连接和焊接。

在制作过程中,我们遇到了一些问题,如电路连接错误、元器件损坏等,但在导师的帮助下,我们逐一解决了这些问题。

3. 调试阶段:在实习的第三周,我们开始对制作的数字钟进行调试。

我们使用了调试工具,如万用表、示波器等,对电路进行了检测和调整。

通过不断的调试,我们成功地使数字钟运行起来,并进行了功能测试。

4. 总结与改进:在实习的最后一周,我们对制作的数字钟进行了总结和评估。

我们发现了一些不足之处,如显示模块的亮度不够、时钟精度不够高等。

我们讨论了改进的方法,并提出了一些改进方案,如使用更亮的显示模块、调整时钟频率等。

四、实习收获通过本次实习,我掌握了数字钟的设计原理和制作流程,提高了自己的实际操作能力。

我学会了如何选择合适的电子元器件,进行电路连接和焊接,掌握了调试工具的使用方法,能够对电路进行检测和调整。

在制作过程中,我学会了如何解决问题和团队合作,培养了自己的创新意识和团队协作能力。

五、实习体会通过本次实习,我深刻体会到了理论与实践相结合的重要性。

只有在实际操作中,我们才能真正理解和掌握所学知识。

单片机电子时钟课程设计报告

单片机电子时钟课程设计报告

单片机电子时钟课程设计报告一、设计目的。

本课程设计旨在通过单片机技术的应用,设计并制作一个简单的电子时钟。

通过这一设计,学生将能够掌握单片机的基本原理和应用,培养学生的动手能力和创新意识,提高学生的实际操作能力。

二、设计原理。

本电子时钟采用单片机作为控制核心,通过晶振产生的时钟信号来实现时间的计时和显示。

利用数码管来显示小时和分钟,通过按键来调整时间。

同时,通过蜂鸣器发出报时信号,实现基本的闹钟功能。

三、设计方案。

1. 硬件设计。

(1)单片机选择,本设计选用常见的51单片机作为控制核心,具有成本低、易于编程的特点。

(2)时钟电路,采用晶振作为时钟信号源,通过单片机的定时器来实现时间的计时。

(3)显示模块,采用数码管来显示小时和分钟,通过数码管的扫描显示来实现时间的动态显示。

(4)按键输入,设计按键来调整时间,包括调整小时和分钟。

(5)报时功能,通过蜂鸣器来实现基本的报时功能,可以设置闹钟时间。

2. 软件设计。

(1)时钟控制,通过单片机的定时器来实现时间的计时和更新。

(2)显示控制,设计数码管的扫描显示程序,实现时间的动态显示。

(3)按键处理,设计按键扫描程序,实现对时间的调整。

(4)报时功能,设计蜂鸣器的报时程序,实现基本的闹钟功能。

四、设计实现。

1. 硬件实现。

根据上述设计方案,完成了电子时钟的硬件连接和布线,保证各个模块之间的正常通讯和工作。

2. 软件实现。

编写了单片机的程序,实现了时钟的计时、显示和控制功能,保证了电子时钟的正常运行。

五、实验结果。

经过调试,电子时钟能够准确显示当前的时间,并能够通过按键调整时间和设置闹钟功能,报时功能也能够正常工作。

六、总结与展望。

通过本课程设计,学生掌握了单片机的基本原理和应用,培养了动手能力和创新意识。

在今后的学习和工作中,学生将能够更好地应用单片机技术,设计和制作更加复杂的电子产品。

同时,也为学生今后的科研和创新工作奠定了良好的基础。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机电子时钟设计报告一、设计任务本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。

电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。

二、系统硬件设备及芯片简介数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。

字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。

本系统设计采用字符型液品显示模块LCD1602 作为显示器件,这样不仅简化了系统的硬件设计,而且极提高了系统的可靠性。

1 LCD1602简介字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。

LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

2 LCD1602功能介绍2.1 引脚功能LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚功能见表1。

表1 引脚功能2.2 LCD1602读写指令LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:①写指令38H:显示模式设置;②写指令08H:显示关闭;③写指令01H:显示清屏;④写指令06H:显示光标移动设置;⑤写指令0CH:显示开及光标设置。

2.3 LCD1602 读写操作时序LCD1602 读写操作时序总体上来说是比较简单的,掌握其有两种方法:一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。

很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。

(1)读状态:输入:RS=L,RW=H,E=H。

输出:D0-D7=状态字。

(2)写指令:输入:RS=L,RW=L,D0-D7=指令码,E=上升沿。

输出:无。

(3)读数据:输入:RS=H,RW=H,E=H。

输出:D0-D7=数据。

(4)写数据:输入:RS=H,RW=L,D0-D7=数据,E=上升沿。

输出:无。

2.4 LCD1602显示方法液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。

显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符。

因为写入显示地址时要求最高位D7 恒定为高电平,所以实际写入的数据应该是要显示地址值加上80H,即将最高位D7置为1。

在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。

液晶模块在显示字符时光标是自动右移的,无需人工干预。

每次输入指令前,都要判断液晶模块是否处于忙状态。

3 数字电子钟硬件电路设计硬件电路系统设计主要由单片机最小系统、输入电路、输出电路等组成。

单片机最小系统同所有单片机系统,在此不作讨论。

输入电路主要时间调节电路,为简化系统我们使两个外部中断来调节“时”和“分”数值,即将INT0、INT1分别接两个按钮。

LCD显示器和单片机接口电路可以采用总线方式或者是模拟口线方式,本设计采用第二种方式,即以单片机I/O 模拟控制信号。

具体电路见图1,P0口作为数据,并接上拉电阻提升电压,P2.0接LCD的RS端、P2.1 接LCD的R/W端、P2.2接LCD的E端,“分”调节按钮接INT0,“时”调节按钮接INT1,图1 省略了电源和单片机最小系统电路。

图1 数字电子钟硬件电路三、设计电路图及程序1.电路图如下原理图如下:2.程序共有四段程序,用Keil仿真是程序列表如图Regx52.h程序为:#ifndef __AT89X52_H__#define __AT89X52_H__sfr P0 = 0x80;sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr P1 = 0x90;sfr SCON = 0x98; sfr SBUF = 0x99; sfr P2 = 0xA0; sfr IE = 0xA8;sfr P3 = 0xB0; sfr IP = 0xB8;sfr T2CON = 0xC8;sfr T2MOD = 0xC9;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;/*------------------------------------------------ P0 Bit Registers------------------------------------------------*/ sbit P0_0 = 0x80;sbit P0_1 = 0x81;sbit P0_2 = 0x82;sbit P0_3 = 0x83;sbit P0_4 = 0x84;sbit P0_5 = 0x85;sbit P0_6 = 0x86;sbit P0_7 = 0x87;/*------------------------------------------------PCON Bit Values------------------------------------------------*/ #define IDL_ 0x01#define STOP_ 0x02#define PD_ 0x02 /* Alternate definition */#define GF0_ 0x04#define GF1_ 0x08#define SMOD_ 0x80/*------------------------------------------------ TCON Bit Registers------------------------------------------------*/ sbit IT0 = 0x88;sbit IE0 = 0x89;sbit IT1 = 0x8A;sbit IE1 = 0x8B;sbit TR0 = 0x8C;sbit TF0 = 0x8D;sbit TR1 = 0x8E;sbit TF1 = 0x8F;/*------------------------------------------------ TMOD Bit Values------------------------------------------------*/ #define T0_M0_ 0x01#define T0_M1_ 0x02#define T0_CT_ 0x04#define T0_GATE_ 0x08#define T1_M0_ 0x10#define T1_M1_ 0x20#define T1_CT_ 0x40#define T1_GATE_ 0x80#define T1_MASK_ 0xF0#define T0_MASK_ 0x0F/*------------------------------------------------ P1 Bit Registers------------------------------------------------*/ sbit P1_0 = 0x90;sbit P1_1 = 0x91;sbit P1_2 = 0x92;sbit P1_3 = 0x93;sbit P1_4 = 0x94;sbit P1_5 = 0x95;sbit P1_6 = 0x96;sbit P1_7 = 0x97;sbit T2 = 0x90; /* External input to Timer/Counter 2, clock out */ sbit T2EX = 0x91; /* Timer/Counter 2 capture/reload trigger & dir ctl *//*------------------------------------------------SCON Bit Registers------------------------------------------------*/sbit RI = 0x98;sbit TI = 0x99;sbit RB8 = 0x9A;sbit TB8 = 0x9B;sbit REN = 0x9C;sbit SM2 = 0x9D;sbit SM1 = 0x9E;sbit SM0 = 0x9F;/*------------------------------------------------P2 Bit Registers------------------------------------------------*/ sbit P2_0 = 0xA0;sbit P2_1 = 0xA1;sbit P2_2 = 0xA2;sbit P2_3 = 0xA3;sbit P2_4 = 0xA4;sbit P2_5 = 0xA5;sbit P2_6 = 0xA6;sbit P2_7 = 0xA7;/*------------------------------------------------ IE Bit Registers------------------------------------------------*/ sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */ sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */ sbit EX1 = 0xAA; /* 1=Enable External interrupt 1 */ sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */ sbit ES = 0xAC; /* 1=Enable Serial port interrupt */ sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */sbit EA = 0xAF; /* 0=Disable all interrupts *//*------------------------------------------------P3 Bit Registers (Mnemonics & Ports)------------------------------------------------*/ sbit P3_0 = 0xB0;sbit P3_1 = 0xB1;sbit P3_2 = 0xB2;sbit P3_3 = 0xB3;sbit P3_4 = 0xB4;sbit P3_5 = 0xB5;sbit P3_6 = 0xB6;sbit P3_7 = 0xB7;sbit RXD = 0xB0; /* Serial data input */sbit TXD = 0xB1; /* Serial data output */sbit INT0 = 0xB2; /* External interrupt 0 */sbit INT1 = 0xB3; /* External interrupt 1 */sbit T0 = 0xB4; /* Timer 0 external input */sbit T1 = 0xB5; /* Timer 1 external input */sbit WR = 0xB6; /* External data memory write strobe */ sbit RD = 0xB7; /* External data memory read strobe */IP Bit Registers------------------------------------------------*/sbit PX0 = 0xB8;sbit PT0 = 0xB9;sbit PX1 = 0xBA;sbit PT1 = 0xBB;sbit PS = 0xBC;sbit PT2 = 0xBD;/*------------------------------------------------T2CON Bit Registers------------------------------------------------*/sbit CP_RL2= 0xC8; /* 0=Reload, 1=Capture select */sbit C_T2 = 0xC9; /* 0=Timer, 1=Counter */sbit TR2 = 0xCA; /* 0=Stop timer, 1=Start timer */sbit EXEN2= 0xCB; /* Timer 2 external enable */sbit TCLK = 0xCC; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */ sbit RCLK = 0xCD; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */ sbit EXF2 = 0xCE; /* Timer 2 external flag */sbit TF2 = 0xCF; /* Timer 2 overflow flag */T2MOD Bit Values------------------------------------------------*/#define DCEN_ 0x01 /* 1=Timer 2 can be configured as up/down counter */ #define T2OE_ 0x02 /* Timer 2 output enable *//*------------------------------------------------PSW Bit Registers------------------------------------------------*/sbit P = 0xD0;sbit FL = 0xD1;sbit OV = 0xD2;sbit RS0 = 0xD3;sbit RS1 = 0xD4;sbit F0 = 0xD5;sbit AC = 0xD6;sbit CY = 0xD7;/*------------------------------------------------Interrupt Vectors:Interrupt Address = (Number * 8) + 3------------------------------------------------*/#define IE0_VECTOR 0 /* 0x03 External Interrupt 0 */#define TF0_VECTOR 1 /* 0x0B Timer 0 */#define IE1_VECTOR 2 /* 0x13 External Interrupt 1 */#define TF1_VECTOR 3 /* 0x1B Timer 1 */#define SIO_VECTOR 4 /* 0x23 Serial port */#define TF2_VECTOR 5 /* 0x2B Timer 2 */#define EX2_VECTOR 5 /* 0x2B External Interrupt 2 */#endifLCD1602驱动程序为:#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#include <intrins.h>//PortDefinitions**********************************************************sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//部等待函数********************************************************************* *****unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80//实际硬件时打开此语句LcdEn=0;return DBPort;}//向LCD写入命令或数据************************************************************ #define LCD_MAND 0 // mand#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_MAND, 0x08|DisplayMode);}//设置输入模式************************************************************ #define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_MAND, 0x04|InputMode);}//移动光标或屏幕************************************************************/*#define LCD_CURSOR 0x02#define LCD_SCREEN 0x08#define LCD_LEFT 0x00#define LCD_RIGHT 0x04void LCD_Move(unsigned char object, unsigned char direction){if(object==LCD_CURSOR)LCD_Write(LCD_MAND,0x10|direction);if(object==LCD_SCREEN)LCD_Write(LCD_MAND,0x18|direction);}*///初始化LCD************************************************************ void LCD_Initial(){LcdEn=0;LCD_Write(LCD_MAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_MAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_MAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//******************************************************************** ****void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_MAND,0x80|x);if(y==1)LCD_Write(LCD_MAND,0x80|(x-0x40));}void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/*void LCD_LoadChar(unsigned char user[8], unsigned char place){unsigned char i;LCD_Write(LCD_MAND,0x40|(place*8));for(i=0; i<8; i++)LCD_Write(LCD_DATA,user[i]);}*///******************************************************************** ****#endifIntrins.h程序为:#ifndef __INTRINS_H__#define __INTRINS_H__extern void _nop_ (void);extern bit _testbit_ (bit);extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long, unsigned char); extern unsigned char _crol_ (unsigned char, unsigned char); extern unsigned int _irol_ (unsigned int, unsigned char); extern unsigned long _lrol_ (unsigned long, unsigned char); extern unsigned char _chkfloat_(float);extern void _push_ (unsigned char _sfr);extern void _pop_ (unsigned char _sfr);#endifDS1302时钟程序为:#ifndef _REAL_TIMER_DS1302_2003_7_21_#define _REAL_TIMER_DS1302_2003_7_21_sbit DS1302_CLK = P1^6; //实时时钟时钟线引脚sbit DS1302_IO = P1^7; //实时时钟数据线引脚sbit DS1302_RST = P1^5; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[9];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算DS1302_RAM 地址的宏void DS1302InputByte(unsigned char d) //实时时钟写入一字节(部函数) {unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(部函数) {unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_SetProtect(bit flag) //是否写保护{if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);}void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数{DS1302_SetProtect(0);Write1302(Address, ((Value/10)<<4 | (Value%10)));}void DS1302_GetTime(SYSTEMTIME *Time){unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }void DateToStr(SYSTEMTIME *Time){Time->DateString[0] = Time->Year/10 + '0';Time->DateString[1] = Time->Year%10 + '0';Time->DateString[2] = '-';Time->DateString[3] = Time->Month/10 + '0';Time->DateString[4] = Time->Month%10 + '0';Time->DateString[5] = '-';Time->DateString[6] = Time->Day/10 + '0';Time->DateString[7] = Time->Day%10 + '0';Time->DateString[8] = '\0';}void TimeToStr(SYSTEMTIME *Time){Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';Time->TimeString[2] = ':';Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';Time->TimeString[5] = ':';Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';Time->DateString[8] = '\0';}void Initial_DS1302(void){unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80)DS1302_SetTime(DS1302_SECOND,0);}/******************************************************************** ************void BurstWrite1302(unsigned char *pWClock) //往DS1302写入时钟数据(多字节方式){unsigned char i;Write1302(0x8e,0x00); // 控制命令,WP=0,写操作?DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbe); // 0xbe:时钟多字节写命令for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据+ 1Byte 控制{DS1302InputByte(*pWClock); // 写1Byte数据pWClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void BurstRead1302(unsigned char *pRClock) //读取DS1302时钟数据(时钟多字节方式){unsigned char i;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(0xbf); // 0xbf:时钟多字节读命令for (i=8; i>0; i--){*pRClock = DS1302OutputByte(); // 读1Byte数据pRClock++;}DS1302_CLK = 1;DS1302_RST = 0;}void DS1302_TimeStop(bit flag) // 是否将时钟停止{unsigned char Data;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND, Data|0x80);elseWrite1302(DS1302_SECOND, Data&0x7F);}********************************************************************* ***********/#endif-四、心得体会这是一次非常难得的理论与实践相结合的机会,通过这次比较完整的数字电子时钟设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我综合运用所学的专业基础知识,解决实际工程的能力。

相关文档
最新文档