2024年2月20日发(作者:茂唱)
单片机课程设计报告
设计题目:音乐倒数计数器
院系:
班级:
姓名:
组员:
指导教师:
郑州轻工业学院课程设计报告
一、设计要求
利用单片机结合七段数码管设计一个倒数计时器,可以煮方便面、煮开水或小睡片刻等,做一小段时间的倒计时。当倒数计时为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:
主程序开始
继电器OFF
初始化变量及数码管显示接口
初始化定时器
LCD闪动表示程序开始执行
扫描显示器更新倒数时间数据,检查闹铃时间是否到了
是否按K1,K2,K3,K4键
N
Y
K1:调整倒数时间
K2:倒数计时时间为5MIN
K3:倒数计时时间为10MIN
K4:倒数计时时间为20MIN
图1 设计流程图
第2页
郑州轻工业学院课程设计报告
原理:
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则执行音乐发生控制程序。因此只要适第3页
郑州轻工业学院课程设计报告
当的运用程序设计技巧,计时中断程序中可以做许多种不同的工作,而这些工作是需要特定一段时间就必须要被触发而被执行的程序。
5,延时时间的计算
若我们想设计程序执行100ms时间延时,程序可以设计如下
DELAY: MOV R6, #50
D1:MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,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 ;计数初值高字节
第4页
郑州轻工业学院课程设计报告
四、源程序:
;以下是开始对各个变量的具体定义,加载字节,确定时间常数,时间变量的存放,倒数的分钟秒钟的存放地址,各变量的含义。
LOA EQU 24
HIA EQU 99
CO EQU 200 ;5ms中断计数时间常数,计数200次表示1s
MUB EQU 20H.0 ;音乐演奏标志
MIN EQU 31H ;已经运行的分钟数
SEC EQU 32H ;正在运行的秒数
SECO EQU 34H ;旧的秒数
DEDA EQU 33H ;5ms计数值
MM EQU 36H ;倒数时间分钟数
SS EQU 37H ;倒数时间秒钟数
LO EQU 38H
HI EQU 39H
TC EQU 3AH
;以下是对四个按键的定义
K1 EQU P3.4
K2 EQU P3.5
K3 EQU P3.6
K4 EQU P3.7
WEI EQU P2.7 ;位选
DUAN EQU P2.6 ;段选
;以下是对继电器、喇叭、闪烁灯的定义
RY1 EQU P1.1 ;继电器
SPK EQU P2.3 ;扬声器
WLED EQU P1.0 ;闪烁灯
;程序开始,代码由地址0开始执行,使用的是定时器0中断
ORG 0000H
SJMP START
ORG 000BH ;T0中断
SJMP T0_INT
START:
SETB MUB ;测试音乐演奏
CLR RY1 ;继电器关
第5页
郑州轻工业学院课程设计报告
CLR MUB ;清除音乐演奏标志
LCALL INIT
LCALL INIT_TIMER
LCALL LOOP
LCALL DISPLAY
LOOP:LCALL DOWN_TIME ;按键控制部分
JNB K1,L1 ;对按键进行检测
JNB K2,L2
JNB K3,L3
JNB K4,L4
JMP LOOP
; 按键1按下,则:
L1: LCALL DISPLAY
JNB K1,L1
MOV MM,#1
LCALL SET_TIME
JMP LOOP
;按键2按下:
L2: LCALL DISPLAY
JNB K2,L2
MOV MM,#5
MOV SS,#0
SJMP LOOP
;按键3按下:
L3: LCALL DISPLAY
JNB K3,L3
MOV MM,#10
MOV SS,#0
SJMP LOOP
;按键4按下:
L4: LCALL DISPLAY
JNB K4,L4
MOV MM,#20
MOV SS,#0
SJMP LOOP ;INIT: MOV DEDA,#0 ; MOV SEC,#0
继续循环执行
将所有时间计时清为0
第6页
郑州轻工业学院课程设计报告
MOV SECO,#0
MOV MIN,#0
;定义初始倒数时间:
MOV MM,#0
MOV SS,#10
RET
;以下是初始化定时器接口,使用定时器0模式0计时
INIT_TIMER:
MOV TMOD,#00000000B
MOV IE, #10000010B
MOV TL0,#LOA
MOV TH0,#HIA
SETB TR0
RET
T0_INT:
JNB MUB,W0 ;T0计时中断程序每5ms中断一次,音乐演奏标志为0时 ;则执行计时程序
MOV TL0,LO
MOV TH0,HI
CPL SPK ;对音乐的加载
RETI
W0: PUSH ACC ;对时间计数的初始化
MOV TL0,#LOA
MOV TH0,#HIA
INC DEDA
MOV A,DEDA
CJNE A,#CO,W1 ;判断是否为1S
MOV DEDA, #0
CPL WLED ;工作指示灯闪烁
INC SEC
MOV A,SEC
CJNE A,#60,W1 ;判断是否1分到了
INC MIN
MOV SEC,#0
MOV A, MIN
CJNE A,#60,W1 ;判断一小时是否到了
第7页
郑州轻工业学院课程设计报告
MOV SEC,#0
MOV MIN,#0
W1: POP ACC ;将累加器由堆栈取出
RETI ;从中断返回
SET_TIME: ;按键1的功能,时间设置部分
CLR TR0 ;定时中断
MOV SS,#0
S0: LCALL DISPLAY ; JNB K2,S1
JNB K3,S2
JNB K4,S3
SJMP S0
S1: LCALL DISPLAY
JNB K2,S1
INC MM
MOV A,MM
CJNE A,#61,S0
MOV MM,#1
SJMP S0
S2: LCALL DISPLAY
JNB K3,S2
DEC MM
MOV A,MM
CJNE A,#0,S0
MOV MM,#60
SJMP S0
S3: JNB K4,S3
LCALL BZ
LCALL BZ
SETB TR0
RET
BZ: MOV R6,#0 ;B1: CALL DEX
CPL SPK
DJNZ R6,B1
MOV R5,#10
CALL DELAY
扫描按下的为哪个键
喇叭发出声音
第8页
郑州轻工业学院课程设计报告
RET
DEX: MOV R7,#180 ;短暂延迟
DE1: NOP
DJNZ R7,DE1
RET
DELAY:MOV R6, #50;延时子程序,延迟10ms
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;过了1S后则更新倒数时间并检查是否倒数终止:
DOWN_TIME:
LCALL DISPLAY
MOV A,SEC ;加载现在时间
MOV B,SECO ;加载旧时间
CJNE A,B,DO1 ;是否过了1S
RET
DO1:
MOV SECO,SEC ;记录旧秒数
DEC SS
MOV A,SS
CJNE A,#0FFH,D2 ;判断秒数和分钟数是否为0
MOV A,MM
CJNE A,#0,D12
CALL TIME_OUT;当秒数和分钟数为0时则停止倒数计时
RET
D12: MOV SS,#59 ;秒数=59 分钟数减1
DEC MM
D2: RET
;显示模块,将时、分、秒十位、各位分离,并暂存到50H-55H
;内,P2.6口控制段选,P2.7口控制位选
DISPLAY:MOV A,#00 ;将时数进行十位、各位分离
MOV B,#10
DIV AB
MOV 50H,A
MOV 51H,B
第9页
郑州轻工业学院课程设计报告
MOV A,MM ;将分数进行十位、各位分离
MOV B,#10
DIV AB
MOV 52H,A
MOV 53H,B
MOV A,SS ;将秒数进行十位、各位分离
MOV B,#10
DIV AB
MOV 54H,A
MOV 55H,B
M1: MOV R6,#00H;控制扫描次数
MOV R0,#0FEH;R0值为位选值,01H=00000001B,第一位数码管选通
MOV R1,#50H;时、分、秒暂存值的单元首地址给R1
MOV DPTR,#TAB;TAB的首地址给DPTR
LOOP1:
SETB DUAN
MOV A,@R1 ;时、分、秒的值给A
MOVC A,@A+DPTR ;查找对应的段码
MOV P0,A ;把段码值给P0口
CLR DUAN
SETB WEI
MOV A,R0 ;位选值给A
MOV P0,A ;位选值给P0口,控制位选
CLR WEI
INC R1 ;时、分、秒暂存值的地址加1
INC R6 ;扫描次数加1
MOV A,R0 ;位选值给A
RL A ;位选值左循环
MOV R0,A
LCALL DELAY1;延时
CJNE R6,#06H,LOOP1;是否扫描一遍了
RET
DELAY1:
MOV R4,#5
DEL2: MOV R5,#250
DEL3: DJNZ R5,DEL3
第10页
郑州轻工业学院课程设计报告
DJNZ R4,DEL2
RET
TIMER0: MOV TL0,#0B0H//给T0装计数初值(50ms)
MOV TH0,#9CH //给T0装计数初值(50ms
INC R7
RETI
//////////查找表//////////////
TAB: DB 3FH //数字0-9所对应数码管上显示0-9的译码值
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH
TIME_OUT:SETB RY1 ;倒数终了程序,继电器ON,停止计时
TI1:
SETB MUB ;演奏音乐
LCALL MUSIC
SJMP TI1
RET
MUSIC: ;音乐的设置模块
MOV TMOD,#00000000B
MOV IE, #10000010B
M0:
CALL SOUND_ON ;喇叭打开
MOV R4,#1 ;发出“DO”一拍
MOV R3,#1
CALL PLAY
MOV R4,#2 ;发出“RE”一拍
MOV R3,#1
CALL PLAY
MOV R4,#3 ;发出“ME”一拍
MOV R3,#3
第11页
郑州轻工业学院课程设计报告
CALL PLAY
CALL SOUND_OFF ;喇叭关闭没有声音
MOV R5,#50 ;静音0.5S
CALL DELAY
;下面是一段旋律演奏的程序
CALL SOUND_ON
CALL PLAY_SONG
CALL SOUND_OFF
JMP M0
;R4音阶指针,R3拍数
PLAY:CALL LOAD_VALUE ;PL:MOV R5,#10
CALL DELAY
DJNZ R3, PL
;实现暂停:
CALL SOUND_OFF
MOV R5,#3
CALL DELAY
CALL SOUND_ON ; RET
;演奏一段旋律:
PLAY_SONG:
MOV TC,#0
PP0: ; MOV DPTR, #SONG
MOV A,TC
MOVC A,@A+DPTR
MOV R4,A
CJNE A,#0FFH,PP1
RET
PP1: ; MOV DPTR, #LEN
MOV A,TC
MOVC A,@A+DPTR
MOV R3,A
CALL PLAY
INC TC
单音演奏
喇叭开启
指向旋律音阶数据列表地址指向旋律拍数数据列表地址第12页
郑州轻工业学院课程设计报告
JMP PP0
RET
SOUND_ON: ;喇叭打开
SETB TR0
RET
SOUND_OFF: ;喇叭关闭
CLR TR0
RET
;以查表法由音阶计数值来载入计数初值,R4表示音阶计数值
LOAD_VALUE:
MOV DPTR,#HI_LIST ;指向数据列表地址
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#LO_LIST
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
RET
;定时器的设置用来设置音乐声音:
HI_LIST: ;音阶对应定时器0计数初值高字节数据列表
DB 0,226,229,232,233,236,238,240
DB 241,242,244,244,246,247,248
LO_LIST: ;音阶对应定时器0计数初值低字节数据列表
DB 0,4,13,10,20,3,8,6
DB 2,23,5,26,1,4,3
;以下为旋律数据:
SONG:
DB 2,6,2,2,3,1,4,3,2,2,1,6,7,1,3,3,5,3,2,7,6,1,0FFH
LEN:
DB 2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0FFH
END
第13页
郑州轻工业学院课程设计报告
五、心得体会
在这段时间里,我学到了很多知识也有很多感受,不仅使我对模拟电子及其它专业知识有了更深刻的了解而且我开始了独立的学习和实验查看相关资料和书籍,让自己头脑中模糊的概念逐渐清晰,每一次改进都是我学习的收获,同时使我将理论应用于实际。我不但回顾了以前所学的电路原理的基础知识,而且还学到了一些新知识。最重要的是我深刻体会到要做好一件完整的事情,要有系统的思维方式和逻辑方法,要耐心的面对所有问题、要善于用应用各种资源来充实和满足自己。
这次做设计的经历让我终生受益、我感受到做设计是要用心去做的一件事,没有学习就不可能有研究的能力,这次的经历能在以后的学习、工作中激励我继续进步。
这份期末的课程设计让我达到了强化自身能力的目的,实际开发过程中,发现日常看起来很普通的一件物品,原来各个都凝聚了人类智慧的结晶,即使只是一个普普通通的倒数计时器,在开发过程中自身学到了很多东西,也充分的认识了自己,以前常认为做事要求的是个人能力,在这次开发过程中,我真正认识到了团队的概念,原来明确的分工,带来的将是意想不到的效果。
顺祝老师工作顺利,身体健康。
第14页
2024年2月20日发(作者:茂唱)
单片机课程设计报告
设计题目:音乐倒数计数器
院系:
班级:
姓名:
组员:
指导教师:
郑州轻工业学院课程设计报告
一、设计要求
利用单片机结合七段数码管设计一个倒数计时器,可以煮方便面、煮开水或小睡片刻等,做一小段时间的倒计时。当倒数计时为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:
主程序开始
继电器OFF
初始化变量及数码管显示接口
初始化定时器
LCD闪动表示程序开始执行
扫描显示器更新倒数时间数据,检查闹铃时间是否到了
是否按K1,K2,K3,K4键
N
Y
K1:调整倒数时间
K2:倒数计时时间为5MIN
K3:倒数计时时间为10MIN
K4:倒数计时时间为20MIN
图1 设计流程图
第2页
郑州轻工业学院课程设计报告
原理:
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则执行音乐发生控制程序。因此只要适第3页
郑州轻工业学院课程设计报告
当的运用程序设计技巧,计时中断程序中可以做许多种不同的工作,而这些工作是需要特定一段时间就必须要被触发而被执行的程序。
5,延时时间的计算
若我们想设计程序执行100ms时间延时,程序可以设计如下
DELAY: MOV R6, #50
D1:MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,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 ;计数初值高字节
第4页
郑州轻工业学院课程设计报告
四、源程序:
;以下是开始对各个变量的具体定义,加载字节,确定时间常数,时间变量的存放,倒数的分钟秒钟的存放地址,各变量的含义。
LOA EQU 24
HIA EQU 99
CO EQU 200 ;5ms中断计数时间常数,计数200次表示1s
MUB EQU 20H.0 ;音乐演奏标志
MIN EQU 31H ;已经运行的分钟数
SEC EQU 32H ;正在运行的秒数
SECO EQU 34H ;旧的秒数
DEDA EQU 33H ;5ms计数值
MM EQU 36H ;倒数时间分钟数
SS EQU 37H ;倒数时间秒钟数
LO EQU 38H
HI EQU 39H
TC EQU 3AH
;以下是对四个按键的定义
K1 EQU P3.4
K2 EQU P3.5
K3 EQU P3.6
K4 EQU P3.7
WEI EQU P2.7 ;位选
DUAN EQU P2.6 ;段选
;以下是对继电器、喇叭、闪烁灯的定义
RY1 EQU P1.1 ;继电器
SPK EQU P2.3 ;扬声器
WLED EQU P1.0 ;闪烁灯
;程序开始,代码由地址0开始执行,使用的是定时器0中断
ORG 0000H
SJMP START
ORG 000BH ;T0中断
SJMP T0_INT
START:
SETB MUB ;测试音乐演奏
CLR RY1 ;继电器关
第5页
郑州轻工业学院课程设计报告
CLR MUB ;清除音乐演奏标志
LCALL INIT
LCALL INIT_TIMER
LCALL LOOP
LCALL DISPLAY
LOOP:LCALL DOWN_TIME ;按键控制部分
JNB K1,L1 ;对按键进行检测
JNB K2,L2
JNB K3,L3
JNB K4,L4
JMP LOOP
; 按键1按下,则:
L1: LCALL DISPLAY
JNB K1,L1
MOV MM,#1
LCALL SET_TIME
JMP LOOP
;按键2按下:
L2: LCALL DISPLAY
JNB K2,L2
MOV MM,#5
MOV SS,#0
SJMP LOOP
;按键3按下:
L3: LCALL DISPLAY
JNB K3,L3
MOV MM,#10
MOV SS,#0
SJMP LOOP
;按键4按下:
L4: LCALL DISPLAY
JNB K4,L4
MOV MM,#20
MOV SS,#0
SJMP LOOP ;INIT: MOV DEDA,#0 ; MOV SEC,#0
继续循环执行
将所有时间计时清为0
第6页
郑州轻工业学院课程设计报告
MOV SECO,#0
MOV MIN,#0
;定义初始倒数时间:
MOV MM,#0
MOV SS,#10
RET
;以下是初始化定时器接口,使用定时器0模式0计时
INIT_TIMER:
MOV TMOD,#00000000B
MOV IE, #10000010B
MOV TL0,#LOA
MOV TH0,#HIA
SETB TR0
RET
T0_INT:
JNB MUB,W0 ;T0计时中断程序每5ms中断一次,音乐演奏标志为0时 ;则执行计时程序
MOV TL0,LO
MOV TH0,HI
CPL SPK ;对音乐的加载
RETI
W0: PUSH ACC ;对时间计数的初始化
MOV TL0,#LOA
MOV TH0,#HIA
INC DEDA
MOV A,DEDA
CJNE A,#CO,W1 ;判断是否为1S
MOV DEDA, #0
CPL WLED ;工作指示灯闪烁
INC SEC
MOV A,SEC
CJNE A,#60,W1 ;判断是否1分到了
INC MIN
MOV SEC,#0
MOV A, MIN
CJNE A,#60,W1 ;判断一小时是否到了
第7页
郑州轻工业学院课程设计报告
MOV SEC,#0
MOV MIN,#0
W1: POP ACC ;将累加器由堆栈取出
RETI ;从中断返回
SET_TIME: ;按键1的功能,时间设置部分
CLR TR0 ;定时中断
MOV SS,#0
S0: LCALL DISPLAY ; JNB K2,S1
JNB K3,S2
JNB K4,S3
SJMP S0
S1: LCALL DISPLAY
JNB K2,S1
INC MM
MOV A,MM
CJNE A,#61,S0
MOV MM,#1
SJMP S0
S2: LCALL DISPLAY
JNB K3,S2
DEC MM
MOV A,MM
CJNE A,#0,S0
MOV MM,#60
SJMP S0
S3: JNB K4,S3
LCALL BZ
LCALL BZ
SETB TR0
RET
BZ: MOV R6,#0 ;B1: CALL DEX
CPL SPK
DJNZ R6,B1
MOV R5,#10
CALL DELAY
扫描按下的为哪个键
喇叭发出声音
第8页
郑州轻工业学院课程设计报告
RET
DEX: MOV R7,#180 ;短暂延迟
DE1: NOP
DJNZ R7,DE1
RET
DELAY:MOV R6, #50;延时子程序,延迟10ms
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;过了1S后则更新倒数时间并检查是否倒数终止:
DOWN_TIME:
LCALL DISPLAY
MOV A,SEC ;加载现在时间
MOV B,SECO ;加载旧时间
CJNE A,B,DO1 ;是否过了1S
RET
DO1:
MOV SECO,SEC ;记录旧秒数
DEC SS
MOV A,SS
CJNE A,#0FFH,D2 ;判断秒数和分钟数是否为0
MOV A,MM
CJNE A,#0,D12
CALL TIME_OUT;当秒数和分钟数为0时则停止倒数计时
RET
D12: MOV SS,#59 ;秒数=59 分钟数减1
DEC MM
D2: RET
;显示模块,将时、分、秒十位、各位分离,并暂存到50H-55H
;内,P2.6口控制段选,P2.7口控制位选
DISPLAY:MOV A,#00 ;将时数进行十位、各位分离
MOV B,#10
DIV AB
MOV 50H,A
MOV 51H,B
第9页
郑州轻工业学院课程设计报告
MOV A,MM ;将分数进行十位、各位分离
MOV B,#10
DIV AB
MOV 52H,A
MOV 53H,B
MOV A,SS ;将秒数进行十位、各位分离
MOV B,#10
DIV AB
MOV 54H,A
MOV 55H,B
M1: MOV R6,#00H;控制扫描次数
MOV R0,#0FEH;R0值为位选值,01H=00000001B,第一位数码管选通
MOV R1,#50H;时、分、秒暂存值的单元首地址给R1
MOV DPTR,#TAB;TAB的首地址给DPTR
LOOP1:
SETB DUAN
MOV A,@R1 ;时、分、秒的值给A
MOVC A,@A+DPTR ;查找对应的段码
MOV P0,A ;把段码值给P0口
CLR DUAN
SETB WEI
MOV A,R0 ;位选值给A
MOV P0,A ;位选值给P0口,控制位选
CLR WEI
INC R1 ;时、分、秒暂存值的地址加1
INC R6 ;扫描次数加1
MOV A,R0 ;位选值给A
RL A ;位选值左循环
MOV R0,A
LCALL DELAY1;延时
CJNE R6,#06H,LOOP1;是否扫描一遍了
RET
DELAY1:
MOV R4,#5
DEL2: MOV R5,#250
DEL3: DJNZ R5,DEL3
第10页
郑州轻工业学院课程设计报告
DJNZ R4,DEL2
RET
TIMER0: MOV TL0,#0B0H//给T0装计数初值(50ms)
MOV TH0,#9CH //给T0装计数初值(50ms
INC R7
RETI
//////////查找表//////////////
TAB: DB 3FH //数字0-9所对应数码管上显示0-9的译码值
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH
TIME_OUT:SETB RY1 ;倒数终了程序,继电器ON,停止计时
TI1:
SETB MUB ;演奏音乐
LCALL MUSIC
SJMP TI1
RET
MUSIC: ;音乐的设置模块
MOV TMOD,#00000000B
MOV IE, #10000010B
M0:
CALL SOUND_ON ;喇叭打开
MOV R4,#1 ;发出“DO”一拍
MOV R3,#1
CALL PLAY
MOV R4,#2 ;发出“RE”一拍
MOV R3,#1
CALL PLAY
MOV R4,#3 ;发出“ME”一拍
MOV R3,#3
第11页
郑州轻工业学院课程设计报告
CALL PLAY
CALL SOUND_OFF ;喇叭关闭没有声音
MOV R5,#50 ;静音0.5S
CALL DELAY
;下面是一段旋律演奏的程序
CALL SOUND_ON
CALL PLAY_SONG
CALL SOUND_OFF
JMP M0
;R4音阶指针,R3拍数
PLAY:CALL LOAD_VALUE ;PL:MOV R5,#10
CALL DELAY
DJNZ R3, PL
;实现暂停:
CALL SOUND_OFF
MOV R5,#3
CALL DELAY
CALL SOUND_ON ; RET
;演奏一段旋律:
PLAY_SONG:
MOV TC,#0
PP0: ; MOV DPTR, #SONG
MOV A,TC
MOVC A,@A+DPTR
MOV R4,A
CJNE A,#0FFH,PP1
RET
PP1: ; MOV DPTR, #LEN
MOV A,TC
MOVC A,@A+DPTR
MOV R3,A
CALL PLAY
INC TC
单音演奏
喇叭开启
指向旋律音阶数据列表地址指向旋律拍数数据列表地址第12页
郑州轻工业学院课程设计报告
JMP PP0
RET
SOUND_ON: ;喇叭打开
SETB TR0
RET
SOUND_OFF: ;喇叭关闭
CLR TR0
RET
;以查表法由音阶计数值来载入计数初值,R4表示音阶计数值
LOAD_VALUE:
MOV DPTR,#HI_LIST ;指向数据列表地址
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#LO_LIST
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
RET
;定时器的设置用来设置音乐声音:
HI_LIST: ;音阶对应定时器0计数初值高字节数据列表
DB 0,226,229,232,233,236,238,240
DB 241,242,244,244,246,247,248
LO_LIST: ;音阶对应定时器0计数初值低字节数据列表
DB 0,4,13,10,20,3,8,6
DB 2,23,5,26,1,4,3
;以下为旋律数据:
SONG:
DB 2,6,2,2,3,1,4,3,2,2,1,6,7,1,3,3,5,3,2,7,6,1,0FFH
LEN:
DB 2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0FFH
END
第13页
郑州轻工业学院课程设计报告
五、心得体会
在这段时间里,我学到了很多知识也有很多感受,不仅使我对模拟电子及其它专业知识有了更深刻的了解而且我开始了独立的学习和实验查看相关资料和书籍,让自己头脑中模糊的概念逐渐清晰,每一次改进都是我学习的收获,同时使我将理论应用于实际。我不但回顾了以前所学的电路原理的基础知识,而且还学到了一些新知识。最重要的是我深刻体会到要做好一件完整的事情,要有系统的思维方式和逻辑方法,要耐心的面对所有问题、要善于用应用各种资源来充实和满足自己。
这次做设计的经历让我终生受益、我感受到做设计是要用心去做的一件事,没有学习就不可能有研究的能力,这次的经历能在以后的学习、工作中激励我继续进步。
这份期末的课程设计让我达到了强化自身能力的目的,实际开发过程中,发现日常看起来很普通的一件物品,原来各个都凝聚了人类智慧的结晶,即使只是一个普普通通的倒数计时器,在开发过程中自身学到了很多东西,也充分的认识了自己,以前常认为做事要求的是个人能力,在这次开发过程中,我真正认识到了团队的概念,原来明确的分工,带来的将是意想不到的效果。
顺祝老师工作顺利,身体健康。
第14页