单片机多功能时钟实验报告.docx

上传人:b****8 文档编号:28417455 上传时间:2023-07-13 格式:DOCX 页数:44 大小:572.15KB
下载 相关 举报
单片机多功能时钟实验报告.docx_第1页
第1页 / 共44页
单片机多功能时钟实验报告.docx_第2页
第2页 / 共44页
单片机多功能时钟实验报告.docx_第3页
第3页 / 共44页
单片机多功能时钟实验报告.docx_第4页
第4页 / 共44页
单片机多功能时钟实验报告.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

单片机多功能时钟实验报告.docx

《单片机多功能时钟实验报告.docx》由会员分享,可在线阅读,更多相关《单片机多功能时钟实验报告.docx(44页珍藏版)》请在冰豆网上搜索。

单片机多功能时钟实验报告.docx

单片机多功能时钟实验报告

单片机实验报告

2020年4月12日

一.实验要求(内容)

本实验要求做出时刻显示包括时分秒,可调时刻,日期,日期转动显示,闹铃设置及到时响铃,倒计时,秒表计时和播放音乐等功能.这些功能需要的单片机知识有单片机大体寻址方式及汇编程序设计,按时与中断,数码管扫描显示,键盘扫描检测及音乐播放的大体原理等.

二.硬件环境与工作原理(接口地址)

设备选择了Atmel的AT89C51,设置波特率38400,频率11.0592MHz,数码管段选地址:

8FFFH,数码管位选地址:

9FFFH,段选和位选驱动都为高电平有效.蜂鸣器P1.6,为高电平有效.4*4的键盘复用了数码管位选地址8FFFH,写信号(/WR)操纵行,读信号(/RD)操纵列.

三.资源利用

键盘用了16个.按时中断T0及T1.寄放器R0~R7,贮存器如下.

贮存变量概念如下:

CLKEQU20H.0

CEKEQU20H.1

HOUREQU40H

MINEQU41H

SECEQU42H;存放秒钟变量

NEQU43H;存放5ms计数值

CHHEQU44H

CMMEQU45H

CSSEQU46H;闹铃设置秒钟变量

RUNEQU23H

DAYEQU24H;日期变量

MONTHEQU25H

YEARLEQU26H

YEARHEQU27H

BUF1EQU28H;显示缓冲区

BUF2EQU29H

BUF3EQU2AH

BUF4EQU2BH

BUF5EQU2CH

BUF6EQU2DH

BUF7EQU2EH

BUF8EQU2FH

BUF9EQU30H

BUF10EQU31H

BUF11EQU32H

CHH_DEQU48H;倒数时间小时数

CMM_DEQU49H

CSS_DEQU4AH

STOP_SEQU4BH;秒表

STOP_MEQU4CH

STOP_MSEQU4DH

SEG1EQU50H;数码管

SEG2EQU51H

SEG3EQU52H

SEG4EQU53H

SEG5EQU54H

SEG6EQU55H

SEG7EQU56H

SEG8EQU57H

TEMPEQU58H;临时变量

;蜂鸣器

四.程序原理与框图

第一部份是变量概念区,第二部份是主函数,包括初始化和键盘循环检测.第三部份是子函数区,第四部份为常数区.子函数包括按时器初始化,年月日转换,数码管扫描显示,键盘操作,调整时刻,设置闹铃,闹铃时刻转换,检查闹铃是不是到,闹铃到了响应,倒计时程序,日期转换,日期扫描显示,日期设置,闰年判定,秒表子程序,音乐,响音乐时的显示和3个延迟子函数.

调用数据初始化子程序

主函数流程:

调用定时器初始化子程序

调用显示时间子函数

调用键盘读取子程序

根据读到的键调用响应的子函数

主函数代码:

MAIN:

ACALLINITALL

ACALLINIT_TIMER

MAINLOOP:

;循环区

ACALLCONV

ACALLCLK_ON

ACALLSEG_DISP

;设置时刻

ACALLKEYBOARD;DUDI1JIAN

CJNEA,#00H,M1

ACALLSET_TIME

JMPMAINLOOP;设置闹铃时间

M1:

CJNEA,#01H,M2

ACALLSET_CLK

JMPMAINLOOP

M2:

;闹钟开关

CJNEA,#0DH,M3

CPLCLK

JNBCLK,M2_1;闹铃启动

LCALLBZ

LCALLBZ

JMPMAINLOOP

M2_1:

LCALLBZ;闹铃停止

JMPMAINLOOP

M3:

;设置倒计时

CJNEA,#0BH,M4

ACALLSET_DOWN

JMPMAINLOOP

M4:

;滚动日期

CJNEA,#0EH,M5

ACALLDATE_DISP

JMPMAINLOOP;调整日期

M5:

CJNEA,#02H,M6

ACALLDATA_SET

JMPMAINLOOP;秒表

