沈阳航空工业学院
(论文)
题目 多功能数字钟的设计
班 级
学 号
学 生 姓 名
指 导 教 师
1
目 录
0. 前言 .................................................................................................................. 4
1. 总体
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
设计 ................................................................ 错误~未定义
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
签。3
2. 硬件电路的设计 ............................................................................................... 7
2.1单片机主机系统电路的设计.......................................................................
2.2汽车信号灯模拟系统电路的设计 ...............................................................
2.2.1输入口电路的设计 .............................................................................
2.2.2输出口电路的设计 .............................................................................
2.3汽车里程
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
模拟系统电路的设计 ...............................................................
3. 软件编程 ........................................................................................................ 10
3.1 T1计数子程序的设计 ......................................................................................................... 10
3.2 外部中断0子程序的设计 ............................................................................................... 10
3.3 外部中断1子程序的设计 ............................................................................................... 10
3.4 里程数处理及显示子程序的设计 ............................................................................... 10
4. 系统调试和分析 ............................................................................................. 29
4.1 软件调试 .................................................................................................................................... 10
4.2 软硬联调 .................................................................................................................................... 10
4.3 调试问题及原因分析 .......................................................................................................... 10
5. 结论及进一步设想 ......................................................................................... 29
参考文献 .......................................................................... 错误~未定义书签。17
课设体会 ............................................................................................................. 31
附录? 元件清单 .............................................................................................. 29
2
附录? 总体电路图 ............................................................................................................................ 29
录? 源程序 .................................................................................................. 29 附
3
小五字,宋
体,为题目名
称
多功能数字钟的设计
摘要:本文设计的是基于单片机的多功能数字钟的设计,本系统设计以AT89C51单片机为核心,分成四个模块,一是显示系统:此系统采用8位LED显示,实现时、分、秒的精确显示;二是时钟计算系统:此系统主要实现对外部脉冲的计数,并用LED数码管将其结果动态显示;三是闹钟定时系统:该系统主要实现闹钟的定时与响铃功能;四是12与24进制转换系统,此系统主要实现由12小时计时方式转换为24小时计时方式。, LED数码管的动态显示可以及时准确的将精确的时间显示出来,在实际应用中很方便。
关键词:AT89C51单片机;按键;脉冲计数;动态显示
0. 前言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远
4
远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。
1.总体方案设计
按键开关 复
位单 电 片路
时钟电路 机LED显示
图1 多功能数字钟单片机模拟系统基本组成框图
单的系统从而达到强化课本知识并灵活运用的目的。电子数字钟是日常生活钟随处可见的简单系统。对电子数字钟的设计比较容易联系实际并进行拓展, 在设计中我将力求尽可能跳出课本的样板,从现实生活中寻找设计原型和设计思路,争取有所突破
电子时钟主要由显示模块,校时模块,时钟运算模块和12与24进制转换模块四大部分组成。其中校时模块和时钟运算模块要对时、分、秒的数值进行操作,并且秒计算到60时,要自己清零并向分进1;分计算到60时,要自己清零并向时进1;时计算到24时,要清零。这样,才能循环记时。
89C51是8位CPU,具有片内振荡器和时钟电路,2个16位的定时器/计数器,5个中断源,两个中断优先级。89C51单片机的时钟信号通常用内部振荡方式得到:
5
在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲.电容器Col,C02起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF。晶振频率的典型值为12MHZ校时模块主要功能是修改时、分、秒内存单元的数值。每按一次键,对应的显示值便加1。分、 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不发生改变)。注意:在主程序中对时间进行调校前应关闭中断,以防在调校过程中定时中断服务程序也对时间进行修改而造成混淆。
数字钟的设计首先要保证其走时尽可能准确,其次再根据人们日常的使用习惯来设定其附加功能。在设计中利用单片机定时计数器来完成走时并用两组输出口控制数码管来显示;通过编程向某一输出口输出方波实现报时及闹铃;利用输入端口外接各种开关来完成对走时及显示的控制(如预置时间等)。在设计中需要用到许多技巧。以下为我在学习单片机课程中总结的一些设计思想或方法: 占空比概念在设计中的运用
图2 占空比
如图所示的一串方波序列,导通时间同周期的比值即占空比。在用单片机控制对多个数码管的扫描显示中,数码管接收到的电压可以看成是一串方波序列,占空比控制了数码管的亮度。实际上对显示延时时间的调节就是调节数码管电压的占空比,当占空比大于一定数值的时候数码管可以显示,实验证明占空比在0.1时仍可以使数码管清晰显示。利用这个概念可以比较直观地理解显示延时的调节。
的分时复用
单片机只有一个CPU,因此在一个时间内只能执行一条语句,要使单片机同时控制多个外部元件(比如扬声器和数码管)就必须对单片机的CPU进行分时复
6
用,让单片机在一小段时间内连续交替执行控制多个器件的语句,从表面上看,单片机便用一个CPU控制了多个元件。本次课程设计中对整点报时和闹铃功能的实现便用到了这个概念。
单片机位寻址区的使用
单片机内部数据存储器由20H到2FH共有16个字节的位寻址区可以被作为程序执行过程中的状态
参数
转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应
,许多程序模块至于两个状态(比如闪烁与正常显示,报时与不报时等)用位寻址区中的某一位来记录程序执行状态,在需要对状态进行判断的时候十分方便并且节约空间,一个字节便可以判断八个状态,而非位寻址区的地址记录程序状态时可能需要先进行变换,增加了执行成本且容易出错。 检测开关时需要注意的问题
对于用各种开关控制程序执行状态的程序设计中,需要注意实时地进行开关的检测,以确保一旦有开关动作,程序状态立即随之改变。此外,在用多个开关控制不同执行状态时,应注意设置开关检测的优先级以防止多个开关同时按下时出现错误。
系统资源分配与使用
单片机有许多资源是有限的不能滥用,比如定时计数器T,外部中断等,在设计一个多模块程序时,要注意先做一个整体规划,把稀缺资源用在最需要用的地方。此外在有多个模块时,要注意模块间的数据传递,比如累加器A和进位标志C,在使用时要注意不能让前一个模块的数据对下一个模块产生不希望有的影响。在模块间的数据传递比较多时最好用固定的内部数据存储器,以避免冲突发生错误。
2. 硬件电路设计
由单片机硬件设计原理可知:(1)尽可能采用功能强的芯片,以简化电路;(2)留有余地。在设计硬件电路时,要考虑到将来修改、扩展的方便。因此在AT89C51芯片本身的最小系统需求外,还选择了上拉电阻进行了简单的扩展。
7
2.1单片机主机系统电路的设计
单片机主机系统原理图如图3所示。
C133PF
1939Y1XTAL1P0.0/AD0 38P0.1/AD137P0.2/AD2GNDC2U1183633PFXTAL2P0.3/AD3 35P0.4/AD4VCC34AT89C51R2P0.5/AD533P0.6/AD6 93210kRSTP0.7/AD7C321R1P2.0/A8 221uFP2.1/A923GND10kP2.2/A102924 PSENP2.3/A113025ALEP2.4/A123126EAP2.5/A1327 P2.6/A1428P2.7/A15
110 P1.0P3.0/RXD211P1.1P3.1/TXD312P1.2P3.2/INT0413 P1.3P3.3/INT1514P1.4P3.4/T0615P1.5P3.5/T1716 P1.6P3.6/WR817P1.7P3.7/RD
图3 单片机主机系统原理图
由图3可知,此系统有两部分:时钟电路和复位电路。
时钟电路:AT89C51内部有一个用于构成震荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成一个自激振荡器。外接晶体以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。(晶体可在1.2MHz,12MHz之间任选,电容C1和C2的典型值在20pF,100pF之间选择)
复位电路:本系统的复位电路是采用按键复位的电路,复位输入引脚RET为AT89C51提供了初始化的手段。当89C51的ALE及PSEN两引脚输出高电平,RET引脚高电平到时,单片机复位。按下按钮,则直接把+5V加到了RET端从而复位称为手动复位。复位后,P0到P3并行I/O口全为高电平,其它寄存器全部清零,只有SBUF寄存器状态不确定。
8
2.2多功能数字钟的时、分、秒的调制电路
C1U1
1939XTAL1P0.0/AD038X1P0.1/AD13722pCRYSTALP0.2/AD2C21836XTAL2P0.3/AD335P0.4/AD434P0.5/AD5C33322pP0.6/AD6932RSTP0.7/AD7
21220pP2.0/A822P2.1/A923P2.2/A102924PSENP2.3/A113025ALEP2.4/A123126EAP2.5/A1327P2.6/A1428P2.7/A15
SET110P1.0P3.0/RXD211P1.1P3.1/TXD312P1.2P3.2/INT0UP413P1.3P3.3/INT1514P1.4P3.4/T0615P1.5P3.5/T1DOWN716P1.6P3.6/WR817P1.7P3.7/RD
AT89C51
图4多功能数字钟的时、分、秒的调制电路
分别设置了三个按键:set、up、down用于高低电平的输入。LED灯组与单片机AT89C51相连接至P0口,用于输出时间的状态。没有开关闭合时,时间处于正常显示状态, LED灯显示当时的时间。开关set键按下时,如果按下一次,则可以对小时进行调整,若小时加1,则继续按up键,若需要小时减1,则需按down键;如果set键按下两次,则可以对分进行调整,具体原理与小时的调整一样;若果set键按下三次,则是对秒进行调整,具体原理 时、分相同。此系统减少了端口的使用,简化了电路,方便了电路以后的使用和修改。
9
2.3多功能数字钟显示系统的设置:
函数信号发生器输出脉冲作为输入接至P3.5口,由单片机内部计数器T1进行计数,选用7段6位共阳极数码管,与单片机的P0口相连,6个位选端分别与单片机的P2.0~P2.5口相连组成显示电路,实现时间的动态显示。在多位LED显示时,为了简化电路,节省I/O口,降低成本,动态显示方案具备一定的实用性,也是目前单片机数码管显示较为常用的一种显示方法。
在本设计课题中采用的是7段6位共阳极LED数码管,它的引脚图如图7所示。
1 2 3 4 5 6 7 8 T T T T T T T T I I I I I I I I B B B B B B B B
图5 7段6位共阳极LED数码管引脚图
7段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,7段数码管分共阴和共阳两种显示方式,本设计中采用共阳极显示器。共阳极显示器的发光二极管的阳极连接在一起,当公共阳极接电源+5V时,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。通常将控制发光二极管发光的8位字节数据编码称为LED显示的段选码,要构成多位LED显示时,除需要段选线外,还需要位选线,以确定段选码对应的显示位,位选线控制第几个LED显示。段选线控制显示字形。8个阴极分别与8个限流电阻相连,在接到相应的电路中(发光二极管的工作电流选取在10-20ma,限流电阻太大,数码管会太亮),其连接图如图6所示。
10
7段共阳极LED连接图 图6
多功能数字钟显示系统电路如图7所示,当按键按下输出脉冲时,内部定时器T1开始计数,脉冲数相当于时间,脉冲数通过单片机内部算法经数码管显示结果。按键set为多功能数字钟的调整键,模拟多功能数字钟时,LED数码管显示当前时间,并随时根据调整的时间进行实时的显示。
RP1RESPACK-8
1
23456789
图7多功能数字钟显示系统电路
11
3. 软件编程
在单片机系统的程序的设计开发中,单片机就如同整个系统的交通中枢,而程序就是组成交通中枢的条条大道,各个部分的模块化的程序就是整个系统的组成成份。软件编写的好坏,语句运用的是否简洁直接关系单片机的工作效率。在各个模块化的程序中尽量用最少的语句作最多的事情,不让语句出现歧义,这样就可以使整个程序可以在系统中更好的运行,使单片机工作效率大大的提高。
本系统编程部分是利用C语言完成的,采用模块化的设计方法,各子程序作为实现各部分功能和过程的入口,完成对灯的控制,脉冲计数和LED动态显示等部分的设计。
该课题的软件设计采用了模块化设计的思想即将程序划分为若干个相对独立的功能模块,画出每一个功能模块的详细流程图,并根据流程图编写程序,最后按照软件设计的总体结构框图,将各模块连接成一个完整的主程序。
在主程序的设计中要合理地调用各模块程序。模块化设计的优点是:无论是硬件还是软件,每一个模块都相对独立,故能独立地进行设计、研制、调试和修改,从而使复杂的工作得以简化。模块之间的相互独立也有助于研制任务的分解和设计人员之间的分工合作,这样可提高工作效率和仪表的研制速度。
本系统设计以AT89C51单片机为核心,分成四个模块,一是显示系统:此系统采用8位LED显示,实现时、分、秒的精确显示;二是时钟计算系统:此系统主要实现对外部脉冲的计数,并用LED数码管将其结果动态显示;三是闹钟定时系统:该系统主要实现闹钟的定时与响铃功能;四是12与24进制转换系统,此系统主要实现由12小时计时方式转换为24小时计时方式。, LED数码管的动态显示可以及时准确的将精确的时间显示出来,在实际应用中很方便。下面就其主要部分分别分析。
12
3.1主程序流程图
初始化(定时
器,显示区中
断系统,计数
单元等) 开 中 断 调用显示子程序
调 用 键N 有键按下, 盘 扫 描 关子 中程 N 断 序 秒键,
秒加1处理
N 分键,
分加1处理
N 小时键,
小时加1处理
图6主程序流程图
13
3.2定时中断流程图
定时器中断处理
重送初值
保护现场
计数单元加1
到1秒,
秒加1
N 秒到60,
秒清0分加1
分到60,
分清0,小时加1
N
小时到24,
小时清0
恢复现场
中断返回
图7 定时器中断流程图
14
在单片机系统的程序的设计开发中,单片机就如同整个系统的交通中枢,而程序就是组成交通中枢的条条大道,各个部分的模块化的程序就是整个系统的组成成份。软件编写的好坏,语句运用的是否简洁直接关系单片机的工作效率。在各个模块化的程序中尽量用最少的语句作最多的事情,不让语句出现歧义,这样就可以使整个程序可以在系统中更好的运行,使单片机工作效率大大的提高。
本系统编程部分是利用C语言完成的,采用模块化的设计方法,各子程序作为实现各部分功能和过程的入口,完成对时,分,秒以及闹铃和12进制与24进制转换的控制,脉冲计数和LED动态显示等部分的设计。
在主程序的设计中要合理地调用各模块程序。模块化设计的优点是:无论是硬件还是软件,每一个模块都相对独立,故能独立地进行设计、研制、调试和修改,从而使复杂的工作得以简化。模块之间的相互独立也有助于研制任务的分解和设计人员之间的分工合作,这样可提高工作效率和仪表的研制速度。
4.调试分析
4.1 软件调试
本次设计采用的是keil仿真器进行软件调试,此系统可以开发应用软件,以及对硬件电路进行诊断、调试等。它的具体功能是可以进行CPU仿真,可以单步、跟踪、断点和全速运行,而且,程序的编译过程中,可以对设计软件进行自诊断,并自动给出故障原因。同时用户调试程序时,可以通过窗口观察寄存器的工作状况,以便及时发现和排除编程中可能出现的错误。
软件的调试是利用keil软件,模块化调试,通过观察存储单元数据的
变化,查找并解决程序的语法和逻辑错误,具体的调试步骤如下:
1. 把系统的各个模块在仿真软件中逐个调试,如时间调整模块、显示模
块等。
2. 对各个需要赋值模块调试时,赋入初值,单步调试,观察数据窗口,
看输出结果是否为设计时想要的结果。
3. 把各个模块组合起来,全速运行,看程序是否能流畅的,是否能实现设计的系统的所有功能。
15
4.2 软硬联调
本设计是采用Proteus软件实现电路图设计和仿真的,Proteus软件与Keil软件联合使用,实现设计要求。
在Keil软件中创建新文件,输入所编写的c语言程序并保存,在编译源程序无误后,会产出相应的”.HEX”文件;将所生成的”.HEX”文件加载到已绘制好的Proteus原理图中,使Proteus与Keil真正连接起来,实现联合调试。调试结 结果如图8所示:
1 2 3 4 5 6 7 8 T T T T T T T T I I I I I I I I B B B B B B B B
5结论及进一步设想(需说明的问题)
该课题的主要任务是设计一个以89C51单片机为核心的多功能数字钟系统。通过联调,实验验证了系统的可行,能满足设计要求,达到设计的指标,最后实现了对多功能数字钟的控制和时间的计算并用LED显示的目的。这个开发过程主要包括了硬件电路仿真设计和软件编程两个部分。从确定课设题目,到查阅质料确定总体方案设计,硬件电路仿真的设计,硬件电路的优化,软件的设计,软件的优化,检验仿真电路,调试软件程序,到最后的软硬件联调,其中的每一个过程都是精心设计、仔细完成的。并且在这次设计中,我了解了单片机的各种问题以及单片机外围电路的设计,对外围电路所涉及的芯片也有了较深刻的理解。同时对单片机的优点有了很好的认识。
16
虽然本次设计的系统具有电路简单、性能可靠、成本低,还有优化的程序等特点,但是该设计还是不够完善及人性化,比如加上AT24C02掉电存储芯片就可以在电源断开的时候,存储当前信息,再加上语音的提示功能,则可能更会有生命力。总之,智能仪器被广泛应用于
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
之中,而数字式仪表领域也被广泛用于实际的应用中,这也就是智能仪器的工程应用价值。
参考文献
1. 张毅坤 陈善久 裘雪红. 单片微型计算机原理及应用. 西安电子科技大学出版社. 1998年9月第1版.
. 电子技术基础课程设计. 中央广播电视大学出版社. 1997年5月第2( 任为民
1版.
3(谭浩强. C程序设计(第二版). 清华大学出版社. 1999年12月第2版.。 4( 刘复华.单片机及其应用系统.北京:清华大学出版社,1992 5(周坚. 单片机C语言轻松入门.北京:航空航天大学出版社,2006 6( 侯玉宝,陈忠平. 基于Proteus51系列单片机设计与仿真. 北京:电子工业出版社,2008
7( 戴佳,苗龙,陈斌. 51单片机应用系统开发典型实例. 北京:中国电力出版社,2005
8. 张立科. 单片机典型模块设计实例导航.北京:中国邮电出版社,2006
17
课设体会
在本次课程设计开始时我就希望能通过这次课程设计学习到尽可能多的知识。因此我选择了难度比较大的数字钟。此前在学习数字电子技术课程的时候,课程设计的题目同样也是数字钟,但是由于使用的语言和硬件不同,设计过程需要考虑的问题也大不相同。数电课程设计的模块划分是由老师完成的,而这个工作锻炼价值很大;同时,数电课设中不需要考虑CPU的时间复用问题,因此,因此本次课程设计的难度比较大。
在课程设计的第一次调试过程中,出现了许多我无法解释的问题,使我有些灰心,但是在认真重新读完自己的程序以后,我发现原来出现问题的原因都是自己的粗心,在修改完这些问题以后,接下来的调试就比较顺畅了归结原因主要还是我对流程图的设计下了很多功夫,为调试打下了良好的基础。我对程序设计课程的学习的目标是在若干年以后能够独立设计一个复杂的系统,包括硬件电路和软件部分。所以,这次课程设计我付出了比别人跟多的努力,同样也学习到了更多的知识。
在我能够独立设计更复杂的实用系统的时候,回想现在我连设计一个简单的数字钟系统都没有很好的把握时,我一定会为自己的成长感到喜悦。
通过两个月的学习和调试过程,终于完成了单片机模块数字钟的工作。并且使数字钟够顺利运行,完成了预期的目标。从单片机模块数字钟的设计过程中也找到了一些单片机开发的规律:先了解所有元件的具体内容,从而画出其电路图,使数字钟从简易变成多功能的方式,虽没有做多功能数字钟,却知晓了其方法。从而让我踏入了单片机应用领域的第一步。然而在调试过程中有也有许多的不足之处:例如编写调试程序有点不足。希望能够在以后的不断深入学习中能够弥补自己的不足之处。同时更是朝着单片机应用领域迈进。
元器件清单
元件名称 型号 数量
单片机 AT89C51 1
LED数码管 7SEG-MPX8-CA-BLUE 1
按键 BUTTON 3
18
附录I 电路原理图
RP11
2345678
1000
SEG1SEG2SEG3U1SEG4SEG11939SEG5XTAL1P0.0/AD0SEG238SEG6P0.1/AD1SEG337SEG7P0.2/AD2SEG41836XTAL2P0.3/AD3SEG535P0.4/AD4SEG634P0.5/AD5SEG733P0.6/AD6LS1SEG8932RSTP0.7/AD7BIT121P2.0/A8BIT222P2.1/A9BIT323P2.2/A10BIT42924SOUNDERPSENP2.3/A11BIT53025ALEP2.4/A12BIT63126EAP2.5/A13BIT727P2.6/A14BIT828P2.7/A15110P1.0P3.0/RXD211P1.1P3.1/TXD312P1.2P3.2/INT0413P1.3P3.3/INT1模式514P1.4P3.4/T0615P1.5P3.5/T1716P1.6P3.6/WR加1817P1.7P3.7/RDAT89C51减1
闹钟开关
BIT1BIT2 BIT3BIT4BIT5BIT6 BIT7BIT8
19
附录2 程序清单
共有6种工作模式:正常计时、按键调时、按键调分、按键调秒、闹钟调时、
闹钟调秒,按设置键切换工作模式。
#include
#include"DS18B20.H"
#define uint unsigned int
#define uchar unsigned char
uchar code
segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc
6};
//0,1,2,3,4,5,6,7,8,9,-,C
uchar code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选码
uchar buffer[]={0,0,0,0,0,0,0,0}; uint hour,min,sec;
uint ringhour,ringmin;
uint status,T;
sbit beep=P1^0; //闹钟
bit ringoff;
bit flag;
void keyprocess(unsigned char);
/**********延时函数************/
void delayMS(uint t) // 晶振频率12M
20
{
uint i;
while(t--)
for(i=0;i<125;i++);
}
void delay() //闹铃的延时
{
uint m,n;
for(m=0;m<20;m++)
for(n=0;n<20;n++);
}
/************数码管显示函数****************/ void display()
{
uchar i;
if (status==4||status==5) //闹钟调时、调分状态
{
buffer[0]=ringhour/10;
buffer[1]=ringhour%10;
buffer[3]=ringmin/10; // 显示分的十位
buffer[4]=ringmin%10; // 显示分的个位
for(i=0;i<8;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1); //防止数码管显示的时候闪动
21
P2=0x0;
}
}
else //正常计时显示
{
buffer[0]=hour/10; // 显示时的十位
buffer[1]=hour%10; // 显示时的个位
buffer[2]=10; // 显示‘-’
buffer[3]=min/10; // 显示分的十位
buffer[4]=min%10; // 显示分的个位
buffer[5]=10;
buffer[6]=sec/10; // 显示秒的十位
buffer[7]=sec%10; // 显示秒的个位
for(i=0;i<8;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1); //防止数码管显示的时候闪动
P2=0x0;
}
}
}
main() //主函数
{
bit keyrelease;
22
uchar buf;
uchar keyinput;
keyrelease=1;
buf=0xff;
ringoff=1;
TMOD=0x01; //T0工作在方式1,16位计数器
TH0=(65536-1000)/256; // 定时器0设置延时1ms中断初始值
TL0=(65536-1000)%256;
TR0=1;
IE=0x82; //开定时器0中断
status=0;
while(1) //死巡环
{
/****************************************************
键扫描程序,全扫描,逐行扫描。按键弹起后才处理
*****************************************************/
keyinput=P1&0xf0;
if(keyinput!=0xf0)
{
delayMS(10);
if(keyinput!=0xf0)
{
if(keyrelease==1)
{
keyrelease=0;
buf = keyinput; //buf用来暂时存放键值
23
}
}
else
{
keyrelease=1;
keyprocess(buf); //调用按键处理函数
// display();
buf = 0xff;
}
}
else
{
keyrelease=1;
keyprocess(buf);
// display();
buf=0xff;
}
if(ringoff==0&&hour==ringhour&&min==ringmin) //闹钟打开,定时
报警,报警时长1分钟
{ beep=0;
delay();
beep=1; }
T = ReadTemperature();
display();
}
24
}
/***************定时器0中断函数****************/ void timer0() interrupt 1 using 2 {
static uint count;
TH0=(65536-1000)/256; // 定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256;
TR0=1;
count++; //正常计时
if(count>=1000) // 定时 1S 到,以下为时钟的正常走钟逻辑
{
count=0;
sec++;
if(sec>= 60)
{
sec=0; min++;
if(min>= 60)
{
min=0; hour++;
if(hour>= 24)
{
hour=0;
}
}
}
if(sec==15||sec==35||sec==55) flag=1;
25
else if(sec==20||sec==40||sec==0) flag=0;
}
}
/**************按键处理函数***************/
void keyprocess(unsigned char key) //键值处理,6种状态,正常计时,
设置闹铃时分 设置时分秒,
{
switch (key)
{
case 0xe0:status++; //按下设置键
if (status>=6) status = 0;
break;
case 0xd0:switch(status) //按下加1键,5种模式下加1
{
case 0x01:if(hour<23) hour++;
else hour=0; break;
case 0x02:if(min<59) min++;
else min=0; break;
case 0x03:if(sec<59) sec++;
else sec=0; break;
case 0x04:if(ringhour<23) ringhour++;
else ringhour=0; break;
case 0x05:if(ringmin<59) ringmin++;
else ringmin=0; break;
}
26
到 NN Y 1 秒, 定时器保护重送秒
加现场初值中断处理 1
break;
case 0xb0:switch(status) //按下减1键
{
case 0x01:if(hour>0) hour--;
else hour=23; break;
case 0x02:if(min>0) min--;
else min=59; break;
case 0x03:if(sec>0) sec--;
else sec=59; break;
case 0x04:if(ringhour>0) ringhour--;
else ringhour=23; break;
case 0x05:if(ringmin>0) ringmin--;
else ringmin=59; break;
}
break;
case 0x70: ringoff=~ringoff; //闹钟的开和关
break;
default:break;
}
}
27
28
4. 系统调试与分析
系统的硬件、软件独调和系统调试是系统最后的步骤也是系统特别重要的环节,因为设计和开发出的系统是否成功,功能是否完善只有在这里才能显现出来。所以为了保证设计系统能够正常工作,必须对软件和硬件部分的每一个部分进行调试和分析。本章详细的介绍了软件调试和软硬联调的过程,并对调试结果进行了介绍和分析。
图15 调试结果图
5. 结论及进一步设想
课设体会
在老师的精心指导下三周的课程设计结束了,通过此次课程设计的训练,我深刻的体会到单片机技术是一门工程特点和实践性很强的学科。刚刚拿到题目时我觉得很盲目,根本无从下手,但是经过老师的指导以及多方面查询资料,我终
29
于得出了方案,完成了这次课程设计。
这次课程设计给我们提供了一个应用自己所学知识的机会,从到图书馆查找资料到对仪器的设计、调试,再到最后的成型,都对我所学的知识进行了检验。不仅使学过的知识得到了巩固与复习,同时也锻炼了我们使用仪器和计算机辅助软件的技能。但更重要的是把理论知识与实际联系在了一起,加强了思考问题的的完整性和可行性,锻炼了我的思考能力和动手能力。使学习变成了一种乐趣,使知识形象具体地被掌握。同时也为作好毕业设计做好准备工作。
三周的课程设计,向我的指导老师胡立夫老师致以深深的谢意。为了让我们更好的做课程设计,他给我们提供了做课设的专用实验室和实验设备,在这样良好的学习环境中我们互相探讨问题,学习氛围很浓。在这段课设时期里,胡老师渊博的知识、严谨的治学作风深深感染着我。当我的课设进度慢下来的时候,胡老师不断鞭笞我努力向前。在指导我如何分析问题,解决问题的同时,更教会我做人的道理。这一切将让我在以后的道路中受益匪浅。
在课设期间我遇到了一些困难,老师都耐心的给我讲解,使我进一步理解课题,编写出程序。他丰富的实践经验和广泛的专业知识使我受益非浅,在此表示衷心地感谢~
[2009年7月 16日完成]
附录? 元件清单
元件名称 型号 数量
30
单片机 AT89C51 1 缓冲器 74LS541 2 锁存器 74LS373 2 发光二极管 LED-RED 12 开关 SWITCH 12 按键 BUTTON 3 信号发生器 CLOCK 1 4位数码管 7SEG-MPX4-CA 1 电阻 RES 26 晶振 CRYSTAL 1 电容 CAP 3
附录? 总体电路图
31
附录? 源程序 #include "reg51.h"
#define uchar unsigned char #define uint unsigned char const uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,
0X92,0X82,0XF8,0X80,0X90};
long int count,counth; long int count1,count2,count3,count4;
long int i;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
void delay(void)
{ uint j;
for(j=0;j<244;j++);
}
void main(void)
{
P24=1;
P25=1;
P26=0;
P27=0;
32
TMOD=0X60;
TH1=0XFE;
TL1=0XFE;
EX0=1;
EX1=1;
ET1=1;
TR1=1;
EA=1;
for(;;)
{ P24=0;
P25=1;
P26=1;
P26=0;
P24=1;
P25=0;
P27=1;
P27=0;
count=i;
count1=count/1000;
counth=count%1000;
count2=counth/100;
count=counth%100;
count3=count/10;
count4=count%10;
P0=tab[count1];
P20=1;
delay();
33
P20=0;
P0=tab[count2];
P21=1;
delay();
P21=0;
P0=tab[count3];
P22=1;
delay();
P22=0;
P0=tab[count4];
P23=1;
delay();
P23=0;
}
}
void zhongduan0(void) interrupt 0
{
TR1=0;
}
void zhongduan1(void) interrupt 2
{
TR1=1;
}
void display(void) interrupt 3
{
i++;
}
34
数据显示
35