
本实验旨在设计和实现一个基于51单片机的简易电子琴,通过按键控制不同频率的声音输出。该系统可以模拟电子琴的基本功能,通过按键的不同组合,产生对应音调的声音。
51单片机(STC89C52)
蜂鸣器
按键(6个)
电阻、电容等基本元器件
面包板及连接线
Proteus仿真软件
单片机:使用STC89C52作为主控制芯片。
蜂鸣器:连接到P1^6引脚,用于发声。
按键:6个按键分别连接到P2口,用于选择不同的音调。
电源:提供稳定的5V电源给单片机和外设。
硬件连接示意图如下:
展开代码+-------------+ +----------+ | | | | | STC89C52 | | 蜂鸣器 | | | | | | P1^6 -----+--------> | | | +----------+ | | | P2.0-P2.5--+ | | | | | +---------+ | | | | +------>| 按键1 | | | | +--------->| 按键2 | | | +----------->| 按键3 | | +------------->| 按键4 | | +->| 按键5 | | | | 按键6 | +-----------------+ +---------+
该设计利用51单片机的I/O端口控制蜂鸣器发声,通过定时器产生不同频率的方波,从而产生不同音调。按键用于选择不同的音调,按键按下时单片机读取按键值并控制蜂鸣器发出相应频率的声音。
程序主要分为以下几个部分:
音调频率定义:定义低音、中音和高音的频率。
定时器初始化:配置定时器用于产生不同频率的方波。
按键扫描:检测按键输入,根据按键值选择相应的音调。
中断服务程序:通过定时器中断产生方波,从而驱动蜂鸣器发声。
c展开代码void init_timer(void) {
    EA = 1;            // 开总中断
    ET1 = 1;           // 定时器T1中断允许
    TMOD &= 0x0f;
    TMOD |= 0x00;      // 使用定时器T1的模式1(13位计数器)
    TR1 = 1;
}
该函数用于初始化定时器1,并设置为13位计数模式。
c展开代码void ScanKey(void) {
    if (GPIO_KEY != 0xff) {
        if (GPIO_KEY == 0xff - 0x01) {
            TEMP_C = Z1;
        } else if (GPIO_KEY == 0xff - 0x02) {
            TEMP_C = Z2;
        } else if (GPIO_KEY == 0xff - 0x04) {
            TEMP_C = Z3;
        } else if (GPIO_KEY == 0xff - 0x08) {
            TEMP_C = Z4;
        } else if (GPIO_KEY == 0xff - 0x10) {
            TEMP_C = Z5;
        } else if (GPIO_KEY == 0xff - 0x20) {
            TEMP_C = Z6;
        }
        C = 460830 / TEMP_C;
        TH1 = (8192 - C) / 32;
        TL1 = (8192 - C) % 32;
        TR1 = 1;
        while (GPIO_KEY != 0xff);
        TR1 = 0;
    }
}
该函数用于扫描按键并根据按键值设置相应的频率常数。
c展开代码void main() {
    init_timer();
    TR1 = 0;         // 关闭定时器
    sound = 1;       // 关闭蜂鸣器
    while (1) {
        ScanKey();   // 获取处理按下的键
    }
}
主函数初始化定时器并进入无限循环,持续检测按键输入。
c展开代码void Time1(void) interrupt 3 {
    sound = !sound;               // 将P3.7引脚输出电平取反,形成方波
    TH1 = (8192 - C) / 32;      // 13位计数器TH0高8位的赋初值方法
    TL1 = (8192 - C) % 32;      // 13位计数器TL0低5位的赋初值方法
}
该函数用于定时器中断,通过改变蜂鸣器引脚的电平,产生方波,从而发出声音。
通过按下不同的按键,蜂鸣器可以发出对应频率的声音,实现了简易电子琴的功能。各按键对应的音调准确,响应速度快,满足设计要求。
本实验成功实现了一个基于51单片机的简易电子琴,通过按键控制蜂鸣器发出不同频率的声音。实验验证了定时器中断、按键扫描等基本技术在电子琴设计中的应用,为进一步的扩展和改进提供了基础。
展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!