M6:

CJNEA,#03H,M7

ACALLSTOP

JMPMAINLOOP

M7:

CJNEA,#0AH,M8

ACALLMUSIC

JMPMAINLOOP

M8:

JMPMAINLOOP

秒表原理及流程:

为了秒表计时的准确,利用了按时器作为时刻源,由于按时器为5ms按时,故先需要对它2分频,采纳奇偶方式分频.然后ms位满100进1,s位满60进1.(流程描述)

Miaobiao:

初始化数据

Readkey;

If(key==start)gotostart;

If(key==end)gotoend;

Start:

读取定时器N;

If(N为偶数)ms加一;

Readkey;

If(key==pause)gotopause;

If(key==end)gotoend;

Pause:

Readkey;

If(key==start)gotostart;

If(key==end)gotoend;

End:

初始化数据;

Return;

 

歌曲信息及发音原理:

利用按时器依照频率和距离产生高低转变的方波信号,使扬声器不断置高低电平,从而发声.碰到停止符,那么暂停发声,当下一个音符到来的时候,再打开按时器,继续产生方波,驱动蜂鸣器发音.

<<天空之城>>

译为频率和距离时刻的十六进制:

DB0FDH,0C6H,02H,0FEH,02H,02H

DB0FEH,2AH,04H,0FEH,02H,02H

DB0FEH,2AH,04H,0FEH,84H,04H

DB0FEH,02H,02H

DB00H,00H,04H

DB0FDH,08H,02H,0FDH,08H,02H

DB0FDH,0C6H,03H,0FDH,80H,02H

DB0FDH,0C6H,04H,0FEH,2AH,04H

DB0FDH,80H,04

DB00H,00H,04H

DB0FDH,08H,02H,0FDH,08H,02H

DB0FDH,30H,03H,0FDH,08H,02H

DB0FDH,30H,02H,0FEH,2AH,03H

DB0FDH,08H,04H

DB00H,00H,04H

DB0FEH,2AH,02H,0FEH,2AH,02H

DB0FEH,2AH,03H,0FEH,02H,03H

DB0FDH,30H,02H,0FDH,30H,04H

DB0FEH,02H,04H,0FEH,02H,04H

DB0FFH,0FFH

五.操作说明

键位安排:

S0到S15别离代表各键位值;S0为进入时刻设置和完成返回键;S1为进入闹铃设置和完成返回按键;S2为进入日期设置和完成按键;S3为进入秒表和退出按键;S11为进入倒计时和退出键;S4,S8,S12别离为年月日及时分秒家一按键,S5,S9,S13别离为年月日及时分秒减一按键;S6为闹钟开关键;S10为日期转动键,S14为播放音乐按键.具体见图.

(键位安排)

六.调试与实际运行结果

调试结果:

调试进程中没有什么错误.

运行结果:

所有功能皆可完美的实现,固然还存在着一些小错误和可改良的地址.

能够改良的地址:

1.秒表忘记了清零的键,故功能不全,能够加入.

2.在音乐响完后蜂鸣器继续发声,尽管解决过,但偶然还会显现问题,缘故不明.

3.键盘由于利用次数多而发生不灵的现象,可改变键盘除抖和延迟时刻加以优化.

4.按时器1的按时刻隔太短,故系统负荷较重.可更改计时模式,增大距离.

编译结果:

ProgramSize:

data=8.0xdata=0code=5453

七.总结与体会

这是单片机大体编程练习,未涉及硬件,因此是超级大体的.在实际的工作中,如此的简单程序只能做个电子表,而这种产品已经充满着市场,略微学习过的人都会做,因此是没有经济价值的.故对学习单片机的学习才只是个开头,以后的学习要多向实际应用进展.做他人可不能做的,才能成为高手.这次是用汇编语言做的,而C语言对汇编来讲是有他自己的优势的,因此下次应该练习用C语言写程序,以后学习综合利用C和汇编写程序,才能综合二者优势,提高编程效率.再有,硬件很重要,可不能单片机硬件确实是外行.总之在繁重的专业课之余,找时刻学习单片机!

附录:

ORG0000H

JMPMAIN

ORG000BH

JMPT0_SRV

ORG1000H

CLKEQU20H.0

CEKEQU20H.1

HOUREQU40H

MINEQU41H

SECEQU42H;存放秒钟变量

NEQU43H;寄存5ms计数值

CHHEQU44H

CMMEQU45H

CSSEQU46H;闹铃设置秒钟变量

RUNEQU23H

DAYEQU24H

MONTHEQU25H

YEARLEQU26H

YEARHEQU27H

BUF1EQU28H

BUF2EQU29H

BUF3EQU2AH

BUF4EQU2BH

BUF5EQU2CH

BUF6EQU2DH

BUF7EQU2EH

BUF8EQU2FH

BUF9EQU30H

