C51音乐程序

发布者:jingyan最新更新时间:2014-12-18 来源: laogu关键字:C51  音乐程序 手机看文章 扫描二维码
随时随地手机看文章

#i nclude
#i nclude
//本例采用89C52, 晶振为11.0592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!


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=3*m;
 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) P1=~P1,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)
       TR0=0;                                             //关定时器1
    }
}

关键字:C51  音乐程序 引用地址:C51音乐程序

上一篇:基于51单片机的多点测温系统设计
下一篇:串口波特率选择

推荐阅读最新更新时间:2024-03-16 13:49

C51—小知识点
1-write总线:和IIC总线类似,是一种通信方式,主机对1-Wire总线的基本操作分为复位、读和写三种。总线上接上拉电阻。对时序的要求比较严格 ROM指令、操作协议: 晶振: CCH:控制信道(CCH)是用于传送信令信息和短的分组数据的信道。 占空比:占空比是指一个脉冲循环内,通电(高电平)时间相对于总时间所占的比例。 PWM:脉冲宽度调试技术,通过对一系列脉冲宽度进行调节来改变来等效获得所需波形 上、下拉电阻:如果一个线路中的电压处于不确定的状态(例如一个引脚不和任何其它回路连通时),那我们就说它的电压是浮动的,他会随着时间不断变化,跳动,而且很容易受到外界环境的影响。处于这种不确定状态的电路会被随机解释为高
[单片机]
Keil C51对C语言的关键词扩展之五: code
code 指定存储位置位于程序存储器。程序存储器只读,因此code类型的变量,是无法再次赋值的。 unsigned char code ary = : Read only ; /* 数组ary位于程序存储器 */ ary ='a'; /* 错误,不可修改*/
[单片机]
c51中的bit,char的强制类型转换
c51中的bit,char的强制类型转换。 data为非0,,bit强制后,为1。否则为0 data的在char强制后取后8位。 (1)强制转换有什么好处? 例如: unsigned char x ; sbit SDA = P1^0 ; 1)、要用x来记录p1.0的值,可以用: for(i=0;i 8;i++) { x |= (unsigned char )SDA ; x =1; } 2)、要用SDA来一位一位传送x的值,可以: for(i=0;i 8;i++) { SDA = (bit)(x&0x80); x =1; } 在进行强
[单片机]
一种基于C51单片机的非抢占式的操作系统架构
摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Keil C51的一种调度方式。为此,构造这一实时操作系统,并有针对性地介绍此系统的堆管理方法、任务的建立以厦任务的切换等。 关键词:51单片机 实时操作系统 任务重八调度 目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我国目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速
[单片机]
一种基于<font color='red'>C51</font>单片机的非抢占式的操作系统架构
《初学者C51自学笔记》之LED1602
上两图对应的; 如想要在00位置上显示,则指令码为(0x80+0x00或0x80) #include reg52.h #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit e=P2^6; uchar table1 =  www.csdn.net ; uchar table2 = LCD1602 test ok! ; //延时函数,在12MHz的晶振频率下 //大约50us的延时 void delay_50us(uint t) { uchar j; for(;t
[单片机]
《初学者<font color='red'>C51</font>自学笔记》之LED1602
#C51串口通讯3-#一串数据#中断即时解析用户自定义协议
前言 1.上一章(中断定时+超时接收)的逻辑,适用于协议较为复杂的情况,即中断判断接收结束,数据放置缓冲区,主函数中解析数据。 2.实际开发中,用户自定义协议的帧头是可预见的,包括数据长度等。 3.本章测试使用中断即时解析自定义协议 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 示例一串数据:固定帧头区(AA 66 AA )+数据类型(01/02)+数据区+和校验+异或校验 其中,01LED,02蜂鸣器 ,数据区为工作时间,低位在前高位在后 二、编程实现 1.知识点 a.“状态机”的算法思想 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。 包括:State(状态)、Event(事件)、
[单片机]
#<font color='red'>C51</font>串口通讯3-#一串数据#中断即时解析用户自定义协议
C51单片机LED灯的控制
1、一盏一盏的操作:即先令第一盏灯亮,延时,再令它熄灭,延时,再让下一盏灯重复操作即可;(略) 2、利用数组方法点亮:先定义一个数组,其中存入相应8盏灯亮的数字(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏灯,第二盏灯....亮),再利总线,按顺序点亮八盏灯;(后面对数码管的控制将用类似的方法) 3、利用移位方法点亮(这种方法,程序看起来简单些,但实质上还是一个一个的控制)。下面是位移方法的程序 共阳,P2端控制。 下面的代码是两种灯得控制: #include reg52.h typedef unsigned char uchar; typedef un
[单片机]
<font color='red'>C51</font>单片机LED灯的控制
I2C总线驱动(C51语言源程序)
i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。 //#pragma ot(6,SIZE) #i nclude AT89X52.H #i nclude intrins.h #define ERRORCOUNT 10 #define readI2C 0xa1 #define writeI2C 0xa0 sbit SDA=P1^6; sbit SCL=P1^5; enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256}; enum eepromtype EepromType; //Da
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved