⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buzzer.c

📁 单片机实现在的电子琴
💻 C
字号:
//************************************************************
//Copyright(C)2008,桂林电子科技大学电子工程学院科技协会
//			 “梦想起航”活动例程 播放音乐(1)
//************************************************************
#include <reg51.h>
#include<intrins.h>

#define uchar unsigned char 
#define uint  unsigned int 
unsigned char m;   //m为频率常数
unsigned char n=0; //n为节拍常数 
unsigned char i=0;
sbit bell = P0^1;

//////////////////////
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 time0(void)  interrupt 1 using 1  //产生10MS精确定时
{  TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
   n--;
}
void delayms(uint a)  //微秒延时程序 
{
     while(--a);
}
void delay(void)   //延迟程序
{
    int i,j;
    for(i=50;i--;i>0)
        for(j=1000;j--;j>0)
           ;
}
void main()
{ 
     TMOD=(TMOD&0xf0)|0x01;
     TH0=(65536 - 10000) / 256;
     TL0=(65536 - 10000) % 256;
     EA  = 1;
     ET0 = 1;
     TR0 = 0;   
     while(1)
     {
	     switch(music_tab[i])
	     {
	        case 0x00: i = 0;     delay();       break; // 曲终停顿一定时间
	        case 0xff: i = i + 1; delayms(100);  break;  //遇到休止符停顿一定时间100微秒,再取下一个频率
	        default: m = music_tab[i++];  n = music_tab[i++];//取频率到m,取节拍到n
	                 TR0 = 1;
	                 while(n != 0)
	                 {
		                 bell = !bell;
		                 delayms(4 * m);//调整产生的频率,可以通过在m前的值来修正音调的高低
	                 }
					 TR0 = 0;
	     }
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -