首页 > 文库大全 > 精品范文库 > 1号文库

电子时钟电子CAD设计报告

电子时钟电子CAD设计报告



第一篇:电子时钟电子CAD设计报告

电子电路CAD课程设计

流水灯

内 容 摘 要

《电子线路CAD Protel》是一门实践性要求很高的课程,学生需要通过上机实习和设计环节巩固所学知识,进而综合运用所学知识针对不同的用户需求设计开发,实践是非常重要的教学环节。鉴于目前的设备及我国CAD软件的流通性,本课程以PROTEL软件为主体,介绍其基础知识、设计流程及设计方法等问题。学完本课程应使学生掌握原理图及印刷电路板图的编辑、输出、网表生成、检查、分析及建立新原理图、印刷电路板图库等。通过实习学生可以独立实现电路原理图和印刷电路板的设计,为今后在工作中的实际应用打下较为坚实的基础。

本篇课程设计主要以学习为目的。主要通过对Z80存储器板卡的原理图、PCB电路板的绘制达到学习Protel电子CAD的目的,让我们对电子线路CAD Protel 有感性的认识,然后通过上机操作、实践,加深、理解设计原理,掌握Protel的设计技术:了解并掌握用protel软件绘制简单电路图;掌握用protel软件设计库元件;掌握

一般电子线路PCB图设计。

目录

一、封面……………………………………………………1

二、内容摘要………………………………………………2

三、目录……………………………………………………3

四、原理图设计……………………………………………4

五、功能描述………………………………………………5

六、PCB板的绘制…………………………………………6

七、设计中遇到的问题……………………………………8

八、心得体会………………………………………………9

九、参考文献………………………………………………9

四、原理图设计

4.1、原理图设计步骤:

(1)进入Protel99 SE,创建一个数据库,选择菜单File/New命令,双击框中原理图服务器(Schematic Document)图标,建立原理图设计文档,进入原理图设计界面。

(2)在设计管理器中选择Browse SCH页面,在Browse区域中的下拉框中选择Library,然后单击ADD/Remove按钮,在弹出的窗口中寻找Protel99 SE子目录,在该目录中选择Library\SCH路径,在元件库列表中选择所需的元件库,Miscellaneous Devices Ddb,Protel Dos库等,单击ADD按钮,即把元件库增加到元件库管理器中。

(3)根据实际电路的需要,到元件库中找出所需的元件,然后用元件管理器的Place按钮将元件放置在工作平面上,按Space旋转元件位置,再用电器线将个元件连接好同时对元件进行编号、封装和设定。

(4)选择菜单Tool/REC对画好的电路原理图进行电气规则检查。如果有错误,根据错误情况进行改正。

4.2、原理图如下:

五、功能描述

主要功能:

1.C1和C2及Y1组成晶振电路。

2.C3和按键S4及电阻R12构成复位电路。

3.R1到R8给8个LED供电,当P1口的某个角为低电平时,与之对应的LED灯就会亮。4.P1口做为AT89C51的输出口。

六、PCB板的绘制

利用原理图设计工具绘制原理图,并且生成对应的网络表。当然,有些特殊情况下,如电路板比较简单,已经有了网络表等情况下也可以不进行原理图的设计,直接进入PCB设计系统,在PCB设计系统中,可以直接取用零件封装,人工生成网络表。

手工更改网络表 将一些元件的固定用脚等原理图上没有的焊盘定义到与它相通的网络上,没任何物理连接的可定义到地或保护地等。将一些原理图和PCB封装库中引脚名称不一致的器件引脚名称改成和PCB封装库中的一致,特别是二、三极管等。6.1、PCB板的绘制一般步骤:

(1)选择菜单File/New命令,双击框中PCB设计服务器(PCB Document)图标,建立PCB设计文档,进入PCB设计界面。(2)选择菜单Design/Add/Remove Library,在“添加/删除元件库” 对话框中选取所有元件所对应的元件封装库,PCB Footprint。

(3)布线规则是设置布线的各个规范:通过Design—Rules进行设置安全间距、走线层面和方向、过孔形状、走线线宽等a.双面板制作b.VCC和GND线宽为30mil,c.其它走线宽度为15mil。d.过孔为外径30mil,内径为25mil(4)选择菜单Design/Load Nets,然后在弹出的窗口中单击Browse按钮,再在弹出的窗口中选择电路原理图设计生成的网络表.net文件,如果没有错误,单击Execute,也可在Sch原理图菜单

Design—Update Pcb进行,如果出现错误提示,必须更改错误。(5)调整元件封装,合理布局。Protel99 SE既可以进行自动布线也可以进行手工布线,但是一般要手工布线,那样才能符合特定要求以及避免一些电器规则出错

(6)最后做一次电器规则检查Tools工具—DEC 如果有错误则必须更改好,直到最终的PCB板完整做好。6.2、PCB板图

七、设计中遇到的问题

本次课程设计中,遇到最难处理的问题是制作PCB板原理图的最后阶段,不能很好处理布线问题,总是出现绿点。

八、心得体会

为期一个星期的课程设计,我认真仔细地设计电路原理图,期间遇到一些问题,在自己查资料和同学的帮助下,都很好的解决了。这次课程设计让我对DXP等软件地使用更加熟悉了,也进一步加强我的动手能力。通过这次课程设计,我意识到了在制作PCB板的步骤过程中,我还有很多东西不够扎实,以后还有必要很好地去学习这方面的缺欠。

九、参考文献

(1)Protel入门与提高(人民邮电出版社)

第二篇:数字电子时钟设计

(电子技术课程)

设计说明书

数字电子时钟

起止日期:

202_ 年

11月23日 至

202_年 11月 27 日

学生姓名

班级 学号

成绩

指导教师(签字)

交通工程学院(部)202_年

11月

29日

数字电子钟

设计一个数字电子钟,具体要求:

1、以24小时为一个计数周期;具有“时”、“分”、“秒”数字数码管显示电路;

2、具有校时功能;

3、整点前10秒,数字钟会自动报时,以示提醒;

4、设计+5V直流电源。(设计220V输入,+5V输出)

5、启动电路。

6、用PROTEUS画出电路原理图仿真成功再用数字电子技术实验箱验证。;

设计步骤及内容:

一、首先对本次设计所需要用到的器件的引脚及功能进行详细的了解 1、555定时器

“1”脚为公共接地端GND;“8”脚为正电源电压VCC;“2”脚是触发端;“4”脚为复位输出端; “7”脚为放电端;“6”脚位阈值端;“5”脚为控制电压输入端;“3”脚是输出端。2、74LS163

CEP、CET:计数使能输入端,高电平有效;CLK:时钟脉冲,上升沿触发;

MR:清零端,低电平有效;LOAD:并行置数使能端,低电平有效;RCO:进位信号输出端; D[0:3]:并行二进制数据输入端;Q[3:0]:计数状态输出端。

二、实验步骤

1、连接555定时器,产生1Hz方波。

首先将555定时器按照如图所示的接法连接起来,并根据555定时器电容充放电时间的计算确定各元件的取值。

电容充电时间T=0.7(R1+R2)C1 为使555定时器输入1Hz的方波,经计算各元件的取值为 R1=43K,R2=51K,C1=10u F,C2=0.01u F。3脚作为时钟脉冲的输出连接到各个计数器的CLK。

