51单片机简易电子琴程序
(完整版)基于51单片机的简易电子琴设计
(完整版)基于51单⽚机的简易电⼦琴设计基于51单⽚机的简易电⼦琴设计⼀.问题提出为什么选择简易电⼦琴设计?1.对于⾳乐的兴趣我们对⾳乐都有着浓厚的兴趣,喜欢听钢琴曲,如理查德·克莱德曼演奏的《思乡曲》《星空》《秋⽇的私语》等,⾳乐在我们的⽣活中扮演着很重要的⾓⾊。
有⼈曾说,喜欢⾳乐的⼈不会向恶。
以前不以为然,可是随着这些年来慢慢喜欢上阴郁,听了越来越多的钢琴曲之后,觉得这句话⾮常有道理。
⾳乐是⽤艺术家⽤⾳符记录世界,传达情感的⼀种艺术形式,⾳乐⾥有⼀种和谐之美,听⾳乐可以让⼈⼼情舒畅,与外界和谐统⼀。
⾳乐现在已经成为我⽣活中很重要的⼀部分,我们每周都会抽些时间去欣赏世界名曲,作为对精神的洗礼。
2.对于电⼦琴的好奇好奇是⼈的天性,⼈类对于⾃然的认识,对于科学的探索,⽆不始于好奇。
我们对电⼦琴如何实现其功能,如⾳⾊选择、声⾳强弱控制、节拍器、⾃动放⾳功能等等也很好奇,想通过学习单⽚机这个机会,深⼊了解电⼦琴的功能实现原理。
3.对于51单⽚机强⼤功能的信赖51单⽚机有基本特性:(1)⾯向控制的8位CPU和指令系统(2)4K字节的程序存储器(ROM或EPROM)(3)128字节的数据存储器(4)可编程的并⾏I/O⼝P0~P3,有32位双向输⼊/输出线(5)⼀个全双⼯串⾏⼝(6)两个16位定时器/计数器(7)五个中断源,两个优先级的中断结构(8)⼀个⽚内时钟振荡器和时钟电路(9)可以寻址64K字节的程序存储器和64K字节的外部数据存储器51单⽚机功能强⼤,性能⽇趋完善,在⼯业测控、智能仪器仪表、机电⼀体化产品、家电领域中应⽤⼴泛,因此基于51单⽚机设计简易的电⼦琴可⾏性⾮常⼤。
⼆.功能需求1.能够实现基本的琴键功能即每按下⼀个琴键,单⽚机能够检测到键盘的按键,并根据按键的位置,通过程序来控制,使蜂鸣器发出不同频率(⾳调)的声⾳,声⾳延迟⼀段时间,等到按键放开后,声⾳停⽌。
然后再继续扫描,看是否有键按下,如此循环下去,即可实现基本的琴键功能。
51单片机电子琴程序
#include<reg51.h>#include<absacc.h>#include<stdio.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar STH0; //定时器计数初值uchar STL0;bit FY=0; //放乐曲时FY=1,电子琴弹奏时FY=0uchar Song_Index=0,Tone_Index=0; //放音乐的参数uchar k,key;sbit SPK=P3^7;sbit LED1=P1^0;sbit LED2=P1^1;uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6f,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79 ,0x71};uchar code Song[][50]={{1,2,3,5,7,8,4,3,4,3,4,5,4,6,3,4,5},{5,5,3,5,4,2,4,5,7,4,2,10,10,10,2,1,2,1,2,10,10},{5,5,10,9,8,5,5,5,5,10,9,8,6,6,6,11,12,9,6,8-1},{13,14,13,12,12,10,12,13,14,15,14,14},{6,6,11,10,9,12,12,12,12,13,12,11,9,8,10,10,10,-1},{9,13,13,13,13,8,13,13,13,13,14,15,14,13,13,14,12,13},};uchar code Len[][50]={{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,2,2,1,2,2},{1,1,1,1,1,1,2,1,1,1,2,2,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},{1,1,2,0,1,1,2,0,1,1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,2,0,1,2,1,2,1,2,1,2,1,2},{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},}; //音符与计数值对应表uint code tab[]={0,63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};void delay1(uint ms) //播放歌曲时实现节拍的延时函数{uchar t;while(ms--) for(t=0;t<120;t++);}//键消抖延时函数void delay(void){uchar i;for(i=300;i>0;i--);}//键扫描函数uchar getkey(void){uchar scancode,tmpcode;if((P0&0xf0)==0xf0)return(0);scancode=0xfe;while((scancode&0x10)!=0){P0=scancode; //输入行扫描码if((P0&0xf0)!=0xf0) //本行有键按下{tmpcode=(P0&0xf0)|0x0f;return((~scancode)+~(tmpcode));}else scancode=(scancode<<1)|0x01;}}//外部中断0void EX0_INT() interrupt 0{FY=0;LED1=1;LED2=0;}//外部中断1,这里是播放按键void EX1_INT() interrupt 2{FY=1;LED1=0;LED2=1;}//定时器0中断服务子程序void time0_int(void) interrupt 1 using 0{TH0=STH0;TL0=STL0;SPK=!SPK;P2=DSY_CODE[k];void main(void){LED1=1;LED2=0;P2=0x3f;IE=0x87;TMOD=0x01;IT0=1;IT1=1;while(1){P0=0xf0;if((P0&0xf0)!=0xf0){delay();if((P0=0xf0)!=0xf0){key=getkey();switch(key){case 0x11:k=0;break;case 0x21:k=1;break;case 0x41:k=2;break;case 0x81:k=3;break;case 0x12:k=4;break;case 0x22:k=5;break;case 0x42:k=6;break;case 0x82:k=7;break;case 0x14:k=8;break;case 0x24:k=9;break;case 0x44:k=10;break;case 0x84:k=11;break;case 0x18:k=12;break;case 0x28:k=13;break;case 0x48:k=14;break;case 0x88:k=15;break;default:break;}if(FY==0){STH0=tab[k]/256;STL0=tab[k]%256;TR0=1;while((P0&0xf0)!=0xf0);TR0=0;}else{while(FY==1){if(Song[k][Tone_Index]==-1)Tone_Index=0;STH0=(tab[Song[k][Tone_Index]])/256;STL0=(tab[Song[k][Tone_Index]])%256;P2=DSY_CODE[Song[k][Tone_Index]];TR0=1;delay1(300*Len[k][Tone_Index]);Tone_Index++;TR0=0;}}}}}}关于“世上只有妈妈好”的单片机音乐演奏程序2009-11-22 21:45单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。
51单片机简易电子琴
51单片机简易电子琴因本人初学单片机程序过于简陋请见谅程序:#include<reg51.h>sbit P2_0=P2^0;sbit P1_0=P1^0;//sbit P3_0=P3^0;unsigned char temp;unsigned int tone1;unsigned int tone2;unsigned char yinfu[]={0xfb,0xe9, //Do0xfc,0x5c, //Re0xfc,0xc1, //Mi0xfc,0xef, //Fa0xfd,0x45, //So0xfd,0x92, //La0xfd,0xd0, //Si0xfd,0xee, //Do#0xfa,0x14, //So低0xfa,0xb9, //La低0xfb,0x4d, //Si低0x00,0x00 //音符之间的间隔,只要间隔时间小于65ms时,//喇叭不会发出声音,用作拍子之间的短暂停顿};void delay500us(void) //延时五百US{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);}void anjian(void) 按键//按键扫描程序{P1=0xf0;temp=P1;if(temp!=0xf0) //按键扫描{delay500us(); //消抖动temp = P1;if(temp!=0xf0){P1=0xfe;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbe:tone1=yinfu[15];tone2=yinfu[16];TR0=1;break;case 0xde:tone1=yinfu[14];tone2=yinfu[15];TR0=1;break;case 0xee:tone1=yinfu[12];tone2=yinfu[13];TR0=1;break;case 0x7e:break;default:break;}}P1=0xfd;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbd:tone1=yinfu[10];tone2=yinfu[11];TR0=1;break;case 0xdd:tone1=yinfu[8];tone2=yinfu[9];TR0=1;break;case 0xed:tone1=yinfu[6];TR0=1;break;case 0x7d:break;default:break;}}P1=0xfb;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xbb:tone1=yinfu[4];tone2=yinfu[5];TR0=1;break;case 0xdb:tone1=yinfu[2];TR0=1;break;case 0xeb:tone1=yinfu[0];tone2=yinfu[1];TR0=1;break;case 0x7b:break;default:break;}}P1=0xf7;temp=P1;if((temp&0xf0)!=0xf0) {switch(temp){case 0xd7:break;case 0x77:break;case 0xb7:case 0xe7: //清零按键break;default:break;}}}}P1=0xf0;while(P1!=0xf0){while(P1!=0xf0);//等待放开按键// delay500us();}// P2_0=0;TR0=0; //关闭定时计数器0// P3_0=0;}void time0(void) {TMOD=0X01; P2_0=0;TH0=tone1;TL0=tone2;EA=1;ET0=1;TR0=0;}void main() {P2_0=0;P3_0=0;time0();while(1){anjian();//else//{//tone1=0xfc;//tone2=0x5c;//}}}void timer0(void) interrupt 1 using 1 //产生矩形波驱动蜂鸣器{static unsigned char f=1;if(f==1){f=0;P2_0=1;}else{f=1;P2_0=0;}TH0=tone1;TL0=tone2;}原理图:。
基于51单片机的简单电子琴代码
基于51单片机的简单电子琴代码#include <AT89X52.h>sbit P10=P1^0;//高音阶,红灯sbit P11=P1^1;//中音阶,黄灯sbit P12=P1^2;//低音阶,绿灯sbit P13=P1^3;//蜂鸣器控制端口sbit P31=P3^0;//低音阶按键行sbit P32=P3^1;//中音阶按键行sbit P33=P3^2;//高音阶按键行sbit P35=P3^4;//播放音乐按键unsigned int i,j,k=0,l=0;unsigned char count1=0xff,count0=0x50;/*********************************数码管码表(P0)***********************************/unsigned char Tab[]={0XBF,0X06,0X5B,0X4F,0X66,//数码管0~40X6D,0X7D,0X07,0X7F,0X6F,//数码管5~90X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//数码管A~F/************************************音阶控制**************************************/music_data_high[]={0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//数组0~6 低音0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//数组7~13 中音0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff};//数组14~20 高音music_data_low[]= {0xf3,0xb8,0x15,0xb9,0x4a,0xcf,0x0c,//数组0~6 低音0x44,0xac,0x09,0x34,0x82,0xc8,0x05,//数组7~13 中音0x4c,0x6d,0x94,0xad,0xd2,0xf3,0x02};//数组14~20 高音/******************************************************函数名:delayms*参数:n 延时毫秒数*功能:延时N毫秒*****************************************************/void delayms(unsigned char n){unsigned char a,b;for(a=100;a>0;a--)for(b=10*n;b>0;b--);}/******************************************************函数名:key_check*参数:无*功能:扫描按键并运行对应功能*****************************************************/void key_check(void){P2=0xff;P3=0xfe;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=1;P12=0;switch(P2){case0xfe:EA=1;count1=0xf8;count0=0xf3;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xf9;count0=0xb8;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfa;count0=0x15;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfa;count0=0xb9;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfb;count0=0x4a;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfb;count0=0xcf;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xfc;count0=0x0c;P0=Tab[7];delayms(50);bre ak;defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfd;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=1;P11=0;P12=1;switch(P2){case0xfe:EA=1;count1=0xfc;count0=0x79;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfc;count0=0xbc;P0=Tab[2];delayms(50);bre ak;case0xfb:EA=1;count1=0xfd;count0=0x09;P0=Tab[3];delayms(50);br eak;case0xf7:EA=1;count1=0xfd;count0=0x44;P0=Tab[4];delayms(50);bre ak;case 0xef:EA=1;count1=0xfd;count0=0xa2;P0=Tab[5];delayms(50);break;case0xdf:EA=1;count1=0xfd;count0=0xd8;P0=Tab[6];delayms(50);br eak;case0xbf:EA=1;count1=0xfe;count0=0x05;P0=Tab[7];delayms(50);br eak;// defaule:break;}}}//else {EA=0;P13=1;}P2=0xff;P3=0xfb;if(P2!=0xff){ delayms(20);if(P2!=0xff){P10=0;P11=1;P12=1;switch(P2){case0xfe:EA=1;count1=0xfe;count0=0x4c;P0=Tab[1];delayms(50);bre ak;case0xfd:EA=1;count1=0xfe;count0=0x6d;P0=Tab[2];delayms(50);br eak;case0xfb:EA=1;count1=0xfe;count0=0x9f;P0=Tab[3];delayms(50);bre ak;case0xf7:EA=1;count1=0xfe;count0=0xad;P0=Tab[4];delayms(50);bre ak;case0xef:EA=1;count1=0xfe;count0=0xd2;P0=Tab[5];delayms(50);bre ak;case0xdf:EA=1;count1=0xfe;count0=0xf3;P0=Tab[6];delayms(50);bre ak;case0xbf:EA=1;count1=0xff;count0=0x02;P0=Tab[7];delayms(50);bre ak;// defaule:break;}}}if(P2==0xff) {EA=0;P13=1;}/******************************************************函数名:play_music*参数:无*功能:播放音乐*****************************************************/ void play_music(void){count1=music_data_high[0];count0=music_data_low[0]; EA=1;delayms(50);EA=0;delayms(5);}/******************************************************函数名:TIM0_init*参数:无*功能:定时器0初始化*****************************************************/ void TIM0_init(void){TMOD=0x01;TH0=count1;TL0=count0;EA=1;ET0=1;TR0=1;}void timer0(void) interrupt 1 using 0{TH0=count1;TL0=count0;P13=!P13;/***************************************************** *函数名:main*参数:无*功能:开跑程序*****************************************************/ void main(void){ P35=1;TIM0_init();//play_music();//while(1){ if(P35==0) {delayms(20);P35=1;play_music();} key_check();}}。
51单片机设计电子琴报告含代码
电子琴设计报告一、实验目的1.更深刻的了解、学习8051单片机的发声原理,利用定时器可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。
2.其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,所以发出不同频率的脉冲。
3.进一步熟悉定时器的编程方法和定时初值的计算,进一步熟悉键盘扫描电路的工作原理和编程方法,了解单片机芯片的接口技术。
二、实验要求1.能够通过键盘演奏音符。
2.能够保存演奏的音乐,并实现回放。
3.有音调调整功能(如:C调,G调)。
4.自由发挥其他功能。
5.要求有单片机硬件系统框图,电路原理图,软件流程图。
三、实验基本原理简易电子琴有主控、蜂鸣器、键盘输入、电源四部分组成。
主控部分以AT89S52 为核心,用C 语言编程,充分运用AT89S52 的8k字节闪烁可编程可擦除只读存储器及其丰富的I/O 口,实现了对键盘数据的采集,和对蜂鸣器声音的控制;键盘输入部分采用4×4的键盘键盘输入,可以实现多个音调;供电部分可对整个电路进行供电。
经测试,整机基本实现预计功能,可以实现键盘演奏音符、调整音调、保存并回放的功能。
四、实验设计分析根据实验所要求实现的功能设计实现该项实验设计的软件电路及硬件电路。
五、实验要求实现A.电路设计1. 整体设计计划利用AT89S52 单片机的功能结合C 语言编程,实现电子琴播放音符等的简单功能,然后结合AT89S52 单片机的控制功能,利用蜂鸣器将输入表达出来,结合程序编制过程中,对各个I/O 的利用设置了键盘的扫描读入,结合电子琴需要多键位的现实,加入了4×4 键盘输入,达到了预期的效果。
2.分块设计1.控制模块AT89S52单片机是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含有8kb的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
简易电子琴单片机c51程序
#include "reg51.h"void tinit(void);void delay_ms(unsigned int);sbit P27=P2^7;sbit P26=P2^6;sbit P25=P2^5;unsigned char code Music_Code[]={0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfb,0xee} ;unsigned char const yinful[3][14]={0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b, 0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05, 0xfb,0x21,0xfe,0x55,0xfe,0x84,0xfe,0x99,0xfe,0xc0,0xfe,0xe3,0xff,0x02 } ;unsigned char const length[]={1,2,4,8,16,32,64};unsigned char sth,stl;void main(void){unsigned char j;unsigned int i;tinit();while(1){switch(P1){case 0xfe: delay_ms(10);if(P1==0xfe){i=0;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xfe)continue;else break;}TR0=0;for(;;){while(P1==0xfe)delay_ms(10);if(P1==0xfe) continue;else break;}}TR0=0;break;case 0xfd: delay_ms(10);if(P1==0xfd){i=1;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xfd)continue;else break;}TR0=0;for(;;){while(P1==0xfd)delay_ms(10);if(P1==0xfd) continue;else break;}}TR0=0;break;case 0xfb: delay_ms(10);if(P1==0xfb){i=2;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xfb)continue;else break;}TR0=0;for(;;){while(P1==0xfb)delay_ms(10);if(P1==0xfb) continue;else break;}}TR0=0;break;case 0xf7: delay_ms(10) ;if(P1==0xf7){i=3;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xf7)continue;else break;}TR0=0;for(;;){while(P1==0xf7)delay_ms(10);if(P1==0xf7) continue;else break;}}TR0=0;break;case 0xef: delay_ms(10);if(P1==0xef){i=4;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xef)continue;else break;}TR0=0;for(;;){while(P1==0xef)delay_ms(10);if(P1==0xef) continue;else break;}}TR0=0;break;case 0xdf: delay_ms(10);if(P1==0xdf){i=5;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xdf)continue;else break;}TR0=0;for(;;){while(P1==0xdf)delay_ms(10);if(P1==0xdf) continue;else break;}}TR0=0;break;case 0xbf: delay_ms(10);if(P1==0xbf){i=6;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0xbf)continue;else break;}TR0=0;for(;;){while(P1==0xbf)delay_ms(10);if(P1==0xbf) continue;else break;}}TR0=0;break;case 0x7f: delay_ms(10);if(P1==0x7f){i=7;TR0=0;sth=Music_Code[2*i];stl=Music_Code[2*i+1];TR0=1;for(j=0;j<=100;j++){delay_ms(10);if(P1==0x7f)continue;else break;}TR0=0;for(;;){while(P1==0x7f)delay_ms(10);if(P1==0x7f) continue;else break;}}TR0=0;break;default: break;}}}void delay_ms(unsigned int k){unsigned int i0;unsigned char i,j;for(i0=0;i0<k;i0++){for(i0=0;i0<k;i0++)for(i=5;i>0;i--)for(j=97;j>0;j--);}}void tinit(void){TMOD=0x01;TH0=sth;TL0=stl;ET0=1;EA=1;TR0=0;}void t0(void) interrupt 1 {TR0=0;TH0=sth;TL0=stl;P27=!P27;TR0=1;}。
简易电子琴设计方案51单片机
简易电子琴(51单片机)目录简易电子琴(51单片机) (1)目录 (1)摘要 (1)ABSTRACT (1)引言 (1)1 方案论证 (1)1.1原理图 (1)1.2系统板硬件连线 (1)1.3 主要芯片简介 (2)1.3.1 AT89S51简介 (2)1.3.2 LM386 (4)图1-3 LM386内部电路原理图 (4)Fig1-3 LM386 internal circuit diagram (4)1.3.3 LED数码管 (5)2 实现过程 (6)2.1 4X4行列式键盘识别及显示 (6)2.1.1 系统板上硬件连线设计 (7)2.1.2 程序设计内容(1)4×4矩阵键盘识别处理,每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
(8)图2.1.1 行列式键盘电路 (8)Figure 2.1.1 determinant keyboard circuit (8)摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
51单片机电子琴,支持弹奏14音、播放21音、支持重放弹奏曲目、支持节拍显示和音调显示
矩阵按键分布:K0 K1 K2 K3K4 K5 K6 K7K8 K9 K10 K11K12 K13 K14 K15按键功能介绍:弹奏模式下:K0:录制按键。
按下后,开始录制接下来弹奏的歌曲,再次按下录制结束。
按右下角的播放按键,播放刚才弹奏的歌曲。
K1~K3:低5音~低7音K4:0音K5~K11:中1音~中7音K12~K15 :高1音~高4音。
播放模式下:K12:上一首歌曲K13:暂停、再次播放K14:下一首歌曲K15:播放模式时功能是,退出播放程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define PSMG P0 //数码管IO口#define PKEY P1 //定义4x4按键接的IO 口行扫描#define PLED P2 //LED接的IO口sbit PLAY = P3^1;sbit SPK = P3^0;#define ALLSONG 3 //歌曲总数按实际写#define CODEMAX 30 //最大音符数uchar tone_h;uchar tone_l;uchar t1_flag = 0; //用于记录定时器1进入中断的次数uchar PressTime = 0; //按键按下的时间(节拍)uchar code chuzhi[3][16]={ //音调对应的计数初值0xff,0xff, //用任意值占0位,因为音调从1开始0xf8,0x8c,//低10xf9,0x5b,// 20xfa,0x15,// 30xfa,0x67,// 40xfb,0x04,// 50xfb,0x90,// 60xfc,0x0c,//低70xff,0xff,//占0位0xfc,0x44,//中10xfc,0xac,// 20xfd,0x09,// 30xfd,0x34,// 40xfd,0x82,// 50xfd,0xc8,// 60xfe,0x06,//中70xff,0xff,//占0位0xfe,0x22,//高10xfe,0x56,// 20xfe,0x85,// 30xfe,0x9a,// 40xfe,0xc1,// 50xfe,0xe4,// 60xff,0x03 //高7};//共阴数码管段码表uchar code YDTAB[23]={0x00, //各段全灭【0】0x77,0x7c,0x39,0x5e,0x79,0x71,0x3d, //a -g 【1~7】0x3f, //0【8】0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //1 -7 【9~15】0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87 //1. -7. 【16~22】};//发光二极管闪烁表uchar code LEDTAB[9]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//****** 生日快乐 ******uint code srkl[] = {205,205,406,405,411,807,205,205,406,405,412,811,205,205,415,413,411,407,406,314,114,413,411,413,812,305,105,406,405,411,807,305,105,406,405,412,811,305,105,415,413,411,407,406,314,114,413,411,412,811,410,0xffff};//*******恋曲1990*******uint code lq1990[] = {613,213,412,411,613,213,412,411,613,213,412,411,1213, 110,//前奏215,215,215,215,413,412, //乌溜溜的黑眼珠613,211,211,212,413,1206, //和你的笑脸212,213,212,213,415,213,212, //怎么也难忘记612,211,211,206,405,1213,110, //你容颜的转变215,215,215,215,213,212, //轻飘飘的旧时613,211,211,212,213,1206, //光就这么溜走212,213,212,213,415,213,212, //转头回去看看612,205,213,212,413,1211,110, //时已匆匆数年215,215,215,215,413,412, //苍茫茫的天涯613,211,211,212,413,1206, //路是你的漂泊212,213,212,213,415,213,212, //寻寻觅觅长相612,211,211,206,405,1213,110, //守是我的脚步215,215,215,215,213,212, //黑漆漆的孤枕613,211,211,212,213,1206, //边是你的温柔212,213,212,213,415,213,212, //醒来时的清晨612,205,213,212,413,1211,110, //里是我的哀愁215,215,215,215,413,412, //轰隆隆的雷雨613,211,211,212,413,1206, //声在我的窗前212,213,212,213,415,213,212, //怎么也难忘记612,211,211,206,405,1213,110, //你离去的转变215,215,215,215,213,212, //孤单单的身影613,211,211,212,213,1206, //后寂寥的心情212,213,212,213,415,213,212, //永远无怨612,205,213,212,413,1211,110, //的是我的双眼615,213,415,416, //或许明日621,216,421,416, //太阳西下415,415,415,416,1213, //倦鸟已归时212,213,212,213,415,413, //你将已经踏上612,211,411,413,1212,210, //旧时的归途613,213,412,413, //人生难得615,213,415,416, //再次寻觅421,421,421,422,1216, //相知的伴侣221,221,221,221,416,415, //生命终究难舍212,412,212,412,413,1215,1610, 1610, //蓝蓝的白云天0xFFFF,};//==========================//粗略延时函数//==========================void delayms(uint ms)//延时?个 ms{uchar a,b,c;while(ms--){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}}//======================//定时器1 测量按键持续的节拍数//======================void Timer1_Init(void){EA = 1;ET1 = 1;TMOD &= 0x0F;TMOD |= 0x10;TH1 = (65536-25000)/256;TL1 = (65536-25000)%256; //25ms中断一次}void timer1() interrupt 3{TH1 = (65536-25000)/256;TL1 = (65536-25000)%256; //25ms中断一次t1_flag++;if(t1_flag == 5) //125ms{t1_flag = 0;if(PressTime < 16) //最多16 即最长4秒PressTime++;//8个LED显示节拍if(PressTime <= 8)PLED = LEDTAB[PressTime];else PLED = LEDTAB[8];}}//======================//按键扫描函数【行扫描】//低4位接行,高4位接列/*键值分布0 1 2 34 5 6 78 9 10 1112 13 14 15*///====================== uchar keyScan(void){uchar hang;uchar key;uchar temp;for(hang = 0;hang < 4;hang++){PKEY = ~(1<<hang);temp = PKEY&0xF0; //取高4位的值temp >>= 4; //将高四位右移到低四位if(temp != 0x0F) //有按键按下{switch(temp){case 14: key = 4*hang+0;break; //temp:1110 case 13: key = 4*hang+1;break; //temp:1101 case 11: key = 4*hang+2;break; //temp:1011case 7: key =4*hang+3;break; //temp:0111}break; //有键按下,获取键值后,终止扫描}else //没有按键按下返回255key = 255;}return key;}//======================//节拍延时//======================void delay125ms(uint pai) //延时?*125ms 即?个节拍{uchar a,b,c;while(pai--){for(c=239;c>0;c--)for(b=104;b>0;b--)继续阅读。
c51单片机课程设计——电子琴
目录1设计题目 (3)2. 设计目的 (3)3. 主要内容 (3)4. 音符频率与计数初值对照表 (3)5. 定时/计数器的工作原理 (4)5.1 方式寄存器 (4)5.2 启/停控制寄存器TCON (6)6. 中断控制 (6)6.1 TCON用于中断请求 (6)6.2中断允许寄存器IE (7)7. 系统分析 (7)7.1系统组成 (8)7.2系统工作原理 (8)& 系统硬件设计 (8)8.1系统硬件总体设计 (8)8.2 LED显示模块 (9)8.3扬声器模块 (9)8.4子系统(模块)电路图 (10)8.4.1 共阳极电路图 (10)8.4.2 上位开关 (10)9. 系统软件设计 (10)9.1系统软件总体设计 (10)9.2本系统总体代码 (11)10. 课程设计成果 (15)11. 个人总结 (15)参考文献 (17)一、设计题目:简易电子琴二、设计目的:(1)熟悉单片机的内部结构;(2)掌握C51编程方法;(3)掌握定时器与发声的关系;(4)掌握交流蜂鸣器的发声原理和程序控制方法;(5)掌握串行控制键盘键的识别方法;(6)掌握声音频率的计算方法。
三、主要内容本系统设计制作一个可演奏的电子琴。
综合应用了两项设计(1)能产生纯音,了解音调高低的控制方法。
(2)用键盘代替电子琴的键盘,控制演奏音乐。
(a)掌握串行控制键盘键的识别方法;(b)根据键值控制发声。
(3)至少演奏一支乐曲。
四、音符频率与计数初值对照表:五、定时/计数器原理MCS-51单片机内部有2个16位的可编程定时/计数器,定时/计数器0由计数器THO和TLO组成,定时/计数器1由计数器TH1和TL1 组成,THX 和TLX(X=0,1)分别为两个8位计数器,连接起来可组成16位计数器。
定时/计数器的工作方式由方式控制字TMOD选择,定时/ 计数器的启停由控制寄存器TCON空制,这两个寄存器均属于特殊功能寄存器。
定时/计数器的工作原理图如下:其核心是一个加1计数器,加1计数器的脉冲有两个来源:一个是外部脉冲源,另一个是系统的时钟振荡器。
基于51单片机学习板的简易电子琴__本科毕业设计论文
中国矿业大学徐海学院技能考核培训姓名:申鹏飞学 号: 22120768专业:信息12-2班题目:基于单片机的技能考核专题:简易的电子琴制作,数据收发指导教师:有鹏设计地点:电工电子实验室时间: 2015 年 6 月通信系统综合设计训练任务书学生姓名 申鹏飞 专业年级 信息12-2班 学号 22120768设计日期: 2015 年 6 月 20 日 至 2015 年7 月3日设计题目:设计专题题目:设计主要内容和要求:1. 主要内容:(1)系统硬件设计及说明)系统硬件设计及说明)系统硬件设计及说明(2)系统硬件设计及说明)单片机学习板主要功能介绍(3)单片机学习板主要功能介绍)系统软件设计(4)系统软件设计2. 功能扩展要求(1)2.4GHz射频收发芯片nRF2401及其应用及其应用)简易的电子琴制作的步骤和功能(2)简易的电子琴制作的步骤和功能指导教师签字:摘要:随着电子技术的发展,电子技术与音乐的结合不断加深。
由此而产生的电子琴在这种形势下,因其体积小,易于携带,经济适用,是一般家庭都能承受得了的经济投入。
而且电子琴键盘操作直观易于掌握。
子琴键盘操作直观易于掌握。
这样对初学者,这样对初学者,尤其对识谱的人来说是很容易弹奏的,尤其对识谱的人来说是很容易弹奏的,一首简一首简单的曲子灵感好的人甚至不用很多的练习和教师的指导就能很快的弹奏出来。
这样就强烈地激发了学习者的学习兴趣,迅速地提高了电子琴的普及率。
激发了学习者的学习兴趣,迅速地提高了电子琴的普及率。
关键词:关键词:5151单片机,电子琴单片机,电子琴 ,数据收发,数据收发目录第一章第一章 前言前言 .............................................. 6 1.1 系统开发背景系统开发背景 ...................................... 6 1.2 系统开发意义系统开发意义 ...................................... 6 第二章第二章 设计任务及要求设计任务及要求设计任务及要求 ................................... 7 第三章第三章 系统硬件设计及说明系统硬件设计及说明 ................................ 8 3.1系统组成及总体框图系统组成及总体框图 ................................. 8 第四章第四章 单片机学习板主要功能介绍单片机学习板主要功能介绍 .......................... 9 4.1AT89S52简介简介 ....................................... .......................................9 4.1.1功能特性:功能特性: ................................... 10 4.1.2主要性能主要性能..................................... ..................................... 11 4.1.3管脚说明管脚说明..................................... ..................................... 11 4.2 LED 数码管数码管 ....................................... ....................................... 12 4.3显示电路显示电路 ......................................... ......................................... 13 4.4键盘扫描模块电路图键盘扫描模块电路图 ................................ 13 4.5数码管显示模块电路原理图数码管显示模块电路原理图 .......................... 14 4.6电源模块电路原理图电源模块电路原理图 ............................... 15 第5章 系统软件设计系统软件设计 ..................................... 16 5.1音乐相关知识音乐相关知识...................................... ...................................... 16 5.2如何用单片机实现音乐的节拍如何用单片机实现音乐的节拍 ........................ 16 5.3如何用单片机产生音频脉冲如何用单片机产生音频脉冲 .......................... 16 5.4系统总体功能流程图系统总体功能流程图 (18)第六章2.4GHz 射频收发芯片nRF2401 模块介绍模块介绍 ............... 20 6.1芯片结构芯片结构 ......................................... ......................................... 21 6.2引脚说明引脚说明 ......................................... ......................................... 21 6.3工作模式工作模式 ......................................... .........................................23 6.3.1收发模式收发模式..................................... ..................................... 23 6.3.2直接收发模式直接收发模式 ................................. 24 6.3.3配置模式配置模式..................................... ..................................... 25 6.3.4空闲模式空闲模式..................................... ..................................... 25 6.3.5关机模式关机模式..................................... ..................................... 25 6.4.6.4.器件配置器件配置器件配置 ......................................... 25 6.5.6.5.应用电路应用电路应用电路 ......................................... 26 6.6无线音频系统无线音频系统...................................... ...................................... 27 第七章第七章 51 51单片机与NRF24L01模块融合模块融合 ..................... 28 第八章第八章 收获与总结收获与总结收获与总结 ...................................... 29 第九章第九章 参考文献参考文献 ......................................... 30 附录一附录一.................................................. 31 附录二附录二 .. (42)第一章 前言1.1 1.1 系统开发背景系统开发背景随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。
基于51单片机的电子琴完整版
基于51单片机的电子琴完整版#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit feng = P0^7; // 蜂鸣器uint FTemp;uint code tab[] = { //定时半周期的初始值64021,64103,64260,64400, //低音3 4 5 664524,64580,64684,64777, //低音7,中音1 2 364820,64898,64968,65030, //中音4 5 6 765058,65110,65157,65178}; //高音1 2 3 4//用扫描法读P1 外接4×4 键盘uchar Keyscan(void){uchar i, j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j = 0; j < 4; j++) //循环四次,扫描四行{P1 = Buffer[j]; //在低四位分别输出一个低电平_nop_();temp = 0x80; //计划先读出P1.7位for(i = 0; i < 4; i++) //循环四次,检查四列{if(!(P1& temp)) //从高四位,截取1位{return (i + j * 4); //返回取得的按键值}temp >>= 1; //换右边一位}}return 16; //没有键按下就返回16}void Main(void){uchar Key_Value = 16, Key_Temp1, Key_Temp2;//读出的键值 TMOD = 0x01; //T0定时方式1ET0 = 1; //允许T0中断EX0 = 1; //允许INT0中断EA = 1;//开总中断while(1){TR0 = 0; //T0工作停,暂不发音Key_Temp1 = Keyscan(); //第一次读入按键if(Key_Temp1 != 16){ //有键按下Key_Temp2 = Keyscan(); //再读一次if (Key_Temp1 == Key_Temp2) //两次相等{Key_Value = Key_Temp1; //就确认下来FTemp = tab[Key_Value]; //根据键值,取出定时半周期的初始值TR0 = 1; //启动定时器T0,发音while (Keyscan() < 16); //等待释放feng = 1; //停止发音}}}}//========================================================= =====void T0_INT(void) interrupt 1{TL0 = FTemp; //载入定时半周期的初始值TH0 = FTemp >> 8;feng = ~feng; //发音。
基于51单片机的液晶显示电子琴设计
基于51单片机的液晶显示电子琴设计摘要单片机是一种集成电路芯片,是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口、中断系统和定时器/计数器等集成到一块硅片上构成一个小而完善的微型计算机系统。
单片机具有体积小、功耗低、速度快、控制能力强、扩展灵活和使用方便等优点,已渗透到我们生活的各个领域,广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制的领域。
音乐现在也成了人们生活的一部分,生活的压力,学习的压力,工作的压力,一切的不顺利可以在音乐声中放松下来,让人们心情舒畅,听着音乐放松心情,让我们提高生活质量。
本次课程设计是基于51单片机的简易电子琴系统设计。
电子琴是现代电子科技与音乐结合的产物,是一种键盘乐器。
本系统以STC89C52为主芯片,4*4矩阵键盘、1602液晶显示屏、扬声器等电路组成,完成显示输入信息、播放相应音符等基本功能。
关键词:STC89C52;LCD1602;电子琴系统Design Of Liquid Crystal Display Keyboard Based On51Single-chip MicrocomputerABSTRACTMCU is an integrated circuit chip,is the CPU,RAM,ROM,I/O interface, interrupt system and timer/counter,etc.integrated into a silicon chip to form a small and perfect micro-computer system.SCM has a small size,low power consumption,speed,control,strong,flexible and easy to expand and other advantages,has infiltrated all areas of our lives,widely used in instrumen -tation,household appliances,medical equipment,aerospace,special equipment of the intelligent management and process control areas.Music is now also a part of people's lives,the pressure of life,the pressure of learning,work pressure,everything is not smooth can relax in the music,let people feel comfortable,listening to music relax,let us improve the quality of life.This course design is based on the 51 single-chip simple keyboard system design.Keyboard is a combination of modern electronic technology and music products,is a keyboard instrument.This system is mainly composed of STC89C52 chip, 4*4 matrix keyboard,1602 LCD screen,speaker and other circuits to complete the display input information,play the corresponding notes and other basic functions.Keyword: STC89C52, LCD1602, keyboard system目录第一章引言 ........................................................................................................... - 1 -1.1 课题设计目的及其意义 ......................................................................... - 1 -1.2 课题设计的任务与主要内容 ................................................................. - 2 - 第二章系统总体方案设计.................................................................................. - 3 -2.1 系统设计要求 ......................................................................................... - 3 -2.2 系统电路框图 ......................................................................................... - 3 - 第三章硬件设计.................................................................................................. - 5 -3.1 STC89C52芯片 ....................................................................................... - 5 -3.2 1602LCD .................................................................................................. - 6 -3.3 矩阵键盘 ................................................................................................. - 7 -3.4 振荡电路 ................................................................................................. - 8 -3.5 复位电路 ................................................................................................. - 9 -3.6 扬声器模块 ........................................................................................... - 10 - 第四章软件设计与调试.................................................................................... - 11 -4.1 使用AltiumDesigner绘制电路图........................................................ - 11 -4.2 程序调试 ............................................................................................... - 11 - 第五章总结与致谢............................................................................................ - 13 -5.1 总结 ....................................................................................................... - 13 -5.2 致谢 ....................................................................................................... - 14 - 参考文献................................................................................................................ - 15 - 附录........................................................................................................................ - 17 - 附录A 实物图............................................................................................. - 17 - 附录B 程序代码......................................................................................... - 18 -第一章引言1.1 课题设计目的及其意义单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。
51单片机c语言编写电子琴+音乐播放器
此程序是51单片机c语言编写的电子琴+音乐播放器,当用杜邦线将P1^0管脚接地时,单片机就会放出《世上只有妈妈好》,将P1^1 管脚接地时单片机就播放《祝你生日快乐》,两者为高电平时进入电子钢琴模式,利用16个矩阵键盘发出相应的哆、瑞、米、发、索。
此文档的乐谱是借鉴别人的,因为本人是音乐白痴!这是我第一次发表,我希望能帮到有需要的人啦........#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit beep=P2^3; //定义蜂鸣器sbit music=P1^0; //music为低电平播放《世上只有妈妈好》(工作模式为音乐播放器),music1为低电平时播放祝你生日快乐,music、music1都为高电平时(工作模式为电子钢琴)sbit music1=P1^1;uchar timer0h,timer0l,time,key,flag; //flag==0时为电子钢琴模式,flag==1时为音乐播放器uchar code yuepu[]={ 6,2,3,5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4,3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1,6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 }; //世上只有妈妈好乐谱uchar code yuepu1[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};//祝你生日快乐乐谱uchar code TH_0[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, // 28个音阶高八位频率表装进定时器高八位0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;uchar code TL_0[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, // 28个音阶低八位频率表装进定时器低八位0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};void delay(uchar t){uchar t1;unsigned long t2;for(t1=0;t1<t;t1++) //延时半拍函数,控制音乐节奏{for(t2=0;t2<8000;t2++){ ; }}}void song(){TH0=timer0h;TL0=timer0l; // 唱歌程序TR0=1;delay(time); //延时,让此音节播放的长短TR0=0; //关定时器,为下个音节响做准备}void delayms(uint x){uint i,j; //去抖延时for(i=x;i>0;i--)for(j=110;j>0;j--);}void keyscan() //检测十六个发出音乐按键函数{ uchar temp;P3=0xfe;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10); //检测第一行按键temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee: key=0;break;case 0xde: key=1;break;case 0xbe: key=2;break;case 0x7e: key=3;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1;//使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfd;temp=P3;temp=0xf0&temp;if(temp!=0x0f) // 检测第二行按键{ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed: key=4;break;case 0xdd: key=5;break;case 0xbd: key=6;break;case 0x7d: key=7;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xfb;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb: key=8;break;case 0xdb: key=9;break;case 0xbb: key=10;break;case 0x7b: key=11;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}P3=0xf7;temp=P3;temp=0xf0&temp;if(temp!=0x0f){ delayms(10);temp=P3 ;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7: key=12;break;case 0xd7: key=13;break;case 0xb7: key=14;break;case 0x77: key=15;break;}TH0=TH_0[key]; //将按下的键对应发出此频率声音的初值装入TL0=TL_0[key];TR0=1; //打开定时器0while(temp!=0xf0) //一直按下就一直发声{temp=P3;temp=temp&0xf0;}TR0=0; //松手时关闭定时器0,不能发声beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开}}}void main(){uchar k,i;TMOD=1;EA=1;ET0=1;while(1){if(music&&music1) //当两个都为高电平时没有放音乐,扫描键盘{ flag=0;keyscan();}if(!music) //当P1^0管脚为低电平时,播放《世上只有妈妈好》{ flag=1;i=0;while(i<100) //音乐数组长度,唱完从头再来{if(music) //在播放音乐时P1^0为高电平时退出播放此歌曲{ beep=1; //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开break;}k=yuepu[i]+7*yuepu[i+1]-1;timer0h=TH_0[k]; // 把对应的音乐频率放进定时器0timer0l=TL_0[k];time=yuepu[i+2]; //音乐节拍i+=3;song();}}if(!music1) // music为低电平时,播放《祝你生日快乐》{ flag=1;i=0;while(i<75) //乐谱的长度{if(music1){beep=1;break;}k=yuepu1[i]+7*yuepu1[i+1]-1;timer0h=TH_0[k];timer0l=TL_0[k];time=yuepu1[i+2];i+=3;song();}}}}void time0() interrupt 1{if(flag==0){beep=!beep; //电子琴模式时进入此语句TH0=TH_0[key];TL0=TL_0[key];}else{ beep=!beep;TH0=timer0h; //音乐播放器模式进入此语句TL0=timer0l;}}。
基于51单片机的电子琴设计课程设计
基于51单片机的电子琴设计课程设计单片机原理》课程设计前言本课程设计旨在通过基于51单片机的电子琴设计,加深学生对单片机原理的理解和应用。
在本设计中,我们将介绍电子琴的设计要求、所用设备及软件以及总体设计方案。
随后,我们将详细介绍系统硬件设计中琴键控制电路、音频功放电路、时钟-复位电路和LED显示电路的设计。
第1章基于51单片机的电子琴设计1.1 电子琴的设计要求在电子琴的设计中,我们需要考虑琴键数量、音频输出质量、电源电压和外部接口等因素。
在本设计中,我们将采用25个琴键,保证音频输出质量和电源电压稳定,并提供外部接口以便于扩展和调试。
1.2 电子琴设计所用设备及软件在本设计中,我们将使用51单片机、琴键、音频功放、时钟、LED显示器等设备,并使用Keil C51编译器进行软件开发。
1.3 总体设计方案在总体设计方案中,我们将采用按键扫描方式实现琴键控制,使用PWM技术实现音频输出,使用外部晶振提供时钟信号,并使用LED显示器显示琴键状态。
第2章系统硬件设计2.1 琴键控制电路在琴键控制电路中,我们将采用矩阵按键扫描方式,通过51单片机的IO口进行扫描和检测。
同时,我们还将使用电容式触摸开关来实现琴键的触发。
2.2 音频功放电路在音频功放电路中,我们将采用TDA7297芯片作为功放,通过PWM技术实现音频输出,并通过滤波电路滤除杂音和谐波。
2.3 时钟-复位电路在时钟-复位电路中,我们将采用12MHz晶振作为时钟源,并使用复位电路确保系统在上电时能够正确运行。
2.4 LED显示电路在LED显示电路中,我们将采用MAX7219芯片实现LED点阵显示,并通过SPI接口与51单片机进行通信。
同时,我们还将使用CD4511芯片实现数码管显示琴键状态。
通过本课程设计,我们可以深入理解单片机原理的应用,掌握电子琴的设计和制作技术,提高自身的实践能力和创新能力。
2.5 整体电路本章将介绍电子琴的整体电路设计。
基于51单片机的简易电子琴设计
基于51单片机的简易电子琴设计一、设计任务及要求1、在该简易电子琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do 8个音阶。
2、设计三个拨码开关,三个拨码开关可以调节高音、中音、低音三个音调。
3、画出电路的总体方框图和电路原理图。
二、设计原理音乐由许多不同的音阶组成的,而每个音阶对应着不同的频率,这样,我们就可以利用不同的频率组合,构成我们想要的音乐。
简易电子琴是摁下拨码开关时,单片机AT89C51会发出声音,声音从端口经过LM386,经过放大以后传入喇叭。
声音主要是经过单片机4×4矩阵键盘的按键产生,这里只用到8个按键来产生高中低的8个音阶,来产生do re mi fa sol la si Do。
下面是计数初值:#6LA# 466 1072 64463 高3MI 1318 372 65157低7SI 494 1012 64524 高4FA 1397 358 65178中1DO 523 0956 64580 #4FA# 1480 338 65198#1DO# 554 0903 64633 高5SO 1568 319 65217中2RE 578 0842 64684 #5SO# 1661 292 65235#2RE# 622 0804 64732 高6LA 1760 284 65252中3MI 659 0759 64777 #6LA# 1865 268 65268中4FA 698 0716 64820 高7SI 1976 253 65283 三、设计方案本次设计的电子琴主要是利用AT89C51单片机为核心控制元件,同时还包括键盘、拨码开关和扬声器等控制模块,由键盘选择八个音阶。
1、电路原理图的总体设计总体电路需要c51单片机一片,音乐按键及喇叭等外围电路,要进行音调控制和音频放大,设计好的电路图如下图所示:2、键盘控制模块的设计矩阵按键部分由8个轻触按键按照2行4列排列,连接到P3端口。
基于51单片机的电子琴设计
基于51单片机的电子琴设计随着科技的不断发展,单片机技术已经成为了现代电子设备中的重要组成部分。
51单片机作为一种广泛应用的单片机系列,具有高性能、低功耗、高集成度等特点,被广泛应用于各种嵌入式系统开发中。
本文将介绍一种基于51单片机的电子琴设计。
一、系统硬件设计1、单片机选择本设计选用AT89C51单片机作为主控制器,AT89C51是一种低功耗、高性能的8位单片机,具有4K字节的可编程存储器和128字节的RAM,同时具有丰富的外设接口,如UART、SPI、I2C等。
2、电子琴设计电子琴采用8×8 LED点阵作为输出设备,通过单片机控制点阵的亮灭状态来展示音乐波形。
具体实现方式是将音频信号通过一个运放放大器放大,然后将其输入到LED点阵中,通过控制点阵的亮灭状态来展示音乐的波形。
3、存储模块设计为了实现电子琴曲目的存储和播放,本设计选用了一块AT24C02 EEPROM芯片作为存储设备。
AT24C02是一种串行E2PROM存储器,容量为256字节,可以通过I2C总线与单片机进行通信。
将曲目信息存储在AT24C02中,可以实现曲目的存储和播放功能。
4、按键模块设计本设计采用4×4矩阵键盘作为输入设备,通过扫描按键状态来实现音符的选择和节奏控制。
矩阵键盘的行线连接到单片机的P1口,列线连接到P2口,通过检测行列组合的变化来确定按下的键位。
二、系统软件设计1、音符解码本设计采用MIDI音符编码方式来存储和播放曲目信息。
在解码过程中,根据音符的频率和持续时间计算出对应的音高和节奏信息,然后将其用于驱动电子琴的输出设备展示音乐的波形。
2、演奏控制为了实现节奏控制,本设计采用了一种基于时间间隔的演奏方式。
在演奏过程中,单片机根据设定的节奏间隔时间来触发音符输出,从而实现对节奏的控制。
同时,为了实现曲目的停止和播放功能,我们需要在软件中加入相应的控制逻辑。
3、存储和播放在软件设计中,我们需要实现将曲目信息存储到AT24C02中以及从AT24C02中读取曲目信息的功能。
基于51单片机的简易电子琴汇编程序实验报告
单片机应用课程设计报告——简易电子琴电子信息科学与技术2013-2xxx单片机应用课程设计报告——简易电子琴xxx摘要本设计是一个基于AT89C52系列单片机的简易电子琴,通过硬件电路制作以及软件编译,设计制作出一个由按键电路、复位电路、数码管显示电路,定时器及蜂鸣器组成简易的电子琴。
通过键盘按键确定键号送去显示以及产生对应的频率的方波。
本次实验的难点是键盘的扫描程序设计,因为本次实验实用的键盘是通过P3.4-P3.7端口输入测试信号,从P3.0-P3.3端口进行检测的,涉及到端口的读入写出原理等问题,后来通过先送出F0数值使低四位处于读入状态,高四位处于输出状态等方法实现。
还有一个问题是如何使单片机产生确定频率的波形,后来利用定时器计时结束后的溢出信号,控制信号反转实现。
关键词:电子琴扫描式键盘数码管1、设计任务和要求1.1设计任务利用AT89C52单片机以及各种元器件自行设计编程制作一个简易电子琴。
1.2任务要求基本要求:利用查询式键盘,数字键1、2、3、4、5、6、7作为电子琴的按键,按键按下时发出Do、Re、Mi、Fa、So、La、Xi的声音。
在弹奏音乐的同时将音符显示在数码管上。
扩展要求:具备存储播放所弹奏的音乐的功能,用三个功能键进行切换状态:按一下按键控制是否进入存储状态。
;按键二控制是否进入演奏状态;按键三为复位键。
1.3方案论证(1)如何产生一定频率的方波信号首先我们知道,每一个音符都有一个固定的频率,当蜂鸣器根据不同频率的方波信号便会震动产生对应的音符。
其次要产生音频脉冲,只要算出某一音频的周期(1/f),然后将此周期除以2,即为半周期的时间,由于使用的是12MHz的晶振,所以每一个计数的脉冲长度为1us,脉冲的个数用半周期时间除以1us,用65536减去脉冲的个数便可以得到计数初值。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} P3=0xff; P37=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--);
temp=P3; temp=temp & 0x0f; if(temp!=0x0f) {
temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e:
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xF3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
key=8; break; case 0x0d: key=9; break; case 0x0b: key=10; break; case 0x07: key=11; break; } speaker=~speaker; STH1=tab[key]/256; STL1=tab[key]%256; TR0=1; temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } TR0=0; }
temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e:
key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; } speaker=~speaker; STH1=tab[key]/256; STL1=tab[key]%256; TR0=1; temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; }
} void timer0(void) interrupt 1 using 0 { if(sw==1)
{ TH0=STH1; TL0=STL1;} else { TH0=STH0; TL0=STL0;} speaker=!speaker; } void delay(unsigned char t) { unsigned char t1; unsigned long t2; for(t1=0;t1<t;t1++) { for(t2=0;t2<8000;t2++) { ; } } TR0=0; } void song() { TH0=STH0; TL0=STL0; TR0=1; delay(time); } void music(void) { m=0; time=1; sw=1; while(time&&sw==0) { if(sw) {i=0;continue;} else {
51单片机简易电子琴程序
2009-04-16 19:59
感谢网上的诸多前辈,小弟我将这个程序写了出来。这个简易电子琴应用了4*4矩阵键盘,每
一个按键赋予了不同的音调,共计有两个八度。并预存了一首乐曲《世上只有妈妈好》。(附
有 protues 仿真图)
#include<reg51.h>
#define uchar unsigned char
k=sszymmh[m]+7*sszymmh[m+1]-1; STH0=FREQH[k]; STL0=FREQL[k]; time=sszymmh[m+2]; m=m+3; song(); } } } void main() { TMOD=0x01; ET0=1; EA=1; while(1) { if(sw==1)key_music(); else music(); } }
5,2,1,
3,2,1, 2,2,4,
2,2,3, 3,2,1, 5,2,2,
5,2,1,
6,2,1,
3,2,2, 2,2,2,
1,2,4, 5,2,3, 3,2,1,
2,2,1,
1,2,1,
6,1,1, 1,2,1,
5,1,6, 0,0,0
};
// 音阶频率表 高八位
code unsigned char FREQH[]={
#define uint unsigned int
uint key,i,j,time,m,k;
uchar temp;
uchar STH0,STL0,STH1,STL1;
sbit sw=P2^7;
sbit speaker=P2^4;
sbit P37=P3^7;
sbit P36=P3^6;
sbit P35=P3^5;
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
unsigned int code tab[]={64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178};
} } P3=0xff; P36=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--);
temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e:
TR0=0; } } P3=0xff; P35=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--)
for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e:
void key_music() {
P3=0xff; P34=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--);
temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } speaker=~speaker; STH1=tab[key]/256; STL1=tab[key]%256; TR0=1; temp=P3; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } TR0=0;
sbit P34=P3^4;
//世上只有妈妈好数据表
code unsigned char sszymmh[]={ 6,2,3,
5,2,1,
3,2,2, 5,2,2, 1,3,2,
6,2,1, 5,2,1,
6,2,4,
3,2,2,
5,2,1, 6,2,1,
5,2,2, 3,2,2, 1,2,1,
6,1,1,
};
// 音阶频率表 低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,