51单片机简易电子琴代码

时间: 2023-07-23 10:23:23 浏览: 46
以下是一个简单的51单片机电子琴代码: ``` #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit beep=P1^7; //定义P1.7口为发声口 uchar code table[]={0xe7,0xe5,0xe3,0xe2,0xdf,0xdc,0xda,0xd8,0xd7,0xd5,0xd4,0xd2,0xd1,0xcf,0xcd,0xcc,0xca,0xc9,0xc7,0xc6,0xc5,0xc4,0xc3,0xc2,0xc1,0xc0,0xbf,0xbe,0xbe,0xbd,0xbc,0xbc,0xbb,0xba,0xba,0xb9,0xb8,0xb8,0xb7,0xb6,0xb6,0xb5,0xb4,0xb4,0xb3,0xb2,0xb2,0xb1,0xb0,0xb0,0xaf,0xae,0xae,0xad,0xac,0xac,0xab,0xaa,0xaa,0xa9,0xa8,0xa8,0xa7,0xa6,0xa6,0xa5,0xa4,0xa4,0xa3,0xa2,0xa2,0xa1,0xa0,0xa0,0x9f,0x9e,0x9e,0x9d,0x9c,0x9c,0x9b,0x9a,0x9a,0x99,0x98,0x98,0x97,0x96,0x96,0x95,0x94,0x94,0x93,0x92,0x92,0x91,0x90,0x90,0x8f,0x8e,0x8e,0x8d,0x8c,0x8c,0x8b,0x8a,0x8a,0x89,0x88,0x88,0x87,0x86,0x86,0x85,0x84,0x84,0x83,0x82,0x82,0x81,0x80}; //定义音符频率表 void delay(uint t) //延时函数 { uint i,j; for(i=0;i<t;i++) for(j=0;j<125;j++); } void main() { uchar i; while(1) { for(i=0;i<100;i++) //循环演奏100个音符,可根据需要修改 { beep=1; //发声 P0=table[i]; //输出音符频率 delay(2); //持续时间,可根据需要修改 beep=0; //停止发声 delay(2); //发声间隔,可根据需要修改 } } } ``` 这个代码使用P1.7口作为发声口,通过P0口输出音符频率,使用table数组存储了88个钢琴键的频率,控制发声时长和发声间隔的时间可以根据需要进行修改。

相关推荐

要制作基于51单片机的简易电子琴,需要以下材料和步骤: 材料: - 51单片机开发板 - 8个按键开关 - 8个电阻(可选,用于限流) - 1个蜂鸣器或扬声器 - 连接线 - 电源(3V或5V) 步骤: 1. 将8个按键开关连接到51单片机开发板的8个I/O口上。如果需要限流,可以在每个按键开关和I/O口之间加一个电阻。 2. 将蜂鸣器或扬声器连接到开发板的一个PWM输出口上。 3. 在51单片机开发环境中编写程序,设置I/O口为输入模式,读取按键开关状态,判断按键是否按下,如果按下则设置PWM输出口的占空比,产生对应的音调。 4. 可以根据需要添加其他功能,比如调整音调频率、加入节拍等。 下面是一个简单的示例程序,实现了8个按键对应的不同音调: c #include <reg52.h> typedef unsigned char uchar; typedef unsigned int uint; uchar code tone[] = {0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0x00}; //8个按键对应的PWM占空比 void main() { uchar i, key; P1 = 0xFF; //P1口设置为输入 TMOD = 0x01; //定时器0为16位计数模式 TH0 = 0xFC; //定时器初值 TL0 = 0x00; TR0 = 1; //启动定时器0 ET0 = 1; //开启定时器0中断 EA = 1; //开启总中断 while (1) { key = P1; //读取P1口状态 for (i = 0; i < 8; i++) { if (!(key & (1 << i))) //如果按键被按下 { P2 = tone[i]; //设置PWM占空比 break; } } } } void timer0() interrupt 1 //定时器0中断服务函数 { static uchar cnt = 0; TH0 = 0xFC; //重新设置定时器初值 TL0 = 0x00; cnt++; if (cnt == 100) //每100个计数周期改变PWM输出状态 { P2 = ~P2; cnt = 0; } } 这个程序中通过定时器0产生一个100Hz的中断,每次中断改变PWM输出状态,从而产生音调。按键被按下时,设置PWM占空比对应的音调。该程序仅作为示例,具体实现可以根据需要进行修改和优化。
好的,以下是51单片机用无源蜂鸣器做简易电子琴的代码,使用定时器来实现: 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; // 发声 P0 = tone[0]; // 发送音阶 delay(500); // 延时500ms P0 = 0x00; // 停止发声 delay(500); // 延时500ms } else if(key2 == 0) // 按键2按下 { buzzer = 1; // 发声 P0 = tone[1]; // 发送音阶 delay(500); // 延时500ms P0 = 0x00; // 停止发声 delay(500); // 延时500ms } else if(key3 == 0) // 按键3按下 { buzzer = 1; // 发声 for(i=0; i<8; i++) { P0 = tone[i]; // 发送音阶 delay(250); // 延时250ms P0 = 0x00; // 停止发声 delay(250); // 延时250ms } } } } 在这个程序中,我们同样使用了定时器0来实现延时功能。通过按键1、2、3来分别发出Do、Re、Mi的音阶,按住按键就会持续发声。这个简易电子琴只有三个音阶,可以根据需要进行扩展。