2、时钟电路的连接

本次设计使用的是74LS163芯片,因为它是16进制计数器,所以需要在控制端加上适当的门电路使其构成十进制计数器,将计数器按照如图所示的方式连接起来。

a、秒各位

将输出端的Q3、Q1用与门(74LS08)连接起来并输入到清零端MR,其目的是为了构成十进制,当计数器计数到9时,与门U1打开,经过非门U1A输出低电平使得MR在下一个脉冲上升沿时清零。

b、秒十位

与秒各位不同的是,秒十位的使能端是由各位Q3、Q1相与的电平控制的,秒十位的进位的条件是当各位为9时,在下一个脉冲的上升沿来临时进位。秒十位的清零需要等到个位为9且十位为5时,U2与U3经过U4输出高电平再经过U3A输出低电平,是的MR在下一个脉冲上升沿是清零。

c、分个位

分各位的构成原理与秒个位相似,不同的是控制端上的门电路换成了与非门U4(为了使之后方便连接门电路),分个位的使能信号由U3输入,清零条件为分个位为9,秒为59时清零,清零信号由U5A输出的低电平提供。

d、分十位

分十位的构成原理与秒十位相似,使能信号由U4输出的高电平提供,清零条件为分为59,秒为59,清零信号由U7A输出的低电平提供。

e、时

时个位的使能信号由U7提供,时十位的使能信号由U9提供。时个位有两个清零信号,一个是当它自身为9时,等到下一个时钟脉冲的上升沿时清零,另一个是当十位为2,个位为3时,十位和个位同时清零。用与非门U12将个位Q2和十位Q1相连,再将两个清零信号相与,实现清零工作。

完整的时钟电路如下图所示

3、校准电路

校准电路连线图如图所示,当开关打在右边时,U14B关闭不工作,U14C送出一个高电平信 6

号,等到秒对分的进位信号来临时和进位信号通过U15A送出一个低电平,使得U15B打开,又因为U15B接入了分个位的使能端,所以相当于开关打在右边时校准电路成为分个位的使能信号进位信号;开关打在左边时,U14C关闭不工作,U14B送出一个高电平信号,然后与秒脉冲信号通过U14D送出一个低电平接入分个位的使能端,所以相当于开关打在左边时,分个位接收了一个秒脉冲信号,使得它能像秒钟一样计时并且能向十位进位,就相当于校准功能,当分钟跳到你想要的时间时把开关打到右边(此时时钟电路照常工作)从你调整好的时间继续计数,达到校准的目的。(时的校准电路与分的校准电路一样)

但是直接把校准电路这样连入时钟电路会出现一些问题,就是在校准的时候分会出现16进制,所以就需要在电路中加入反馈,将它控制到10进制,具体的反馈连接方式如图所示(不能接在MR端,不然会使电路出现问题)时钟电路与校准电路如图所示 将开关打到左边进行校准:

完成之后将开关打到右边继续计数:

4、报时电路

报时电路使用的是74HC30芯片,它是一个8输入与非门芯片,只有当所有输入都为1时输出为0,使得喇叭能够正常工作(喇叭一端接高电平一端接低电平),因为是整点报时,所以秒个位就不用接入芯片,只需在多余的两个引脚接入电源就可以实现在59分50秒到59秒的报时,具体接法如下图所示

整个可校准可报时的数字电路如图所示

三、心得体会

本次数字电子课程设计是我觉得收获非常大的一次实习,而这次课程设计给我们提供了一个应用自己所学知识来设计作品的平台。

在本次课程设计中,我更加熟悉Proteus软件的操作了,同时对74LS163、74LS161、74HC30、555等芯片加深了了解,和对它们的使用,对于数字、模拟电路的综合运用有了更深一步理解,为以后的电路分析和设计奠定了一定的基础。

本次课程设计很遗憾没能选择最有挑战性的课题来做,因为基础知识不够扎实,做数字电子时钟也是费了很大劲。

这次设计我主要觉得有两个难点:

一、从一开始没选择十进制计数器来做,所以使设计的电路看起来很复杂,并且进位需要考虑的很周全,越高位必要条件越多,所以用了许多门电路;

二、校准电路直接连入电路会产生十六进制,所以需要加反馈,在最开始不太理解反馈的意思,又去翻了数电书还问了老师很多次,接了很多遍才将反馈接出来。

但是最后成功了看着自己能把理论知识运用到实际,心里还是非常开心的,在做课题的这几天学会了很多,对仿真也产生了浓厚的兴趣,想自己试着在课余时间再做做几个课题。

第三篇:数字电路电子时钟课件设计

数字电路电子时钟课程设计

数字电路电子时钟课程设计

整个数字钟由时间计数电路、晶体振荡电路、校正电路、整点报时电路组成。其中以校正电路代替时间计数电路中的时、分、秒之间的进位,当校时电路处于正常输入信号时,时间计数电路正常计时,但当分校正时,其不会产生向时进位,而分与时的校位是分开的,而校正电路也是一个独立的电路。电路的信号输入由晶振电路产生,并输入各电路

方案论证:方案一数字电子钟由信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用555构成的振荡器加分频器来实现。

优点:数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

方案二秒、分计数器为60进制计数器,小时计数器为24进制计数器。实现这两种模数的计数器采用中规模集成计数器74LS90构成。

优点:简单易懂,比较好调试。设计原理数字电子钟由信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用555构成的振荡器加分频器来实现。将标准秒脉冲信号送入“秒计数器”,该计数器采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计数器,可以实现一天24h的累计。译码显示电路将“时、分、秒”计数器的输出状态经七段显示译码器译码,通过六位LED显示器显示出来。整点报时电路是根据计时系统的输出状态产生一个脉冲信号,然后去触发音频发生器实现报时。校时电路是来对“时、分、秒”显示数字

数字电路电子时钟课程设计

进行校对调整。其数字电子钟系统框图如下:

时显示器分显示器秒显示器时译码器分译码器秒译码器整点报时时计数器分计数器秒计数器时钟校准振荡器分频器秒脉冲

图 1 数 字 电 子 钟 系 统 框 图 详细设计及实验步骤

4.1 秒脉冲信号发生器

秒脉冲信号发生器是数字电子钟的核心部分,它的精度和稳定度决定了数字钟的质量。由振荡器与分频器组合产生秒脉冲信号。

振荡器: 通常用555定时器与RC构成的多谐振荡器,经过调整输出1000Hz脉冲。

分频器: 分频器功能主要有两个,一是产生标准秒脉冲信号,一是提供功能扩展电路所需要的信号,选用三片74LS90进行级联,因为每片为1/10分频器,三片级联好获得1Hz标准秒脉冲。其电路图如下:

数字电路电子时钟课程设计

图2 秒 脉 冲 信 号 发 生 器

4.2 秒、分、时计时器电路设计

秒、分计数器为60进制计数器,小时计数器为24进制计数器。实现这两种模数的计数器采用中规模集成计数器74LS90构成。

