音乐倒数计时器.docx
- 文档编号:6816775
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:16
- 大小:45.75KB
音乐倒数计时器.docx
《音乐倒数计时器.docx》由会员分享,可在线阅读,更多相关《音乐倒数计时器.docx(16页珍藏版)》请在冰豆网上搜索。
音乐倒数计时器
单片机课程设计报告
设计题目:
音乐倒数计数器
院系:
班级:
姓名:
组员:
指导教师:
一、设计要求
利用单片机结合七段数码管设计一个倒数计时器,可以煮方便面、煮开水或小睡片刻等,做一小段时间的倒计时。
当倒数计时为0时,则发出一段音乐,通知倒数终了,该做重要的事情了。
具体功能:
1:
6个七段数码管显示时分秒
2:
用4个按键操作来设置现在想要倒数的时间
3:
一旦按键后则开始倒数计时,当计时为零则发出一阵音乐声响
4:
程序执行后工作指示灯LED闪动,表示程序开始执行,七段显示器显示“000010”
5:
按下操作键K1~K4动作如下:
操作键K1,可调整倒数时间1min~60min;
操作键K2,设置倒数计时时间为5min,显示“000500”;
操作键K3,设置倒数计时时间为10min,显示“001000”;
操作键K4,设置倒数计时时间为20min,显示“002000”;
按下K1键后:
操作键K2:
增加倒数计时1min;
操作键K3,减少倒数计时1min;
操作键K4:
设置完成,开始倒数计时。
当计时为0时则发出一段音乐,同时继电器启动
二、设计目的
学习单片机定时器时间计时处理、按键扫描、数码管显示及音乐旋律演奏的设计方法。
强化对单片机知识的学习
能够熟练运用所学知识
三、设计的具体实现
具体的设计流程可见图1:
图1设计流程图
原理:
1,定时/计数器:
单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。
大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。
2,工作指示灯:
送出低电平时,LED点亮,高电平时则使LED熄灭。
3,按键控制:
按键控制室控制程序执行时数据的输入或是特殊功能的设置及操作,使用单片机端口3的4条输入口,由程序来控制,平时输入端为高电平,当有按键按下则相对位会呈现低电平,进过轮流扫描判断输入端是否为低电平,便可知道按下的是哪一个按钮。
4,控制程序:
本课程设计中,可以学习利用单片机定时器设计时间计时处理,其时分秒控制,定时器0计时中断程序每个5ms中断一次当做一个计数,每中断一次则计数加1,当计数200次时,表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,若计数到了则将相关变量清除为0。
单片机定时器负责定时的技术,不会因为案件处理而中断时间描述的增加。
在主控程序循环中主要工作为扫描是否有按键,若有按键则做相应的功能处理,同时也检查所倒数的时间是否为0,若为0表示倒数的时间终了,应该执行想对应的工作了,图1为主程序控制工作流程。
时间计时处理程序时等过了1s后,则更新时间数据,将最新剩余倒数的分秒的时间数据转换为数字数据,并显示在数码管上。
程序中如何判断是否已过了1s?
可以设一旧秒数变量,当新旧秒数变量不一样时,则表示已过了1s,要做相关程序处理了。
倒数计时闹铃的动作利用时间计时处理来做秒数倒数,当所设置的时间为0,喇叭则不断发出音乐声,启动继电器,有继电器可以控制家电开启或关闭。
音乐声的产生也是有定时器来产生固定频率的方波信号推动压电喇叭,发出旋律。
而定时器原先已利用设计时间计时处理了,怎么能在设计来做音乐旋律的控制?
在此设计定义一个音乐演奏标志,若音乐演奏标志为0则执行中断程序中计时程序的部分程序,若音乐演奏标志为1则执行音乐发生控制程序。
因此只要适当的运用程序设计技巧,计时中断程序中可以做许多种不同的工作,而这些工作是需要特定一段时间就必须要被触发而被执行的程序。
5,延时时间的计算
若我们想设计程序执行100ms时间延时,程序可以设计如下
DELAY:
MOVR6,#50
D1:
MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
如果震荡频率为12MHz则执行时间按为
T=1+50*(1+100*2)+2+2+2us
=10.057ms
如果执行10次此子程序,则延时时间约为100ms
6,工作方式设计
本次设计中采用的定时器模式0来设计,在此方式中T0、T0可以进行13位的计时,其值保存在两个8位的定时寄存器中。
对于其中任一定时器,工作时钟可以由内部或是外部来提供,由C/T位来决定做定时器还是计数器。
定时器的时钟为系统工作时钟除以12.此次试验中采用12MHz石英震荡器则产生1us的计数时间脉冲宽度。
本次实验的定时器计时时间为5ms,因此定时器0需计数5000次,其定时器初值的加载可以计算如下:
TL0=(8192-5000).MOD.32
TL1=(8192-5000)/32
执行后的结果为,产生的脉冲宽度为
T=5ms
7,由定时器产生各种频率的声音
我们可以设定发音的频率来改变声音产生音乐,计时时间长短也是按照发音的频率而定的。
由频率值推得定时器计数初值由下关系式得到:
T=1/f(us);方波宽度
Co=(int)t/2;定时器所得计数的次数
Lo=(8192-co)%32;计数初值低字节
Hi=(8192-co)/32;计数初值高字节
四、源程序:
;以下是开始对各个变量的具体定义,加载字节,确定时间常数,时间变量的存放,倒数的分钟秒钟的存放地址,各变量的含义。
LOAEQU24
HIAEQU99
COEQU200;5ms中断计数时间常数,计数200次表示1s
MUBEQU20H.0;音乐演奏标志
MINEQU31H;已经运行的分钟数
SECEQU32H;正在运行的秒数
SECOEQU34H;旧的秒数
DEDAEQU33H;5ms计数值
MMEQU36H;倒数时间分钟数
SSEQU37H;倒数时间秒钟数
LOEQU38H
HIEQU39H
TCEQU3AH
;以下是对四个按键的定义
K1EQUP3.4
K2EQUP3.5
K3EQUP3.6
K4EQUP3.7
WEIEQUP2.7;位选
DUANEQUP2.6;段选
;以下是对继电器、喇叭、闪烁灯的定义
RY1EQUP1.1;继电器
SPKEQUP2.3;扬声器
WLEDEQUP1.0;闪烁灯
;程序开始,代码由地址0开始执行,使用的是定时器0中断
ORG0000H
SJMPSTART
ORG000BH;T0中断
SJMPT0_INT
START:
SETBMUB;测试音乐演奏
CLRRY1;继电器关
CLRMUB;清除音乐演奏标志
LCALLINIT
LCALLINIT_TIMER
LCALLLOOP
LCALLDISPLAY
LOOP:
LCALLDOWN_TIME;按键控制部分
JNBK1,L1;对按键进行检测
JNBK2,L2
JNBK3,L3
JNBK4,L4
JMPLOOP
;按键1按下,则:
L1:
LCALLDISPLAY
JNBK1,L1
MOVMM,#1
LCALLSET_TIME
JMPLOOP
;按键2按下:
L2:
LCALLDISPLAY
JNBK2,L2
MOVMM,#5
MOVSS,#0
SJMPLOOP
;按键3按下:
L3:
LCALLDISPLAY
JNBK3,L3
MOVMM,#10
MOVSS,#0
SJMPLOOP
;按键4按下:
L4:
LCALLDISPLAY
JNBK4,L4
MOVMM,#20
MOVSS,#0
SJMPLOOP;继续循环执行
INIT:
MOVDEDA,#0;将所有时间计时清为0
MOVSEC,#0
MOVSECO,#0
MOVMIN,#0
;定义初始倒数时间:
MOVMM,#0
MOVSS,#10
RET
;以下是初始化定时器接口,使用定时器0模式0计时
INIT_TIMER:
MOVTMOD,#00000000B
MOVIE,#10000010B
MOVTL0,#LOA
MOVTH0,#HIA
SETBTR0
RET
T0_INT:
JNBMUB,W0;T0计时中断程序每5ms中断一次,音乐演奏标志为0时;则执行计时程序
MOVTL0,LO
MOVTH0,HI
CPLSPK;对音乐的加载
RETI
W0:
PUSHACC;对时间计数的初始化
MOVTL0,#LOA
MOVTH0,#HIA
INCDEDA
MOVA,DEDA
CJNEA,#CO,W1;判断是否为1S
MOVDEDA,#0
CPLWLED;工作指示灯闪烁
INCSEC
MOVA,SEC
CJNEA,#60,W1;判断是否1分到了
INCMIN
MOVSEC,#0
MOVA,MIN
CJNEA,#60,W1;判断一小时是否到了
MOVSEC,#0
MOVMIN,#0
W1:
POPACC;将累加器由堆栈取出
RETI;从中断返回
SET_TIME:
;按键1的功能,时间设置部分
CLRTR0;定时中断
MOVSS,#0
S0:
LCALLDISPLAY;扫描按下的为哪个键
JNBK2,S1
JNBK3,S2
JNBK4,S3
SJMPS0
S1:
LCALLDISPLAY
JNBK2,S1
INCMM
MOVA,MM
CJNEA,#61,S0
MOVMM,#1
SJMPS0
S2:
LCALLDISPLAY
JNBK3,S2
DECMM
MOVA,MM
CJNEA,#0,S0
MOVMM,#60
SJMPS0
S3:
JNBK4,S3
LCALLBZ
LCALLBZ
SETBTR0
RET
BZ:
MOVR6,#0;喇叭发出声音
B1:
CALLDEX
CPLSPK
DJNZR6,B1
MOVR5,#10
CALLDELAY
RET
DEX:
MOVR7,#180;短暂延迟
DE1:
NOP
DJNZR7,DE1
RET
DELAY:
MOVR6,#50;延时子程序,延迟10ms
D1:
MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;过了1S后则更新倒数时间并检查是否倒数终止:
DOWN_TIME:
LCALLDISPLAY
MOVA,SEC;加载现在时间
MOVB,SECO;加载旧时间
CJNEA,B,DO1;是否过了1S
RET
DO1:
MOVSECO,SEC;记录旧秒数
DECSS
MOVA,SS
CJNEA,#0FFH,D2;判断秒数和分钟数是否为0
MOVA,MM
CJNEA,#0,D12
CALLTIME_OUT;当秒数和分钟数为0时则停止倒数计时
RET
D12:
MOVSS,#59;秒数=59分钟数减1
DECMM
D2:
RET
;显示模块,将时、分、秒十位、各位分离,并暂存到50H-55H
;内,P2.6口控制段选,P2.7口控制位选
DISPLAY:
MOVA,#00;将时数进行十位、各位分离
MOVB,#10
DIVAB
MOV50H,A
MOV51H,B
MOVA,MM;将分数进行十位、各位分离
MOVB,#10
DIVAB
MOV52H,A
MOV53H,B
MOVA,SS;将秒数进行十位、各位分离
MOVB,#10
DIVAB
MOV54H,A
MOV55H,B
M1:
MOVR6,#00H;控制扫描次数
MOVR0,#0FEH;R0值为位选值,01H=00000001B,第一位数码管选通
MOVR1,#50H;时、分、秒暂存值的单元首地址给R1
MOVDPTR,#TAB;TAB的首地址给DPTR
LOOP1:
SETBDUAN
MOVA,@R1;时、分、秒的值给A
MOVCA,@A+DPTR;查找对应的段码
MOVP0,A;把段码值给P0口
CLRDUAN
SETBWEI
MOVA,R0;位选值给A
MOVP0,A;位选值给P0口,控制位选
CLRWEI
INCR1;时、分、秒暂存值的地址加1
INCR6;扫描次数加1
MOVA,R0;位选值给A
RLA;位选值左循环
MOVR0,A
LCALLDELAY1;延时
CJNER6,#06H,LOOP1;是否扫描一遍了
RET
DELAY1:
MOVR4,#5
DEL2:
MOVR5,#250
DEL3:
DJNZR5,DEL3
DJNZR4,DEL2
RET
TIMER0:
MOVTL0,#0B0H//给T0装计数初值(50ms)
MOVTH0,#9CH//给T0装计数初值(50ms
INCR7
RETI
//////////查找表//////////////
TAB:
DB3FH//数字0-9所对应数码管上显示0-9的译码值
DB06H
DB5BH
DB4FH
DB66H
DB6DH
DB7DH
DB07H
DB7FH
DB6FH
TIME_OUT:
SETBRY1;倒数终了程序,继电器ON,停止计时
TI1:
SETBMUB;演奏音乐
LCALLMUSIC
SJMPTI1
RET
MUSIC:
;音乐的设置模块
MOVTMOD,#00000000B
MOVIE,#10000010B
M0:
CALLSOUND_ON;喇叭打开
MOVR4,#1;发出“DO”一拍
MOVR3,#1
CALLPLAY
MOVR4,#2;发出“RE”一拍
MOVR3,#1
CALLPLAY
MOVR4,#3;发出“ME”一拍
MOVR3,#3
CALLPLAY
CALLSOUND_OFF;喇叭关闭没有声音
MOVR5,#50;静音0.5S
CALLDELAY
;下面是一段旋律演奏的程序
CALLSOUND_ON
CALLPLAY_SONG
CALLSOUND_OFF
JMPM0
;R4音阶指针,R3拍数
PLAY:
CALLLOAD_VALUE;单音演奏
PL:
MOVR5,#10
CALLDELAY
DJNZR3,PL
;实现暂停:
CALLSOUND_OFF
MOVR5,#3
CALLDELAY
CALLSOUND_ON;喇叭开启
RET
;演奏一段旋律:
PLAY_SONG:
MOVTC,#0
PP0:
;指向旋律音阶数据列表地址
MOVDPTR,#SONG
MOVA,TC
MOVCA,@A+DPTR
MOVR4,A
CJNEA,#0FFH,PP1
RET
PP1:
;指向旋律拍数数据列表地址
MOVDPTR,#LEN
MOVA,TC
MOVCA,@A+DPTR
MOVR3,A
CALLPLAY
INCTC
JMPPP0
RET
SOUND_ON:
;喇叭打开
SETBTR0
RET
SOUND_OFF:
;喇叭关闭
CLRTR0
RET
;以查表法由音阶计数值来载入计数初值,R4表示音阶计数值
LOAD_VALUE:
MOVDPTR,#HI_LIST;指向数据列表地址
MOVA,R4
MOVCA,@A+DPTR
MOVHI,A
MOVDPTR,#LO_LIST
MOVA,R4
MOVCA,@A+DPTR
MOVLO,A
RET
;定时器的设置用来设置音乐声音:
HI_LIST:
;音阶对应定时器0计数初值高字节数据列表
DB0,226,229,232,233,236,238,240
DB241,242,244,244,246,247,248
LO_LIST:
;音阶对应定时器0计数初值低字节数据列表
DB0,4,13,10,20,3,8,6
DB2,23,5,26,1,4,3
;以下为旋律数据:
SONG:
DB2,6,2,2,3,1,4,3,2,2,1,6,7,1,3,3,5,3,2,7,6,1,0FFH
LEN:
DB2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0FFH
END
五、心得体会
在这段时间里,我学到了很多知识也有很多感受,不仅使我对模拟电子及其它专业知识有了更深刻的了解而且我开始了独立的学习和实验查看相关资料和书籍,让自己头脑中模糊的概念逐渐清晰,每一次改进都是我学习的收获,同时使我将理论应用于实际。
我不但回顾了以前所学的电路原理的基础知识,而且还学到了一些新知识。
最重要的是我深刻体会到要做好一件完整的事情,要有系统的思维方式和逻辑方法,要耐心的面对所有问题、要善于用应用各种资源来充实和满足自己。
这次做设计的经历让我终生受益、我感受到做设计是要用心去做的一件事,没有学习就不可能有研究的能力,这次的经历能在以后的学习、工作中激励我继续进步。
这份期末的课程设计让我达到了强化自身能力的目的,实际开发过程中,发现日常看起来很普通的一件物品,原来各个都凝聚了人类智慧的结晶,即使只是一个普普通通的倒数计时器,在开发过程中自身学到了很多东西,也充分的认识了自己,以前常认为做事要求的是个人能力,在这次开发过程中,我真正认识到了团队的概念,原来明确的分工,带来的将是意想不到的效果。
顺祝老师工作顺利,身体健康。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐 倒数 计时器