⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sound.asm

📁 51单片机用汇编实例 包括ad
💻 ASM
字号:
;========================================================================
; 文件名称: Sound.ASM
; 功能描述: 电子发声实验. 利用定时器/计数器演奏音乐.
;     乐曲: 友谊天长地久  B调  四分之二拍
;========================================================================

VALH	DATA 31H
VALL	DATA 30H

FCOUNT	DATA 32H		;频率表计数器
TCOUNT	DATA 33H		;时间表计数器

	ORG 0000H
	LJMP START
	ORG 000BH
	LJMP T0ISR
	ORG 0100H
START:	MOV TMOD, #01H		;初始化定时器T0
	MOV IE, #82H
	SETB TR0		;启动定时器T0
MLP1:	MOV FCOUNT, #00H	;演奏顺序
	MOV TCOUNT, #00H
MLP2:	MOV DPTR, #FREQ		;频率表首地址
	MOV A, FCOUNT
	MOVC A, @A+DPTR		;查表
	MOV R6, A		;除数高位
	CJNE R6, #00H, MLP3	;判0, 0表示一遍演奏结束
	INC FCOUNT
	MOV A, FCOUNT
	MOVC A, @A+DPTR
	MOV R7, A
	CJNE R7, #00H, MLP4
	AJMP MLP1		;R6R7=0 结束一遍演奏
MLP3:	INC FCOUNT
	MOV A, FCOUNT
	MOVC A, @A+DPTR
	MOV R7, A		;R6R7中不为0, 作为除数
MLP4:	MOV R2, #00H		;被除数(CLK)
	MOV R3, #07H
	MOV R4, #00H
	MOV R5, #00H
	LCALL DIV42		;调用除法程序
	CLR C
	MOV A, #0FFH
	SUBB A, R3
	MOV VALL, A		;计数初值低位
	MOV A, #0FFH
	SUBB A, R2
	MOV VALH, A		;计数初值高位
	MOV TH0, VALH		;装入计数初值
	MOV TL0, VALL
	
	MOV A, TCOUNT
	MOV DPTR, #TIME		;得到时间表
	MOVC A, @A+DPTR
	MOV R4, A		;[R4]次延时
MLP5:	LCALL DELAY
	DJNZ R4, MLP5
	INC FCOUNT
	INC TCOUNT
	LJMP MLP2		;继续下一音符的演奏
;定时器0中断程序
T0ISR:	CPL P0.0		
	MOV TH0, VALH		;重装计数初值
	MOV TL0, VALL
	RETI
;(R2R3R4R5)/(R6R7)--(R2R3)
;影响资源: PSW, A, B, R1~R7
DIV42: 	CLR C 		;比较被除数和除数
	MOV A,R3 
	SUBB A,R7
	MOV A,R2
	SUBB A,R6
	JC DVD1
	SETB OV 	;溢出
	RET
DVD1: 	MOV B,#10H 	;计算双字节商
DVD2: 	CLR C 		;部分商和余数同时左移一位
	MOV A,R5
	RLC A
	MOV R5,A
	MOV A,R4
	RLC A
	MOV R4,A
	MOV A,R3
	RLC A
	MOV R3,A
	XCH A,R2
	RLC A
	XCH A,R2
	MOV F0,C 	;保存溢出位
	CLR C
	SUBB A,R7 	;计算(R2R3-R6R7)
	MOV R1,A
	MOV A,R2
	SUBB A,R6
	ANL C,/F0 	;结果判断
	JC DVD3
	MOV R2,A 	;够减,存放新的余数
	MOV A,R1
	MOV R3,A
	INC R5 		;商的低位置一
DVD3: 	DJNZ B,DVD2 	;计算完十六位商(R4R5)
	MOV A,R4 	;将商移到R2R3中
	MOV R2,A
	MOV A,R5
	MOV R3,A
	CLR OV 		;设立成功标志
	RET
;单位延时
DELAY:	MOV R7, #0E0H
DLP1:	MOV R6, #0F0H
DLP2:	DJNZ R6, DLP2
	DJNZ R7, DLP1
	RET
;频率表
FREQ:	DW 371,495,495,495,624,556,495,556,624
        DW 495,495,624,742,833,833,833,742,624
	DW 624,495,556,495,556,624,495,416,416
	DW 371,495,833,742,624,624,495,556,495
	DW 556,833,742,624,624,742,833,990,742
	DW 624,624,495,556,495,556,624,495,416
	DW 416,371,495,0
;时间表
TIME:	DB 4, 6, 2, 4, 4, 6, 2, 4, 4, 6
        DB 2, 4, 4,12, 1, 3, 6, 2, 4, 4
	DB 6, 2, 4, 4, 6, 2, 4, 4,12, 4
	DB 6, 2, 4, 4, 6, 2, 4, 4, 6, 2
	DB 4, 4,12, 4, 6, 2, 4, 4, 6, 2
	DB 4, 4, 6, 2, 4, 4,12

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -