您的位置 首页 主动

51单片机操控蜂鸣器播映5首歌曲汇编程序

;机器人代码:(外部中断用来接红外传感器的)ORG0000HJMPINITORG0003HJMPINT_0ORG000BHJMPINT_TORG0023HJMPINT_S;——-

;机器人代码:(外部中止用来接红外传感器的)

ORG 0000H
JMP INIT
ORG 0003H
JMP INT_0
ORG 000BH
JMP INT_T
ORG 0023H
JMP INT_S
;————————————-
FLAG_F EQU 01H ;功用挑选,0为播映,1为演奏
FLAG_L EQU 02H ;指示灯挑选,0指示灯亮或1亮
FLAG_P EQU 03H ;是否播映标志,0中止,1播映
FLAG_CH EQU 04H ;演奏时是否换音符,1有用
FLAG_LAST EQU 05H ;播映时是否到最终64分音符
FLAG_PRESS EQU 06H ;是否有演奏按键
FLAG_GO EQU 07H ;是否行走标志位(1为行走,0为中止)
STAT_0 EQU 08H ;4位行走状况,对应P1.0–P1.3
STAT_1 EQU 09H
STAT_2 EQU 0AH
STAT_3 EQU 0BH
FLAG_MUTE EQU 0CH
PERIOD_H EQU 30H ;音长(守时器高位)
PERIOD_L EQU 31H ;音长(守时器低位)
COUNTER EQU 32H ;守时器计数(设定守时周期的倍数)
CU_COUNTER EQU 41H ;当时守时器计数
TONE EQU 33H ;音高
SPEED EQU 34H ;乐曲速度
D_1 EQU 35H
D_2 EQU 36H
P_1 EQU 37H
P_2 EQU 38H
NUM EQU 39H ;乐曲的方位(第几首)
POSITION EQU 40H ;乐曲中音符的方位
TAB_H EQU 42H ;当时乐曲的音长表首地址高八位
TAB_L EQU 43H ;当时乐曲的音长表首地址低八位
TAB_TONE_H EQU 44H ;当时乐曲的音高表首地址高八位
TAB_TONE_L EQU 45H ;当时乐曲的音高表首地址低八位
THIS_NUM EQU 46H ;存储当时按键号
PRE_NUM EQU 47H ;存储前次按键号
COUNTER_1 EQU 48H ;判别是否为最终64分音符用,其值等于COUNTER-1
D_L1 EQU 49H
D_L2 EQU 4AH
D_L3 EQU 4BH
P_L1 EQU 4CH
P_L2 EQU 4DH
TAB_1 EQU 4EH ;查表时的凹凸字节序号存储
TAB_2 EQU 4FH
CMD EQU 50H
;行走指令存储 (1:功用挑选、2:加快、3:减速、4:原速、5:中止/行进、
;(6:左转、7:右转、8:朝前) )
COUNTER_LOOP EQU 51H ;守时器循环计数
; STATUS EQU 52H ;行走状况存放
PERIOD_TEMP EQU 53H
;*****************主程序*************************
ORG 0030H
INIT: ; CALL LONG
CLR P3.7
; SETB P3.7
MOV SP, #54H
CLR FLAG_F ;初始化
CLR FLAG_L
CLR FLAG_P
CLR FLAG_LAST
SETB FLAG_CH
CLR FLAG_PRESS
SETB FLAG_GO
CLR FLAG_MUTE
SETB STAT_0
SETB STAT_1
SETB STAT_2
SETB STAT_3
MOV CMD, #00H
MOV PERIOD_H, #00H
MOV PERIOD_L, #00H
MOV TONE, #00H
MOV SPEED, #00H
MOV COUNTER, #00H
MOV NUM, #00H
MOV POSITION, #00H
;MOV STATUS, #0FFH
MOV D_1, #80
MOV D_2, #79
MOV P_L1, #01H
MOV P_L2, #0FFH
MOV TMOD, #21H ;守时器0为16位计数器守时 ,1为8位主动装载
MOV TH0, #0FFH
MOV TL0, #0FFH
MOV TH1, #0CCH
MOV TL1, #0CCH
MOV SCON, #0D0H
SETB IT0 ;设定外部中止0为负跳变触发
SETB PX0 ;外部中止为高优先级
SETB PS
SETB EA
SETB ET0
SETB EX0 ;开外部中止
SETB ES
SETB TR1
;CALL DELAY
;——————————————-
LOOP: JB FLAG_F, PLAY ;演奏功用跳转
OUT: JNB FLAG_P, LOOP ;播映部分
MOV A, TONE
JZ MUTE
JB FLAG_MUTE, MUTE_1
SETB P3.7
MUTE_1: CJNE A, #1FH, NO_OVER
CLR TR0 ;TONE值等于1FH,乐曲完毕,从头赋初值开端
CLR P3.7
ORL P1, #0FH
MOV POSITION, #00H
MOV CU_COUNTER, COUNTER
CALL LONG
MOV TONE, #00
MOV COUNTER_LOOP, #0
SETB TR0
JMP LOOP
NO_OVER:
MUTE: CALL DELAY
CLR P3.7
CALL DELAY
JMP LOOP
;——————
PLAY: JNB FLAG_PRESS, OVER
SETB P3.7 ;演奏部分
CALL DELAY
CLR P3.7
OVER: CALL DELAY
JMP LOOP
;****************串口中止服务程序******************
;INT_S: PUSH ACC
;CLR RI
;MOV A, SBUF
;JB P, R_1
;R_0: JB RB8, TO_OVER
;JMP RIGHT
;R_1: JNB RB8, TO_OVER
;RIGHT: MOV NUM, A ;赋乐曲号
;ANL A, #0FH
;JNZ SELECT ;选曲跳转
;MOV A, NUM
;SWAP A
;MOV CMD, A
;—————————-
;CJNE A, #01H, IF_2
;CLR P3.7
;CPL FLAG_F
;ORL P1, #0FH
;JB FLAG_F, PLAY_SET
;SETB FLAG_GO
;JMP INT_OVER
;PLAY_SET: CLR FLAG_P
;CLR TR0
;CLR FLAG_GO
;CLR FLAG_PRESS
;JMP INT_OVER
;IF_2: CJNE A, #02H, IF_3
;MOV A, PERIOD_H
;ADD A, #4
;MOV NUM, A
;CLR C
;SUBB A, #240
;JC S_UP
;JMP INT_OVER
;S_UP: MOV PERIOD_H, NUM
;JMP INT_OVER
;IF_3: MOV A, CMD
;CJNE A, #03H, IF_4
;MOV A, PERIOD_H
;SUBB A, #9
;MOV NUM, A
;CLR C
;SUBB A, #100
;JNC S_DOWN
;JMP INT_OVER
;S_DOWN: MOV PERIOD_H, NUM
;JMP INT_OVER
;IF_4: MOV A, CMD
;CJNE A, #04H, IF_5
;MOV PERIOD_H, PERIOD_TEMP
;JMP INT_OVER
;IF_5: CJNE A, #05H, IF_9
;CPL FLAG_GO
;JMP INT_OVER
;IF_9: CJNE A, #09H, CMD_OVER
;CPL FLAG_MUTE
;CMD_OVER:
;TO_OVER: JMP INT_OVER
;—————————
;SELECT: DEC NUM
;MOV A, NUM
;ANL A, #0F0H
;JNZ TO_OVER
;MOV A, NUM
;CLR C
;SUBB A, #11
;JNC TO_OVER
;MOV A, NUM
;RL A
;MOV TAB_1, A
;MOV TAB_2, TAB_1
;INC TAB_2
;MOV DPTR, #TAB_SPEED ;查乐曲速度
;MOV A, TAB_1
;MOVC A, @A+DPTR
;MOV PERIOD_L, A
;MOV TL0, A
;MOV A, TAB_2
;MOVC A, @A+DPTR
;MOV PERIOD_H, A
;MOV PERIOD_TEMP, A
;MOV TH0, A
;MOV DPTR, #TAB_NUM_T ;查音高方位首地址
;MOV A, TAB_1
;MOVC A, @A+DPTR
;MOV TAB_TONE_H, A
;MOV A, TAB_2
;MOVC A, @A+DPTR
;MOV TAB_TONE_L, A
;MOV DPTR, #TAB_NUM_L ;查音长方位首地址
;MOV A, TAB_1
;MOVC A, @A+DPTR
;MOV TAB_H, A
;MOV A, TAB_2
;MOVC A, @A+DPTR
;MOV TAB_L, A
;HANDLE: JB FLAG_F, PLAY_0 ;演奏乐曲时跳转
;SETB FLAG_P ;答应播映
;MOV POSITION, #0H ;赋乐曲方位值为0,即从头开端拨出
;MOV COUNTER, #02H
;MOV CU_COUNTER, COUNTER ;赋当时守时次数和应守时次数值,使之持平,以使守时器作业时就播映,无需等候
;MOV COUNTER_1, COUNTER
;DEC COUNTER_1
;CLR FLAG_LAST
;MOV COUNTER_LOOP, #0
;SETB TR0 ;发动守时器0
;JMP INT_OVER
;PLAY_0: CLR P3.7
;SETB FLAG_PRESS
;SETB FLAG_CH
;MOV DPTR, #TAB_TONE ;查音高表
;MOV A, NUM
;ADD A, #07
;RL A ;音高表每组音高有两个延时值
;MOV TAB_1, A
;MOVC A, @A+DPTR ;查第一个延时值
;MOV D_1, A
;MOV A, TAB_1
;INC A
;MOVC A, @A+DPTR
;MOV D_2, A
;JB FLAG_L, L_0
;SETB FLAG_L
;CLR P3.4
;SETB P3.3
;JMP INT_OVER
;L_0: CLR FLAG_L
;CLR P3.3
;SETB P3.4
;INT_OVER: POP ACC
;RETI

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/255868.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部