单片机七阶音符代码
时间: 2023-07-09 17:13:32 浏览: 71
以下是一个简单的基于8051单片机的七音电子琴程序,代码中使用定时器0和PWM方式来实现发声:
```c
#include <reg51.h>
sbit P3_4 = P3^4; // P3.4接音箱
unsigned char code key[7] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF}; // 七个按键的扫描码
unsigned char code tune[7] = {0x3B, 0x35, 0x30, 0x2A, 0x24, 0x1F, 0x19}; // 七个音符的计数值,分别对应C4-D4-E4-F4-G4-A4-B4
unsigned char key_value; // 按键值
unsigned char timer_value; // 定时器计数值
void Init_Timer0()
{
TMOD = 0x02; // 定时器0工作在模式2,8位自动重载模式
TH0 = 0x00; // 定时器0初值
TL0 = 0x00; // 定时器0初值
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
}
void Init_PWM()
{
P3_4 = 0; // 先关闭音箱
TMOD |= 0x10; // 定时器1工作在模式1,16位自动重载模式
TH1 = 0xFD; // 定时器1初值,用于设置PWM频率
TL1 = 0xFD; // 定时器1初值,用于设置PWM频率
ET1 = 0; // 关闭定时器1中断
TR1 = 1; // 启动定时器1
P1M1 |= 0x02; // P1.1为PWM输出
P1M2 &= ~0x02; // P1.1为推挽输出
CCON |= 0x40; // 启动PCA定时器
}
void main()
{
Init_Timer0();
Init_PWM();
while(1)
{
key_value = P1 & 0x7F; // 读取按键值
if(key_value != 0x7F) // 如果有按键按下
{
for(int i = 0; i < 7; i++)
{
if(key_value == key[i]) // 如果按下的是第i个按键
{
timer_value = tune[i]; // 将对应的计数值赋给定时器计数值
CCAP1H = TH1 = 0xFF - timer_value / 256; // 设置PWM占空比高位
CCAP1L = TL1 = 0xFF - timer_value % 256; // 设置PWM占空比低位
P3_4 = 1; // 打开音箱
break;
}
}
}
else // 如果没有按键按下
{
P3_4 = 0; // 关闭音箱
}
}
}
void Timer0_ISR() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0x3C; // 重置定时器初值,使定时器中断周期为1ms
TL0 = 0xAF;
CCAPM1 |= 0x42; // 设置PWM为高电平输出
CCAPM1 &= ~0x21; // 设置PWM为非固定比输出
}
```
以上代码仅供参考,具体实现还需要根据硬件电路和具体的需求进行调整。