老古开发网首页
导航:老古开发网首页文章索引索引第2898页文章分类另类其他第22页→[音乐程序,让单片机演奏音乐......]
| -文章搜索 - 最新文章 - |

第3002篇:音乐程序,让单片机演奏音乐......

发布时间:2006年10月15日 点击次数:2483
来源:   作者:
 
/************************************************************************
*****music.c
*****created by zhangyongchang
*****date 2006 4.5
/**********************************************************************/
#include <reg51.h>
unsigned char m;   //m为频率常数
unsigned char n=0; //n为节拍常数
unsigned char i=0;
sbit bell=P1^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(unsigned char a)  //微秒延时程序
{
  while(--a);                 
}
void delay(void)   //延迟程序
{
 int i,j;
 for(i=50;i--;i>0)
  for(j=10000;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;
      }
     }
}

欢迎进入老古论坛进行讨论
[另类其他] 相关文章:
流水灯(二)
简介:
#include &lt;reg51.h&gt; void delay(void); unsigned char string[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void main(void) { unsigned char *p; while(1) { for(p=string;p&lt;(string+8);p++) ......

万无一失地确实太武断---飞入LJMP ERR的中部又如何???
电脑屏幕抖动原因
A51 4.5.1 PROC / ENDP(仅适用于 AX51 和 A251 )
A51 4.4.5 DSD (仅适用于 AX51 和 A251 )
 
下一个:[单片机]LCD1602的滚动显示
简介:
**************************************LCD1602头文件*********************************/ #ifndef _LCD1602_H_ #define _LCD1602_H_ //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO......

上一个:[单片机]I2C读写心得(AT24C02篇)(转)

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:31毫秒