BUF10EQU31H

BUF11EQU32H

SEC0EQU47H;存放旧的秒数

CHH_DEQU48H;倒数时间小时数

CMM_DEQU49H

CSS_DEQU4AH

STOP_SEQU4BH;秒表

STOP_MEQU4CH

STOP_MSEQU4DH

SEG1EQU50H;数码管

SEG2EQU51H

SEG3EQU52H

SEG4EQU53H

SEG5EQU54H

SEG6EQU55H

SEG7EQU56H

SEG8EQU57H

TEMPEQU58H

 

;***************************************主程序区******************************

INITALL:

CLRCEK

CLRCLK

MOVN,#0

MOVSEC,#55;时刻

MOVMIN,#19

MOVHOUR,#02

MOVCHH,#2;闹钟

MOVCMM,#20

MOVCSS,#0

MOVCHH_D,#0;倒计时

MOVCMM_D,#0

MOVCSS_D,#0

MOVDAY,#06;日期

MOVMONTH,#03

MOVYEARL,#11

MOVYEARH,#20

MOVTEMP,#033H

RET

MAIN:

ACALLINITALL

ACALLINIT_TIMER

MAINLOOP:

;循环区

ACALLCONV

ACALLCLK_ON

ACALLSEG_DISP

;设置时刻

ACALLKEYBOARD;DUDI1JIAN

CJNEA,#00H,M1

ACALLSET_TIME

JMPMAINLOOP;设置闹铃时间

M1:

CJNEA,#01H,M2

ACALLSET_CLK

JMPMAINLOOP

M2:

;闹钟开关

CJNEA,#0DH,M3

CPLCLK

JNBCLK,M2_1;闹铃启动

LCALLBZ

LCALLBZ

JMPMAINLOOP

M2_1:

LCALLBZ;闹铃停止

JMPMAINLOOP

M3:

;设置倒计时

CJNEA,#0BH,M4

ACALLSET_DOWN

JMPMAINLOOP

M4:

;滚动日期

CJNEA,#0EH,M5

ACALLDATE_DISP

JMPMAINLOOP;调整日期

M5:

CJNEA,#02H,M6

ACALLDATA_SET

JMPMAINLOOP;秒表

M6:

CJNEA,#03H,M7

ACALLSTOP

JMPMAINLOOP

M7:

CJNEA,#0AH,M8

ACALLMUSIC

JMPMAINLOOP

M8:

JMPMAINLOOP

;-------------------------按时器T0模式0计时---------------------------

INIT_TIMER:

;初始化按时器,有效按时器T0模式0计时

MOVTMOD,#00H;设置按时器T0模式0

MOVIE,#82H;启用按时器T0中断产生

MOVTL0,#00H;加载初始化数据

MOVTH0,#70H

SETBTR0;启动按时器0开始计时

RET

T0_SRV:

;定时器T0中断程序每隔5ms中断一次

PUSHACC

MOVTL0,#00H;重加载初始化数据

MOVTH0,#70H

INCN;加1

;秒输出

MOVA,N

CJNEA,#200,TT1

MOVN,#0

INCSEC;秒计数加1

MOVA,SEC

CJNEA,#60,TT1;是不是1min到了

;分输出

INCMIN;分计数加1

MOVSEC,#0

MOVA,MIN

CJNEA,#60,TT1;是不是1h到了

;时输出

INCHOUR

MOVMIN,#0

MOVA,HOUR

CJNEA,#24,TT1;是否1天到了

;天输出

INCDAY

MOVHOUR,#0

MOVDPTR,#MONTHTAB

MOVA,MONTH

MOVCA,@A+DPTR

MOVB,DAY

CJNEA,B,TT1

;月输出;是否1月到了

INCMONTH

MOVDAY,#1

MOVA,MONTH

CJNEA,#13,TT1;是否1年到了

;年输出

INCYEARL

MOVMONTH,#1

MOVA,YEARL

CJNEA,#100,TT1

INCYEARH

MOVYEARL,#0

MOVA,YEARH

CJNEA,#100,TT1

MOVSEC,#0H

MOVMIN,#0H

MOVHOUR,#0H

MOVDAY,#1H

MOVMONTH,#1H

MOVYEARL,#0H

MOVYEARH,#0H

TT1:

POPACC

RETI

CONV:

MOVDPTR,#SEGTAB

MOVA,SEC

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG2,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG1,A

MOVA,MIN

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG5,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG4,A

MOVA,HOUR

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG8,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG7,A

JNBCEK,CLKOFF

MOVSEG3,#80H

MOVSEG6,#80H

JMPENDING

JNBCLK,CLKOFF

MOVSEG3,#0C0H

MOVSEG6,#0C0H

RET

CLKOFF:

MOVSEG3,#40H

MOVSEG6,#40H

ENDING:

RET

