收藏 分享(赏)

基于单片机AT89S52控制的数字时钟系统.doc

上传人:buyk185 文档编号:6426152 上传时间:2019-04-12 格式:DOC 页数:17 大小:241KB
下载 相关 举报
基于单片机AT89S52控制的数字时钟系统.doc_第1页
第1页 / 共17页
基于单片机AT89S52控制的数字时钟系统.doc_第2页
第2页 / 共17页
基于单片机AT89S52控制的数字时钟系统.doc_第3页
第3页 / 共17页
基于单片机AT89S52控制的数字时钟系统.doc_第4页
第4页 / 共17页
基于单片机AT89S52控制的数字时钟系统.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1基于单片机 AT89S52 控制的数字时钟系统【摘 要】 本系统的设计电路是以 AT89S52单片机为核心控制器,其外围电路主要包括键盘模块、LED显示模块。这种电子钟不 仅具有了一般电子钟的基本功能,并且具有以下功能:闹钟时间设置,显示年月日等一系列功能。其中利用单片机中断系统, 实现时间 的计时功能。通过键盘和 LED 提示可方便地校对时钟和设置闹钟时间,完成年月日调整等功能。整个系 统使用单片机 S52语言进行编程,实现其设计的各项功能。 引言 31、方案论证与比较41.1 显示模块 41.2 控制电路模块 41.3 键盘模块 41.4 程序编写语言选择42、数字时钟系统的工作原理53

2、、数字时钟硬件系统设计53.1 时钟、复位、键盘接口电路 63.2 显示器接口电路 64、系统软件部分84.1 开发软件及编程语言简介84.2 程序流程图85、功能说明126、测试方法及结论12结束语12致谢词12参考文献13引言数字时钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。随着技术的发展,人们已不再满足于钟表原先简单的报时功能,希望出现一些新的功能,诸如日历的显示、跑表功能、重要日期倒计时显示等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。因此,研究实用电子钟及其扩展应用,

3、有着非常现实的意义,具有很大的实用价值 1。 由于数字集成电路技术的发展和采用了先进的石英技术,使电子钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。虽然现在市场上已有现成的电子钟集成电路芯片出售,价格便宜,使用也灵活,如可以随意设置时、分、秒的输出,改变显示数字的大小等,并且由于集成电路技术的发展,特别是MOS集成电路技术的发展,使电子钟具有体积小、携带方便,但是这里介绍的实用电子钟可以满足使用者的一些特殊要求,输出方式灵活、功耗低、计时准确、性能稳定、维护方便等优点。 21、方案论证与比较1.1 显示模块方案一:采用 LED 静态显示方式。用此方式编写

4、程序相对比较简单,一旦将欲显示的数据发送出去,只要当前显示的数据没有变化,就无须理睬数码管显示器,这就是静态数码管显示的好处。但本设计显示的位数比较多,若用此方案则会使硬件的开销多,耗电量大。方案二:采用 LED 动态显示方式。此方式可以大幅度地降低硬件成本和电源的功耗,因为某一时刻只有一个数码管工作,也就是所谓的分时显示,故显示所需要的硬件电路可分时复用。本设计即基于这种思想而采用动态数码管显示 5。1.2 控制电路模块方案一: 纯硬件电路系统。各功能采用分离的硬件电路模块实现。用时序逻辑电路实现时钟功能,用555定时器实现闹钟的设定。但这种实现方法可靠性差、控制精度低,灵活性小、线路复杂、

5、安装调试不方便,而且不方便实现对系统的扩展。 方案二: 用可编程逻辑器件(PLD)实现。这种方案与前一种相比,可靠性增加,同时可以很好的完成时钟的功能。但采用这种方案系统的灵活性不够,不利于各种功能的扩展。 方案三:采用 AT89S52 单片机作为系统的控制核心。由于使用了单片机,整个系统可编程,系统的灵活性、可靠性大大增加了 7,单片机还可进行软件抗干扰功能 9。另外,本方案可以方便的实现其他功能的扩展。 经过以上的比较论证,选用方案三来完成项目设计的要求。 1.3 键盘模块方案一:采用阵列式键盘,此类键盘是采用行列扫描方式,优点是当按键较多时可以降低占用单片机的 I/O 口数目,缺点是电路