60进制计数器:由74LS90构成的60进制计数器,将一片74LS90设计成10进制加法计数器,另一片设置6进制加法计数器。两片74LS90按反馈清零法串接而成。秒计数器的十位和个位,输出脉冲除用作自身清零外,同时还作为分计数器的输入脉冲CP1。下图电路即可作为秒计数器,也可作为分计数器。24进制计数器:由74LS90构成的二十进制计数器,将一片74LS90设计成4进制加法计数器,另一片设置2进制加法计数器。即个位计数状态为Qd Qc Qb Qa = 0100十位计数状态为Qd Qc Qb Qa = 0010时,要求计数器归零。通过把个位Qc、十位Qb相与后的信号送到个位、十位计数器的清零端,使计数器清零,从而构成24进制计数器。电路图如下:

数字电路电子时钟课程设计

图3 60 进 制 计 数 器

图4 24 进 制 计 数 器

4.3 译码显示电路

译码电路的功能是将秒、分、时计数器的输出代码进行翻译,变成相应的数字。用与驱动LED七段数码管的译码器常用的有74LS48。74LS48是BCD-7段译码器/驱动器,输出高电平有效,专用于驱动LED七段共阴极显示数码管。若将秒、分、时计数器的每位输出分别送到相应七段译吗管的输入端,便可以进行不同数字的显示。在译码管输出与数码管之间串联电阻R作为限流电阻。

数字电路电子时钟课程设计

图5 译码显示电路 校时电路

校时电路是数字钟不可缺少的部分,每当数字钟与实际时间不符时,需要根据标准时间进行校时。K1、K2分别是时校正、分校正开关。不校正时,K1、K2开关是闭和的。当校正时位时,需要把K1开关打开,然后用手拨动K3开关,来回拨动一次,就能使时位增加1,根据需要去拨动开关的次数,校正完毕后把K1开关闭上。校正分位时和校正时位的方法一样。其电路图如下:

数字电路电子时钟课程设计

图6 校 正 电 路 课程设计原理图

数字电路电子时钟课程设计

图8 设计结果与分析

数字电路电子时钟课程设计

整个数字钟由时间计数电路、晶体振荡电路、校正电路、整点报时电路组成。其中以校正电路代替时间计数电路中的时、分、秒之间的进位,当校时电路处于正常输入信号时,时间计数电路正常计时,但当分校正时,其不会产生向时进位,而分与时的校位是分开的,而校正电路也是一个独立的电路。电路的信号输入由晶振电路产生,并输入各电路。

把显示器与CD4511相连,第一次接时,数码管完全没有显示数字,检查后发现是数码管未接地而造成的,接地后发现还是无法正确显示数字,用万用表检测后,发现是因芯片引脚有些接触不良而造成的,所以确认芯片是否接触良好是非常重要的一件事。

六进制、十进制都没有什么大的问题,只是芯片引脚的老问题,只要重新插过芯片就可以解决了。但在六十进制时,按图接线后发现,显示器上的数字总是100进制的,而不是六十进制,检测后发现无论是线路的连通还是芯片的接触都没有问题。最后,在重对连线时发现是线路接错引脚造成的,改过之后,显示就正常了。

因上面程因引脚接错而造成错误,所以校正电路是完全按照仿真图所连的,在测试时,开始进行时校时时,没有出现问题,但当进行到分校时时,发现计数电路的秒电路开始乱跳出错。因此,电路一定是有地方出错了,在反复对照后,发现是因为在接入校正电路时忘了把秒十位和分个位之间的连线拿掉而造成的,因此,在接线时一定要注意把不要的多余的线拿掉

在整个设计的过程中,虽然遇到了一些问题,可是经过我们的努力都一一解决了,总的来说,整个设计还是比较成功的,实现了时钟模块、闹钟模块、显示模块以及控制模块的相互联接。心得体会

通过这次数字钟的课程设计与制作,让我知道设计电路的一些程序,也让我初步了解了关于数字钟的一般原理与设计理念,加深了对各种芯片逻辑功能的了解,更重要的是掌握了许多实际操作技能。由于数字钟包括组合逻辑电路和时序电路,通过它也让我进一步学习与掌握了各种组合逻辑电路与时序电路的原理与使用方法。这次课程设计时间只有五天,而安排在前期原理图设计上的时间就用

数字电路电子时钟课程设计

了两天,占总时间的40%,可见前期准备的重要性,前期的准备充分与否,直接关系到设计的成败。当我得知这次课程设计的任务是数字钟之后,马上就去图书馆查找相关资料,先对数字钟的设计有个总体的把握,顺利画出了它的总体设计框图。接下来就是对组成数字钟的各个功能模块的设计了,这一步是本次设计的重中之重,它需要考虑很多东西,像选择什么样的芯片,多大的电阻、电容等等。经过上网查找和与同学讨论确定了各个模块的电路,一个完整的数字钟的电路图已经形成。

设计方案经过老师肯定之后就是数字钟的制作与调试了,它占了总时间的一半,这是一个难点也是重点。在这个过程中吸取了许多教训,我在接下了的制作过程中就显得异常轻松,比较快的完成了这次任务。这就是好事多磨吧!

通过这次课程设计,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手设计操作才会有深刻理解和达到学习的目的。

参考文献

数字电路电子时钟课程设计

[1].阎石.数字电子技术基础[M] ;高等教育出版社,1996-02 [2].余孟尝.数字电子技术基础简明教程[M] ;高等教育出版社,202_-03 [3]康华光.电子技术基础数字部分[J]; 高等教育出版社,1999-06 [4]童诗白.模拟电子技术基础第二版[J]; 北京高等教育出版社,202_-01 [5]陈永.555集成电路应用[J]; 电子工业出版社,202_-05 [6]阎石.数字电子技术基础(第5版)[M];高等教育出版社,202_-03 [7]郝鸿安.555集成电路使用电路集[M];上海科学普及出版社,202_-06 [8]孙余凯,吴鸣山,项绮明.555时基电路识图[J];电子工业出板社,202_-03 [9]卢结成.电子电路实验及应用课题设计[J].中国科学技术大学出版社,202_-09 [10]魏绍亮,陈新华.电子技术实践[M];机械工业出版社,1999-03

致 谢

数字电路电子时钟课程设计

在此次设计中,指导老师给了我很大的帮助,在我的设计中给予了很多的宝贵指导意见,才能使我的设计得以顺利完成,在此我向李敏君老师表示衷心的感谢。此外,本次设计的完成也离不开同学的热情帮忙。同时,在本次设计中不仅我学会了很多关于触发器的知识,同时也提高了我的实际动手能力,再次对关心帮助我的老师同学给予衷心的感谢。

第四篇:EDA嵌入式电子时钟设计

目 录

摘要…………………………………………………………...………………………1 第一章 前言..………………………………………………………………………1 第二章 系统设计.…………………………………………………...……….……2 2.1 题目标及总体方案…………………………………………………...………..2

2.2 元器件的选择和连线……………………………………………………...…..2

2.3 程序和芯片的初始化……………………………………………………...…..3

2.4 构建功能模块………………………………..…………………………….…..4 第三章 实验(测试)结果及讨论……….……………………………….…….9

3.1 ads1.2 软件的编译连接和运行………………………………………….....9

3.2 protues 7.4仿真软件的联合调试……………………………………….….10 第四章 结论………………………………………………………………………11 心得体会………………………………………………………………………...…12 参考文献………………………………………………………………………13 附 录………………………………………………………………………14

摘要

近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。

