//我大概給你寫了個框架,要你自己去調節音符,
//顯示也是現成的了,你自己添加字進來就行
//你這個8乘以8的 要顯示字很難
#include<reg51.h>
#include<intrins.h>
#define duo 12 //這里定義哆來咪,就是聲音的頻率,你要自己去調,要改這里的參數得到正確的哆來咪
#define rui 11
#define mi 10
#define fa 9
#define suo 8
#define la 7
#define xi 6
sbit spk = P1^0;
unsigned char t1 = 0;//顯示中用到的變量
unsigned char zhi = 0;//顯示第幾個字
unsigned char t2 = 0;//每一個字的段位,要8段才湊成一個字
unsigned int dis_time = 0;//每一個字顯示的時間
unsigned char yp = 0;//聲音的頻率寄存器 就是音階
code unsigned char num[3][8]={{0x80,0x84,0x44,0x34,0x0f,0x34,0x44,0xc4}, //大
{0x84,0x94,0x94,0xff,0x94,0x95,0x86,0x8c}, //生
{0x00,0xff,0x49,0x49,0x49,0x49,0xff,0x00},};//日
code unsigned char wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //掃描的段位
void delay(unsigned int time)
{
while(time--);
}
void timer0() interrupt 1
{
if(t1<2)
{
P3 = num[zhi][t2];
P0 = wei[t2];
}
if(t1==2)
{
P0 = 0xff;
P3 = 0x00;
}
t1++;
if(t1==3)
{
t1 = 0;
t2++;
if(t2==8)
{
t2 = 0;
dis_time++;
if(dis_time==100)
{
dis_time = 0;
zhi++;
if(zhi==3)
zhi = 0;
}
}
}
}
void timer1() interrupt 3
{
unsigned char i;
i++;
if(i==yp)
{
i = 0;
spk^=1;
}
}
void main()
{
P0 = 0x00;
P3 = 0xff;
TMOD = 0x00; //模式0
TL0 = 0xfe; //65536-11.0592M/12/1000
TH0 = 0xff;
TR0 = 1; //啟動定時器
ET0 = 1; //使能定時器中斷
TL1 = 0xfe; //
TH1 = 0xff;
TR1 = 0; //啟動定時器
ET1 = 1; //使能定時器中斷
EA = 1;
while(1)
{
TR1=1;
yp = duo;
delay(50000);//這些延時是控制歌曲的節奏的,就是拍子。你自己根據生日快樂的歌曲的譜子去做節奏延時
delay(50000);
yp = rui;
delay(50000);
delay(50000);
yp = mi;
delay(50000);
delay(50000);
yp = fa;
delay(50000);
delay(50000);
yp = suo;
delay(50000);
delay(50000);
yp = la;
delay(50000);
delay(50000);
yp = xi;
delay(50000);
delay(50000);
TR1 = 0; //
spk = 0; //
delay(50000); //
delay(50000); //這4句 就是擲音符,這里的延時就是擲音的長度
TR1 = 1;
yp = xi;
delay(50000);
delay(50000);
yp = la;
delay(50000);
delay(50000);
yp = suo;
delay(50000);
delay(50000);
yp = fa;
delay(50000);
delay(50000);
yp = mi;
delay(50000);
delay(50000);
yp = rui;
delay(50000);
delay(50000);
yp = duo;
delay(50000);
delay(50000);
TR1 = 0;
spk = 0;
delay(50000);
delay(50000);
}
} |