6、复杂且会加大编程难度 2。方案二:采用独立式按键电路,每个键单独占有一根 I/O 接口线,每个 I/O 口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点是当按键较多时占用单片机的 I/O 数目较多,优点是电路设计简单,且编程极其容易 3。由于该系统采用了常规钟表式的校对方式,用键较少,系统资源足够用,故采用了方案二。1.4 程序编写语言选择方案一:采用汇编语言编写。汇编语言具有能够直接操作机器硬件、指令的执行速度快,但由于汇编语言不是结构化的程序设计语言,用它编写的程序可读性较差,不便于资料的交流和移植,调试也比较麻烦 4。方案二:采用 S52 语言编写。在单片机开发应用中引用 S52

7、 语言可以使单片机有很好的移植性,应用 S52 语言编写系统软件不仅大大缩短开发周期、增加程序的可读性,而且便于修改和扩充。且S52 语言编译器可以自动完成变量的存储单元分配,编程者可以专注于应用软件部分的设计,从而大大加快了开发速度。所以本设计程序编写语言采用 S52 语言 10。2、数字时钟系统的工作原理数字时钟的设计有多种方法,本设计采用单片机技术。数字时钟设计的关键是如何产生秒的时间基准。本设计利用了单片机的定时器/计数器和中断系统,通过软件计数的方法,获得了秒的时间基准。具体方法如下:单片机晶振频率 fosc=6MHZ,设定定时器/计数器 0 的工作方式为工作方式 1,软件控制定时器

8、/计数器 0 的运行、停止,定时时间 100ms,则定时器/计数器 0 溢出中断 10 次即可得到 1 秒的时间基准,前 0.5 秒时使显示秒的发光二极管暗,后 0.5 秒时使显示秒的发光二极管亮,定时器/计数3器 0 计数初值 X 应满足(2 16-X)*2=100000us,X=15536(十进制),3CB0(十六进制) 。定时器/计数器0 采用中断控制方式,溢出次数在定时器/计数器 0 的中断服务程序中,通过软件计数器累计,累计次数满 10 次,则表明产生了 1 秒的时间基准。另外,时钟从秒到分、分到时、时到日期的计时是通过累加和数值比较实现的。数字时钟的显示器采用 LED 数码管显示器

9、,由 7 个 LED 数码管组成,从左至右依次显示为时/年(十位、个位) 、分/月(十位、个位) 、秒/日(十位、个位) 、星期,同时秒的显示也由两个串接的发光二极管闪烁表示。数字时钟的键盘由 5 个按键构成(系统复位键除外) 。一个按键作功能键,用于控制时钟的运行显示、调整状态,一个按键用与闹铃的开关,其它三个按键用于调整数字时钟的时/年、分/月、星期/日的值。3、数字时钟硬件系统设计数字时钟硬件系统的设计,关键是其键盘、显示器接口电路的设计,本设计采用直接利用单片机AT89S52 的并行 I/O 口构成数字钟的键盘、显示接口电路,其硬件系统原理图如图 3-1 所示,主要包括单片机、时钟电路

10、、复位电路、键盘及显示接口电路。单片机时钟电路复位电路驱动电路LED显示器键盘图 3-1 硬件系统原理3.1 时钟、复位、键盘接口电路如图 3-2 所示,时钟电路由片外石英晶振、微调电容与片内相应电路组成。石英晶振 Y1 的振荡频率 fosc=6MHZ,微调电容 C6、C7 一般取 20pF。复位电路具有上电复位和按键复位两种复位功能。电解电容 C5 一般取 10uF,电阻 R30、R31 分别取 200、2K。数字时钟的键盘采用独立式键盘结构,由 5 个按键组成(复位键除外) 。S0 键为数字时钟功能键,接至 P1.0,用于改变数字钟的工作状态;S1 键为调时/年键,S2 键为调分/月键,S

11、3 键为调星期/日键,它们分别接至 P1.1、P1.2、P1.3;S4 键为闹铃开关键,用函数表达式 S=(S+1)%2 来判断闹铃的开和4关,按下 S4 键若 S 值为 1 则闹铃处于开状态,再按下 S4 键若 S 值为 0 则闹铃处于关状态。R20R24是上拉电阻,这里取 10K。图 3-2 时钟、复位、键盘接口电路3.2 显示器接口电路数字时钟的显示器由 7 位 LED 共阳极数码管和两个串接的发光二极管组成。两个串接的发光二极管的闪烁用来表示秒的跳动,7 位 LED 共阳极数码管从左到右依次显示时/年、分/月、秒/日、星期的信息,具体电路如图 3-3 所示。该显示器以动态显示的方式工作

