//我大概给你写了个框架,要你自己去调节音符,
//显示也是现成的了,你自己添加字进来就行
//你这个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);
}
} |