51单片机简易电子琴

合集下载

51单片机简易电子琴

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单片机的简单电子琴代码

基于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单片机设计电子琴报告含代码

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指令系统及引脚。

简易电子琴设计方案51单片机

简易电子琴设计方案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单片机的简易电子琴设计

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

基于51单⽚机的简易电⼦琴设计基于51单⽚机的简易电⼦琴设计⼀、设计任务及要求1、在该简易电⼦琴设计中,设置8个按键,8个按键可以发出do、re、mi、fa、sol、la、si、Do 8个⾳阶。

2、设计三个拨码开关,三个拨码开关可以调节⾼⾳、中⾳、低⾳三个⾳调。

3、画出电路的总体⽅框图和电路原理图。

⼆、设计原理⾳乐由许多不同的⾳阶组成的,⽽每个⾳阶对应着不同的频率,这样,我们就可以利⽤不同的频率组合,构成我们想要的⾳乐。

简易电⼦琴是摁下拨码开关时,单⽚机AT89C51会发出声⾳,声⾳从P1.0端⼝经过LM386,经过放⼤以后传⼊喇叭。

声⾳主要是经过单⽚机4×4矩阵键盘的按键产⽣,这⾥只⽤到8个按键来产⽣⾼中低的8个⾳阶,来产⽣do re mi fa sol la si Do。

下⾯是计数初值:三、设计⽅案本次设计的电⼦琴主要是利⽤AT89C51单⽚机为核⼼控制元件,同时还包括键盘、拨码开关和扬声器等控制模块,由键盘选择⼋个⾳阶。

1、电路原理图的总体设计总体电路需要c51单⽚机⼀⽚,⾳乐按键及喇叭等外围电路,要进⾏⾳调控制和⾳频放⼤,设计好的电路图如下图所⽰:2、键盘控制模块的设计矩阵按键部分由8个轻触按键按照2⾏4列排列,连接到P3端⼝。

将⾏线所接的单⽚机的I/O⼝作为输出端,⽽列线所接的I/O,则作为输⼊。

⾏线输出是低电平,有健按下,则输⼊线就会被拉低,这样,通过读输⼊线的状态就可得知是否有键按下。

3、键盘消抖当⽤⼿按下⼀个键时,如图所⽰,往往按键在闭合位置和断开位置之间跳⼏下才稳定到闭合状态的情况;在释放⼀个键时,也回会出现类似的情况。

这就是抖动。

抖动的持续时间随键盘材料和操作员⽽异,不过通常总是不⼤于10ms。

⽤软件⽅法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,此后再读⼊键盘码。

⼀个单⽚机⼯作于12M晶振,它的时钟周期是1/12(微秒)。

它的⼀个机器周期是12*(1/12)也就是1微秒。

51单片机电子琴,支持弹奏14音、播放21音、支持重放弹奏曲目、支持节拍显示和音调显示

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--)继续阅读。

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

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

目录摘要 (3)Abstract (3)1绪论 (4)1.1背景 (4)1.2目的 (4)1.3 意义 (4)1.4基本理论依据和主要工作内容 (4)2 设计方案简述 (6)2.1键盘模块 (6)2.2发声模块 (6)2.3 8X8点阵显示模块 (6)2.4系统技术指标和预期功能 (7)3 详细设计 (8)3.1主要IC芯片介绍 (8)3.2硬件设计 (11)4 设计结果及分析 (19)4.1 测试 (19)5总结 (20)参考文献 (21)附录主要程序代码 (22)摘要单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。

本设计阐述的主要内容是一种基于51 单片机的电子琴的设计,其核心芯片AT89S52 单片机,内部电路包括4X4行列式键盘模块、音频放大模块和8X8LED点阵显示模块,本系统运行稳定,功能较为完善,控制系统可靠,性价比较高等,具有一定的实用价值。

对于那些需要显示的信息量不是很大,分辨率不是很高,又需要制造成本相对比较低的场合,使用大、小屏幕LED点阵显示器是比较经济适用的,他可以显示字符、数字和简单图形,显示亮度较高,并且对环境条件要求比较低。

电子乐器的结构较为复杂,音源是由晶体管产生的电振动,并通过音色回路而产生各种音色;同时由周波数调制产生颤音效果,由振幅调制产生各种乐器的音效。

关键词:AT89S52单片机;音频放大模块;8X8点阵AbstractIts applications have become increasingly close to life, with a single chip to achieve a number of electronic design is becoming simpler. The main elements of the design described is based on 51 single-chip, the flower design, the core chip AT89S52 microcontroller Internal circuit including the 4X4 determinant keyboard module, audio amplifier module and 8X8LED dot matrix display module, the system is stable, function better, control system reliability, higher cost and so on, has some practical value. For those who need to display the amount of information is small, resolution is not high, they need to make the occasion a relatively low cost, using large and small screen, LED dot matrix display is more economical, and he can display characters, numbers and simple graphics, display brightness higher and lower demands on the environmental conditions. : The structure of more complex electronic instruments, the source is generated by the transistor electrical vibration, and sound loops generated by a variety of tone; also modulated by the frequency to produce vibrato effects, generated by the amplitude modulated sounds of various instruments.Keywords:AT89S52 Microcontroller;Audio Amplifier Module;8X8 matrix1绪论1.1背景单片机是随着大规模集成电路的出现极其发展,将计算机的CPU,RAM,ROM,定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,因此单片机早期的含义称为单片微型计算机(single chipmicrocomputer).它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果。

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

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

摘要本设计主要研究基于AT89C52单片机的简易电子琴设计。

它是以AT89C52单片机作为主控核心,设置键盘、蜂鸣器等外围器件;另外还用到一些简单器件如:两位数码管,和NPN型三极管及电阻等。

利用按键实现音符和音调的输入;四位的数码管进行被操作的按键显示;用NPN型三极管8550实现低音频功率放大。

本设计硬件部分主要由最小系统,按键系统模块、数码管显示模块和蜂鸣器模块组成。

其软件部分主要有主程序模块、定时中断程序、定时计数程序、显示程序。

(1)最小系统:它是单片机应用系统的设计基础。

它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。

(2)按键系统模块:本设计采用10个按键,其中7个按键用来显示7个音调,其它3个按键可以进行高低中音的切换。

(3)数码管显示模块:SM段选端接在单片机的P0口,四个位选端分别接在P2.0、P2.1、P2.2和P2.3。

(4)蜂鸣器模块:此电子琴发音电路是通过三极管驱动蜂鸣器发音,经过上拉电阻提高驱动能力。

本次设计首先对单片机设计简易电子琴仔细分析,接着制作硬件电路,购买电子器件进行焊接,之后编写软件的程序,最后进行软硬件的调试运行。

并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。

利用单片机产生不同频率来获得我们要求的音阶,实现高、中、低共21个音符的发音和显示。

基于单片机设计的简易电子琴,系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比高等,具有一定的使用和参考价值。

目录1.概述 .................................................................................................................... 错误!未定义书签。

1.1设计背景...................................... 错误!未定义书签。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机简易电子琴设计院系;电气信息工程学院班级;10通信工程三班*****指导老师:设计周数:一周一设计题目:设计一简易电子琴,要求能够发出1、2、3、4、5、6、7等七个音符。

使用元件:AT89C51、LM324,喇叭,按键等二设计目的(1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。

(2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。

(3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。

(4)对软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

三设计思路在本次课程设计中,根据复杂程序设计思想——模块化程序设计,分析和确定程序总体设计目标:电子琴基本功能及部分扩展功能后,将总体目标划分为若干模块(子程序,具体可见下)。

程序设计的思路按以下顺序进行:1.分析与确定程序总体设计目标2.将总体目标划分为若干模块3.定义每个模块的具体任务,明确它与其他模块间的通信方式4.编写源程序,进行调试四、设计原理、思路及流程图设计原理(1)对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。

给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波。

对于音乐,每个音阶都有确定的频率。

各音阶标称频率值:(2)由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

原理:系统硬件图流程图: 。

本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T= 216--5﹡105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值,:五实验源程序方案一:产生按键音符ORG 0000HLJMP MAINORG 000BHLJMP BREAKMAIN: MOV TMOD,#01H ;设置定时器0的工作方式SETB EASETB ET0 ; 设置定时器0中断SETB TR0 ; 启动定时器0WAIT1: LCALL KEY ; 调用KEY子程序,判断有键按下否?第几个键?CLR EA ;屏蔽中断CJNE R3,#00H,WAIT1 ;如果R3=0,表示有键按下MOV A,22H ;将22H里存放的按键号送给ARL A ; 因为查表里都是字,所以得乘2查得数据MOV DPTR,#TABLE ;指向表头MOVC A,@A+DPTR ; 查表MOV TH0,A ;将数据高位送TH0MOV 21H,A ; 将高位备份MOV A,22H ;将22H里存放的按键号送给ARL A ;因为查表里都是字,所以得乘2查得数据INC A ;取低位数据MOVC A,@A+DPTRMOV TL0,AMOV 20H,AWAIT2: LCALL KEYSETB EACJNE R3,#00H,WAIT1JMP W AIT2KEY: MOV R3,#00H ; KEY子程序,判断有键按下否?第几个键?MOV R1,#0FFHMOV R0,#00HMOV A,R1MOV P2,AMOV A,P2CLR CCPL C ;利用标志位CY来判断是哪个键按下MOV R2,#08HWAIT3: RLC A ;移位判断JNC STOREINC R0DJNZ R2,W AIT3STORE: MOV 22H,R0 ; 将按键号存22H,R3=0有键按下MOV R3,#00HRETBREAK: PUSH ACC ; 中断产生方波,从P1.0口输出PUSH PSWMOV TL0,20HMOV TH0,21HCPL P1.0POP PSWPOP ACCRETITABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1 END方案二:产生按键音符ORG 0000HSJMP STARTORG 000BHAJMP INT_0ORG 0030HSTART: MOV P1,#00HSETB EASETB ET0 ;计数器0MOV TMOD,#02HMOV TH1,#09CHMOV TL1,#09CH ;定时器初植CLR TR0 ;定时器不允许SCAN: ;键盘扫描MOV A,P2 ;判断键盘按下,跳到SCAN_1,若未按,继续扫描CJNE A,#0FFH,SCAN_1NOPSJMP SCANSCAN_1:ACALL DELAY ;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下?MOV A,P2CJNE A,#0FFH,SU_KEYNOPSJMP SCANSU_KEY:JNB P2.1,MU_1 ;判断是哪个键按下?JNB P2.2,MU_2JNB P2.3,MU_3JNB P2.4,MU_4JNB P2.5,MU_5JNB P2.6,MU_6JNB P2.7,MU_7SJMP SCAN;R1信号周期MU_1: MOV R1,#19 ;如果第一个按键按下,则R1=19,同时程序转NEXT SJMP NEXTMU_2: MOV R1,#17SJMP NEXTMU_3: MOV R1,#15SJMP NEXTMU_4: MOV R1,#14SJMP NEXTMU_5: MOV R1,#13SJMP NEXTMU_6: MOV R1,#11SJMP NEXTMU_7: MOV R1,#10SJMP NEXTNEXT: MOV A,R1MOV R0,ASETB TR0 ;启动定时器0NEXT_1:MOV A,P2 ; 没键按下继续执行,有键按下,返回读引脚CJNE A,#0FFH,NEXT_1ACALL DELAYMOV A,P2 ;真的没键按下?CJNE A,#0FFH,NEXT_1CLR TR0 ;不响AJMP SCAN ;扫描键盘去INT_0: ;中断程序DJNZ R0,RE ;R0不等于0时,返回CPL P1.0MOV A,R1MOV R0,ARE: RETIDELAY:MOV R7,#100 ;延长时间等待,键盘消抖D1: MOV R6,#10D2: DJNZ R6,D2DJNZ R7,D1RETEND生日快乐歌:(扩展功能部分程序)ORG 0000HJMP MAINORG 000BHJMP TT0MAIN: MOV TMOD,#01H ;设置定时器0工作方式MOV IE,#82H ;设置中断MAIN0:MOV 30H,#00HNEXT: MOV A,30HMOV DPTR,#TABLE ;查表MOVC A,@A+DPTRMOV R2,AJZ STOPANL A,0FHMOV R5,AMOV A,R2SW AP AANL A,#0FHJNZ SINGCLR TR0JMP W1SING: DEC AMOV 22H,ARL AMOV DPTR,#TABLE1 ;查表MOVC A,@A+DPTRMOV TH0,AMOV 21H,AMOV A,22HRL AINC AMOVC A,@A+DPTRMOV TL0,AMOV 20H,ASETB TR0W1: CALL DELAYINC 30HJMP NEXTSTOP: CLR TR0JMP MAIN0TT0: PUSH ACC ;中断服务程序PUSH PSWMOV TL0,20HMOV TH0,21HCPL P1.0POP PSWPOP ACCRETIDELAY:MOV R7,#2 ;延时187msW2: MOV R4,#187W3: MOV R3,#248DJNZ R3,$DJNZ R4,W3DJNZ R7,W2DJNZ R5,DELAYRETTABLE1:DW 64260,64400,64524,64580 ;音符计数植DW 64684,64777,64820,64898DW 64968,65030,65058,65110DW 65157,65178,65217TABLE:DB 82H,01H,81H,94H,84H ;节拍表DB 0B4H,0A4H,04HDB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04HDB 82H,01H,81H,0F4H,0D4HDB 0B4H,0A4H,94HDB 0E2H,01H,0E1H,0D4H,0B4HDB 0C4H,0B4H,04HDB 82H,01H,81H,94H,84HDB 0B4H,0A4H,04HDB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04HDB 82H,01H,81H,0F4H,0D4HDB 0B4H,0A4H,94HDB 0E2H,01H,0E1H,0D4H,0B4HDB 0C4H,0B4H,04HDB 00HEND六、实验总结:经过这个课程设计,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西,也真正体会到做电子设计行业工作的辛苦,不过自己收获还是挺大的。

这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。

经过短短一周的课程设计,我认识到,课程设计能真正让人学到实际应用的东西的一门课程。

收获比上几星期课还多。

首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。

在把课程要求实现到实际中来的过程中,首先必须清楚明白地了解几个参考程序的每一行的意思,这就需要敢于静心钻研。

为了把使得程序更加完整,就必须进行创新,这就需要敢于创新。

其次,通过课程设计,让我在课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。

为了了解键盘,查找了不少单片机的资料,了解了键盘的初始化,存取缓存,扫描键盘,读取键码以及键码和显示码之间的转换。

为了实现基本功能,认真研究了参考程序的意义,了解了电子琴的不同音阶放音功能的实现,长短音的实现,更深入了解了单片机的使用方法。

编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。

调试程序中,学习了DEBUG 的使用,DEBUG对检查程序的错误作用很大。

相关文档
最新文档