12、,单片机的 P0 口作 LED 显示器的段控口,其口线(P0.7P0.0)经过 74LS244 接至每位 LED 数码管的 dpa 端,提供段控码信息;单片机的 P2 口作 LED 显示器的位控口,其口线(P2.7P2.1)经过 74LS244 分别接至 LED 数码管 LED7LED1 的公共端 C7C1,提供位控码信息 6。74LS244 为同相驱动器,在此提高 P0、P2 口的驱动能力,R10R16 为限流电阻,用于保护 LED 数码管。5图 3-3 显示器接口电路4、系统软件部分4.1 开发软件及编程语言简介6数字时钟的程序设计语言采用 C 语言。以往,人们研制单片机应用系统,几乎都是

13、使用汇编语言编写应用程序。尽管汇编语言具有能够直接操作机器硬件、指令的执行速度快等优点,但由于汇编语言不是结构化的程序设计语言,用它编写的程序可读性较差,不便于资料的交流和移植,调试也比较麻烦。而 C 语言恰好克服了汇编语言的缺点,而且又具有汇编语言的优点。开发软件采用美国 Keil Software 公司出品的 52 系列兼容单片机 Keil S52 语言软件开发系统 8。4.2 程序流程图为实现系统功能,系统软件共设三个运行状态和一个中断处理程序。数字钟的软件系统主要包括系统监控程序、键功能程序、定时器/计数器 0 的中断服务程序、显示子程序、闹铃子程序以及键盘扫描子程序等。(1)监控程序

14、 数字时钟的监控程序 main()主要完成数字钟的初始化、时钟的显示以及键盘的管理工作,其程序设计流程图如图 4-1 所示。开 始数字初始化调用走时转换子程序调用键盘扫描子程序调用闹铃子程序结 束图 4-1 监控程序流程图(2)键盘扫描子程序 键盘扫描子程序 KEY 用于完成按键的判断、按键的去抖动以及按键键值的处理,其中调用了显示子程序 scan(),按键的释放在各键的键功能程序中处理,其流程图如图 4-2所示。7图 4-2 键盘扫描程序流程图(3)显示子程序 显示子程序 scan()用于完成时间信息及年、月、日期信息的显示,采用动态扫描的方法从左至右进行,显示信息的字型代码通过查表获得。为

15、了能够稳定显示时钟的相关信息,在每次送出段控码和位控码信息后,延时 2ms 的时间,其流程图如图 4-3 所示。8图 4-3 显示子程序流程图(4)闹铃子程序 时间值与闹钟设置值比较,若定时到,则进入闹铃状态。(5)定时器/计数器 0 的中断服务程序 中断服务程序用于完成定时器/计数器 0 溢出中断次数的计数,时间秒、分、时的累加、比较、清 0、进位操作,其流程图如图 4-4 所示。9图 4-4 定时器/计数器 0 的中断服务程序流程图105、功能说明通电后即显示预设时间及星期。按功能键 key0 一次后,指示灯 L1 亮,其功能为对时间和星期进行调节:再按 key1 键调节小时,按 key2

16、 键调节分钟,按 key3 键调节星期。按功能键 key0 两次后,指示灯 L2 亮,其功能为显示日历并可对其进行调节:再按 key1 键调节年,按 key2 键调节月,按key3 键调节日。按功能键 key0 三次后,指示灯 L3 亮,其功能为显示闹铃时间并可对其进行调节:再按 key1 键调节闹铃小时,按 key2 键调节闹铃分钟,按 key3 键调节闹铃秒。若再按 key0 键则又回到显示正常时间状态。Key4 键为闹铃开关键,按下若指示灯 L4 亮,表示闹铃开;反之,则表示闹铃关。6、测试方法及结论采用先分别调试各单元模块,调通后再进行整机调试的方法,以提高调试效率。时钟测试 在带有单

17、片机的电路板上编程调试时钟,使其在数码管上显示,并可以通过键盘控制设定实时时间、日历和闹铃时间。利用仿真机调试成功后通过编程器将程序写入芯片中调试。闹钟测试 通过键盘控制设定闹钟开关和闹钟响的时间,并通过单片机程序驱动发光二极管闪烁。测试数据表(1):次数 1 2 3 4 5测试时间 1000 秒 1000 秒 1000 秒 1000 秒 1000 秒时钟时间 1000 秒 1000 秒 1000 秒 1000 秒 1000 秒测试数据表(2):次数 1 2 3 4 5测试时间 24 小时 24 小时 24 小时 24 小时 24 小时时钟时间 23 时 59 分59 秒23 时 59 分58

18、 秒23 时 59 分58 秒23 时 59 分59 秒23 时 59 分59 秒测量误差分析:由于各元器件精度不同,使数字钟产生误差,但都在误差允许范围内,符合要求。结束语本系统以 AT89S52 为控制部件,利用 S52 语言编程,通过键盘控制和 LED 数码管显示实现了时间、日历和闹钟功能。它性能稳定,价格低廉,有很好的性价比,有利于工厂的大规模生产。附录 1 主要元器件清单序号 名称、型号及规格 数量 备注1 电阻 RJ14-0.25W-10K5% 62 电阻 RJ14-0.25W-3305% 43 电阻 RJ14-0.25W-2405% 14 电阻 RJ14-2W-1805% 111

19、5 电阻 RJ14-0.25W-5605% 96 电阻 RJ14-0.25W-47K5% 17 瓷片电容-30pF 18 电解电容-100uF/25V 19 电解电容-10uF/25V 110 单片机 AT89S52 111 74ls244 212 发光二极管 713 按键 614 石英晶体振荡器-6M 115 共阴级 8 段数码显示管-5101AG-N3 716 腐蚀板 -14.55*9.3 1附录 2:/*数字时钟:采用 7 位 LED 软件译码动态显示,P0 为字段码,P2 为位选码,数码管共阴;key0 为功能键,key1 、key2、key3 为调节键,key4 为闹铃开关键。*/#

20、include #include sbit key0=P10;sbit key1=P11;sbit key2=P12;sbit key3=P13;sbit P1_4=P14;sbit P1_5=P15;sbit P1_6=P16;12sbit P1_7=P17;sbit P3_0=P30;sbit P3_1=P31;sbit P3_7=P37;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned c

21、har dispbitcode=0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char dispbuf7; unsigned char dispbuf07=7,0,2,0,5,2,1; /时间缓存unsigned char dispbuf17=7,1,0,4,0,7,0; /年月缓存unsigned char dispbuf27=7,0,0,1,0,2,1; /闹铃时间缓存unsigned char dispbitcnt; unsigned char second=20; unsigned char minite=50; unsigned char h

22、our=12;unsigned char day=1;unsigned char week=7;unsigned char month=4;unsigned char year=7;unsigned char second1;unsigned char minite1=1;unsigned char hour1=12; unsigned int tcnt; unsigned int con; unsigned int s;unsigned char i,j;void day_28();void day_29();void day_30();void day_31();delay1ms(int

23、t);void keyscan();nl(); main() TMOD=0x02; TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; P1_5=0;P1_6=0;P1_7=0;P3_7=1;while(1) keyscan();nl();/*按键处理子程序*/void keyscan(void) /EA=0;if(key0=0) delay1ms(10);while(key0=0);13con=(con+1)%4; /TR0=0;ET0=0; /按键调节时停止计时/TR0=1;ET0=1;if(con=1) /功能选择 1,时间调节 P1_5=1;if(key1=

24、0) delay1ms(10);while(key1=0); /K1 按一次小时加 1hour=(hour+1)%24;dispbuf05=hour%10; dispbuf06=hour/10;if(key2=0) delay1ms(10);while(key2=0); /K2 按一次分钟加 1minite=(minite+1)%60;dispbuf03=minite%10; dispbuf04=minite/10;if(key3=0) delay1ms(10);while(key3=0); /K3 按一次星期加 1week=(week)%7+1;dispbuf00=week; P1_5=0;

25、if(con=2) /功能选择 2,年月日显示及调节 P1_6=1;if(key1=0) delay1ms(10);while(key1=0); /K1 按一次年加 1year=(year+1)%100;dispbuf15=year%10; dispbuf16=year/10;if(key2=0) delay1ms(10);while(key2=0); /K2 按一次月加 1month=(month)%12+1;dispbuf13=month%10; dispbuf14=month/10;if(key3=0) delay1ms(10);while(key3=0); /K3 按一次日加 1swi

