51单片机按键控制无源蜂鸣器发Do Re Mi Fa So La Si Do代码,用定时器实现
时间: 2024-02-28 13:57:32 浏览: 124
好的,以下是51单片机按键控制无源蜂鸣器发Do Re Mi Fa So La Si Do的代码,使用定时器来实现:
```c
#include <reg51.h>
sbit buzzer = P2^3; // 无源蜂鸣器接口
sbit key1 = P3^1; // 按键1接口
sbit key2 = P3^2; // 按键2接口
sbit key3 = P3^3; // 按键3接口
unsigned char code tone[] = {0x3F, 0x3C, 0x3A, 0x38, 0x35, 0x32, 0x2E, 0x2B}; // 音阶数组
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
{
for(j=0; j<120; j++);
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = (65536-1000)/256; // 重新赋值,每1ms进入中断一次
TL0 = (65536-1000)%256;
}
void main()
{
unsigned char i = 0;
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536-1000)/256; // 初始化定时器0
TL0 = (65536-1000)%256;
ET0 = 1; // 打开定时器0中断允许
EA = 1; // 打开总中断允许
TR0 = 1; // 启动定时器0
while(1)
{
if(key1 == 0) // 按键1按下
{
buzzer = 1; // 发声
for(i=0; i<8; i++)
{
P0 = tone[i]; // 发送音阶
delay(500); // 延时500ms
}
buzzer = 0; // 停止发声
}
else if(key2 == 0) // 按键2按下
{
buzzer = 1; // 发声
for(i=0; i<8; i++)
{
P0 = tone[7-i]; // 发送音阶
delay(500); // 延时500ms
}
buzzer = 0; // 停止发声
}
else if(key3 == 0) // 按键3按下
{
buzzer = 1; // 发声
for(i=0; i<8; i++)
{
P0 = tone[i]; // 发送音阶
delay(250); // 延时250ms
P0 = 0x00; // 停止发声
delay(250); // 延时250ms
}
buzzer = 0; // 停止发声
}
}
}
```
在这个程序中,我们使用了定时器0来实现延时功能。通过按键1、2、3来分别发出Do、Re、Mi、Fa、So、La、Si、Do的音阶。其中,按键1和2都是从低音往高音发出音阶,而按键3则是按照Do、静音、Re、静音、Mi、静音、Fa、静音、So、静音、La、静音、Si、静音、Do的顺序循环播放。
阅读全文