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

📄 music.c

📁 能让单片机唱歌的程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
sbit P32=P3^2;
unsigned char n=0;               //n为节拍常数变量,全局变量
unsigned char code music[] ={
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_int()  interrupt 1    //采用定时中断0 控制节拍
{
 TH0=0xdc;
 TL0=0x00;
 n--; 
}
void delay (unsigned char m)  //控制频率的延时程序
{
 unsigned int a=3*m;
 while(--a);
}
void delayms(unsigned int i)      //延时程序,i是形式参数
{
unsigned int j;
for(;i>0;i--)             //变量i由实际参数传入一个值,因此i不能赋初值
for(j=0;j<125;j++)
{;}
}
void main()
{
unsigned char p,m;         //m为频率常数变量
unsigned char i=0;
TMOD=0x01;
TH0=0xdc;
TL0=0x00;
EA=1;
ET0=1;
play:while(1)
   {
a: p=music[i];
   if(p==0x00) 
{ i=0, delayms(1000);goto play;}  //如果碰到结束符,延时约1秒,回到开始再来一遍
    else if(p==0xff)
 { i=i+1;delayms(10),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符
    else 
{m=music[i++]; n=music[i++];}     //取频率常数和节拍常数
    TR0=1;                         //开定时器1
    while(n!=0)
{P32=~P32;delay(m);}            //等待节拍完成, 通过P1口输出音频
    TR0=0;                         //关定时器1
    } 
}
 

⌨️ 快捷键说明

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