单片机C语言程序设计:按键控制定时器选播多段音乐

发布者:rocky96最新更新时间:2013-08-31 来源: 21ic关键字:单片机  C语言  程序设计  按键控制  定时器 手机看文章 扫描二维码
随时随地手机看文章

 /*  名称:按键控制定时器选播多段音乐


说明:本例内置 3 段音乐,K1 可启动


停止音乐播放,K2 用于选择音乐段。


*/


#include


#include


#define uchar unsigned char


#define uint unsigned int

sbit K1=P1^0;      //播放和停止键


sbit SPK=P3^7;     //蜂鸣器


uchar Song_Index=0,Tone_Index=0;  //当前音乐段索引,音符索引


//数码管段码表


uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


//标准音符频率对应的延时表


uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};


uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};


//三段音乐的音符


uchar code Song[][50]=


{


{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},


{3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},


{3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}


};


//三段音乐的节拍


uchar code Len[][50]=


{


{1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},


{1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},


{1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}

};

//外部中断 0

void EX0_INT() interrupt 0

{

TR0=0;播放结束或者播放中途切换歌曲时停止播放

Song_Index=(Song_Index+1)%3;跳到下一首的开头


Tone_Index=0;


P2=DSY_CODE[Song_Index]; //数码管显示当前音乐段号

}

//定时器 0 中断函数


void T0_INT() interrupt 1


{


TL0=LO_LIST[Song[Song_Index][Tone_Index]];


TH0=HI_LIST[Song[Song_Index][Tone_Index]];


SPK=~SPK;


}


//延时


void DelayMS(uint ms)


{


uchar t;


while(ms--) for(t=0;t<120;t++);


}[page]


//主程序

 

void main()

{

P2=0xc0;

SPK=0;

 

TMOD=0x00;

IE=0x83;

IT0=1;

IP=0x02;

while(1)

{

//T0 方式 0

 

while(K1==1);  //未按键等待

while(K1==0);  //等待释放

 

TR0=1;    //开始播放

Tone_Index=0;  //从第 0 个音符开始


//播放过程中按下 K1 可提前停止播放(K1=0)。


//若切换音乐段会触发外部中断,导致 TR0=0,播放也会停止


while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1)


{


DelayMS(300*Len[Song_Index][Tone_Index]);  播放延时(节拍)

 

Tone_Index++;    //当前音乐段的下一音符索引

}

TR0=0;   //停止播放


while(K1==0); //若提前停止播放,按键未释放时等待

  }

}

单片机C语言程序设计:按键控制定时器选播多段音乐

关键字:单片机  C语言  程序设计  按键控制  定时器 引用地址:单片机C语言程序设计:按键控制定时器选播多段音乐

上一篇:什么是EEROM扩展电路? 动态RAM的特点是什么?
下一篇:单片机C语言程序设计:演奏音阶

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

