【精品】毕业设计:单片机电子时钟设计报告.doc

【精品】毕业设计:单片机电子时钟设计报告.doc

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
四、设计思路 1、硬件设计思路 本人使用Proteus软件绘制硬件系统。硬件系统以AT89C51单片机、显示系统、键控系统构成。晶振电路由12MHz振荡器和两个25pF电容构成。复位电路采用按键脉冲复位电路,由一个SW-SPST按键、一个10k和一个1k电阻、两个22uf电容构成。 显示系统由六位共阴极红色数码管进行动态扫描输出。 按键部分由三个SW-SPST键构成。 扬声器为交流SOUNDER。 如图, P0口上拉电阻为RESPACK-8,每位均为10k欧姆。 由于使用Proteus进行仿真,所以省去设置keil软件的麻烦,只要把WAVE编译产生的烧写HEX文件导入单片机即可仿真。 2、软件设计思路 根据电路可以设计一个带整点报时、调时功能的电子钟。 根据要求对硬件功能进行分配:本系统由 P0口做段码口,P2口做位码口。P3.0为启停键(控制电子钟的启动和停止),P3.1,P3.2为调时键,其中P3.1为取码键(选择要调的位),P3.2为加一键(对选择的位进行加1操作)。 据功能程序可以由以下几部分组成:主程序、定时器中断子程序、显示子程序、延时子程序、启停子程序、调时子程序、调时比较子程序(调表时检测所调位是否溢出,并进行清0处理)、整点报时子程序。 1)主程序说明: 本程序利用定时计数器T0进行定时。首先设置T0工作模式为模式1,显示缓冲区清零,设置调时取位寄存器(存储所调位的地址)初值。启动定时器。进入循环模块后先调用显示子程序,然后判断启停键是否闭合。如果闭合则调用启停子程序,如果断开就跳到下一项判断定时器是否停止,若停止则调用调时子程序,若启动则直接调用整点报时子程序。 主程序流程图 2)中断子程序 先介绍一下定时器产生秒的过程:定时器在模式1时为16位计数器,记到65535才溢出,最长计时65.535ms。可以每隔50ms中断一次,中断20次为1秒。计算初值由公式 (216-X)×12/6/106=10-1 得 X=15536=3CB0H 因此THO=3CH,TL0=0B0H 此程序工作过程为:此程序把时分秒的个位和十位分开计算。 首先要堆栈保护现场,把定时器循环次数20送入让,然后时钟运行,秒个位到10进位,秒十位到6进位,分个位到10进位,分十位到6进位,时个位到10进位,到4时检查时位是否为2,如果是就全部清零,如果不是就进位。另外分十位进位时整点报时标志位置1。并将3送入响铃延时寄存器。中断子程序流程图如下: Y 3)显示子程序:此程序把显示缓冲区内容通过查表得到段码,再把段码送到P0口并依次送入六位数码管。实现动态扫描输出。 显示子程序流程图 4)延时子程序:用两个寄存器做两层嵌套循环实现延时,MOV指令执行时间为1T,NOP为1T,DJNZ指令为2T,因晶体振荡频率为fosc12MHz,则机器周期T=1us,该程序可以延时时间 t =(1+ (1+1+2)×200+2)×5=4015us 延时子程序流程图 5)启停子程序 该程序用来检查启停键的动作,如果闭合则对TR0取反,以此控制定时器的启停,进而启停时钟。 6)调时子程序 调时程序是在定时器停止的时候通过P3.1口的取位键和P3.2口的加一键进行调时。在定时器暂停期间,程序反复扫描P3.1与 P3.2。 这里用到了寄存器来存储所调的位地址。每按一次取位键,寄存器所存地址加一,即所调的文位左移一次。加一键闭合时对R1所存地址内的数据加一。然后调用比较子程序以确定每一位是否溢出。 7)调时比较子程序 此程序在调时时调用以确定所调位,再检测该位是否溢出,溢出则清0。 调时比较子程序流程图 8)整点报时程序 通过测试闹铃标志位来确定是否响铃,再对SPERKER电平循环取反产生方波。 同时将秒个位数字与响铃延迟时间比较,时间到了就清0标志位。 五、调试过程 软件调试的过程据功能的增加分为几步: 首先,根据原来的100进制显示程序的基础上编写成时分秒六位显示的主干程序。该程序将时分秒分成个位和十位分别计算,所以将60进制和24进制变成10进制、6进制和2进制。又因为如果时十位为2的话,不能大于3,所以在分十位向时个位进位时得判断时十位是否为2,在组员的帮助下经过不断试验和修改终于完成。过程比较顺利。 接下来是增加暂停的功能,先构想按下启停键时关闭中断,等待第二次按下时再开启。但总不得要领,却在整点报时取得突破。过程是这样的:先在时个位加一时将一个标志位置1,然后在主程序循环部分判断此标志位,以决定是否开启响铃。所以就增加了整点报时子程序,响铃时间在标志位置1时就送进R3中,就取得是响铃3秒的效果。可是编译时用户标志位F1通不过,就改成了B.1。现在就差启停功能就完成了。 启停的功能后经过同学提醒可以在

您可能关注的文档

文档评论(0)

14576 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档