26、tch(month) /年和月份检测 case 1: day=(day%31)+1; break; case 3: day=(day%31)+1; break;case 5: day=(day%31)+1; break;case 7: day=(day%31)+1; break;case 8: day=(day%31)+1; break;case 10: day=(day%31)+1;break;case 12: day=(day%31)+1; break;case 2: if(year%4=0) /如果是闰年 day=(day%29)+1; break;elseday=(day%28)+1;

27、 break;14default: day=(day%30)+1; break;dispbuf11=day%10; dispbuf12=day/10; P1_6=0;if(con=3) /闹钟时间设置 P1_7=1;if(key1=0) delay1ms(10);while(key1=0); /K6 按一次小时加 1 hour1=(hour1+1)%24;dispbuf25=hour1%10; dispbuf26=hour1/10;if(key2=0) delay1ms(10);while(key2=0); /K3 按一次分钟加 1 minite1=(minite1+1)%60;dispbuf

28、23=minite1%10; dispbuf24=minite1/10;if(key3=0) delay1ms(10);while(key3=0); /K3 按一次秒加 1 second1=(second1+1)%60;dispbuf21=second1%10; dispbuf22=second1/10;P1_7=0; /EA=1;void t0(void) interrupt 1 using 0 dispbufdispbitcnt=dispbuf0dispbitcnt;P0=dispcodedispbufdispbitcnt; P2=dispbitcodedispbitcnt;if(con=

29、1) dispbufdispbitcnt=dispbuf0dispbitcnt;P0=dispcodedispbufdispbitcnt; P2=dispbitcodedispbitcnt;if(con=2) dispbufdispbitcnt=dispbuf1dispbitcnt;P0=dispcodedispbufdispbitcnt; P2=dispbitcodedispbitcnt;if(con=3) dispbufdispbitcnt=dispbuf2dispbitcnt;P0=dispcodedispbufdispbitcnt; P2=dispbitcodedispbitcnt;d

30、ispbitcnt+; if(dispbitcnt=7) dispbitcnt=0; 15tcnt+; if(tcnt=1000)P3_1=0;if(tcnt=2000) tcnt=0; P3_1=1;second+; if(second=60) second=0; minite+; if(minite=60) minite=0; hour+; if(hour=24) hour=0; week=(week)%7+1;switch(month) /年和月份检测 case 1: day_31(); break; case 3: day_31(); break;case 5: day_31(); b

31、reak;case 7: day_31(); break;case 8: day_31(); break;case 10: day_31(); break;case 12: day_31(); break;case 2: if(year%4=0) /如果是闰年 day_29(); break;elseday_28(); break;default: day_30(); break; if(con=0)dispbuf00=week;dispbuf01=second%10; dispbuf02=second/10; dispbuf03=minite%10; dispbuf04=minite/10;

32、 dispbuf05=hour%10; dispbuf06=hour/10;if(con=1)P3_1=0;dispbuf00=week;dispbuf01=second%10; dispbuf02=second/10; dispbuf03=minite%10; dispbuf04=minite/10; dispbuf05=hour%10; dispbuf06=hour/10; 16if(con=2)P3_1=0;dispbuf10=week;dispbuf11=day%10; dispbuf12=day/10; dispbuf13=month%10; dispbuf14=month/10;

33、dispbuf15=year%10; dispbuf16=year/10; if(con=3)P3_1=0;dispbuf20=week;dispbuf21=second1%10; dispbuf22=second1/10; dispbuf23=minite1%10; dispbuf24=minite1/10; dispbuf25=hour1%10; dispbuf26=hour1/10; /*月与天的关系*/void day_28(void) day=(day%28)+1;if(day=1) month=(month%12)+1;void day_29(void) day=(day%29)+

34、1;if(day=1) month=(month%12)+1;void day_30(void) day=(day%30)+1;if(day=1) month=(month%12)+1; void day_31(void) day=(day%31)+1;if(day=1) month=(month%12)+1;if(month=1)year=(year+1)%100;/*延时子程序*/delay1ms(int t) for(i=0;it;i+);for(j=0;j120;j+);/*闹铃*/nl() if(P1_4=0) delay1ms(10);17while(P1_4=0);s=(s+1)%2; if(s=0)P3_0=1;elseP3_0=0;if(hour=hour1)delay1ms(500);P3_7=1;delay1ms(500); /LED 闪烁

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报