51单片机演奏国歌

51单片机演奏国歌完整程序

#include<REG51.H>
#include <intrins.h>
unsigned int dTime[]={
0XFB04,0XFB90,0XFC0C,0XFC44,
0XFCAC,0XFD09,0XFD34,0XFD82,
0XFDC8,0XFE06,0XFE22,0XFE56,
0XFE85,0XFE9A,0XFEC1};
unsigned char happy[]={0X82,0X01,0X81,0X94,0X84,0X0B4,0X0A4,0X04,0X82,0X01,0X81,0X94,0X84,0X0C4,0X0B4,0X04
,0X82,0X01,0X81,0X0F4,0X0D4,0X0B4,0X0A4,0X94,0X0E2,0X01,0X0E1,0X0D4,0X0B4,0X0C4,0X0B4,0X04
,0X82,0X01,0X81,0X94,0X84,0X0B4,0X0A4,0X04,0X82,0X01,0X81,0X94,0X84,0X0C4,0X0B4,0X04
,0X82,0X01,0X81,0X0F4,0X0D4,0X0B4,0X0A4,0X94,0X0E2,0X01,0X0E1,0X0D4,0X0B4,0X0C4,0X0B4,0X04,0X00
};

unsigned char _TH0,_TL0;
unsigned char *mus;
sbit p10=P1^0;

void delay(unsigned char n) //节拍延时

{
unsigned char i=105,j;
do {
do {
for (j=0; j<80; j++) _nop_(); //j=(11159KHz/12-10)/4
}while(--i);
}while(--n);
}

void t0() interrupt 1
{
TH0=_TH0;
TL0=_TL0;
p10=~p10;
}

void main()
{
unsigned char yd,jp;
int k;
TMOD=0X01;
ET0=1;
EA=1;
mus=happy;
TR0=1;
while(1)
{
while(*mus!=0)
{
jp=(*mus)&0x0f;
if((*mus)>>4==0)
delay(jp);
else
{
yd=(*mus)>>4;
k=dTime[yd-1];
_TH0=k>>8;
_TL0=k&0x00ff;
delay(jp);
}
mus++;
}
}
mus=happy;
}

//上面是生日快乐歌的才c程序!你自己改数组就行了!

//下面是国歌程序

;音符 频率 周期(半个) 初值 音符 频率 周期(半个)初值 音符 频率 周期(半个)初值
;------------------------------------------------------------------------------------------------------
;低1DO 262 1908 f88c 中1DO 523 0956 fc44 高1DO 1046 0478 fe22
;#1DO# 277 1805 #1DO# 554 0903 #DO# 1109 0451
;低2RE 294 1700 f95c 中2RE 578 0842 fcb6 高2RE 1175 0426 fe56
;#2RE# 311 1608 #2RE# 622 0804 #2RE# 1245 0402
;低3M 330 1516 fa14 中3M 659 0759 fd09 高3M 1318 0372 fe8c
;低4FA 349 1433 fa67 中4FA 698 0716 fd34 高4FA 1397 0358 fe9a
;#4FA# 370 1350 #4FA# 740 0676 #4FA# 1480 0338
;低5SO 392 1276 fb04 中5SO 784 0638 fd82 高5SO 1568 0319 fec1
;#5SO# 415 1205 #5SO# 831 0602 #5S0# 1661 0292
;低6LA 440 1136 fb90 中6LA 880 0568 fdc8 高6LA 1760 0284 fee4
;#6LA# 466 1072 #6LA# 932 0536 #6LA# 1865 0268
;低7SI 494 1012 fc0c 中7SI 988 0506 fe06 高7SI 1976 0253 ff03
;------------------------------------------------------------------------------------------------------
yfh equ 30h ;音符高位
yfl equ 31h ;音符低位
jp equ 32h ;节拍
yyd equ 33h ;
yf equ 34h ;

org 0000h
ajmp main