;-----------------------------数码管扫描显示--------------------------------

SEG_DISP:

PUSH00H

PUSH06H

MOVR0,#SEG1

MOVR6,#08H

MOVA,#00H

MOVR2,#01H

SEG_LOOP:

MOVDPTR,#9FFFH

MOVA,@R0

INCR0

MOVX@DPTR,A

MOVDPTR,#8FFFH

MOVA,R2

MOVX@DPTR,A

RLA

MOVR2,A

LCALLDLY400US

MOVA,#00H

MOVX@DPTR,A

DJNZR6,SEG_LOOP

POP06H

POP00H

RET

;---------------------4*4键盘区-------------------------

KEYBOARD:

MOVDPTR,#9FFFH

MOVA,#00H

MOVX@DPTR,A

LCALLKEY_SCAN

JNZCHUDOU;除抖

LJMPEND_KEYBOARD

CHUDOU:

LCALLDLY10MS

LCALLKEY_SCAN

JNZKEY_READ;扫描

LJMPEND_KEYBOARD

KEY_READ:

MOVR3,#01H

MOVB,#00H

MOVA,R3

KP4:

MOVX@DPTR,A

MOVXA,@DPTR

JNBACC.0,K1

MOVA,#00H

LJMPKP5

K1:

JNBACC.1,K2

MOVA,#04H

LJMPKP5

K2:

JNBACC.2,K3

MOVA,#08H

LJMPKP5

K3:

JNBACC.3,NEXT

MOVA,#0CH

KP5:

ADDA,B

PUSHACC

KP3:

LCALLDLY10MS

LCALLKEY_SCAN

JNZKP3

POPACC

RET

NEXT:

INCB

MOVA,R3

JBACC.3,END_KEYBOARD

RLA

MOVR3,A

LJMPKP4

END_KEYBOARD:

MOVA,#0FFH

RET

KEY_SCAN:

MOVDPTR,#8FFFH

MOVA,#0FH

MOVX@DPTR,A

MOVXA,@DPTR

ANLA,#0FH

RET

;--------------调整时刻子程序-----------------------------------

SET_TIME:

SETBCEK

CLRTR0;定时器工作暂停

ACALLCONV

ACALLSEG_DISP

KEY0:

LCALLSEG_DISP;扫描显示

LCALLKEYBOARD

CJNEA,#04H,KEY1;未按下S1键,那么继续扫描

;S1小时调整

INCHOUR

MOVA,HOUR

CJNEA,#24,L11;是否24小时到了

MOVHOUR,#0H;小时变量清零

L11:

ACALLCONV;转换显示数据

ACALLSEG_DISP;扫描显示

JMPKEY0

KEY1:

CJNEA,#08H,KEY3;未按下S2键,则继续扫描

;S2分钟调整

INCMIN

MOVA,MIN

CJNEA,#60,L21;是否60min到了

MOVMIN,#0H;分钟变量清零

L21:

ACALLCONV

ACALLSEG_DISP

JMPKEY0

KEY3:

CJNEA,#0CH,KEY2;未按下S2键,则继续扫描

;MIAO调整

INCSEC

MOVA,SEC

CJNEA,#60,L31;是否60MIAO到了

MOVSEC,#0H;变量清零

L31:

ACALLCONV

ACALLSEG_DISP

JMPKEY0

KEY2:

CJNEA,#00H,KEY0;未按下S3键,那么继续扫描

SETBTR0;启动按时器

CLRCEK

RET

;----------------设置闹铃时刻-----------------------------------

;设置闹铃时刻

SET_CLK:

ACALLCONVA;加载闹铃时刻数据

N0:

ACALLSEG_DISP

ACALLKEYBOARD

CJNEA,#04H,N1;未按下S1键那么继续扫描

;S1调整小时

INCCHH

MOVA,CHH

CJNEA,#24,N11

MOVCHH,#0

N11:

ACALLCONVA

ACALLSEG_DISP

JMPN0

N1:

CJNEA,#08H,N2;未按下S2键则继续扫描

;S2调整分钟

INCCMM

MOVA,CMM

CJNEA,#60,N21

MOVCMM,#0

N21:

ACALLCONVA

ACALLSEG_DISP

JMPN0

N2:

CJNEA,#01H,N0;未按下S3键则继续扫描

;S3设置完成

ACALLCONV

RET

;-------------------------加载闹铃时刻数据-----------------------

CONVA:

;转换数据

MOVDPTR,#SEGTAB

MOVA,CSS

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG2,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG1,A

MOVSEG3,#80H

MOVA,CMM

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG5,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG4,A

MOVSEG6,#80H

MOVA,CHH

MOVB,#10

DIVAB

MOVCA,@A+DPTR

MOVSEG8,A

MOVA,B

MOVCA,@A+DPTR

MOVSEG7,A

RET

;-

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

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1