最新推荐

基于51单片机的电子琴的设计

本简易电子琴的设计可实现的功能如下:程序中预存了一首音乐《世上只有妈妈好》,通过一个独立键盘可以实现对该音乐的播放和停止操作的控制。4*4矩阵键盘的16个按键分别对应着16个不同的音符,分为高、低两个八度,...

基于80C51单片机的简易电子琴代码及电原理图

利用51单片机,若干个按键,扬声器构成一个电子琴系统,按下1~7按键,分别发出相应声音。基于汇编语言

Java毕业设计--SpringBoot+Vue的乐校园二手书交易管理系统(附源码,数据库,教程).zip

Java 毕业设计,Java 课程设计,基于 SpringBoot+Vue 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

基于matlab和opencv的手写数字及字母识别系统源码.zip

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于matlab和opencv的手写数字及字母识别系统源码.zip

输入输出方法及常用的接口电路资料PPT学习教案.pptx

输入输出方法及常用的接口电路资料PPT学习教案.pptx

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Office 365常规运维操作简介

# 1. Office 365概述 ## 1.1 Office 365简介 Office 365是由微软提供的云端应用服务,为用户提供办公软件和生产力工具的订阅服务。用户可以通过互联网在任何设备上使用Office应用程序,并享受文件存储、邮件服务、在线会议等功能。 ## 1.2 Office 365的优势 - **灵活性**:用户可以根据实际需求选择不同的订阅计划,灵活扩展或缩减服务。 - **便捷性**:无需安装繁琐的软件,随时随地通过互联网访问Office应用程序和文件。 - **协作性**:多人可同时编辑文档、实时共享文件,提高团队协作效率。 - **安全性**:微软提供安全可靠

如何查看linux上安装的mysql的账号和密码

你可以通过以下步骤查看 Linux 上安装的 MySQL 的账号和密码: 1. 进入 MySQL 安装目录,一般是 /usr/local/mysql/bin。 2. 使用以下命令登录 MySQL: ``` ./mysql -u root -p ``` 其中,-u 表示要使用的用户名,这里使用的是 root;-p 表示需要输入密码才能登录。 3. 输入密码并登录。 4. 进入 MySQL 的信息库(mysql): ``` use mysql; ``` 5. 查看 MySQL 中的用户表(user): ``` se

最新电力电容器及其配套设备行业安全生产设备设施及隐患排查治理.docx

2021年 各行业安全生产教育培训

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依