;--------------定时中断程序
org 000bh
cpl p2.1
mov th0,yfh
mov tl0,yfl
reti
;--------------主程序
org 0030h
main: setb p2.1
mov yyd, #00h
mov tmod,#11h
setb ea
setb et0
setb tr1
setb tr0
music:
mov dptr,#table2 ;取出音符,并存入yf单元
mov a,yyd
movc a,@a+dptr
cjne a,#00h,music1;判断音乐是否结束,结束复位
ajmp main
music1:
dec a
rl a
mov yf,a
mov a,yyd;指向节拍
inc a
mov yyd,a
mov dptr,#table1 ;取出音符初值,并存入yfh,yfl单元
mov a,yf
movc a,@a+dptr
mov yfh,a
mov a,yf
inc a
movc a,@a+dptr
mov yfl,a
mov dptr,#table2
mov a,yyd;取出音节,并存入jp
movc a,@a+dptr
mov jp,a
mov th0,yfh;送入音符初值
mov tl0,yfl
mov a,yyd ;指向下一音符
inc a
mov yyd,a
lcall delay
nop
ljmp music
delay:
mov r2,jp
del4: mov r1,#3
del3:
mov th1,#3ch
mov tl1,#0b0h
del1:
jbc tf1,del2 ;查询定时时间是否到
ajmp del1
del2:
djnz r1,del3
djnz r2,del4
ret

table1:
db 0f8h,8ch,0f9h,5ch,0fah,14h,0fah,67h,0fbh,04h,0fbh,90h,0fch,0ch ;音符表
db 0fch,44h,0fch,0b6h,0fdh,09h,0fdh,34h,0fdh,82h,0fdh,0c8h,0feh,06h
db 0feh,22h,0feh,56h,0feh,8ch,0feh,9ah,0feh,0c1h,0feh,0e4h,0ffh,03h
table2: ;歌曲---音节表
/*db 01h,04h,02h,04h,03h,04h,04h,04h,05h,04h,06h,04h,07h,04h ;歌曲表
db 08h,04h,09h,04h,0ah,04h,0bh,04h,0ch,04h,0dh,04h,0eh,04h
db 0fh,04h,10h,04h,11h,04h,12h,04h,13h,04h,14h,04h,15h,06h
db 00h*/

/*乐曲---心太软
db 0ch,02h,0ch,02h,0ah,02h,0dh,04h,0ch,02h,0ah,06h,0ah,04h,09h,02h,08h,02h,08h,04h,08h,02h
db 0fh,02h,0fh,02h,0fh,02h,0fh,02h,0dh,02h,0ch,04h,0ah,02h,0dh,02h,0ch,06h*/

;乐曲---老鼠爱大米
/*db 0ah,02h,09h,01h,08h,01h,08h,04h,0ah,02h,09h,01h,08h,01h,08h,04h,0ah,02h,09h,02h
db 0ah,02h,01h,02h,0ah,02h,0dh,01h,0ch,01h,0ch,04h,0ah,01h,0ch,01h,0dh,02h,0dh,01h,0ch,01h,0ch,02h
db 0dh,01h,0ch,01h,0ch,04h,0ah,01h,09h,01h,08h,02h,09h,02h,09h,01h,0ah,01h,09h,02h,08h,01h,09h,01h,09h,04h */
;乐曲---国歌
db 05h,02h,08h,06h,08h,02h,08h,02h,08h,02h,05h,02h,06h,01h,07h,01h,08h,04h,08h,04h
db 0ah,02h,08h,02h,09h,01h,0ah,01h,0ch,04h,0ch,04h,0ah,02h,0ah,01h,08h,02h,0ah,02h
db 0ch,02h,0ah,01h,09h,04h,09h,08h,0dh,04h,0ch,04h,09h,04h,0ah,04h,0ch,02h,0ah,02h
db 0ch,02h,0ah,02h,09h,01h,0ah,01h,08h,04h,0ah,04h,05h,02h,0dh,01h,08h,02h,08h,02h
db 0ah,02h,0ah,01h,0ch,02h,0ch,02h,09h,02h,09h,01h,09h,01h,06h,04h,09h,04h,05h,02h
db 08h,04h,08h,02h,0ah,04h,0ah,02h,0ch,08h,08h,02h,0ah,01h,0ch,02h,0ch,02h,0dh,04h
db 0ch,04h,0ah,02h,08h,01h,0ch,02h,0ch,01h,0ch,01h,0ah,03h,08h,03h,05h,04h,08h,04h
db 0ah,02h,08h,01h,0ch,02h,0ch,01h,0ch,01h,0ah,03h,08h,03h,05h,04h,08h,04h,05h,04h
db 08h,04h,05h,04h,08h,04h,08h,04h
end
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-08
第2个回答  2010-07-14
定义一个一维数组,再从里面读数就行了