实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。

summary In recent years, along with the computer technology and integrated circuit technology development, the embedded technology, growing popularity in communication, network, industrial, medical and electronic field plays a more and more important role.The embedded system has become the most popular most promising IT application field of one.Real time clock(RTC)device is a kind of can provide calendar/clock, data storage function application-specific integrated circuit, commonly used all kinds of computer system clock signal source and the parameters set store circuit.With timing accurate RTC, low power consumption, and small volume and other characteristics, especially suitable for all kinds of embedded system loyal record in the timing of events and related information, especially in communication engineering, power automation, industry control, high automation field of unmanned their duties environment.Along with the development of the integrated circuit technology, the new product of RTC device also has introduced.These new product not only has accurate RTC, and high capacity memory, temperature sensor and A/D data acquisition channel etc, has become the collection of data collection and storage, RTC in an integrated function device, especially suitable for to micro controller as the core of the embedded system.第一章 前 言

通常我们常用的LCD显示模块,有两种,一是带有驱动电路的LCD显示模块,一是不带驱动电路的LCD显示屏。大部分ARM处理器中都集成了LCD的控制器,所以,针对ARM芯片,一般不使用带驱动电路的LCD显示模块。

S3C44B0X 中具有内置的LCD 控制器,它能将显示缓存(在SDRAM存储器中)中的LCD图像数据传输到外部的LCD驱动电路上的逻辑功能。它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。在显示灰度时,它采用时间抖动算法(time-based dithering algorithm)和帧率控制(Frame Rate Control)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。通过软件编程,可以实现233或332的RGB调色的格式。对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD 控制器中的相应寄存器写入不同的值,来配置不同的LCD 显示板。

实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。

第二章 系统设计

2.1课题目标及总体方案

利用lpc 2104芯片和LCD显示器,通过汇编和C语言编译,完成实时时钟的显示。

2.2元器件的选择和连线

选用嵌入式arm 7系列的lpc 2104芯片和Lcd pg160128a显示器:

图 2.2.2

图 2.2.1

根据使用的需要配置端口连线:

图 2.2.3 图 2.2.4

2.3程序和芯片的初始化

程序中包括:Lcd的初始化:

中断向量的初始化:

RTC的初始化:

芯片Lpc2104 基础配置: 中间使用了上接正电源配合 电容的交流特性,为芯片提供电 源和复位功能。

其他引脚根据芯片要求配置 连接。

图 2.3.1 2.4构建功能模块

LCD重要的函数实现画圆和画直线。以下为画圆函数:

void Shouw_Cricle()// 整 点 { Set_Color(GUI_YELLOW);Fill_Circle(160, 30,2);// 12点(x,y,r)Fill_Circle(135, 35,2);// 11 点(x,y,r)Fill_Circle(115, 55,2);// 10 点(x,y,r)Fill_Circle(110, 80,2);// 9 点(x,y,r)Fill_Circle(115, 105,2);// 8 点(x,y,r)Fill_Circle(135, 125,2);// 7 点(x,y,r)Fill_Circle(160, 130,2);// 6 点(x,y,r)Fill_Circle(185, 125,2);// 5 点(x,y,r)Fill_Circle(205, 105,2);// 4 点(x,y,r)Fill_Circle(210, 80,2);// 3 点(x,y,r)Fill_Circle(205, 55,2);// 2点(x,y,r)

Fill_Circle(185, 35,2);// 1点(x,y,r)}

该算法是通过X变量的自增,补偿1 修正正方形控制Y变量自减,找到距中心恒定距离的点,其中rs=45,X自0加1增至45。和原点坐标运算,可以在第一象限找到一点,再通过折叠对称找到其他象限的三个点,通过画点函数描绘出。再画他的45度镜像就好了。

画线函数:void line(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned char draw)以中心的坐标为起点,使用while函数与指针最外圈的点比较,不断延长直至相等,所以事先计算出时针,分针和秒针三个同心圆最外圈点的坐标,以便带入函数。也同圆类似,要考虑不同象限点的情况,根据不同的位置带参数到画点函数中描绘。

2.4.1画指针模块

int SpaceXS[61]={160,165,170,175,180,185, 189,193,197,201,205,206,207,208,209,210, 209,208,207,206,205, 201,197,193,189,185, 180,175,170,165,160, 155,150,145,140,135, 131,127,123,119,115, 114,113,112,111,110, 111,112,113,114,115, 119,123,127,131,135, 140,145,150,155,160, }, SpaceYS[61]={30,31,32,33,34,35,39,43,47,51, 55,60,65,70,75, 80,85,90,95,100, 105,109,113,117,121, 125,126,127,128,129,130,129,128,127,126, 125,121,117,113,109, 105,100,95,90,85, 80,75,70,65,60, 55,51,47,43,39, 35,34,33,32,31,30}, SpaceXM[61]={160,164,168,172,176,180,183,186,189,192,195,196,197,198,199,200,199,198,197,196,195,192,189,186,183,180,176,172,168,164, 160,156,152,148,144,140,137,134,131,128, 125,124,123,122,121,120,121,122,123,124,125,128,131,134,137,140,144,148,152,156, 160 }, SpaceYM[61]={40,41,42,43,44,45,48,51,54,57,60,64,68,72,76,80,84,88,92,96, 100,103,106,109,112,115,116,117,118,119, 120,119,118,117,116,115,112,109,106,103, 100,96,92,88,84,80,76,72,68,64, 60,57,54,51,48,45,44,43,42,41, 40},SpaceXH[13]={160,175,185,190,185,175,160,145,135,130,135,145,160}, SpaceYH[13]={50,55,65,80,95,105,110,105,95,80,65,55,50},2.4.2显示模块

