http://blog.163.com/asm_c/blog/static/248203113200910229450995/
看这个吧伏好丛。
//=转自人家。。SPEAKER EQU P2.0 定义喇叭驱动口
ORG 0000H 伪地址
LJMP MAIN 长跳转,执行Main函数
ORG 000BH
LJMP DSQT0
MAIN: MOV SP,#50H 向SP写入50
MOV TMOD,#01H 定时器设置
MOV TH0,#0F8H 低音1-261HZ;定时器高旅缓位初值装入
MOV TL0,#39H 定时器低位初值装入
SETB EA 允许中断
SETB ET0 在EA打开的前提下,打开T0定时器中断
CLR TR0 不启用T0计数器/定时器LOOP: NOP 开始循环播放了。程序不完整
-------------------------------
1-|6. 5 3 5 | 第一段
LCALL DY6 长跳转到拆闷模低音6标号那里,程序不完整,没有写出来。以罩返下同理
SETB TR0 开始启用T0计数器/定时器
LCALL DEL11
LCALL DEL12
LCALL ZY5
LCALL DEL12
LCALL ZY3
LCALL DEL11
LCALL ZY5
LCALL DEL11
-----------------------
2-|1 6 5 6- | ;第二段
LCALL GY1
SETB TR0
LCALL DEL11
LCALL ZY6
LCALL DEL12
LCALL ZY5
LCALL DEL12
LCALL ZY6
LCALL DEL11
LCALL DEL11
-----------------------
3-|3 5 6 5 3 |
LCALL ZY3
SETB TR0
LCALL DEL11
LCALL ZY5
LCALL DEL12
LCALL ZY6
LCALL DEL12
LCALL ZY5
LCALL DEL11
LCALL ZY3
LCALL DEL11
-----------------------
4-|1 6 5 3 2- |
LCALL ZY1
SETB TR0
LCALL DEL12
LCALL DY6
LCALL DEL12
LCALL ZY5
LCALL DEL12
LCALL ZY3
LCALL DEL12
LCALL ZY2
LCALL DEL11
LCALL DEL11
-----------------------
5-|2. 3 5 5 6 |
LCALL ZY2
SETB TR0
LCALL DEL11
LCALL DEL12
LCALL ZY3
LCALL DEL12
LCALL ZY5
LCALL DEL11
LCALL ZY5
LCALL DEL12
LCALL ZY6
LCALL DEL12
-----------------------
6-|3 2 1 -|
LCALL ZY3
SETB TR0
LCALL DEL11
LCALL ZY2
LCALL DEL11
LCALL ZY1
LCALL DEL11
LCALL DEL11
-----------------------
7-|5. 3 2 1 6 1 |
LCALL ZY5
SETB TR0
LCALL DEL11
LCALL ZY3
LCALL DEL12
LCALL ZY2
LCALL DEL12
LCALL ZY1
LCALL DEL12
LCALL DY6
LCALL DEL12
LCALL ZY1
LCALL DEL12
-----------------------
8-|5 - - - |
LCALL DY5
SETB TR0
LCALL DEL11
LCALL DEL11
LCALL DEL11
LCALL DEL11
LJMP LOOP 跳转到loop那里重新播放
===========================================
低音音符频率对应16位定时器初值装置子程序
DY1: MOV 30H,#0F8H 低音1-262HZ 把F8放在30的地址里面
MOV 40H,#89H
NOP
RET
DY2: MOV 30H,#0F9H 低音2-294HZ
MOV 40H,#59H
RET
NOP
//每一组,第一个是音阶,就是do
ri
mi
fa
...,
第二个数字,1:低音,2中音,3高音,第三个,表示拍数,3即3拍,等等
code
unsigned
char
sszymmh[]={
6,2,3,
5,2,1,
3,2,2,
5,2,2,
1,3,2,
6,2,1,
5,2,1,
6,2,4,
3,2,2,
5,2,1,
6,2,1,
5,2,2,
3,2,2,
1,2,1,
6,1,1,
5,2,1,
3,2,1,
2,2,4,
2,2,3,
3,2,1,
5,2,2,
5,2,1,
6,2,1,
3,2,2,
2,2,2,
1,2,4,
5,2,3,
3,2,1,
2,2,1,
1,2,1,
6,1,1,
1,2,1,
5,1,6,
0,0,0
}
void
t0int()
interrupt
1
{
//定时器里面让团册speaker根据定时时间开关,产生不同频率的声音,就是上面定义的音节频率
TR0=0
speaker=!speaker
TH0=timer0h
TL0=timer0l
TR0=1
}
delay(time)
//很显然,这就是延时几拍了
//这里很显然,就是计算出每一个音的音阶(包含计算了高低音,每级7个音)
k=sszymmh[i]+7*sszymmh[i+1]-1
timer0h=FREQH[k]
//根据音阶频率,设置定时参数,产生相应频戚或缺高辩率的声音
timer0l=FREQL[k]
time=sszymmh[i+2]
//根据曲谱延时几拍
有问题你追问,满意请采纳
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)