简易电子琴设计(c语言)
目录
1 设计内容:
1.1 矩阵键盘代表琴键,实现至少8个音的弹奏,分别为1,2,3,4,5,6,7,i.
1.2 键按下时间的长短代表节拍的长短
1.3 用蜂鸣器发出声音
1.4 8*8led点阵动态显示音符高低(自用显示)
2 系统硬件设计
2.1 硬件组成
2.2 显示模块
2.3 按键模块
2.4 发音模块
3 系统主程序流程图
4 protues原理图
5 AD的pcb图
6 程序代码
1 设计内容:
1.1 矩阵键盘代表琴键,实现至少8个音的弹奏,分别为1,2,3,4,5,6,7,i.
1.2 键按下时间的长短代表节拍的长短
1.3 用蜂鸣器发出声音
1.4 8*8led点阵动态显示音符高低(自用显示)
2 系统硬件设计
2.1 硬件组成
本次设计简易电子琴,通过STC89C52芯片最小控制电路,以16位矩阵电盘,蜂鸣器产生16个音阶,8x8点阵led显示音符高低,独立按键控制复位。将不同模块结合起来,实现简易电子琴的设计。
硬件以ST89C52芯片为核心,外部扩展4x4矩阵式键盘来模拟16个按键,用蜂鸣器来发声,外部扩展8*8LED点阵来动态显示音符的简谱。
基本引荐结构图如图2所示。
图2
2.2 显示模块
点阵屏的8个行引脚与单片机的P0口相连并且接上拉电阻;而点阵的8个列引脚则直接与单片机的P2口相连。
显示模块的电路图如图2.1所示。
2.3 按键模块
16位矩阵键盘,通过P1口控制音阶的产生和led点阵显示,按下相应的的键产生设定的声音和点亮对应的led点阵屏,按键模块的电路图如图2.3所示。
图2.3
2.4 发音模块
使用无源蜂鸣器,通过内部程序产生不同频率的方波,使蜂鸣器产生16个基本的音阶,16个按键分别是中音和高音的Do,Re,Mi,Fa,So,La,Si,Do.蜂鸣器与P3^6相接,电路图如图2.4所示。
图2.4
3 系统主程序流程图
4 protues原理图
5 AD的pcb图
6 程序代码
#include <reg51.h>
#include<intrins.h>
#include<absacc.h>
//#define PA XBYTE[0xff7c]
//#define PB XBYTE[0xff7d]
//#define PC XBYTE[0xff7e]
#define CTRL XBYTE[0xff7f]
#define temp P1
#define uchar unsigned charuchar code Table_of_Digits[] = { //8*8led点阵段码 ,1~f 0xFF,0xFF,0xF9,0xFB,0xFB,0xFB,0xF1,0xFF,/*"1",0*/0xFF,0xFF,0xF8,0xFA,0xFD,0xFE,0xF8,0xFF,/*"2",1*/0xFF,0xFF,0xF8,0xFB,0xFD,0xFB,0xF8,0xFF,/*"3",2*/0xFF,0xFF,0xFB,0xF9,0xFA,0xF0,0xF1,0xFF,/*"4",3*/0xFF,0xFF,0xF8,0xF8,0xFB,0xFB,0xF8,0xFF,/*"5",4*/0xFF,0xFF,0xF9,0xF8,0xFA,0xFA,0xF8,0xFF,/*"6",5*/0xFF,0xFF,0xF9,0xFB,0xFB,0xFB,0xFB,0xFF,/*"7",6*/0xFF,0xFF,0xF8,0xFA,0xFD,0xFA,0xF8,0xFF,/*"8",7*/0xFF,0xFF,0xF8,0xFA,0xF8,0xFB,0xFC,0xFF,/*"9",8*/
0xFF,0xFF,0xFF,0xF8,0xFB,0xF8,0xF0,0xFF,/*"a",0*/0xFF,0xFD,0xFD,0xF9,0xF9,0xF9,0xF9,0xFF,/*"b",1*/0xFF,0xFF,0xFF,0xF9,0xFE,0xFE,0xF8,0xFF,/*"c",2*/0xFF,0xF9,0xFB,0xF8,0xFA,0xFA,0xF8,0xFF,/*"d",3*/0xFF,0xFF,0xFF,0xF9,0xF9,0xF9,0xF9,0xFF,/*"e",4*/0xFF,0xF9,0xFD,0xF8,0xFD,0xFD,0xF8,0xFF,/*"f",5*/
};void delay(unsigned int z); //延时函数,参数为非负整型,延时1ms
void display( int yin) ; //led显示函数,参数为整型,
void function1 (void) ; //该函数用于主函数中的按键发音 和点阵显示
int keyscan(); //键盘扫描并返回键值
unsigned int pin[]={64580,64684,64777,64820,64898,64985,65030,65058,65110,65157,65178,65217,65252,65265,65283,65290};//16个音阶简谱码(T值)
unsigned int syin[16]={ 0}; //存储16音阶
sbit P36=P3^6; //beep蜂鸣器引脚
int yin,i;
unsigned poe; //用于存储按键扫描函数返回的键值
unsigned char key_num; main() //???
{ EA=1; //总中断允许 TMOD=0x01; //定时器T0工作方式1 ET0=1; //T0中断允许 PT0=1; //T0为高级中断 CTRL=0x89;while(1){function1();}}void function1 (void) //按键返回值存储,长按发音和显示
{ poe = keyscan(); //???????? switch(poe){case 1:yin=1; //按键对应的音阶 break;case 2:yin=2; break;case 3:yin=3; break;case 4:yin=4; break;case 5:yin=5; break;case 6:yin=6; ;break;case 7:yin=7; break;case 8:yin=8; break; case 9:yin=9; break;case 10:yin=10; break;case 11:yin=11; break;case 12:yin=12; break;case 13:yin=13; break;case 14:yin=14; ;break;case 15:yin=15; break;case 16:yin=16; break;}
if(poe!=0xff) //按键按下 { if (yin==1) { TH0=pin[yin-1]/256; //寻找对应的简谱码给T0赋值,以获取相应的脉冲,蜂鸣器按照相应的频率发音 TL0=pin[yin-1]%256;while(poe==1){TR0=1; //定时器开始计数 poe = keyscan(); //用于不断扫描,判断键值是否还等于while小括号里面的值,如果等于,说明按键没有松开,则进入中断实现发音。 display(yin -1 );}TR0=0;}if (yin==2){ TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==2){TR0=1;poe = keyscan();display(yin -1 ); }TR0=0;}if (yin==3) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==3){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==4) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==4){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==5) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==5){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==6) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==6){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==7) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==7){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==8) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==8){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==9) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==9){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==10) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==10){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==11) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==11){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==12) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==12){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==13) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==13){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==14) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==14){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==15) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==15){TR0=1;poe = keyscan();display(yin -1 );}TR0=0;}if (yin==16) {TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;while(poe==16){TR0=1;poe = keyscan();display(yin -1 );
// display(syin);}TR0=0;}for (i=15;i>0;i--)syin[i]=syin[i-1];syin[0]=yin;} P36=1;}void delay(unsigned int z) //延时函数,延时1ms
{unsigned int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);
}void fasheng() interrupt 1 //T0 中断
{TH0=pin[yin-1]/256;TL0=pin[yin-1]%256;P36=~P36; //P3^6引脚发出相应的脉冲信号驱动蜂鸣器发声 } int keyscan() //矩阵键盘扫描函数,返回按键值num{uchar num;temp=0xf0;if(temp!=0xf0) //先将高四位全部置高电平,低四位全部置低电平,当高四位不全为高电平时,说明有按键按下,然后通过接受的数据值,判断是哪一列有按键按下{delay(10); //延时10ms消抖 if(temp!=0xf0) {temp=0xf0; switch(temp) {case 0x70: num=1; break; case 0xb0: num=5; break; case 0xd0: num=9; break; case 0xe0: num=13; break; }temp=0x0f; switch(temp) {case 0x07: num=num+0; break; case 0x0b: num=num+1; break; case 0x0d: num=num+2; break; case 0x0e: num=num+3; break; }}elsenum = 0xff;}return num; }void display(yin){uchar i;for(i = 0 ;i < 8;i++){P0= i%8; //位值 P2 = Table_of_Digits[i+yin*8]; //段码 delay(1);P2 = 0xff; //熄灭 }}
简易电子琴设计(c语言)相关推荐
- 简易电子琴c语言程序,基于单片机的简易电子琴设计(C语言编程).docx
单片机课程设计报告 基于单片机的简易电子琴设计 摘 要 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器.它在现代音乐 扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经 ...
- 用matlab编程简单电子琴,基于MATLAB的数字信号发生器及简易电子琴设计论文.doc...
基于MATLAB的数字信号发生器及简易电子琴设计论文 基于MATLAB的数字信号发生器及简易电子琴设计 摘 要 数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器.在工程实践中需要检测和分析的各 ...
- 简易电子琴设计(琴键、预设、录制、回放)
简易电子琴设计 设计要求: 使用汇编语言或 C 语言: 程序功能要求:使用数字小键盘作为电子琴键,按下数字键演奏出相应的音符,能 够保存所演奏的音乐,并重复自动播放,电子琴能够进行三首以上的预置乐曲播 ...
- 计算机电子电路原理图,简易电子琴设计电路图大全(八款模拟电路设计原理图详解) - 消费类电子电路图...
简易电子琴设计电路图(一) 电子琴稳定的+5V电源的电路如图所示. 电子琴电源电路 电路工作原理:集成块ICCA6722是该电源电路的核心元件.它能输出精确而稳定的+5V直流电压.从IC第1脚输人+9 ...
- 基于51单片机的简易电子琴设计
一.设计背景 ■电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器.它是现代电子科技与音乐结合的产物,价格相对便宜,能够满足一般爱好者的需求,因此,在现代音乐中扮演着重要的角色.故简易电子琴的 ...
- 基于matlab的数字信号发生器及简易电子琴设计,简易电子琴电路的设计仿真与实现课程设计...
简易电子琴电路的设计仿真与实现课程设计 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 信息工程学院 题 目: 简易电子琴电路的设计仿真与实现 初始条件: 可选元件:集成运算放大器LM ...
- 基于单片机的简易电子琴设计(电路+程序)
博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...
- 51单片机用c语言写音符代码,51单片机电子琴设计C语言程序实例
51单片机C程序实例,电子琴设计 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsi ...
- 基于AT89C52单片机的简易电子琴设计与仿真
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853299?spm=1001.20 ...
最新文章
- java项目怎样强制删除手机缓存_Myeclipse清理项目缓存的几大方法
- oracle查看控件文件 tns
- lucene索引合并与增量索引
- linux 更改文件夹大小,Linux下改变文件大小
- csgo怎么控制电脑玩家_电脑远程控制怎么弄
- 第 5-7 课:Java 中的各种锁和 CAS + 面试题
- iframe 与frameset
- 什么叫单模光纤_什么是单模单纤/双纤光纤收发器?二者有何区别?
- mysql单表大小限制
- hashset和hashmap有什么关系
- 数据仓库——元数据、主数据
- 在区块链的世界里,美国CFTC希望成为一个节点
- asp.net panel 加html,ASP.NET中 Panel 控件的使用方法
- 在word中如何对图片进行编辑
- MFC简易音乐播放器
- XCP实战系列介绍16-XCP标定过程指令解析
- 建tcode維護自己創建的數據表(SE54/SM30)
- 使用调色板绘制系统界面
- 【HTTP协议】简单的HTTP协议
- 16求计算机科学与技术鲁嘉华第三章作业
热门文章
- RGui下R Console无法在英文模式下输入引号问题
- 视频消重软件吾爱伪原创 安卓手机怎么看视频md5
- 美剧字幕组翻译谈如何提高英语听力口语
- html 图片自动大小,css图片自适应_用css让图片自动适应大小
- mp4 android自动播放,Android - 简单使用VideoView播放MP4
- c语言矩形方阵副对角线,对角条中的横向矩形矩阵
- html中的锚记实战挖掘
- (fucntion(){})()
- 频谱分析-FFT之后的那些事情
- word vba 转换html,通过VBA和剪贴板复制HTML到Word丢失特殊字符