简易数字时钟.doc_第1页
简易数字时钟.doc_第2页
简易数字时钟.doc_第3页
简易数字时钟.doc_第4页
简易数字时钟.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华侨大学数字时钟设计报告课题:简易数字时钟学 院: 信 息 学 院专 业: 集成电路设计与集成系统班 级: 10集成姓 名: *学 号:*目 录一方案设计31.1设计要求31.2系统分析31.3系统方案31.3.1方案设计31.3.2 方案论证4二硬件设计42.1 控制芯片的介绍.42.2 单片机最小系统62.2.1 振荡电路62.2.2 复位电路62.3 显示电路设计62.4 控制电路设计72.5元件清单8三软件设计83.1程序设计思路83.2 C语言程序代码9四本次设计不足20五本次设计体会2021简易数字时钟摘 要:本设计的成品是在单片机最小系统的基础上增加显示电路和控制电路来完成数字时钟的硬件电路的。数字时钟电路主要由STC89C51单片机最小系统电路、七段数码管动态显示电路组成,它能实现时钟显示,日期显示,星期显示,整点报时,定时闹铃,秒表计时等功能。能通过按键进行时间调整,万年历调整,闹钟调整,秒表的开始,暂停及数据的存储,调用等。其中万年历可以以大月,小月,闰二月准确显示,秒表最多可以进行60组时间的存储与调用,查询每次计时时间,基本满足日常所需。(注:本次采用的是分块设计,总共4个模块,分为时钟模块,闹铃模块,万年历模块,秒表模块各个模块互不影响,可以自行删减,截取所需。同时本电路采用的是三极管扩流,输入需要反相,由于开始没有注意到这个问题,吃了点亏)一 方案设计1.1设计要求基本要求: 8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”; 时间可以通过按键调整。发挥部分: 具有闹钟功能; 具有日历功能; 具有秒表功能; 其他可自由发挥。1.2系统分析设计的电路主要是能记时,并将记时的多少通过显示电路显示出来计时可以通过控制电路查询出来。设计框图如图一所示; 1.3系统方案1.3.1方案设计方案一:利用分分离门电路和集成块电路设计简易数字时钟;主要可分为五个功能模块:毫秒脉冲发生器、计数器、译码显示电路、时序控制电路,存储电路。555振荡器可作为脉冲发生电路,计数器和控制电路是系统的主要部分,计数器是用可加(减)的计数方法,分别采用60进制,31进制,30进制,29进制,28进制,24进制,10进制,7进制计数的方式,可选用74LS192,计时器完成计时功能;控制电路具有直接控制计数器的启动计数、暂停/连续计数、查询所计数、译码显示电路显示,存储等功能。设计框图如二所示;方案二:利用STC89C51单片机设计简易数字时钟。单片机软件编程灵活、自由度大,可用软件编程实现各种控制算法和逻辑控制。单片机系统可分别在时钟模式,日历模式,闹钟模式,秒表模式下用数码管显示相应的值,能用按键实现复位,调整等。本方案选用了STC89C51芯片(内部含有4KB的flash及高低各128位的RAM),不需要外扩展存储器,可使系统整体结构更为简单。设计框图如图三所示;1.3.2 方案论证方案一是用逻辑门搭建的,基本也能满足电路设计要求,但要做好是有很大的难度的,线非常之多,元件分散、多,容易把线接错,而且浪费;所以考虑采用了方案二以STC89C51芯片为中心控制系统,实现显示、键盘控制、响铃等功能,大大提高了系统的智能化,也使得系统所测结果精度大大提高。二 硬件设计2.1 控制芯片的介绍STC89C51单片机的外型如图四所示。单片机可分为通用型和专用型,种类繁多。这里我们主要介绍STC89C51是一种低功耗、高性能、超抗干扰的单片机,指令代码完全兼容传统的8051单片机。12时钟/机器周期和6时钟/机器周期可以任意选择,能处理8位数据的通用型单片机,具有CMOS工艺、芯片内集成了通用8位中央处理器,片内含4k可反复擦写的Flash只读程序存储器(ROM), 支持ISP(In-system programmable)功能。STC89C51内部有256RAM(高128和低128),8个中断源,4个中断优先级, 3个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。兼容标准MCS-51指令系统及80C51引脚结构。STC89C51有40个引脚,32个外部双向输入/输出(I/O)口。该芯片还具有PDIP40、TQFP44和PLCC44三种封装形式,以适应不同产品的需求。外型图四和封装形式如图四所示。从外观上看单片机就是一块集成电路,它与在模拟电路和数字电路中学习过的集成电路电路最主要的区别是:普通集成电路电路的引脚功能基本上固定的,而单片机的一些引脚的功能是可以通过编程进行控制,一些引脚既可作输入又可作输出。由于STC89C51不仅支持程序的并行写入,而且支持ISP在线可编程的串行写入,利用下载线将计算机将原程序编译后进行串行写入到STC89C51,速度快、稳定性好,同时不需要VPP烧写高压,只要45V供电即可完成写入。单片机广泛用于工业控制、智能仪器仪表、计算机设备及网络、通信领域、家用电器、医用设备、军用设备等各个方面。对于单片机这样的集成电路,要设计让它完成一个特定的工作任务,除完成设计相关的硬件电路外,还要设计相应的控制软件,才能使整个电路按照设计要求自动地进行工作。所以,电子电路学习到单片机这个知识层次时,除要学习相关硬件知识,还学习相关软件设计知识,才能对单片机进行控制和应用。单片机的开发和应用,是利用硬件和软件的结合来实现的。由于单片机的功能强大,充分理解各引脚功能,灵活编写控制程序去控制引脚功能,完成各种需要的设计。2.2 单片机最小系统2.2.1 振荡电路STC89C51是内部具有振荡电路的单片机,只需在18脚和19脚之间接上石英晶体给单片机加上工作所需直流电源,振荡器就开始振荡起来。振荡电路就为单片机工作提供了所需要的时钟脉冲信号,使单片机的内部电路,单片机的内部程序(若有)开始工作起来。振荡电路不工作,整个单片机电路都不能正常工作。STC89C51常外接6 MHz、11.0592MHz、12 MHz的石英晶体,本电路接入的是12MHz的石英晶体。 18脚和19 脚分别对地接了一个30PF的电容,目的是防止单片机自激。如果从18脚输入外部时钟脉冲,则19脚接地。2.2.2 复位电路复位电路就是在RST端(9脚)外接的一个电路,目的是当单片机上电开始工作时,内部电路从初始状态开始工作,或者在工作中要想人为的让单片机重新从初始状态开始工作。在时钟工作的情况下,只要STC89C51的复位引脚高电平保持两个机器周期以上的时间,STC89C51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且从地址0000H处开始读入程序代码而执行程序。该电路具有上电自动复位和手动复位功能,当上电时,根据电容两端电压不能突变,使RST有一个高电位,电路实现复位,在很短一段图六 单片机双复位电路时间后电容充满,RST通过电阻接地恢复低电位,单片机内部程序正常工作,同时在开关按下时,RST直接与5V电压相连可实现高电平复位,而正常情况下通过电阻连接GND,单片机内部程序可正常工作。具体电路如图六所示,由C3和R0构成上电自动复位电路,S实现手动开关复位。2.3 显示电路设计实验电路设计了一组数码管显示电路,电路如图七所示。八只数码管动态驱动显示。通过插接口P0接数码管七段显示段码端,通过插接口P2接每位数码管的位选端。单片机在输出七段显示码到P0的同时,提供哪一位数码显示的控制信号也输到P2上,通过延时12毫秒,在使下一个数码管点亮,一次类推,可利用余光效应,给人以八位数码管同时点亮的视觉效果。实现数码管的显示。同时需要注意的是STC89C51端口输出电流很小,不足以驱动八位数码管和蜂鸣器,所以需要通过三极管扩流,以下电路采用的是NPN型三极管S9012进行扩流,是共阳数码管点亮。(注:采用三极管扩流时P2应反相)图八图七 数码管显示电路2.4 控制电路设计控制电路主要由6个独立的按键组成,我们可以用按键来控制计时的开始、暂停、清零和查询。所有按键的一端接地,另一端与单片机的P2口的几个引脚相连。具体电路如下图八所示。图九图八 按键2.5 元件清单元件名数量STC89C511八段4位共阳数码管2NPN三极管(9012)91K电阻17无极性电容(22PF)2电解电容22uf1排针1有源蜂鸣器110K排阻1轻触按键5三位拨码开关1晶振12MHZ1三.软件设计3.1程序设计思路在硬件的基础上,可以通过软件完成时钟的设计。我用7个独立按键作为控制键。其中P10,P11(11,10,01,00)用于切换电路分别在时钟,万年历,闹钟,秒表模式下显示,P12用于控制秒表开始暂停,P13至P16分别用于调节时钟,闹钟时分秒及万年历年月日星期,在秒表计时模块,长按P14,通过P15可以进行最多60组记录时间的重复调数,P16为秒表清零键。其中时钟在四钟工作状态下都能正常计时,闹钟在秒表模式下不工作,是设计更加符合要求。3.2 C语言程序代码#include#include#define uchar unsigned char#define uint unsigned int/*七段共阳管显示定义*/ uchar code dispcode=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff;/此表为 LED 的字模, 共阳数码管不带小数点0-9,带小数点0-9,_ 和灭灯uchar xhaomiao61=0;/此数组用于秒表中记录60次的时间。uchar xmmiao61=0;/此数组用于秒表中记录60次的时间。uchar xfenzhong61=0;/此数组用于秒表中记录60次的时间。uchar LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7; / 各个数码管从左至右编号/*定义并初始化变量*/uchar seconde=0;/秒uchar minite=30;/分uchar hour=9; /时uchar week=7; /星期uchar day=25;/日uchar month=3;/月uint year=12; /年uchar haomiao=0; /秒表毫秒uchar mmiao=0; /秒表秒uchar fenzhong=0; /秒表分钟uchar mstcnt=0;/定时器计数,定时10ms,mstcnt满100,秒加1uchar stopwatch=0; /定时器好秒表计数,定时10ms,满1,毫秒加1uchar shi=0; /闹铃功能时uchar fen=0; /闹铃功能分uchar miao=0; /闹铃功能秒uchar bjcs; /报警次数uchar y=1; /定义一个y,使得当时,分,秒,都为0时,日只自加一次uchar z=1; /定义一个z,使得当整点时只报时一次uchar x=0; /定义一个x,用于显示秒表时间中调用组数uchar f=0; /定义一个f,用于显示秒表时间中循环调用组数uchar P13=0;uchar P14=0;uchar P15=0;uchar P16=0;sbit P1_0=P10; /P1_3为1,P1_5为1时,显示时间,P1_3为0,P1_5为1时,显示闹钟sbit P1_1=P11; /P1_3为1,P1_5为0时,显示日历,P1_3为0,P1_5为0时,显示秒表sbit P1_2=P12; /秒表开始暂停sbit P1_3=P13; /时钟秒,闹钟秒调整定义sbit P1_4=P14; /时钟分,闹钟分调整定义sbit P1_5=P15; /时钟时,闹钟时,日历年调整定义sbit P1_6=P16; /星期调整定义 sbit P1_7=P17;/接蜂鸣器,0响,1不响/*函数声明*/void delay(uint k ); /延时子程序void time_pro( ); /时间处理子程序void display( ); /时间显示调整子程序void dingshi( ); / 闹钟显示调整子程序void naozhong( ); / 时间到,闹铃void zhengdian ( ); /整点报时void day_pro( ); /日历处理子程序void calendar( ); /日历显示调整子程序void miaobiao( ) ; /秒表显示子程序void xianshi( ) ; /显示总程序/*延时子程序*/void delay (uint k)/延时程序,此处大约为0.8 msuchar j;while(k-) for(j=0;j100;j+) ; void xianshi(void) /显示总程序 P0=0Xff; / 消影 P2=0Xfe; P0=dispcodeLED0;/LED0 delay(1); P0=0Xff; P2=0Xfd; P0=dispcodeLED1;/LED1 delay(1); P0=0Xff; P2=0Xfb; P0=dispcodeLED2;/LED2 delay(1); P0=0Xff; P2=0Xf7; P0=dispcodeLED3;/LED3 delay(1); P0=0Xff; P2=0Xef; P0=dispcodeLED4;/LED4 delay(1); P0=0Xff; P2=0Xdf; P0=dispcodeLED5;/LED5 delay(1); P0=0Xff; P2=0Xbf; P0=dispcodeLED6;/LED6 delay(1); P0=0Xff; P2=0X7f; P0=dispcodeLED7;/LED7 delay(1);P0=0Xff; /*时间处理子程序*/void time_pro(void) if(seconde=60) z=0; seconde=0; minite+; if(minite=60) minite=0; hour+; if(hour=24) y=0; hour=0; /*时间显示调整子程序*/void display(void) if(P1_0=1)&(P1_1=1) /*时间调整键盘扫描子程序*/ if(P1_3!=P13)/秒位的调整 delay(10); if(P1_3=0) seconde+; if(seconde=60) seconde=0; P13=P1_3; if(P1_4!=P14)/分位的调整 delay(10); if(P1_4=0) minite+; if(minite=60) minite=0; P14=P1_4; if(P1_5!=P15)/时位的调整 delay(10); if(P1_5=0) hour+; if(hour=24) hour=0; P15=P1_5; /*时间显示子程序*/LED0=hour/10;/时十位 LED1=hour%10;/时个位LED2=20;/间隔符 -LED3=minite/10;/分十位LED4=minite%10;/分个位LED5=20;/间隔符 -LED6=seconde/10;/秒十位LED7=seconde%10;/秒个位 /*定时闹钟*/void dingshi(void) if(P1_0=0)&(P1_1=1) /*闹钟调整键盘扫描子程序*/if(P1_5!=P15)/设定时 delay(10); if(P1_5=0) shi+; if(shi=24) shi=0; P15=P1_5; if(P1_4!=P14)/设定分 delay(10); if(P1_4=0) fen+; if(fen=60) fen=0; P14=P1_4; if(P1_3!=P13)/设定秒 delay(10); if(P1_3=0) miao+; if(miao=60) miao=0; P13=P1_3; /*闹钟显示子程序*/LED0=shi/10; /时十位 LED1=shi%10; /时个位 LED2=20; /间隔符 -LED3=fen/10; /分十位 LED4=fen%10; /分个位LED5=20; /间隔符 -LED6=miao/10; /秒十位LED7=miao%10; /秒个位 /*整点报警*/void zhengdian (void) if(seconde=0)&(minite=0)&(seconde=0)&(z=0)/整点报时 if(P1_0=1)|(P1_1=1) P1_7=0; delay(100); P1_7=1;z=1; /*响闹钟程序*/ void naozhong(void)/时间到,响铃 if(hour=shi)&(minite=fen)&(seconde=miao) if(P1_0=1)|(P1_1=1) for(bjcs=0;bjcs5;bjcs+) P1_7=0; delay(300); P1_7=1; delay(600); /*日历处理子程序*/void day_pro(void) if(hour=0)&(minite=0)&(seconde=0)&(y=0) day+; week+; if(week=8) week=1; if(month=1)|(month=3)|(month=5)|(month=7)|(month=8)|(month=10)|(month=12) if(day=32) day=1; month+;if(month=4)|(month=6)|(month=9)|(month=11)if(day=31) day=1; month+;if(month=2)if(year%4)=0)if(day=30) day=1; month+;elseif(day=29)day=1;month+; if(month=13) month=1;year+;if(year=100) year=0; y=1; /*日历显示调整模块*/void calendar(void)if(P1_0=1)&(P1_1=0)/*日历调整键盘扫描子程序*/ /日期调整, p1_0日, p1_月,p1_4年 p1_6调整星期 if(P1_3!=P13) /日的调整 delay(10); if(P1_3=0) if(month=1)|(month=3)|(month=5)|(month=7)|(month=8)|(month=10)|(month=12) if(day31) day+; else day=1; if(month=4)|(month=6)|(month=9)|(month=11) if(day30) day+; else day=1; if(month=2)if(year%4)=0)if(day29) day+; else day=1; elseif(day28)day+; else day=1; P13=P1_3; if(P1_6!=P16)/星期调整 delay(10); if(P1_6=0) week+; if(week=8) week=1; P16=P1_6; if(P1_4!=P14)/月的调整 delay(10); if(P1_4=0) month+; if(month=13) month=1; P14=P1_4; if(P1_5!=P15) /年的调整 delay(10); if(P1_5=0) year+; if(year=100) year=0; P15=P1_5; /*日历显示模块*/LED0=year/10; /年十位LED1=(year%10)+10; /年个位 LED2=month/10; /月十位LED3=(month%10)+10; /月个位LED4=day/10; /日十位LED5=day%10; /日个位LED6=20; /-LED7=week; /星期 /*秒表显示计时模块*/void miaobiao(void)if(P1_0=0)&(P1_1=0) /*秒表计时模块*/if(haomiao=99) haomiao=0; mmiao+; if(mmiao=60) mmiao=0; fenzhong+; if(fenzhong=60) fenzhong=0; if(P1_3!=P13) delay(10); if(P1_3=0) if(x0) x-; if(x=0)x=f; P15=P1_5; void timer0(void) interrupt 1 /定时器0方式1,0.01s中断一次 TH0=0xd8; /手动加载计数脉冲次数 TL0=0xf0; TMOD=0x11; /使用16位定时器 mstcnt+; /用于计算时间,每隔10ms加1 if(mstcnt=100)/mstcnt满100即为一秒 seconde+;/秒+1 mstcnt=0; /对计数单元的清零,重新开始计数 if(P1_2=0) stopwatch+; /用于秒表计算时间,每隔10ms加1 if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论