51单片机定时器简易音乐播放代码
时间: 2023-09-19 07:09:26 浏览: 178
以下是一个基于51单片机定时器的简易音乐播放代码:
```c
#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
// 音乐节拍数组,每个元素表示占空比,范围0~255
uchar music[] = { 100, 100, 100, 50, 150, 150, 150, 50, 100, 100, 100, 50, 150, 150, 150, 50 };
// 每个音符的持续时间,单位为20ms
uchar duration[] = { 10, 10, 10, 5, 15, 15, 15, 5, 10, 10, 10, 5, 15, 15, 15, 5 };
uchar index = 0; // 当前播放的音符索引
void timer0_init()
{
TMOD |= 0x01; // 设置为工作模式1
TH0 = (65536 - 50000) / 256; // 定时器初值,定时20ms
TL0 = (65536 - 50000) % 256;
EA = 1; // 打开总中断开关
ET0 = 1; // 打开定时器0中断开关
TR0 = 1; // 启动定时器0
}
void main()
{
timer0_init();
while(1);
}
void timer0_isr() interrupt 1
{
static uchar count = 0;
TH0 = (65536 - 50000) / 256; // 重新赋初值
TL0 = (65536 - 50000) % 256;
P1 = (count < music[index] ? 0x01 : 0x00); // 控制P1.0输出高电平或低电平
count++;
if (count >= duration[index]) // 当前音符播放结束
{
count = 0;
index++;
if (index >= sizeof(music)) // 播放完毕,从头开始
{
index = 0;
}
}
}
```
该代码使用定时器0产生20ms的中断,每次中断时控制P1.0输出高电平或低电平,从而产生音乐声音。音乐节拍和每个音符的持续时间以数组的形式存储,通过index来控制当前播放的音符。当当前音符播放结束时,index自增,如果已经播放完毕,则从头开始播放。
阅读全文