单片机之流水灯 AT89C51
流水灯是单片机入门必学的一个实验。这里面主要涉及的操作就是移位操作,还有就是对延时的控制。在没有接触定时器的时候,可以用for语句来进行延时,当然并不能做到精准延时,可以通过在试验箱上的实验现象,来修改延时时间的长短。 #include reg51.h #define uchar unsigned char #define uint unsigned int void delay() { uchar m,s,n; for(m=20;m 0;m--) for(s=20;s 0;s--) for(n=248;n 0;n--); } /*上面这个延时到底延时了多长时间,可以通过keil中的反汇编看到。晶振为12
[单片机]
扫盲:什么是单片机时序,如何看懂时序图
我们都知道在学校是通过铃声来控制所有班级的上下课时间,那个单片机是通过什么样的办法进行取指令,执行指令和其它操作的呢?在这里引入了一个时序的概念: 一、时钟电路 单片机时钟电路有三种方式: 1、单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端,XTAL1和XTAL2需外接上晶体和合适的电容。 2、有的单片机内部也自带时钟电路,用于产生时钟信号。 3、单片机管脚XTAL2直接接晶振。 二、周期 1、时钟周期 时钟电路产生时钟信号的周期我们叫时钟周期(振荡周期)。 单片机通电后就产生了固定标称值的脉冲信号,单片机就是在脉冲信号的驱动下顺序地从ROM中(程序存储器)取
[单片机]
扫盲:什么是<font color='red'>单片机</font>时序,如何看懂时序图
51单片机8X8点阵屏显示
显示一个爱心 #include reg52.h #include intrins.h sbit DIO = P3^4;//串行数据口 sbit S_CLK = P3^5;//移位寄存器时钟 sbit R_CLK = P3^6;//输出锁存器时钟 unsigned char code table ={0xFF,0xEF,0xD7,0xBB,0x7D,0x6D,0x93,0xFF}; //♥ void send(unsigned char dat) { unsigned char i; S_CLK = 0; R_CLK = 0; for(i=0; i 8; i++) { if(da
[单片机]
51单片机入门 - EEPROM(24C02的使用)
24C02:256 个字节的 EEPROM。一般情况下,EEPROM 拥有 30 万到 100 万次的寿命。基于 I2C 通信协议的器件。I2C 是一个通信协议,它拥有严密的通信时序逻辑要求,而EEPROM 是一个器件,只是这个器件采样了 I2C 协议的接口与单片机相连而已,二者并没有必然的联系,EEPROM 可以用其它接口, I2C 也可以用在其它很多器件上。 1、EEPROM写数据流程 第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地 址,并且在读写方向上选择“写”操作。 第二步,发送数据的存储地址。24C02一共 256 个字节的存储空间,地址从 0x00~0xFF,我们想把数
[单片机]
单片机通信实例与 ASCII 码
我们学习串口通信主要是要实现单片机和电脑之间的信息交互,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面我们就做一个简单的例程,实现单片机串口调试助手发送的数据,在我们开发板上的数码管上显示出来。 #include reg52.h sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code LedChar = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; uns
[单片机]
<font color='red'>单片机</font>通信实例与 ASCII 码
单片机数的本质和物理现象
单片机执行指令 我们来思考一个问题,当我们在编程器中把一条指令写进单片机内部,然后取下单片机,单片机就可以执行这条指令。 那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢? 这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。 为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。 单片机数的本质
[单片机]
采用C8051F020单片机和模糊控制器实现便携式心电监护仪的应用方案
目前,以采集心电信号、分析和诊断为主的心电监护系统已经得到了广泛的应用,对于心脏系统疾病的预防、诊断发挥了很大的作用。但是此类心电监护仪只能是在病人静态或者病人要在特殊的情况下才能使用,对心脏病人的要求太高特别是心脏病疑似病人和早期的心脏病患者,影响他们正常的工作生活;而另一类便携式心电监护仪,其24小时可以监护,但是其存储需要大量的空间,对于心电信号的回放也需要大量的时间,鉴于以上两个问题,本文设计基于模糊控制的便携式心电监护仪。他在克服以上两个问题的同时也突破以往在线诊断疾病的单值处理,能够更加准确地判断心电信号正、异常实现及时发出报警。 1、 系统总统设计 1.1 系统设计目标 根据心电信号特征、生物信号处理系统和现代心
[单片机]
采用C8051F020<font color='red'>单片机</font>和模糊<font color='red'>控制</font>器实现便携式心电监护仪的应用方案
基于C8051F021型单片机与PCI接口实现数据采集卡的设计
1、引言 国家电力公司陆延昌副总经理在第26届中国电网调度运行全闭幕式上的讲话中指出了今后一段时期内的电网技术的发展上应重点研究和解决的问题,其中,在电网安全、稳定、经济运动领域,互联电力系统实时功角测量受到越来越的关注。特别是在以监控中目的的电力调度自动化系统中,如何快速、准确地采集处理各种电气参数显得尤为重要。而在实现自动化的过程中,首要环节就是数据采集。为此我们研究开发了电力系统功角广域测控系统,其中,用C8051F021型单片机实现的数据采集卡不仅可以准确、高效、实时地进行AD数据采集并通过双口RAM和PCI接口与上位机交换数据,还可以通过与GPS接收通信接收秒脉冲实现采集数据异地同步 2、功角及其测量 2.1 发电机
[单片机]
基于C8051F021型<font color='red'>单片机</font>与PCI接口实现数据采集卡的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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