例说8051 第8章 声音的产生
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012/10/19
例说8051
8-23
Ch8-1.asm-3
;=======音节表============================== TIMES: DB 95, 85, 76, 72, 64, 57, 50, 48 ;========================================== ;=============DELAY子程序================== DELAY: NOP ;1us MOV R7, #3 ;1us DJNZ R7, $ ;2×R7us DJNZ A, DELAY ;2us RET ;2us ;===========(10A+2)us=================== END
2012/10/19 例说8051 8-11
以Mode 1来产生低音的Do(续)
SETB TR0 ;启动TIMER0 JMP $ ;停在这里,或另写程序 ;======================================================= TONE_INT: CPL SPEAKER ;驱动喇叭 MOV TH0, #>TONE ;指定时间 MOV TL0, #<TONE ;指定时间 SETB TR0 ;启动TIMER0 RETI ;返回 ;======================================================= END
TONE2 EQU -833 ;设定第二个音阶 (600Hz) LENGTH1 EQU 3 ;0.3SEC LENGTH2 EQU 6 ;0.6SEC L_MUTE EQU 5 ;0.5SEC SPEAKER REG P1.0 ;设定输出口 ;=============主程序============================== ORG 0 ;程序开始 JMP START ;跳至START ORG BH ; TIMER 0中断向量 JMP TIMER ;跳至TIMER中断子程序 START: MOV IE, #10000010B;设定中断使能 MOV TMOD, #1 ;设定TIMER方式 MOV SP, #70H ;移开堆栈地址 LOOP: MOV R1, #>TONE1 ; 存储第一个音阶
2012/10/19 例说8051 8-14
节拍的产生(使用定时器/计数器中断)
拍 数 中断次数
1
拍
数
中断次数
4
拍
数
中断次数
10
1/8
1/2
1又1/4
1/4
2
3/4
6
1又1/2
12
3/8
3
Βιβλιοθήκη Baidu
1
8
2
16
2012/10/19
例说8051
8-15
节拍的产生(使用定时器/计数器中断-1)
BASE EQU -62500 ;设定1/8拍 TIMES EQU 2 ;设定1/4拍 DO EQU 95 ;设定Do音阶参数 BEAT_FLAG REG 20H.0 ;节拍标志 SPEAKER REG P1.0 ;设定输出口 ;======================================================= ORG 0 ;从0地址开始 JMP START ;跳至START ORG 1BH ;TIMER1中断向量 JMP T1_INT ;跳至T1_INT START : CLR BEAT_FLAG ;清除节拍标志 MOV TMOD, #10H ;使用TIMER 1,MODE 1 SETB EA ;启用中断总开关
2012/10/19 例说8051 8-28
Ch8-2.asm-2
MOV R0, #<TONE1 ;存储第一个音阶 CALL LOAD ;调用加载子程序 MOV R5, #LENGTH1 ;指定时间长度0.3SEC CALL DELAY ;调用延迟子程序 CLR TR0 ;关闭TIMER 0 MOV R1, #>TONE2 ;存储第二个音阶 MOV R0, #<TONE2 ;存储第二个音阶 CALL LOAD ;调用加载子程序 SETB TR0 ;启动定时器 MOV R5, #LENGTH2 ;指定时间长度0.6SEC CALL DELAY ;调用延迟子程序 CLR TR0 ;关闭TIMER 0 ;=============静音============================== MUTE: MOV R5, #L_MUTE ;0.5SEC CALL DELAY ;调用延迟子程序 JMP LOOP ;跳至LOOP
2012/10/19
例说8051
8-12
节拍的产生
C3/4 1 1 2 1 4 3
2012/10/19
例说8051
8-13
节拍的产生(使用延迟子程序)
B_DELAY: B_1: MOV MOV DJNZ DJNZ DJNZ RET R7, #244 ;1us R6, #255 ;1×R7us R6, $ ;2×R6×R7us R6, B_1 ;2×R7us A, B_DELAY ;2us ;2us
2012/10/19 例说8051 8-22
Ch8-1.asm-2
DJNZ R0, LOOP ;判读下一个按钮 JMP START ;若八个按钮都判读, 则从头开始 ;============================================== SOUND: MOV A, R1 ;将键值放入ACC MOVC A, @A+DPTR ;读取音阶 MOV 20H, A ;储存音阶 CPL SPEAKER ;驱动喇叭 CALL DELAY ;调用延迟子程序 MOV A, 20H ;取回音阶 CPL SPEAKER ;驱动喇叭 CALL DELAY ;调用延迟子程序 JMP START ;跳至START
t A (1 R 7 2 R 6 R 7 2 R 7 2 ) 2 us A ( 3 3 R 7 2 R 6 R 7 ) 2 us A ( 3 3 255 2 244 255 ) 2 us (125208 A 2 ) us
2012/10/19 例说8051 8-18
节拍的产生(使用定时器/计数器中断-4)
DJNZ A, T_DELAY ;2us RET ;2us ;======================================================= T1_INT:DJNZ R3, EXIT ;若R3不为0,则继续 MOV R3, #TIMES ;设定中断重复次数 CPL BEAT_FLAG ;设定节拍标志 EXIT: MOV TH1, #>BASE ;指定时间 MOV TL1, #<BASE ;指定时间 SETB TR1 ;启动TIMER1 RETI ;返回 ;======================================================= END
2012/10/19 例说8051 8-17
节拍的产生(使用定时器/计数器中断-3)
MUTE: CLR CLR MOV MOV MOV SETB BEAT_FLAG TR1 TH1, #>BASE TL1, #<BASE R3, #TIMES TR1 ;清除节拍标志 ;设定停用定时器 ;指定时间 ;指定时间 ;设定中断重复次数 ;启动TIMER1
声音及其产生
第八章
本章内容
• 硬件部分:探讨发声原理与声音的产生电 路。 • 程序与实做部分:简易的声音产生程序、 混合频率的声音产生、基本音阶产生、简 易电子琴,以及歌曲演奏等。
2012/10/19
例说8051
8-2
声音的产生
2012/10/19
例说8051
8-3
喇叭驱动电路
2012/10/19
例说8051
8-4
由Port 0驱动喇叭
2012/10/19
例说8051
8-5
音 调
2012/10/19
例说8051
8-6
钢琴键盘
2012/10/19
例说8051
8-7
钢琴键盘
2012/10/19
例说8051
8-8
延迟子程序
T_DELAY: NOP MOV R7,#3 DJNZ R7, $ DJNZ A, T_DELAY RET ;1us ;1us ;2×R7us ;2us ;2us
MUTE_1: JNB BEAT_FLAG, LOOP;若拍子结束则跳至LOOP JMP MUTE_1 ;跳至MUTE_1形成循环 ;======================================================= T_DELAY: NOP ;1us MOV R7,#3 ;1us DJNZ R7, $ ;2×R7us
2012/10/19
例说8051
8-19
简易电子琴实例演练(8-5-1)
• 连接电路
2012/10/19
例说8051
8-20
简易电子琴实例演练(8-5-1)
• 流程图
2012/10/19
例说8051
8-21
Ch8-1.asm-1
SPEAKER REG P1.0 ;喇叭连接到P1.0 KEY REG P2 ;P2连接八个按钮开关 ;================================================ ORG 0 ;程序从0地址开始 START: MOV DPTR, #TIMES ;将数据指针指向表格位置 MOV KEY, #FFH ;将P2规划为输入功能 MOV A, KEY ;读入按钮开关状态 SETB CY ;CY=1 MOV R0, #8 ;8 KEYS MOV R1, #0 ;KEY LOOP: RRC A ;ACC右移 JNC SOUND ;若CY=0, 则发声 INC R1 ;R1+1
2012/10/19 例说8051 8-16
节拍的产生(使用定时器/计数器中断-2)
SETB ET1 ;启用TIMER 1中断开关 MOV SP, #30H ;移开堆栈地址 MOV TH1, #>BASE ;指定时间 MOV TL1, #<BASE ;指定时间 MOV R3, #TIMES ;设定中断重复次数 SETB TR1 ;启动TIMER1 ;===========Do音(1/4拍)================================ LOOP: JB BEAT_FLAG, MUTE;若拍子结束则跳至MUTE CPL SPEAKER ;驱动喇叭 MOV A, #DO ;发出Do音阶 CALL T_DELAY ;调用T_DELAY延迟子程序 JMP LOOP ;跳至LOOP形成回路 ;===========静音(1/4拍)================================
t A (1 1 2 R 7 2 ) 2 us A (1 1 2 3 2 ) 2 us (10 A 2 ) us
2012/10/19
例说8051
8-9
延迟子程序
2012/10/19
例说8051
8-10
以Mode 1来产生低音的Do
TONE EQU -1908 ;设定音调半周期 SPEAKER REG P1.0 ;设定输出口 ;================================================= ORG 0 ;从0地址开始 JMP START ;跳至START ORG 0BH ;TIMER0中断向量 JMP TONE_INT ;跳至TONE_INT START:MOV TMOD, #1 ;使用TIMER 0,MODE 1 SETB EA ;启用中断总开关 SETB ET0 ;启用TIMER 0中断开关 MOV SP, #30H ;移开堆栈地址 MOV TH0, #>TONE ;指定时间 MOV TL0, #<TONE ;指定时间
2012/10/19
例说8051
8-24
实例演练(8-5-2)
• 功 能 说 明
2012/10/19
例说8051
8-25
实例演练(8-5-2)
• 连接电路
2012/10/19
例说8051
8-26
实例演练(8-5-2)
• 流程图
2012/10/19
例说8051
8-27
Ch8-2.asm-1
TONE1 EQU -500 ;设定第一个音阶 (1KHz)