课程设计论文-基于89c51单片机的数字电子钟设计内容摘要:
的制作 本次设计的数字钟系统中由于频率不是特别高,所以在设计 PCB 板时不存在考虑走线之间频率干扰问题, 但由于设计规定了 PCB 板的大小为 7*9cM,并且是单面板,所以对我们的设计带来了一定的难度,在设计中不得不通过走飞线的方式完成 PCB 板的制作。 5. 1 PCB 板的制作规则 我在数字钟设计中采用 Orcad 软件平台, 完成了 PCB 的制作, 在 PCB 的设计中需注意以下的一些规则: ( 1) 在 Orcad 中制作 PCB 时一定要注意板层的设置,我们本次设计的是单面板,所以需将 Bottom 层设为走线层, TOP 层设为丝印层( DOC 层),别的板层全部设为 不走线层。 ( 2) 由于本次设计的单面板大小规定为 7*9Cm,所以在开始制定板框大小时,在 Global 层画边框时,将其设置为规定的大小,然后根据一定的规则放置元件,放置元件时应让元件间的走线距离最小。 ( 3) 放置元件时须注意一些规则,例如将单片机的晶振和 电容靠近单片机放置, 将电源供电的 USB 接口靠近板框放置等。 ( 4) 在放置完元件之后,进 行布线时需注意一些走线时的设置,最重要的是元件过孔的孔径设置,为了制作方便,本次制作设为 、 、当然,设置了孔径,还需注意焊盘的大小,软件默认的焊盘大小一般太小,焊接时不太方便 ;其次是走线的安全间距设置, 走线间距一般默认为软件的设置,即 ;下来就是走线的一些规则设置,如果是自动布线,则可设置布线时的一些规则,如果是手工布线,则可根据需要进行布线。 ( 5) 在走线时一定要注意电源走线的设置,电源的走线一定要宽,这样承载的电流会更大, 电流的大小与走线的宽度之间有一定的计算公式,可以作 参考。 为了使单面板的布线方便,飞线更少,我们将地线设为敷铜种子,在敷铜时与大面积的铜相接。 5. 2 飞线的处理 由于 制作的 是单面板,难免有很多的飞线,在制作完 PCB 板之后,需处理飞线。 经常选取的办法是打过孔,这样在加工之后可以采用飞线将其连接。 当然,飞线的多少取决于布线的水平高低。 有时为了减少飞线而走很远的路,这样带来高频的影响,我觉得这种方法应该避免。 5. 3 PCB 制作中的注意事项 USB 供电 单片机数字钟设计报告 10 ( 1)要注意焊盘的大小、过孔的大小、走线的安全间距及走线的宽带,在适当的时候应该用游标卡尺进行测量,保证元器件能够合适的 插进去。 ( 2)对于一些自己制作的原件封装,一定要测量使之合理。 ( 3)电源走线一定要宽,实际上是越宽越好,但过宽会影响布线的效率。 适当的时候我们可以大概的计算一下, 使之更加合理。 ( 4)在布线时我们一定要弄清楚板层,有时一个放错了板层的字符,会带来制作时的困难,要想合理的完成制作,必须清楚板层。 ( 5)首次在 PCB 板上放置 USB 接口,一定要注意正负极不能接反。 ( 6)如果有必要,可以在每个芯片的 VCC 极和 GND极之间跨接一个 ~之间的瓷片电容。 为了使电源电压稳定,可以在电源电压与 地之间接一个滤波电容,如果电源电压波动较大,则可以使用稳压芯片来稳压。 ( 7)在敷完铜之后,需要观察敷铜区域,避免有些接地的敷铜区域形成孤岛。 如果存在孤岛,则需要与最近敷铜区连接起来,经常采用打过孔走飞线的方式使其连接起来。 ( 8)在放置元件时,由于设置了安全间距,元件放置较近时会出现报错提示,但这对 PCB 板的制作是没影响的。 5. 4 制作后的 PCB 板如下 软件模块的设计 本次设计单片机数字钟,供可选择的语言有汇编语言和 C 语言两种选择,单片机数字钟设计报告 11 从总体角度考虑,两种语言各有其优缺点。 汇编语言在编写过程中 可以较容易的计算出机器周期,这样可以计算出相应的延时与误差,并且在编译过程中精度较高,执行效率也较高,是各种语言中执行效率最高的一种。 相反,汇编语言又是一种较为低级的语言,编写起来难度较大,程序量也较大, 不易编写大规模的系统。 C 语言它的灵活性较强,语法功能也比较强大,对于同一个设计,与汇编语言相比,工作量较小,完全可以实现汇编无法实现的一些功能。 虽然 C 语言具有强大的功能,但也有不足之处,比如在循环延时时不易计算出相应的机器周期,还有,采用不同的编译器,可能以不同的方式编译出不同的机器码。 由于本次设计的单片 机数字钟编程量较大,又考虑到后面的工作过程中将大量使用 C 语言编程,所以本次编写过程采用 C 语言,基于 Kiel C3 软件来完成软件模块的设计工作。 6. 1 数字钟总体设计框图 编程 设计 数字钟大家可能最常用的就是采用单片机中的定时器定时的方法,由于定时器不能一次定时 1s,所以需采用定时一定的时间,循环叠加的方法,加到一秒后,将其显示的秒加一,然后判断分和时是否加一,这样就完成了数字钟的最基本制作。 我在此次设计中采用的方法完全不同于上面的常规方法,主要是受到了EDA 中并行的影响,当然,单片机中是不可能实现并 行的,但我们可以用串行的方式模拟并行 ,实现数码管的扫描及采用延时粗略计算出 1s 的延时,这样很多人可能认为不准确,但我们可以分好多的延时,这样在校时时不会出现改一个数字出现大的变化的情况。 程序设计框图如下: 开 始 F0 = 1 设置闹钟的时间 =当前时间 F0 = 0 F0 = 1 闹钟报警 Y Y N N 闹钟流程图 单片机数字钟设计报告 12 开 始 扫 描 显示时间 I + + 总延时 1s i=0 秒加一 分 =60 秒 =00 分加一 秒 =60 分 =00 时加一 时 =24 时 =00 Y Y Y Y N N N N 正常走时流程图 单片机数字钟设计报告 13 开 始 给时分秒 6位数分配6 字节静态存储空间 中断优先级设置 开外中断 设置闹钟。 防抖延时 设置闹钟。 开定时器 0,定时 50ms 定时器中断。 将当前时分秒保 存到静态空间 N 时分秒全置零 扫描显示 是否外中断。 N 设置闹钟。 Y 保存闹钟设置时间 中断服务,对时及设置闹钟,相 应的时分加一 Y 计数器 m++ Y 取出设闹钟之前保存时间 加上 m*50ms 的设置闹钟耗时时间,扫描显示正常时间 Y Y 延 时 正常走时 N N N 闹钟设置流程图 单片机数字钟设计报告 14 6. 2 源程序 源程序见 附件 Ⅰ。 设计中的问题分析与解决 由于这是我第一次系统地进行设计,难免会遇到很多的问题。 当然,作为我们初学者来说,遇到问题越多收获也就也多,这就要看我们解决问题能力及方案了。 下面是我在这次设计中所遇到的一些问题总结。 ( 1) 由于此次设计数字钟,主要是由软件来完成的,所以硬件中的问题相对来说较少。 当我们将 PCB 板设计完之后,焊接上元件之后,如果出现不正常工作的情况,我们可以确定是硬件问题。 解决方案:①检查单片机是否正常工作,我们可以使用示波器进行观察单片机ALE(第 30 引脚)的输出波形,如果输出波形的频率是晶振频率 的 6 分频,则证明单片机是正常工作的。 ②如果单片机第 31 引脚没有输出波形,首先应 检查晶振 的好坏,我们可以更换晶振看其是否能正常工作。 ③如果还不正常工作,说明是硬件电路的设计有问题,首先我们应该检查的是所有芯片的电源是否正常。 ( 2) 我们采用 C 语言,利用单片机中的优点中断和定时器,完成数字钟其实很容易实现,但要完成精度相当高的数字钟设计,加上实现校时和闹钟功能之后,我们会遇到很多的问题。 首先是怎么避免由按键造成的延时误差,我们 总结 的方案有 4 种,分别是: ① 计算出按键延时的具体时间,按键一次则给定时器加上相应的按键延时时间,这样虽然可以大大的减小按键延时带来的时间误差,但还是有一定量的机器周 期的延时。 例如使用这种方法又需在定时器中添加一些判断语句,当符合条件时,将会增加一定 的机器周期。 ②通过采用设置优先级的方式可以清除按键防抖延时,在主程序中我们需要将定时器的中断优先级设为最高,别的中断优先级设为低,这样我们在按键中断时,如果定时器还未中断,则响应外部中断,这样对定时器的定时没有影响;如果在响应外部中断的时候,有定时中断,则优先响应定时中断,这样又对定时器的定时没有影响;如果在响应定时中断时,则别的中断不会影响到定时器的正常定时。 ( 3)在设定闹钟时间时,我们要确保定时器的 正常工作,如何 既要让数码管显示闹钟设置的相应时间,并且定时器的正常计数不能受到影响,我们应该如何解决这个矛盾呢 ? 解决方案:为了使编程更加方便,我们专门设置了一个启动设置闹钟的开关,当开关设为高电平时,则为闹钟设置,首先数码管上全部显示零,即清零。 然后按相应的校时按钮,则数码管显示被设置的相应时间,在设置闹钟的这期间,是如何确保相应时间的准确性呢。 我是这样解决的,当启动设置闹钟开关之后,在程序中同时启动另一个定时器开始定时工作,当定到 50ms 时,发生中断,相应的变量加一,这样我们就可以计算出在设置闹钟时所花费的时间。 当设置闹钟开关置到相应的低电平时,说明设置闹钟结束,在这同时,我们将变量所记的数 与50ms 相乘,计算出与之对应的秒数,加到闹钟设置之前保存到静态变量中的数上。 这种方法有一定的缺陷,会造成一定的延时,经过软件处理,延时将在 0~之间随机产生。 ( 4)在测量数字钟精度时,我们发现了一个问题,在数字钟正常工作时,会单片机数字钟设计报告 15 出现秒与秒之间不相等的情况,比如在 10 分钟之内我们与标准时间进行比较会发现,有时发现时间走的快,有时时间走的慢。 解决方案:后面在程序中发现,原因是由于程序中的 if 判断语句 ,在判断过程中 当满足条件时,会执行更多的语句,这样会有相应的机器周期的延时,所以会出现时间一会走的快一会走的慢的情况。 这种情况只有通过减少 if 语句,怎么减少 if 语句呢。 我们可以充分利用单片机的自身条件,充分利用单片机中的定时器,定时器不够用时我们可以选用 89c52 系列。 设计总结与心得 单片机数字钟可以说是一个较小的系统, 开始时我们觉得通过 C 语言较容易实现,确实,只实现一个能够正常走时并且能够校时的数字钟是比较容易的。 但我们想错了,毕竟是第一次从总体角度来考虑地完成一个小系统,好多的实际性的问题我们没有考虑,所以造成 我们最终设计的数字钟精度不高,并且存在好多问题,当然问题多了对我们来说是好事,这样我们在解决更多问题时学会更多解决问题的方法,对我们也算是长长经验吧。 最开始我们需要总体设计,这就是常常说的算法。 平时的编程实现的都是小功能,我们按照自己的想法直接写下去就可以实现,但这次不一样,我们不但要实现数字钟的正常工作,而且需要加上设置闹钟及闹钟到报警和是否已经设置了闹钟的指示灯提示,这在我们设计时会遇到好多的矛盾,当然矛盾我们可以一个个的解决,当 然 更重要的是在解决矛盾时 我们要确保时间的准确性,这又需要我们计算机器周期和处理一些延时程序的延时,这可能是我们本次设计中最 困难的问题,我们在解决这个问题中更深入的理解了单片机的内部结构,也学会了合理利用单片机中的定时器和中断处理。 除了在编写程序中遇到的问题之外,我对程序又有了更深一层的认识,就像王老师经常说的那样,人类只是现在还没有弄清楚人类的思维方式,如果有一天生物科技真正研究通了人类自己的思维方式,机器人将真的会有自己的思维方式,可能真的就会战胜人类了。 在这次设计中,让我真的明白了,只要我们想明白的事情,我们一定会用程序将其描述出来 ,不管它有多么的复杂。 接 下来就是 PCB 的制作,这次可算是经历了全部过程,从画原理图到 PCB的导出,最后到生产加工出成品,尤其是 PCB 板的加工生产过程尤为重要,从生产加工中我们可以学到很多在画 PCB 时的注意事项,也理解了我们在软件中的各种设置的重要性及 的差距。 看着加工机床的机械臂在那儿来回着工。课程设计论文-基于89c51单片机的数字电子钟设计
相关推荐
A 车道绿灯亮,南北方向 B 车道红灯亮。 表示南北方向 B 车道上的车辆禁止通行,东西方向 A 车道允许通行。 绿灯亮足规 定的时间隔时,控制器发出状态信号,转到下一工作状态。 ( 2)东西方向 A 车道黄灯亮,南北方向 B 车道红灯亮。 表示东西方向 A 车道上未过停车线的车辆停止通行,已过停车线的车辆继续通行,南北方向 B 车道禁止通行。 黄灯亮足规定时间间隔时,控制器发出状态转换信号
实现时钟计时的基本方法 利用 MCS51 系列单片机的可编程定时 /计数器、中断系统来实现时钟计数。 (1) 计数初值计算 : 把定时器设为工作方式 1,定时时间为 50ms,则计数溢出 20 次即得时钟计时最小单位秒,而 100 次计数可用软件方法实现。 假设使用 T/C0,方式 1, 50ms 定时, fosc=12MHz。 则初值 X 满足( 216X) 1/12MHz 12μ s
电压。 唐山学院课程设计 5 XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 逐次逼近式 A/D 转换模块设计 逐次逼近型 A/D 转换器属于直接型 A/D 转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。 主要由比较器、环形分配器、控制门、寄存器与 D/A 转换器组成。 引脚功能 图 14 ADC0808 引脚图
LCALL DL1MS LCALL DL1MS JNB , SSWAIT SSST: MOV TIME, TIMED0。 120S LCALL TUNBCD MOV SN, 99H MOV EW, 0AAH SETB EA。 总中断开放 SETB PX1 SETB EX1 SETB ET0。 允许 T0 中断 SETB TR0。 开启 T0 定时器 MOV R4, 14H。 1S 定时用初值(
if(s1==0) //功能键按下 { while(s1==0)。 //松手检测 s1num++。 //功能键按下计数 TR0=0。 //T0 定时停止,进入时间调整 switch(s1num) { case 1: write_(0x80+0x40+0x09)。 break。 //光标闪烁位定为秒个位 case 2: write_(0x80+0x40+0x06)。 break。
即驱动蜂鸣器鸣叫、 8 个发光二极管发光 主程序流程图: 开始 显示实时温度 温度设定、报警 查询记录温度值 定时器初始化、启动 图 12 主程序流程图 读温度值模块 读温度值模块需要调用 4 个子程序,分别为: DS18B20 初始化子程序:让单片机知道 DS18B20 在总线上且已准备好操作 DS18B20 写字节子程序:对 DS18B20 发出命令 DS18B20 读字节子程序