void Shows(){ show(sec);Set_Color(GUI_GRAY);//擦除上一秒的 Draw_Line(x_line,y_line,*Placex,*Placey);Placex=Placex+1;Placey=Placey+1;Set_Color(GUI_YELLOW);//显示下一秒的 Draw_Line(x_line,y_line,*Placex,*Placey);Set_Color(GUI_RED);//显示下一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym);Set_Color(GUI_GREEN);//显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh);if(Placex==&SpaceXS[60]&&Placey==&SpaceYS[60]){ Placex=&SpaceXS[0];Placey=&SpaceYS[0];} } 小时,分显示类似。

2.4.3计时模块

oid Task_2(void *pdata){

for(;;)

{ Show_Color();Shouw_Cricle();

Set_Color(GUI_RED);sec = 0;Set_Color(GUI_YELLOW);//显示

Draw_Line(x_line,y_line,*Placex,*Placey);Display_Time(130, 160);//时间

do { Delay(1200);sec++;Shows();if(sec >= 60)

{ sec = 0;min++;Showm();if(min >= 60){ min = 0;hour++;Showh();if(hour >= 23)

} { hour = 0;day++;if(day >=32){

day = 1;mon++;if(mon >= 13){

}

mon = 1;yea1++;} } } }

Display_Time(130, 160);//时间 日期 }while(1);} 第三章 实验(测试)结果及讨论

3.1 ads1.2 软件的编译,连接和运行

构建完整的程序:

添加头文件,中断处理汇编程序段,初始化函数和主函数:

编译 所有的文件:

图 3.1.1

编译器提示:成功生成所需Hex文件,将得到的Hex文件导入仿真芯片 Lpc 2104中,观察实时时钟。

3.2 protues 7.4仿真软件的联合调试

为Lpc 2104 芯片选择Hex文件路径:

图 3.2.1

连接芯片与LCD端口,运行程序,观察效果。显示如下时钟界面:

动态显示当前的时间,包括:年、月、日、时、分、秒,时针、分针和秒针为动态实时指示当前的时间。

图 3.2.2

第四章 结 论

综合效果图:

图 4.1

以上为protues部分设计的,ads程序见附录。

心得体会

通过短短一个星期的嵌入式课程设计,我获益匪浅。在课程设计的过程中,我发现我们专业在半个学期里所修的嵌入式课程的知识点都仅仅是基础中的基础,要完成老师交给我们的任务还是有一些距离的,于是我自发上网搜集了许多嵌入式的资料,在完成方案设计和程序修改调试以后,就可初步实现本课题课程设计的要求。但当我们将程序烧入实验箱后,发现最初的版本并不完美,存在许多使用上的不方便与可以进一步改进的地方,譬如功能不全、外观粗糙……

通过这次课设,我发现了自己在课本知识上掌握的不足,同时把以前所学过的知识重新温故,巩固了所学的知识。我觉得这次的成功很大部分取决与同学的帮助与冷静、耐心和细心。团队合作可以增强我们的创新能力与加大我们的完成速度,而程序的修改,调试,编译则离不开冷静、耐心和细心等心理素质。另外,这次课设的完满结束,给了我们日后毕业设计宝贵的经验,使我们受益匪浅。

参考文献

[1] 谢自美,电子线路设计、实验、测试,华中理工大学出版社,202_。[2] 宋春荣,通用集成电路速查手册,山东科学技术出版社,1995。[3] Arnold Berger,嵌入式系统设计,吕骏 译,北京:电子工业出版社, 202_ [4] 桑楠.嵌入式系统原理及应用开发技术,北京:北京航空航天大学出版社, 202_

附 录

源程序:

#include “..incconfig.h” #define STACKSIZE 256 #define x_line 160 #define y_line 80 OS_STK_DATA stk;extern GUI_FONT CHINESE_FONT12;extern GUI_FONT CHINESE_FONT16;extern GUI_FONT GUI_Font8x16;OS_EVENT * Send_LCD_Sem;OS_EVENT *Key_Mbox;

I8 Hour[3],Min[3],Sec[3];I8 hour = 0, min = 0, sec = 0,ms;I8 YEA1[3],YEA2[3],MON[3],DAY[3];int yea1 = 20,yea2=11, mon = 6, day = 23;I8 XH0[3],XH1[3],XH2[3],XH3[3];I8 XH4[3],XH5[3],XH6[3],XH7[3];char xh0=01,xh1=62,xh2=31,xh3=03;char xh4=32,xh5=36,xh6=02,xh7=12;//int TimeCount = 0;int SpaceXS[61]={160,165,170,175,180,185,189,193,197,201,205, 206,207,208,209,210, 209,208,207,206,205, 201,197,193,189,185, 180,175,170,165,160, 155,150,145,140,135, 131,127,123,119,115,114,113,112,111,110, 111,112,113,114,115, 119,123,127,131,135, 140,145,150,155,160, }, SpaceYS[61]={30,31,32,33,34,35,39,43,47,51, 55,60,65,70,75, 80,85,90,95,100, 105,109,113,117,121, 125,126,127,128,129, 130,129,128,127,126,125,121,117,113,109, 105,100,95,90,85, 80,75,70,65,60, 55,51,47,43,39, 35,34,33,32,31,30}, SpaceXM[61]={160,164,168,172,176,180,183,186,189,192,195,196,197,198,199,200,199,198,197,196, 195,192,189,186,183,180,176,172,168,164, 160,156,152,148,144,140,137,134,131,128, 125,124,123,122,121,120,121,122,123,124, 125,128,131,134,137,140,144,148,152,156, 160 }, SpaceYM[61]={40,41,42,43,44,45,48,51,54,57,60,64,68,72,76,80,84,88,92,96, 100,103,106,109,112,115,116,117,118,119, 120,119,118,117,116,115,112,109,106,103, 100,96,92,88,84,80,76,72,68,64, 60,57,54,51,48,45,44,43,42,41,40 },SpaceXH[13]={160,175,185,190,185,175,160,145,135,130,135,145,160}, SpaceYH[13]={50,55,65,80,95,105,110,105,95,80,65,55,50}, *Placex=&SpaceXS[0],*Placey=&SpaceYS[0],*Placexm=&SpaceXM

[0],*Placeym=&SpaceYM[0], *Placexh=&SpaceXH[0],*Placeyh=&SpaceYH[0];void Display_xh1(char xx1,char yy1);void Display_xh2(char xx2,char yy2);void Display_xh3(char xx3,char yy3);

void Shows(){ show(sec);Set_Color(GUI_GRAY);//擦除上一秒的 Draw_Line(x_line,y_line,*Placex,*Placey);Placex=Placex+1;Placey=Placey+1;Set_Color(GUI_YELLOW);//显示下一秒的 Draw_Line(x_line,y_line,*Placex,*Placey);

Set_Color(GUI_RED);//显示下一分的

Draw_Line(x_line,y_line,*Placexm,*Placeym);Set_Color(GUI_GREEN);//显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh);if(Placex==&SpaceXS[60]&&Placey==&SpaceYS[60]){ Placex=&SpaceXS[0];Placey=&SpaceYS[0];} }

void Showm(){

Set_Color(GUI_GRAY);//擦除上一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym);Placexm=Placexm+1;

Placeym=Placeym+1;Set_Color(GUI_RED);//显示下一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym);Set_Color(GUI_GREEN);//显示下一时的

Draw_Line(x_line,y_line,*Placexh,*Placeyh);

}

void Showh(){

Set_Color(GUI_GRAY);//擦除上一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh);Placexh=Placexh+1;Placeyh=Placeyh+1;Set_Color(GUI_GREEN);//显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh);if(Placexm==&SpaceXM[60]&&Placeym==&SpaceYM[60]){

} Placexm=&SpaceXM[0];Placeym=&SpaceYM[0];

if(Placexh==&SpaceXH[12]&&Placeyh==&SpaceYH[12]){ Placexh=&SpaceXH[0];

} } Placeyh=&SpaceYH[0];void Shouw_Cricle()// 整 点 { Set_Color(GUI_YELLOW);Fill_Circle(160, 30,2);// 12点(x,y,r)Fill_Circle(135, 35,2);// 11 点(x,y,r)Fill_Circle(115, 55,2);// 10 点(x,y,r)Fill_Circle(110, 80,2);// 9 点(x,y,r)Fill_Circle(115, 105,2);// 8 点(x,y,r)Fill_Circle(135, 125,2);// 7 点(x,y,r)Fill_Circle(160, 130,2);// 6 点(x,y,r)Fill_Circle(185, 125,2);// 5 点(x,y,r)Fill_Circle(205, 105,2);// 4 点(x,y,r)Fill_Circle(210, 80,2);// 3 点(x,y,r)Fill_Circle(205, 55,2);// 2点(x,y,r)Fill_Circle(185, 35,2);// 1点(x,y,r)}

void Delay(int time);void ChangeForm(char Time[],char time){ Time[0] = time / 10 + 48;Time[1] = time % 10 + 48;Time[2] = '';} void Display_Time(char x,char y){ ChangeForm(Hour, hour);ChangeForm(Min, min);ChangeForm(Sec, sec);ChangeForm(MON, mon);ChangeForm(DAY, day);ChangeForm(YEA1, yea1);ChangeForm(YEA2, yea2);Disp_String(Hour,x,160);Disp_String(“:”,x + 16,160);Disp_String(Min,x + 24,160);Disp_String(“:”,x + 40,160);Disp_String(Sec,x + 48,160);Disp_String(YEA1,x , 180);Disp_String(YEA2,x +16,180);Disp_String(“,”,x + 32,180);Disp_String(MON,x + 40,180);Disp_String(“,”,x + 56,180);Disp_String(DAY,x + 64,180);/*分配各任务的堆栈容量 */ OS_STK Stack_Task_1[STACKSIZE];OS_STK Stack_Task_2[STACKSIZE*3];

void Task_3(I8 s){ I8 display;for(;;){

Delay(100);display++;Set_Color(GUI_RED);Display_xh1(5,180);if(display==1000)

} } /* { } display=0;函数说明 : GUI任务,优先级为9输出参数 : 无 */ void Task_2(void *pdata){ for(;;){ Show_Color();

Shouw_Cricle();

Set_Color(GUI_RED);sec = 0;Set_Color(GUI_YELLOW);//显示

Draw_Line(x_line,y_line,*Placex,*Placey);Display_Time(130, 160);//时间

do { Delay(1200);sec++;Shows();if(sec >= 60)

{ sec = 0;min++;

} Showm();if(min >= 60){ min = 0;hour++;Showh();if(hour >= 23){ hour = 0;day++;if(day >=32){ day = 1;mon++;if(mon >= 13){

} } } } }

Display_Time(130, 160);//时间 日期 }while(1);

mon = 1;yea1++;}

void Task_1(void *pdata){ Rtc_Tick_Init();//打开时钟节拍,让操作系统跑起来

OSTaskCreate(Task_2,(void *)0,(OS_STK *)&Stack_Task_2 [(STACKSIZE*3)(void

第五篇:基于51单片机电子时钟设计

基于51单片机的电子时钟设计

摘要

本电子时钟以STC89C52单片机作为主控芯片,采用DS12C887时钟芯片,使用1602液晶作为显示输出。该时钟走时精确,具有闹钟设置,以及可同时显示时间、日期等多种功能。本文将详细介绍该电子时钟涉及到的一些基本原理,从硬件和软件两方面进行分析。

【关键词】

STC89C52单片机

DS12C887时钟芯片

1602液晶

蜂鸣器

目录

一、绪论…………………………………………………………4

1.1 电子时钟功能…………………………………………1.2设计方案………………………………………………4

二、硬件设计……………………………………………………4

2.151

2.2 单片机部分设计………………………………4

USB供电电路设计………………………………5

2.3 串行通信电路设计………………………………6

2.4DS12C887时钟芯片电路的设计…………………6

2.51602LCD液晶屏显示电路设计………………7

2.6

蜂鸣器电路设计………………………………8

2.7

按键调整电路设计…………………………8

三、软件设计…………………………………………9

3.1 系统程序流程图设计…………………………9

3.2程序设计……………………………………11

四、心得体会………………………………………………22 参考文献……………………………………………………23

一、绪

1.1电子时钟功能

(1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。(2)具有闹铃设定即到时报警功能,报警响起时按任意键可取消报警。

(3)能够使用实验板上的按键随时调节各个参数,四个有效键分别为功能选择键、数值增大键、数值减小键和闹钟查看键。

(4)每次有键按下时,蜂鸣器都以短“滴”声报警。

(5)利用DS12C887自身掉电可继续走时的特性,该时钟可实现断电时间不停、再次上电时时间仍准确显示在液晶上的功能。

1.2设计方案

DS12C887时钟芯片+1602LCD液晶屏

DS12C887时钟芯片功能丰富、价格适中,能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部含有世纪寄存器,从而利用硬件电路解决“千年”问题。DS12C887中自带锂电池,外部掉电时,其内部时间信息还能保持10年之久。1602LCD液晶屏可以输出2行,每行显示16个字符。1602LCD液晶屏显示清晰且不会闪烁,由于液晶屏是数字式的,因此和单片机系统的接口简单,操作方便。

以STC89C52为主控芯片,DS12C887为时钟芯片,1602LCD液晶屏作为显示器。程序控制DS12C887时钟芯片实现小时、分、秒和年、月、日的计时,并在1602LCD液晶屏上显示出来。当时间走到程序所设定的时间时,蜂鸣器响起,起到闹钟功能。

二、硬

2.1 51单片机部分设计

单片机部分如图2—1所示:

以STC89C52单片机为核心,选用12MHZ的晶振,由于晶振的频率越高,单片机的运行速度就越快,考虑到单片机的运行速度快会导致对存储器的要求就会变高,因此12MHZ为最佳选择。外接电容的值虽然没有严格的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此选用30pF的电容作为起振电容。复位电路为按键高电平复位,当按键按下,RES端为高电平,当高电平持续4us的时间单片机即复位。

2.2 USB供电电路设计

USB供电电路如下图2—2所示:

该电子时钟采用USB端口的方式为单片机供电,LPOW1为电源显示灯,当按键S5按下,电源显示灯LPOW1亮,表示给单片机供+5V电。

2.3 串行通信电路设计

串行通信电路如下图2—3所示:

图中通过MAX232进行RS—232电平与单片机TTL电平之间的转换,从而为单片机和上位机之间通信提供通道。通信电路的目的就是让通信双方的电平匹配,单片机用的是TTL电平,上位机的串口用的是RS—232电平。TTL电平逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;RS—232电平的逻辑1的电压范围是—15V到—5V,逻辑0的电压范围是+5V到+15V。MAX232可以把输入的+5V电源电压变换成为RS—232输出电平所需的+10V电压。所以采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。对于没有+12V电源的场合,其适应性更强,2.4 DS12C887时钟芯片电路的设计

时钟芯片电路如下图2—4所示:

DS12C887时钟芯片共需要13条信号线,分别是并行数据地址复用线AD0~AD7,CS,AS,R/W,DS和IRQ。

MOT—总线操作时序选择端。它有两种工作模式,当MOT接

VCC时,选用Motorola模式;当MOT接GND或悬空时,选用Intel模式。NC—空引脚。

AD0~AD7—复用地址数据总线。在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的是数据信息。GND,VCC—系统电源接入端。当

VCC输入为+5V时,用户可以访问DS12C887内RAM的输入小于+4.25V时,禁止用户对内部RAM中的数据,并可对其进行读/写操作;当

VCC进行读/写操作,此时用户不能正确芯片内的时间信息;当

VCC的输入小于+3V时,DS12C887会自动的将电源切换到内部自带的锂电池上,以保证内部的电路能正常工作。

CS—芯片片选端。

AS—地址选通输入端。在进行读/写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论CS是否有效,DS12C887都将执行该操作。

R/W—读/写输入端。该引接脚有两种工作模式,当MOT接

VCC时,R/W工作在Motorola模式。此时该引脚的作用是区分读操作还是写操作,R/W高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该引脚工作在Intel模式,此时该引脚为写允许输入,此信号的上升沿锁存数据。

DS—数据选择或读输入脚。该引脚有两种工作模式,当MOT接

VCC时,选用Motorola模式,此时,每个总线周期后一部分的DS为高电平,称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中。当MOT接GND时,选用Intel模式,此时该引脚是读允许输入引脚。

RESET—芯片复位引脚。

IRQ—中断请求输出。用作处理器的中断申请输入。只要引起中断的状态位置位,并且相应中断使能位也置位,IRQ将一直保持低电平,处理器程序通常读取C存储器来清除IRQ引脚输出,RESET引脚也会清除未处理的中断。没有中断发生时,IRQ为高阻状态,可将多个中断器件接到一条IRQ总线上,只要它们均为漏极开路输出即可。IRQ引脚为漏极开路输出,需要使用一个外接上拉电阻与SQW—方波输出引脚。当供电电压

VCC相连。

VCC大于4.25V时,SQW引脚可输出方波。

2.5 1602LCD液晶屏显示电路设计

1602LCD液晶屏显示电路如下图2—5所示:

1602液晶为5V电压驱动,带背光,可显示2行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。接口说明如下:(1)液晶1,2端为电源;15,16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个1K电阻用于限流。

(2)液晶3端为液晶对比度调节端,通过一个10K电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。

(3)液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。

(4)液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。

(5)液晶6端为使能信号,是操作时必须的信号,接单片机的P3.4口。

2.6 蜂鸣器电路设计

蜂鸣器电路如下图2—6所示:

蜂鸣器电路接在单片机的P2.3引脚上,当该引脚一个低电平,三极管导通,蜂鸣器发出声音作为闹铃。

2.7 按键调整电路设计

按键调整电路如下图2—7所示:

四个独立键盘均采用查询方式,将按键的一端接地,另一端各接一根输入线直接与STC89C52的I/O口相连。当按键闭合时,相当于该I/O口通过按键与地相连,变成低电平,单片机通过检测I/O口的电平状态,即可识别出按下的键。通过四个键实现参数的调节,S1为功能选择键,S2为数值增大键,S3为数值减小键,S4为闹钟查看键。

三、软

3.1 系统程序流程图设计

流程图1:实验主程序流程图

流程图2:定时中断程序流程图

流程图3:调时功能流程图

3.2 程序设计

#include #include void delay(uint z)

//延时函数 {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);} void di()

//蜂鸣器报警声音 {

beep=0;

delay(100);

beep=1;} void

write_com(uchar com)

//写液晶命令函数

{

rs=0;

lcden=0;

P0=com;

delay(3);

lcden=1;

delay(3);

lcden=0;} void write_data(uchar

data)

//写液晶数据函数 {

rs=1;

lcden=0;

P0=data;

delay(3);

lcden=1;

delay(3);

lcden=0;} void

init()

//初始化函数 {

uchar

num;

EA=1;

//打开总中断

EX1=1;

//开外部中断1

IT1=1;

//设置负跳变沿触发中断

flag1=0;

//变量初始化

t0_num=0;

s1num=0;

week=1;

dula=0;

//关闭数码管显示

wela=0;

lcden=0;

rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入

write_ds(0x0A,0x20);

//打开振荡器

write_ds(0x0B,0x26);

//设置24小时模式,数据二进制格式,开启闹铃中断

set_time();

//设置上电默认时间

---------------*/

write_com(0x38);

//1602液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num<15;num++)

//写入液晶固定部分显示

{

write_data(table[num]);

delay(1);}

write_com(0x80+0x40);

for(num=0;num<11;num++)

{

write_data(table1[num]);

delay(1);

} } void write_sfm(uchar add,char data)

{ //1602液晶刷新时分秒函数,4为时,7为分,10为秒

char

shi,ge;

shi=data/10;

ge=data%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);} void

write_nyr(uchar add,char

data)

{

//1602液晶刷新年月日函数,3为年,6为月,9为日

char

shi,ge;

shi=data/10;

ge=data%10;

write_com(0x80+add);

write_data(0x30+shi);

write_data(0x30+ge);void

write_week(char we)

//写液晶星期显示函数 {

write_com(0x80+12);

switch(we)

{

case 1:

write_data('M');delay(5);

write_data('O');delay(5);

write_data('N');

break;

case 2:

write_data('T');delay(5);

write_data('U');delay(5);

write_data('E');

break;

case 3:

write_data('W');delay(5);

write_data('E');delay(5);

write_data('D');

break;

case 4:

write_data('T');delay(5);

write_data('H');delay(5);

write_data('U');

break;

case 5:

write_data('F');delay(5);

write_data('R');delay(5);

write_data('I');

break;

case 6:

write_data('S');delay(5);

write_data('A');delay(5);

write_data('T');

break;

case 7:

write_data('S');delay(5);

write_data('U');delay(5);

write_data('N');

break;

} } void keyscan(){ if(flag_ri==1){

//这里用来取消闹钟报警,按任意键取消报警

if((s1==0)||(s2==0)||(s3==0)||(s4==0))

{

delay(5);

if((s1==0)||(s2==0)||(s3==0)||(s4==0))

{

while(!(s1&&s2&&s3&s&s4));di();

flag_ri=0;

//清除报警标志

}

}

}

if(s1==0)

//检测s1

{

delay(5);

if(s1==0)

{

s1num++;

//记录按下次数

if(flag1==1)

if(s1num==4)

s1num=1;

flag=1;

while(!s1);di();

switch(s1num)

{

//光标闪烁点定位

case 1: write_com(0x80+0x40+10);

write_com(0x0f);

break;

case 2: write_com(0x80+0x40+7);

break;

case 3: write_com(0x80+0x40+4);

break;

case 4: write_com(0x80+12);

break;

case 5: write_com(0x80+9);

break;

case 6: write_com(0x80+6);

break;

case 7: write_com(0x80+3);

break;

case 8: s1num=0;

write_com(0x0c);

flag=0;

write_ds(0,miao);

write_de(2,fen);

write_ds(4,shi);

write_ds(6,week);

write_ds(7,day);

write_ds(8,month);

write_ds(9,year);

break;

}

}

}

if(s1num!=0)

//只有当s1按下后,才检测s2和s3

{

if(s2==0)

{

delay(1);

if(s2==0)

while(!s2);di();

switch(s1num)

{

//根据功能键次数调节相应数值

case 1: miao++;

if(miao==60)

miao=0;

write_sfm(10,miao);

write_com(0x80+0x40+10);

break;

case 2: fen++;

if(fen==60)

fen=0;

write_sfm(7,fen);

write_com(0x80+0x40+7);

break;

case 3: shi++;

case 4:

case 5:

case 6:

case 7:

}

}

}

if(s3==0)

{

delay(1);

if(shi==24)

shi=0;

write_sfm(4,shi);

write_com(0x80+0x40+4);

break;week++;

if(week==8)

week=1;

write_week(week);

write_com(0x80+12);

break;day++;

if(day==32)

day=1;

write_nyr(9,day);

write_com(0x80+9);

break;month++;

if(month==13)

month=1;

write_nyr(6,month);

write_com(0x80+6);

break;year++;

if(year==100)

year=0;

write_nyr(3,year);

write_com(0x80+3);

break;

if(s3==0)

{

while(!s3);di();

switch(s1num)

{

//根据功能键次数调节相应数值

case 1: miao--;

if(miao==-1)

miao=59;

write_sfm(10,miao);

write_com(0x80+0x40+10);

break;

case 2: fen--;

if(fen==-1)

fen=59;

write_sfm(7,fen);

write_com(0x80+0x40+7);

break;

case 3: shi--;

if(shi==-1)

shi=23;

write_sfm(4,shi);

write_com(0x80+0x40+4);

break;

case 4: week--;

if(week==0)

week=7;

write_week(week);

write_com(0x80+12);

break;

case 5: day--;

if(day==0)

day=31;

write_nyr(9,day);

write_com(0x80+9);

break;

case 6: month--;

if(month==0)

month=12;

write_nyr(6,month);

write_com(0x80+6);

break;

case 7: year--;

if(year==-1)

year=99;

write_nyr(3,year);

write_com(0x80+3);

break;

}

}

}

}

if(s4==0)

//检测s4

{

delay(5);

if(s4==0)

{

flag1=~flag1;

while(!s4);di();

if(flag1==0)

{

//退出闹钟设置时保存数值

flag=0;

write_com(0x80+0x40);

write_data(' ');

write_data(' ');

write_com(0x0c);

write_ds(1,miao);

write_ds(3,fen);

write_ds(5,shi);

}

else

{

//进入闹钟设置

read_alarm();

//读取原始数据

miao=amiao;

//重新赋值用以按键调节

fen=afen;

shi=ashi;

write_com(0x80+0x40);

write_data('R');

//显示标志

write_data('i');

write_com(0x80+0x40+3);

write_sfm(4,ashi);

//送液晶显示闹钟时间

write_sfm(7,afen);

write_sfm(10,amiao);

}

}

} } void write_ds(uchar add,uchar

data){

//写12C887函数

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

P0=add;

//先写地址

dsas=0;

dsrw=0;

P0=data;

//再写数据

dsrw=1;

dsas=1;

dscs=1;} uchar

read_ds(uchar add){

//读12C887函数

uchar

ds_data;

dsas=1;

dsds=1;

dsrw=1;

dscs=0;

P0=add;

//先写地址

dsas=0;

dsds=0;

P0=0xff;

ds_data=P0;

//再读数据

dsds=1;

dsas=1;

dscs=1;

return ds_data;} /*---首次操作12C887时给予寄存器初始化-----void set_time(){

//首次上电初始化时间函数

write_ds(0,0);

write_ds(1,0);

write_ds(2,0);

write_ds(3,0);

write_ds(4,0);

write_ds(5,0);

write_ds(6,0);

write_ds(7,0);

write_ds(8,0);

write_ds(9,0);}----------------------*/

void

read-alarm(){

//读取12C887闹钟值

amiao=read_ds(1);

afen=read_ds(3);

ashi=read_ds(5);} void main()

//主函数 {

init();

//调用初始化函数

while(1)

{

keyscan();

//按键扫描

if(flag_ri==1)

//当闹钟中断时进入这里

{

di();

delay(100);

di();

delay(500);

}

if(flag==0&&flag1==0)

//正常工作时进入这里

{

keyscan();

//按键扫描

year=read_ds(9);

//读取12C887数据

month=read_ds(8);

day=read_ds(7);

week=read_ds(6);

shi=read_ds(4);

fen=read_ds(2);

miao=read_ds(0);

write_sfm(10,miao);

//送液晶显示

write_sfm(7,fen);

write_sfm(4,shi);

write_week(week);

write_nyr(3,year);

write_nyr(6,month);

write_nyr(9,day);

}

} } void

exter()interrupt 2

//外部中断1服务程序 {

uchar

c;

//进入中断表示闹钟时间到

flag_ri=1;

//设置标志位,用于大程序中报警提示

c=read_ds(0x0c);

//读取12C887的C寄存器表示响应了中断 }

_______________________________________________________________________________ 以下为define.h源代码:

_______________________________________________________________________________ #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;

//功能键 sbit s2=P3^1;

//增大键 sbit s3=P3^2;

//减小键 sbit s4=P3^6;

//闹钟查看键 sbit rd=P3^7;sbit beep=P2^3;

//蜂鸣器 sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;bit flag1,flag_ri;

//定义两个位变量

uchar count,s1num,flag,t0_num;

//其他变量定义 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code

table[]=“201-

”;

//液晶固定显示内容 uchar code

table1[]=“

:

:

”;

void write_ds(uchar,uchar);

//函数申明 void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();

四、心

在本次电子时钟设计中对单片机的内部结构有了一定的了解,熟悉了各个引脚的功能,同时熟知了1602LCD液晶、DS12C887时钟芯片的使用,以及各种电路的功能。

通过此次课程设计,无论是从软件方面还是硬件方面,都进一步学习和巩固了程序的总体设计和单片机的应用。在软件方面,进一步熟悉了各条指令的功能及用法,定时、中断的用法,更深一步学习了用C语言编写实现电子时钟的功能。在硬件方面,进一步熟悉并使用了keil软件,在keil中编程,调试,运行;对电路的一些基本结构和设计有了更深一步的了解。在整个设计过程中,虽然出现了很多问题,有时确实叫人很心烦,但在发现问题后努力去解决,并获得成功,这时会感到无比的快乐和具有成就感。只有自己动手去做,去应用,才能将学到的知识变成自己的。

程序不要光看不写,一定要自己写一次。最开始的时候,可能自己啥都不懂,这时可以抄人家的程序过来。但在抄的时候一定要看看每一句是干什么用的,来达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次。此时会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。

单片机提高重在实践,想要学好单片机,软件编程必不可少。但是熟悉硬件对于学好单片机也是非常重要的。如何学习好硬件,动手实践是必不可少的。我们可以通过自己动手做一个自己的电子制作,通过完成它,以提高对一些芯片的了解和熟练运用。这样我们就可以多了解一些芯片的结构。

我学习的目标是希望在若干年以后能够独立设计一个复杂的系统,包括硬件电路和软件部分。总之,通过这次电子技术设计我学到了许多,似乎离自己的目标又近了一步。

[1]郭天祥.51单片机C语言教程.电子工业出版社.202_ [2]谭浩强.C程序设计.清华大学出版社.1991 [3]孙育才 王荣兴

孙华芳.ATMEL新型AT89S52系列单片机及其应用.清华大学出版社.202_ [4]谢维成.单片机原理及应用与51程序设计.清华大学出版社.202_

[5]鲍宏亚.MCS—51系列单片机应用系统设计及实用技术.中国宇航出版社.202_ [6]赵文博

刘文涛.单片机语言C51程序设计.人民邮电出版社.202_ [7]求是科技.8051系列单片机C程序设计.人民邮电出版社.202_

    版权声明:此文自动收集于网络,若有来源错误或者侵犯您的合法权益,您可通过邮箱与我们取得联系,我们将及时进行处理。

    本文地址:https://www.feisuxs.com/wenku/jingpin/1/2747603.html

相关内容

热门阅读
随机推荐