单片机多功能时钟实验报告.docx
《单片机多功能时钟实验报告.docx》由会员分享,可在线阅读,更多相关《单片机多功能时钟实验报告.docx(44页珍藏版)》请在冰点文库上搜索。
单片机多功能时钟实验报告
单片机实验报告
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
;-