/
[文件名] C51音乐程序(八月桂花)
[功能] 通过单片机演奏音乐
注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器
//
#include <REG52H>
#include <INTRINSH>
//本例采用89C52, 晶振为110592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
sbit Beep = P1^5 ;
unsigned char n=0; //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void int0() interrupt 1 //采用中断0 控制节拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制频率延时
{
unsigned i=3m;
while(--i);
}
void delayms(unsigned char a) //豪秒延时子程序
{
while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
void main()
{ unsigned char p,m; //m为频率常数变量
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数
TR0=1; //开定时器1
while(n!=0) Beep=~Beep,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
TR0=0; //关定时器1
}
}
//如图,允许多键同时按下,
//在KEY2或KEY3的中断服务期间,key1的中断请求仍能被服务;
//当KEY2与KEY3同时按下时,key2优先被服务,key3在key2服务结束后才能被服务;
//在key3的中断服务期间,key2的中断请求不能被服务。
//编程实现上述功能,设8051的主频为12MHZ,
//每个中断的服务用调用软件延时程序DELAY来模拟。
//k1 ---------> X0
//k2 or k3 ---> X1
#include<reg51h>
sbit P10 = P1^0; //CLR k1
sbit P11 = P1^1; //CLR k2
sbit P12 = P1^2; //CLR k3
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6; //k2
sbit P17 = P1^7; //k3
//------------------------------------------------------
void delay_ms(unsigned int num)
{
unsigned int i, j;
for(i = num; i > 0; i--) for(j = 124; j > 0; j--);
}
//------------------------------------------------------
void main(void) using 0
{
EX0 = 1;
EX1 = 1;
PX0 = 1;
EA = 1;
while(1) {;}
}
//------------------------------------------------------
void X0_INT(void) interrupt 0 using 1
{
unsigned char i;
P10 = 0; P10 = 1; //撤消外部中断申请
for (i = 0; i < 20; i++) {
P13 = 0; delay_ms(100); //快速闪烁
P13 = 1; delay_ms(100);
}
}
//------------------------------------------------------
void X1_INT(void) interrupt 2 using 2
{
unsigned char i;
if(P16) {
P11 = 0; P11 = 1; //撤消外部中断申请
for (i = 0; i < 10; i++) {
P14 = 0; delay_ms(200);//慢速闪烁
P14 = 1; delay_ms(200);
}
}
if(P17) {
P12 = 0; P12 = 1; //撤消外部中断申请
P15 = 0; delay_ms(5000); P15 = 1;//常亮
}
}
//------------------------------------------------------
已经通过实验验证。
电路和说明可见:
>
以上就是关于51单片机控制喇叭的程序(c语言)全部的内容,包括:51单片机控制喇叭的程序(c语言)、任选asm51或c51编程语言实现以下功能,并绘制程序流程图、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)