51单片机演奏国歌

Python025

51单片机演奏国歌,第1张

#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=0j<80j++) _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 10460478fe22

#1DO# 277 1805 #1DO# 554 0903 #DO#11090451

低2RE 294 1700 f95c中2RE 578 0842 fcb6 高2RE 11750426fe56

#2RE# 311 1608 #2RE# 622 0804 #2RE# 12450402

低3M 330 1516 fa14中3M 659 0759 fd09 高3M13180372fe8c

低4FA 349 1433 fa67中4FA 698 0716 fd34 高4FA 13970358fe9a

#4FA# 370 1350 #4FA# 740 0676 #4FA# 14800338

低5SO 392 1276 fb04中5SO 784 0638 fd82 高5SO 15680319 fec1

#5SO# 415 1205 #5SO# 831 0602 #5S0# 16610292

低6LA 440 1136 fb90中6LA 880 0568 fdc8 高6LA 17600284 fee4

#6LA# 466 1072 #6LA# 932 0536 #6LA# 18650268

低7SI 494 1012 fc0c中7SI 988 0506 fe06 高7SI 19760253 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

不用出钱,你学过vc自己就可以写。

1:写几个函数分别显示不同的国旗形态

2:主函数里循环swith时间,比如X.1秒显示第一个函数对应形态,X.3秒对应第二函数对应形态。。。

3:循环调用音频

P.S. 你网上搜下怎么调用事件函数,怎么调用音频,比你花钱快得多