基于单片机设计简易数字钟说明书--大学毕业论文.doc
信息与电气工程学院(课程设计说明书(2015/2016 学年第 二学期)课程名称 : 单片机应用技术课程设计 题 目 : 简易数字钟设计 专业班级 : 电气工程及其自动化1303班 学生姓名 : 学 号: 指导教师 : 刘增环、岑毅南、李兵等 设计周数 : 两周 设计成绩 : 2016年 6月 24日【摘要】20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。单片机数字时钟是以单片机为核心,在它的基础上设计出来的数字时钟,本设计采用了STC公司生产的AT80C51型单片机设计了一个单片机最小系统,外接LED显示电路,按键电路,晶振电路,复位电路模块构成了一个简易的数字钟,具有显示、时、分、秒的功能,且时、分、秒每一个参数都可以自行设置,以实现时间的校正,总体来说实现了一个数字时钟的应有功能。关键词:80C51系列单片机、单片机最小系统、时钟定时器、4位一体数码管显示目录课程设计正文2一 系统工作原理21.1 功能说明21.2 基本原理2二 硬件设计32.1 单片机32.2 复位电路42.3 晶振电路42.4 键盘调整单元52.5 数码管与三极管显示6三 软件设计73.1 系统主程序73.2 中断程序73.3显示函数73.4键盘扫描程序83.5时钟实现的基本方法8四 心得体会8n 附录 源程序9I单片机课程设计报告课程设计的目的(1) 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制能力;(2) 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3) 对课题设计方案的分析、选择、比较、熟悉单片机应用系统开发、研制过程,软硬件设计的方法、内容及步骤。课程设计正文一 系统工作原理1.1 功能说明全面了解掌握MCS-51的基本知识,由于该系列单片机具有体积小、功耗低、价格便宜、易于产品化等特点,可以更加方便的实现以下特点:1、 准确及时,以数字形式显示一位分、两位秒的时间;2、 分最大计到10,秒的计时要求为60进位;3、 三位数码管,显示分和秒,按键“功能键”依次选择调整“时”、“分”, 按键的“加键”依次加1,按键“减键”依次减1;4、 晶振电路起到减小误差,提高精确度的作用;5、 整分报时。1.2 基本原理该系统主要由复位电路、晶振电路、按键电路,数码管显示电路和STC80C51单片机组成。该数字时钟设计采用单片机内部的定时器来定时,然后通过软件编程来实现时钟的显示,这种设计方案的优点是外围器件少,电路简单清晰,电路焊接容易,出问题的故障几率小。系统结构图如图1所示。四位数码管显示复位电路晶振电路按键开关80C51控制器图1二 硬件设计2.1 单片机STC90C52系列单片机采用了CMOS技术制造,较之AT89c51系列单片机,集成度高、速度快、功耗低。主要由9个部件组成,分别是:1个8位中央处理器;4KBFlash存储器;128B的数据存储器;32条I/O口线;2个定时器/计数器;1个具有5个中断源、2个优先级的中断嵌套结构;全双工UART的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。如图2所示。s图2 STC80C51单片机2.2 复位电路STC90C52 的复位端高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,下拉电阻具有拉低电平作用,按一下复位开关就使在RST端出现一段时间的高电平。复位电路如图3所示。图3复位电路2.3 晶振电路外接12MHZ晶振和两个30pF 电容组成系统的内部时钟电路。将外部已有信号引入单片机内,这种方式适宜用来使单片机的时钟与外部信号保持同步。晶振电路如图4所示。图4 晶振电路2.4 键盘调整单元当要对时钟进行调时时,就要用到键盘进行时间修改。由于调节信息不多,故采用3个独立键盘即可,分别实现功能、增大、减小等作用。将所有扫描线置成低电平,检查输入线是否为低电平,若无低电平则不是按键操作,延时一段时间,再次将所有扫描线置成低电平,检查输入线是否为低电平,如果有低电平则是按键操作,若无低电平则不是按键操作,返回,即完成按键扫描。键盘原理图如图5所示图5键盘原理图S1:接P2.0口, 开始功能。S2:接P2.1口,具有切换功能,可以切换到时、分,从而实现对时、分的调整,再次按下功能键S2则返回,继续计时。S3:接P2.2口,实现时和分的增大S4:接P2.3口, 实现时和分的减小2.5 数码管与三极管显示显示单元由3个8段共阴数码管组成,数码管位选端分别接P1.0、P1.1、P1.2用于显示一位分和两位秒; 按照工作方式, 数码管显示可以分为静态显示和动态扫描。所谓静态显示, 就是每一个数码管的段码都要独占具有锁存功能的输出口, CPU把要显示的字码送到输出口上,就可以使数码管显示对应的字符, 直到下一次送出另外一个字码之前, 显示的内容一直不会消失;动态扫描是把所有显示器的8个段码中的A-dp的各个相同段连接在一起, 接到一个公共的输出口上,而数码管的位端分别接在另外的输出口上,通过这两个输出口的两组信号相互作用来产生显示效果。即让各位数码管按照一定顺序轮流显示, 只要扫描频率足够高, 由于人眼的“ 视觉暂留”现象,就能连续稳定的显示动态扫描其特点在于能显著降低显示部分成本,大大减少显示接口的连线结构。该系统采用动态扫描显示。三极管放大电路中发射极正向偏置,集电极反向偏置是使三极管工作的必要条件,当PNP管的VC<VB<VE时,使得集电结反偏,发射结正偏时,管子的发射极电流流入管子,基极电流和集电极电流流出管子,且集电极电流跟基极电流之间成关系,三极电流满足IE=IB+IC=IB(1+·IB)。即,基极电流可以控制集电极电流,这种控制作用就称为管子的放大作用,图中1K电阻为了限流。如图6所示。图6 数码管显示5单片机课程设计报告三 软件设计3.1 系统主程序中需要对各个模块进行初始化,并且判断定时器是否溢出20次,用以确定是否到达1S,初始化主要包括:设置定时器0和定时器1的工作方式为方式1,定时器赋初值,开总中断,开定时器0和定时器1中断,启动定时器。3.2 中断程序定时器0中断:单片机晶振12MHZ,主要是使用定时器0方式1,定时5ms,用来控制数码管的位选信号。且分为三种情况,P0口分别输送分钟和秒。定时器1中断:单片机晶振12MHZ,主要是使用定时器0方式1,每50ms溢出一次,计数加一次,计数20次,到时1S;秒加一。秒钟加到60,分加一,同时秒钟置0,蜂鸣器响。分加到10,分和秒都置0,3.3显示函数本设计采用共阴数码管显示,显示两位秒,为秒钟的个位与十位,second2=second/10;second1=second%10;P1控制数码管的位选, 如下:P1 = (P1&0xf0)|0x0e;P0 = minute;P1 = (P1&0xf0)|0x0d; P0 = second2;P1 = (P1&0xf0)|0x0b; P0 = second1;3.4键盘扫描程序键盘采用查询的方式,一旦有s1按键按下,数字钟开始工作,定时器1开始计时。按一次s2键,是对分钟进行调节,按二次s2键是对秒钟进行调节;s3,s4键分别是加减键,只有在s2键被按下的前提下,s3,s4键才有效;3.5时钟实现的基本方法时钟的最小计时单位是秒,使用定时器0方式1,把定时器的定时时间定为50ms。这样,计数溢出20次即可得到时钟的最小计时单位:秒单元满60,则分单元的内容加1;分单元满10,则将分、秒的内容全部清零。 四 心得体会在基于单片机的数字时钟电路设计过程中,我学到了很多重要的东西,其中最重要的是如何将实践和理论相联系,怎样将我所学到的知识运用到我以后的工作中去。大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的时钟设计给我奠定了一个实践基础。本系统的设计应用到了模拟电子技术、数字电子技术、单片机控制技术、电路焊接工艺等多方面的知识,所设计的时钟电路,达到了题目要求。这次课程设计使我得到了很大收获:不仅学到了许多了关于单片机方面的知识,还提高了实验技能;而且也使我的动手能力和电路设计能力得到了极大的提高。在此次设计中,我的难点是程序的调试,由于以前学业不精,所以编一个完整的程序很是吃力!但是经过这一段时间的学习,我还是解决了一些问题。软件调试中也出现了一些问题,就是程序在编译中仿真器的设置出现了错误,从而使系统的编译通不过,给系统的调试带来了极大的不便,所以对软件的使用还须更进一步的熟练掌握。最后,我要感谢老师在此次课程设计中的悉心指导与帮助,让我的课程设计得以顺利完成。n 附录 源程序#include <reg52.h>#define uchar unsigned char uchar ds_code=0,second2=0,second1=0,sum=0,F_flag,S_flag;char minute = 0;char second = 0;uchar time_temp = 0;sbit DS0 = P10;sbit DS1 = P11;sbit DS2 = P12;sbit key1=P20;/开始键sbit key2=P21;/功能键sbit key3=P22;/加键sbit key4=P23;/减键sbit SPEAKER = P14;/*延时函数*void delay(uchar x) unsigned int a,b; for(a=x;a>0;a-) for(b=110;b>0;b-);/*秒显示函数*void second_div(void)second2 = second/10;second1 = second%10;/*按键扫描函数*void Key(void)P2 = 0xff;if(P2!=0xff)delay(50);if(P2!=0xff)if(key1=0) TR1 = 1;if(key2=0) delay(50); / 消抖 if(key2=0) while(!key2);/松手检测 TR0=1; TR1=0;/关闭定时器 sum+; if(sum=1) F_flag=1; S_flag=0; if(key3=0) delay(50); if(key3=0) while(!key3); minute+; if(minute=10) minute=0; if(key4=0) delay(50); if(key4=0) while(!key4);minute-;if(minute=-1)minute=9; if(sum=2) F_flag=0; S_flag=1; if(key3=0) delay(50); if(key3=0) while(!key3); second+; if(second=60) second=0;delay(50);minute+; if(key4=0) delay(50); if(key4=0) while(!key4); second-; if(second=-1) second=59;delay(50);minute-; second_div(); if(sum=3) F_flag=1; /打开标志位 S_flag=1; sum=0; /Sum清零 TR0=1;/打开定时器TR1=1; /*主函数*void main(void)SPEAKER = 1;TMOD = 0x11;TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;EA = 1;ET0 = 1;TF0 = 0;TR0 = 1;ET1 = 1;TF1 = 0;while(1)Key();/*定时器0*void Timer_0(void) interrupt 1ET0 = 0;switch(ds_code)case 0:P1 = (P1&0xf0)|0x0e;P0 = minute;break;case 1:P1 = (P1&0xf0)|0x0d; P0 = second2;break;case 2:P1 = (P1&0xf0)|0x0b; P0 = second1;break;default:break;ds_code+;if(ds_code>2)ds_code = 0;TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;ET0 = 1; /*定时器1*void Timer_1(void) interrupt 3ET1 = 0;time_temp+;if(time_temp>=20)time_temp = 0;second+;if(second=60) minute+; delay(50); second = 0; if(minute=10) minute = 0;second = 0;SPEAKER = 0; second_div();TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;ET1 = 1;17n 系统原理图以及仿真图1 .电力电子技术基础(第五版)康光华主编 高等教育出版社。2.单片机原理及应用 (C语言编程)魏鸿磊主编 同济大学出版社。3.PROTEUS入门实用教程(第二版) 周润景蔡雨恬编著 机械工业出版社。课程设计评 语课程设计成 绩指导教师(签字) 年 月 日