用51单片机设计的时钟电路(毕业)_第1页
用51单片机设计的时钟电路(毕业)_第2页
用51单片机设计的时钟电路(毕业)_第3页
用51单片机设计的时钟电路(毕业)_第4页
用51单片机设计的时钟电路(毕业)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——用51单片机设计的时钟电路(毕业)

好东西哟,用吧

毕业论文

ShaoguanUniversity

:kesion

目录

任务书摘要前言说明书

第一章电路原理分析

1-1显示原理

1-2数码管结构及代码显示1-3键盘及读数原理1-4连击功能的实现

第二章程序设计思想和相关指令介绍

2-1数据与代码转换

2-2计时功能的实现与中断服务程序

2-3时间控制功能与比较指令2-4时钟误差的分析

附录A电路图

附录B存储单元地址表

附录C输入输出口功能分派表附录D定时中断程序流程图附录F调时功能流程图

附录G程序清单

好东西哟,用吧

摘要

单片计算机即单片微型计算机。(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

前言

本文通过用对一个能实现定时,时钟,日历显示功能的时间系统的设计学习,详细介绍了51单片机应用中的数据转换显示,数码管显示原理,动态扫描显示原理,单片机的定时中

断原理、从而达到学习,了解单片机相关指令在各方面的应用。系统由AT89C51、LED数码管、按键、二极管等部分构成,能实现时钟日历的功能:能进行时、分、秒的显示。也具有日历计算、显示和时钟,日历的校准、定时时间的设定,实现三路开关定时输出等功能。文章后附有电路图,程序清单,各数据存储单元的所在地址,输入输出口对应表。以供读者参考。因本人也是个初学者,水平有限,难免有疏落不足之处,敬请老师和同学能给与批评正。

说明书

系统由AT89C51、LED数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由SB0、SB1、SB2、SB3、SB4完成。其中SB0为时间校对,定时器调整功能键,按SB0进入调整状态。SB1为功能切换键。第一轮按动SB1依次进入一路、二路、三路定时时间设置提醒程序,按SB3进入各路定时调整状态。定时时间到,二极管发亮。到了关断时间后灭掉。假使不进入继续按SB1键,依次进入时间年位校对、月位校对、日位校对、时位校对、分位校对、秒位校对状态。不管是进入那种状态,按动SB2皆可以使被调整位进行不进位增量加1变化。各预置量设置完成后,系统将所有的设置存入RAM中,按SB1退出调整状态。上电后,系统自动进入计时状态,起始于00时00分。SB4为年月日显示转换键,可使原来显示时分秒转换显示年月日。

二、电路原理分析

1.显示原理

电原理图见附图1。由6个共阴极的数码管组成时、分、秒的显示。P0口的8条数据线P0.0至P0.7分别与两个CD4511译码的ABCD口相接,P2口的P2.0至P2.2分别通过电阻R10至R13与VT1至VT3的基极相连接。这样通过P0口送出一个存储单元的高位、低位BCD显示代码,通过P2口送出扫描选通代码轮番点亮LED1至LED6,就会将要显示的数据在数码管中显示出来。从P0口输出的代码是BCD码,从P2口输出的就是位选码。这是扫描显示原理。

2.数码管结构及代码显示

好东西哟,用吧

共阴LED数码管结构、字段及引脚排列见图2图2

共阴LED数码管由8只发光二极管VD1至VD8共阴连接并按8字形结构排列而成。这样,我们将这些二极管的正极接高低不同的电位,把所有的负极接地,当正极为高电位时相应的二极管就会导通而发光,从而使数码管浮现不同的字符。而只有P2相应浮现高电位,VT个管导通,LED1的GND与地相接,LED位被选中才具备发光的使能条件;可见,在利用P2口送出位选码,使各位轮番得到发光使能条件的同时,通过P0口分别送出不同的段选码,就会在LED1至LED4中显示出不同的数字来。

3键盘及读数原理

键盘是人与微机打交道的主要设备,按键的读取简单引起误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的规律电平是不稳定的,如不采取合理处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms.

4连击功能的实现

按下某键时,对应的功能键解释程序得到执行,如操没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。

三、程序设计思想和相关指令介绍

本系统的主程序主要完成时间显示和定时输出判断功能。而年月日显示和各时间单元进位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。1.数据与代码转换。

由前述可知,从P2口输出位选码,从P0口输出段选码,LED就会显示出数字来。但P0口的输出的数据是要BCD码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0口去驱动LED数码管显示是不能正确表达的,必需在系统内部将要显示的数据经过BCD码行转换后,将各个单元数据的段选代码送入P0口,给CD4511译码后去驱动数码管显示。

具体转换过程如下:

好东西哟,用吧

我们先将要显示的数据装入累加器A中,再将A中的数据转换成高低两位的BCD码,再放回A中,然后将A中的值输出。如:有一个单元存储了45这样一位数,则需转换成四位的BCD码:(0100)(0101)然后放入A中。A中BCD码,高位四位代表4低四位代表5同时送给两个译码器中,译码后45字就在两个LED中显示出来。2.计时功能的实现与中断服务程序

时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0开启后,进入计时,满100毫秒后,重装定时。中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位,24小时满后,天单元进位。这样然后根据进率,得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,实现时钟计时功能。累加是用指令INC来实现的。

进入中断服务程序以后,执行PUSHPSW和PUSHA将程序状态寄放器PSW的内容和累加器A中的数据保存起来,这便是所谓的保护现场.以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM中的任一区间设定,而堆栈的数据存取与一般的RAM存取又有区别,对它的操作,要遵循后进先出的原则。3时钟误差分析

开启定时器/计数器0,使之开始计时,中断后进入中断程序。自中止计数到、计数又开始,中间执行了7条指令,也就是延迟了13个单周期共用时间26us,这样,每个中断的总时间应为为100.026sm,而原来定时是100ms,,所以,也就是说每次中断定时多了26um.这样,可改变计数重装值,使每次中断定时时间为99.974sm,加上原来的7条指令所用的时间,正好100sm.计数10次得1s.这样就可得到较确切的计时秒数,然后根据进率,得到时、分的值。

4时间控制功能与比较指令

系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先将执行设备开启的时间和关闭时间置入RAM某一单元,在计时主程序当中执行几条比较指令,假使当前计时时间与执行设备的设定开启时间相等,就执行一条CLR指令,将对应的那路P3置为高电位,开启;假使当前计时时间与执行设备设定的关闭时间相等,就执行SETB对应的P3置低电位,二极管截止,。实现此控制功能用到的比较指令为CJNEA,#direct,rel,其转移条件是累加器A中的值与马上数不等则转移。

好东西哟,用吧

http://.77

DIY爱好者

DS?+5U?7126U?500U?CAPU?CAPCAPRES2500RES2500RES27126U?CAPU?CAPU?U?CAPU?CAP+515143130pRES2C?RES2R?RES230pRES2U?CAP191891716123456781312P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWR8031RXDTXDALE/PPSEN10113029P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27393837363534333221222324252627282kCAP2kCAP2kCAP345345ABCDLTBILE4511+5U?ABCDLTBILE4511ABCDEFG1312111091514ABCDEFG131211109151412345678abcdefgdpDPYafegdbcdp

DS?12345678abcdefgdpDPYafegdbcdp

DS?12345678DPYaabcfbgdeecdfdpgdp

RES2DS?12345678abcdefgdpDPYafegdbcdp

RES2DS?12345678abcdefgdpDPYafegdbcdp

RES2DS?12345678DPYaabcfbgdeecdfdpgdp

RES2

RES2

RES2

U?CAP

U?CAP

U?CAP

U?CAP

http://.77DIY爱好者

CreatedwithnovaPDFPrinter(http://.77).Pleaseregistertoremovethismessage.

好东西哟,用吧

http://.77

DIY爱好者

主程序开始

显示/定时判断/开定时中断

调用程序条件

中断T0

与设定时同?

按SB4?

按SB0?

进入定时中断程序(最高级)

中断0

中断1

秒分时日月年进位对P0.3\P0.4\P0.5输出应

转换显示年月日(3S返回)

调整时间(改变时间存储值)

设定定时(三路定时)

返回主程序

http://.77DIY爱好者

CreatedwithnovaPDFPrinter(http://.77).Pleaseregistertoremovethismessage.

好东西哟,用吧

DIY爱好者

定时中断程序流程图

好东西哟,用吧

调时功能流程图

好东西哟,用吧

调时功能流程图

存储单元分派表

读取按键代码表16进制码FEFDFB时间单元SecMinHourDayMouYearSb0

P1.0SB1011

P1.1SB2101

P1.2SB31101组开定时单元\4142434445Sb3

P1.3*1111组关

P1.4*1112组开

P1.5*1112组关

3组开

P1.6*1113组关

P1.7*111

存储单元分派表

32h31h30h35h34h33hSb1

秒分时日月年Sb2

\4046474849Sb4

\51525354551组输出

\50565758592组输出

\61626364653组输出

\6066676869

各P口功能连接.P3.3

P1.0

P1.1+\-

P1.2

P3.2年月日显示转换

p3.0

P3.1

P3.4

调整时间、定时中断

二极管二极管二极管

好东西哟,用吧

程序

SECEQU32H;秒即时时间\伪指令MINEQU31H;分HOUREQU30H;时DAYEQU35H;日MONEQU34H;月YEAREQU33H;年

MIN_1EQU41H;分定时器1路、开存储单元HOUR_1EQU42H;时DAY_1EQU43H;MON_1EQU44H;YEAR_1EQU45H;

MIN_11EQU40H;分定时器1路、关存储单元HOUR_11EQU46H;时DAY_11EQU47H;日MON_11EQU48H;月YEAR_11EQU49H;年;***********************ORG0000HljmpMAIN

ORG0003H;中断转换显示年月日、INT0(SB4键)LJMPSHOW

ORG000BH;计数中断T0、方式1LJMPTIMEORG0013H

LJMPCHANGE;调整时间、定时、INT1(SB0键);主程序ORG0030HMAIN:

;初始化付值MOVYEAR,#02MOVMON,#05MOVDAY,#01MOVHOUR,#00MOVMIN,#00MOVSEC,#00

CLR40H;定时单元1路清零CLR41HCLR42HCLR43H

好东西哟,用吧

CLR44HCLR45HCLR46HCLR47HCLR48HCLR49H

;开中断

MOVTMOD,#01H;计数、模式1、T0MOVTL0,#0B0H;100SM计数定时MOVTH0,#3CH;clrp3.0

MOV20H,#0AH;10次*100SMSETBPT0;T0为最高级SETBTR0;允许计数SETBET0;允许T0中断SETBEX0;允许INT0中断SETBEX1;允许INT1中断SETBEA;开总中断

;显示、定时器启动判断LOOP:

MOVR1,#30H;存储单元MOVR4,#01H;位选通MOVR3,#03H;三组显示NEXT:

MOVA,@R1;

MOVB,#10;将存储单元转换成两高低两组的BCD码DIVABSWAPAORLA,BMOVP0,A;输出MOVP2,R4

INCR1;下一单元MOVA,R4;RLA;位移MOVR4,A

LCALLDE5SM;延时0.5SMDJNZR3,NEXT;全扫描显示一偏

;判断定时输出(只编写了一路)

好东西哟,用吧

CJNER7,#88H,LOOP;是8则开,否则、定时已关、转;开MOVA,YEAR

CJNEA,YEAR_1,LOOP_1;年比较,不等转关MOVA,MON

CJNEA,MON_1,LOOP_1MOVA,DAY

CJNEA,DAY_1,LOOP_1MOVA,HOURCJNEA,HOUR_1,LOOP_1MOVA,MIN

CJNEA,MIN_1,LOOP_1CPLP3.0;关LOOP_1:MOVA,YEAR

CJNEA,YEAR_11,LOOP;年比较MOVA,MON

CJNEA,MON_11,LOOPMOVA,DAY

CJNEA,DAY_11,LOOPMOVA,HOURCJNEA,HOUR_11,LOOPMOVA,MIN

CJNEA,MIN_11,LOOPCPLP3.0LJMPLOOP

;年月日显示中断子程序SHOW:PUSHPSWpushACCPUSHBPUSH01HPUSH02HPUSH03HPUSH04H

MOVR2,#0FFH;中断扫描次数TURN:MOVR1,#33HMOVR4,#01HMOVR3,#03HNEXT_1:

好东西哟,用吧

MOVA,@R1MOVB,#10DIVABSWAPAORLA,BMOVP0,AMOVP2,R4INCR1RLAMOVR4,ALCALLDE5SMDJNZR3,NEXT_1

DJNZR2,TURN;反复显示一定时间后返回POP04HPOP03HPOP02HPOP01HPOPBPOPACCPOPPSWRETI

;计数中断服务子程序TIME:PUSHPSWPUSHACCPUSHBPUSH06H

MOVTH0,#3CH;重装计数MOVTL0,#0BH;

DJNZ20H,OUT;转到中断跳出pop程序MOV20H,#0AH;重装:100*10=1000;进位程序INCSECMOVR6,SEC;

CJNER6,#60,OUT;比较MOVSEC,#00;

INCMINMOVR6,MINCJNER6,#60,OUTMOVMIN,#00

好东西哟,用吧

INCHOURMOVR6,HOURCJNER6,#25,OUTMOVHOUR,#00

INCDAYMOVR5,MON

CJNER5,#1,MON_22;是否1月、不是转2月MOVR5,DAY

CJNER5,#32,OUT;本月是否益出INCMONMOVDAY,#1LJMPOUTOUT:POP06HPOPBPOPACCPOPPSWRETIMON_22:MOVR5,MON

CJNER5,#2,MON_33;是否2月、不是转3月MOVA,YEAR;判断是否瑞年MOVB,#4DIVABMOVA,B

JNZOUT_1;不是则转(A不为零则转)MOVR5,DAY

CJNER5,#30,OUT;如是瑞年、判断是否到29天INCMONMOVDAY,#1LJMPOUTOUT_1:

MOVR5,DAY

CJNER5,#29,OUT;平年二月判断INCMONMOVDAY,#1LJMPOUTMON_33:MOVR5,MON

CJNER5,#3,MON_44

好东西哟,用吧

MOVR5,DAYCJNER5,#32,OUTINCMONMOVDAY,#1LJMPOUTMON_44:MOVR5,MONCJNER5,#4,MON_55MOVR5,DAYCJNER5,#31,OUTINCMONMOVDAY,#1LJMPOUTMON_55:MOVR5,MON

CJNER5,#5,MON_66MOVR5,DAYCJNER5,#32,OUTINCMONMOVDAY,#1LJMPOUTMON_66:MOVR5,MONCJNER5,#6,MON_77MOVR5,DAYCJNER5,#31,OUTINCMONMOVDAY,#1LJMPOUTMON_77:MOVR5,MONCJNER5,#7,MON_88MOVR5,DAYCJNER5,#32,L1INCMONMOVDAY,#1L1:LJMPOUTMON_88:MOVR5,MONCJNER5,#8,MON_99MOVR5,DAYCJNER5,#32,L2

好东西哟,用吧

INCMONMOVDAY,#1L2:LJMPOUTMON_99:MOVR5,MONCJNER5,#9,MON_00MOVR5,DAYCJNER5,#31,L3INCMONMOVDAY,#1L3:LJMPOUTMON_00:MOVR5,MON

CJNER5,#10,MON_AAMOVR5,DAYCJNER5,#32,L4INCMONMOVDAY,#1L4:LJMPOUTMON_AA:MOVR5,MONCJNER5,#11,MON_BBMOVR5,DAYCJNER5,#31,L5INCMONMOVDAY,#1L5:LJMPOUTMON_BB:MOVR5,DAYCJNER5,#32,L6INCYEARMOVMON,#1MOVDAY,#1L6:LJMPOUT

;校对时间、定时调整中断

CHANGE:PUSHPSWPUSHACCPUSHBPUSH00Hmovp2,#00h

好东西哟,用吧

SHOW_1:

MOVA,#01H;显示1MOVP0,A

MOVP2,#0FFH;三组数码管都显示1路LCALLREAD;调用读p1口键程序CJNEA,01H,SHOW_1;去抖后比较LCALLDE250SM;延时250秒

CJNEA,#0FBH,ttT1LJMPSB3_1

ttT1:CJNEA,#0FEH,SHOW_1AJMPSHOW_2

;二组显示SHOW_2:

MOVA,#02H;显示2MOVP0,AMOVP2,#0FFH;LCALLREAD

CJNEA,01H,SHOW_2;去抖后比较LCALLDE250SM;延时250秒

CJNEA,#0FBH,T2;不等转去判断此时SB3按了没LJMPSB3_2

T2:CJNEA,#0FEH,SHOW_2AJMPSHOW_3;_三组显示SHOW_3:

MOVA,#03H;显示3MOVP0,A

MOVP2,#0FFH;位码LCALLREAD

CJNEA,01H,SHOW_3;去抖后比较LCALLDE250SM;延时250秒

CJNEA,#0FBH,T3;不等转去判断此时SB3按了没LJMPSB3_3

T3:CJNEA,#0FEH,SHOW_3

AJMPSHOW_4;即时年单元调时、显示SHOW_4:

MOVA,YEAR;调出年单元MOVB,#10;BCD转换DIVAB

好东西哟,用吧

SWAPAORLA,BMOVP0,A;MOVP2,#01H;LCALLREADLCALLDE250SM

CJNEA,01H,SHOW_4;去抖

CJNEA,#0FEH,KEY2_1;按SB2转年调整AJMPMON_CH;按SB1往下调月单元KEY2_1:CJNEA,#0FDH,SHOW_4LCALLYEAR_AD;调用年调整AJMPSHOW_4;

MON_CH:MOVA,MON;月单元调整MOVB,#10DIVABSWAPAORLA,BMOVP0,A;MOVP2,#02H;LCALLREADLCALLD

温馨提示

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

最新文档

评论

0/150

提交评论