3146|2

280

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

单片机演奏音乐程序 [复制链接]

/************************************************************************
*****music.c
*****created by zhangyongchang
*****date 2006 4.5
/**********************************************************************/
#include
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)
{
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;
}
}
}

此帖出自单片机论坛

最新回复

演凑音乐  详情 回复 发表于 2010-7-29 01:54
点赞 关注
 

回复
举报

144

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
好东西好东西,谢谢楼主的分享。
此帖出自单片机论坛
 
个人签名小小的我,大大的梦想...
 

回复

237

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
演凑音乐

演奏音乐.rar

14.97 KB, 下载次数: 11

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表