单片机的电子琴汇编程序

合集下载

51单片机电子琴程序

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

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

单片机电子琴方案

单片机电子琴方案

方案设计1电子琴设计框图图1电子琴设计框图2 总体设计2.1 硬件部分采用AT89S52 单片机作为主控制部件,AT89S52 用上电自动复位,12MHZ 的晶振和两个电容形成晶振电路。

面键,用于输入音符。

2.2 软件部分软件部分采用汇编语言编写程序,单片机汇编语言程序设计步骤如下:第一步:分析问题。

第二步:画出程序的基本轮廓。

第三步:实现该程序。

2.3 软硬件调试使用KEIL 软件,将程序输入进行编译,编译通过后,则将制作的电路进行联机仿真,检测功能和设计任务能不能实现。

如果不能达到预期效果,则必须重新检查硬件或修改程序。

2.4 程序固化经过调试,实现了预期的成果和功能,就可以开始程序固化了。

将程序烧录到 AT89S52 内部ROM 中,然后将单片机放入到电路中,再进行观察。

一.相关技术简介用电子琴可以演奏出各种美妙的音乐,而音乐是有音符组成的。

不同的音符是由相应频率的振动产生不同频率的声音电信号经扬声器发音后,人耳所听到的便是不同的声音,换言之,只要向扬声器中输入不同频率的电信号就可以产生不同的声音。

若将不同的音节于不同的节拍组合在一起便形成一定的曲调,因此一个单片机I/O口,通过软件,控制其输出不同频率的信号,就可以产生8个基本音节,将音节以一定的节拍进行组合,便可以产生歌曲。

乐曲中每一音符对应着确定的频率,表1 给出C 调时各音符频率。

如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符。

二.硬件设计1. AT89S52单片机图2 AT89S52单片机<1)简介AT89S52 是一种低功耗、高性能 CMOS8 位微控制器,具有8K 在系统可编程 Flash 存储器。

使用 Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

单片机课程设计电子琴 (汇编语言)

单片机课程设计电子琴 (汇编语言)

目录1. 引言 (1)1.1. 设计的目的 (1)1.2. 设计的内容与要求...................................错误!未定义书签。

2. 总体设计 (1)2.1. 音乐产生原理 (1)2.2. 设计流程 (3)3. 硬件设计 (8)3.1. AT89C51芯片简介 (8)3.1.1 主要特性 (8)3.1.2 功能描述 (8)3.1.3 引脚说明与硬件连接 (9)3.2. 元器件清单 (13)4. 系统工作说明 (13)5. 结束语 (14)5.1 收获与体会 (14)5.2 遇到的问题与解决方法 (15)5.3 教程建议 (15)6.参考文献 (15)7. 附录 (16)1. 引言1.1 设计的目的本设计的主要目的是掌握单片机系统的开发应用,掌握prteus和keil C51软件的应用,巩固和加深已学过的知识,提高动手能力及解决实际问题的能力,同时培养团队合作精神。

1.2. 设计内容与要求(1)本设计以AT89C52单片机为核心控制元件设计一个电子琴,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个弹奏按键、1个播放按键和扬声器,并且按下时按键发声,松开延时一段时间停止,中间再按别的键则发另一音调的声音。

16个按键设置成4x4矩阵键盘,能弹奏出 16个音,添加歌曲程序同时能够播放出歌曲。

(2)利用软件 keil C51进行程序的调试。

(3)利用proteus软件画电路图,并在单片机加载程序进行仿真。

(4)根据电路图运用proteus软件的布局和布线功能绘制PCB图并输出显示电路的3D图。

(5)根据电路图、PCB图和3D图快速地焊接电路。

(6)下载程序代码,调试(Easy 51Pro)。

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

北邮小学期单片机电子琴汇编代码

北邮小学期单片机电子琴汇编代码
CALL M22
BTFSS PORTB,3
CALL Fa22
btfsc porte,1
bsf porte,0
GOTO start2 ;循环执行此子程序
So02 btfss porte,1
bcf porte,0
movlw b'00100111'
movwf PORTC
bcf PORTC,0
bcf intcon,2
movlw time
movwf tmr0
call test
movlw b'01111111'
movwf PORTD
BTFSS PORTB,0
CALL So02
BTFSS PORTB,1
CALL La02
BTFSS PORTB,2
movlw b'11011111'
movwf PORTD
BTFSS PORTB,0
CALL So12
BTFSS PORTB,1
CALL So112
BTFSS PORTB,2
GOTO start2 ;检测是否跳转到另一个子程序
movlw b'01111111'
movwf PORTD
BTFSS PORTB,0
CALL So0
bcf PORTA,5
movwf option_reg
bcf status,rp0
clrf PORTC
bsf porte,0 ;对各端口的初始化设置
start1 BTFSC PORTB,5 ;电子音子程序开始
CALL Fa2
bcf PORTA,5 ;检测RD4这一行有无按键按下并调用相应发音子程序

51单片机16键电子琴汇编程序

KEYL EQU 30H ; 定义KEYL变量,用于键盘扫描KEYR EQU 31H ; 定义KEYR变量,用于键盘扫描VAL EQU 32H ; 定义键值变量VALORG 00HJMP START ; 主程序入口ORG 0BHJMP INT_T0 ; Timer 0中断入口START:MOV TMOD,#01H ; Timer 0作定时器,模式1LSCAN: ; 键盘按键判断MOV P2,#0F0H ; 列全为1L1: ; 判断第1行JNB P2.0,L2CALL DELAYJNB P2.0,L2MOV KEYL,#00HJMP RSCANL2: ; 判断第2行JNB P2.1,L3CALL DELAYJNB P2.1,L3MOV KEYL,#01HJMP RSCANL3: ; 判断第3行JNB P2.2,L4CALL DELAYJNB P2.2,L4MOV KEYL,#02HJMP RSCANL4: ; 判断第4行JNB P2.3,L1CALL DELAYJNB P2.3,L1MOV KEYL,#03HRSCAN:MOV P2,#0FH ; 键盘行输出1C1: ; 判断第1列JNB P2.4,C2MOV KEYR,#00HJMP CALCUC2: ; 判断第2列JNB P2.5,C3MOV KEYR,#01HJMP CALCUC3: ; 判断第3列JNB P2.6,C4MOV KEYR,#02HJMP CALCUC4: ; 判断第4列JNB P2.7,C1MOV KEYR,#03HCALCU: ; 计算按键号MOV A,KEYLMOV B,#04HMUL ABADD A,KEYRMOV VAL,AMOV DPTR,#TABLE ; 装表MOV B,#2MUL ABMOV R1,AMOVC A,@A+DPTR ; 把表中计数初始值装入累加器AMOV TH0,AINC R1MOV A,R1MOVC A,@A+DPTRMOV TL0,AMOV IE,#82H ; 使能Timer 0中断SETB TR0 ; 启动TimerW0: ; 等待按键释放MOV A,P2CJNE A,#0FH,W1CLR TR0 ; TRO清0JMP LSCANW1:MOV A,P2CJNE A,#0F0H,W2MOV P0,#00HCLR TR0JMP LSCANW2:JMP W0;Timer 0中断服务程序,输出某一频率的方波.INT_T0:MOV DPTR,#TABLEMOV A,VALMOV B,#2MUL ABMOV R1,AMOVC A,@A+DPTRMOV TH0,AINC R1MOV A,R1MOVC A,@A+DPTRMOV TL0,ACPL P1.0 ; 清P1.0口RETIDELAY:MOV R6,#10D1:MOV R7,#250DJNZ R7,$DJNZ R6,D1RETTABLE: ; 16个琴键发音频率的计数初始值DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178END。

单片机制作电子琴源程序

#include "ht66f018.h"//同一首歌unsigned char const Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,0x00,0x00 };//两只蝴蝶unsigned char const Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,0x19,0x03,0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,0x10,0x03, 0x15,0x00, 0x00,0x00 };//挥着翅膀的女孩unsigned char const Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,0x1F,0x03,0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,0x18,0x02,0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};unsigned char const Music_sd[]={ 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03,0x0F,0x02, 0x0F,0x03, 0x0F,0x03, 0x0F,0x03, 0x17,0x03,0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x03, 0x10,0x03,0x18,0x03, 0x17,0x03, 0x16,0x03, 0x10,0x02, 0x10,0x03,0x19,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x17,0x02,0x15,0x03, 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03,0x15,0x03, 0x0F,0x02, 0x0F,0x03, 0x0F,0x03, 0x17,0x03,0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x03, 0x10,0x03,0x18,0x03, 0x17,0x03, 0x16,0x03, 0x19,0x03, 0x19,0x03,0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x18,0x03,0x16,0x03, 0x15,0x16, 0x17,0x03, 0x17,0x03, 0x17,0x02,0x17,0x03, 0x17,0x03, 0x17,0x02, 0x17,0x03, 0x19,0x03,0x15,0x03, 0x16,0x04, 0x17,0x01, 0x18,0x03, 0x18,0x03,0x18,0x03, 0x18,0x04, 0x18,0x03, 0x17,0x03, 0x17,0x03,0x17,0x04, 0x17,0x04, 0x17,0x03, 0x16,0x03, 0x16,0x03,0x15,0x03, 0x16,0x03, 0x19,0x02, 0x19,0x03, 0x19,0x03,0x18,0x03, 0x16,0x03, 0x15,0x02, 0x00,0x00 }; unsigned char const Music_lzlh[]={ 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x15,0x03, 0x15,0x03,0x18,0x03,0x19,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x19,0x03,0x1A,0x03, 0x19,0x03, 0x18,0x03, 0x17,0x02, 0x15,0x02,0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x18,0x03, 0x17,0x02,0x15,0x02, 0x16,0x02, 0x0F,0x02, 0x15,0x16, 0x16,0x02,0x0F,0x02, 0x15,0x16, 0x00,0x00 };unsigned char const Music_fk[]={ 0x15,0x03, 0x10,0x03, 0x11,0x03, 0x15,0x66, 0x15,0x03,0x11,0x03, 0x15,0x03, 0x17,0x03, 0x17,0x03, 0x15,0x03,0x11,0x03, 0x10,0x03, 0x10,0x03, 0x10,0x66, 0x10,0x7A,0x15,0x03, 0x10,0x03, 0x11,0x03, 0x15,0x03, 0x10,0x03,0x11,0x03, 0x15,0x03, 0x11,0x03, 0x15,0x03, 0x17,0x03,0x17,0x03, 0x11,0x03, 0x11,0x03, 0x10,0x03, 0x15,0x03,0x10,0x66, 0x10,0x7A, 0x15,0x03, 0x16,0x03, 0x17,0x03,0x15,0x03, 0x16,0x03, 0x17,0x03, 0x19,0x03, 0x18,0x03,0x17,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x66, 0x17,0x03,0x16,0x03, 0x15,0x03, 0x11,0x03, 0x15,0x03, 0x16,0x03,0x10,0x66, 0x10,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03,0x15,0x03, 0x16,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x03,0x17,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03,0x1A,0x03, 0x16,0x03, 0x16,0x03, 0x15,0x03, 0x16,0x03,0x16,0x03, 0x15,0x03, 0x10,0x17, 0x17,0x03, 0x17,0x03,0x16,0x03, 0x17,0x03, 0x1F,0x66, 0x1F,0x66, 0x1B,0x66,0x17,0x03, 0x16,0x03, 0x17,0x03, 0x1A,0x03,0x19,0x03,0x17,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x15,0x03,0x15,0x03, 0x15,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x03,0x17,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,0x17,0x03, 0x15,0x66, 0x15,0x03, 0x11,0x03, 0x15,0x03,0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x19,0x03,0x1A,0x03, 0x1B,0x7A, 0x00,0x00 };void KeyScan();void play_while();void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed);#define u8 unsigned char#define u16 unsigned int#define u32 unsigned long#define WaitStatus 0 //按键过程的状态#define PressStatus 1#define ReleaseStatus 2#define BeepIO _pb4#define KEY1 _pb3#define KEY2 _pa7#define KEY3 _pa6#define KEY4 _pa5#define KEY5 _pa4#define KEY6 _pb2#define KEY7 _pb1#define KEY8 _pb0#define LED1 _pb5#define LED2 _pb6#define LED3 _pa3#define LED4 _pa1#define LED5 _pa0#define LED6 _pc2#define LED7 _pc1#define LED8 _pc0typedef struct{u16 count ;u8 name;u8 enable;}Timer;u8 KeyStatus=0,KeyPress=0,keyval=0;u8 mu_st=0;u8 music_en=0xff;Timer mytimer;#define true 1#define false 0const u16 fout[3][7]={{15289,13621,12135,11454,10204,9091,8099},{7645,6811,6068,5727,5102,4545,4050},{3822,3405,3034,2864,2551,2273,2025},};#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔unsigned int const FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表unsigned char const SignTab[7] = { 0,2,4,5,7,9,11 };//1~7在频率表中的位置unsigned char const LengthTab[7]= { 1,2,4,8,16,32,64 };unsigned int NewFreTab[12]; //新的频率表unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,SoundLength;unsigned char Tone,Length;unsigned char *Sound_bak;unsigned char start=0;void LED(u8 data){_pc0=data;_pc1=data>>1;_pc2=data>>2;_pa0=data>>3;_pa1=data>>4;_pa3=data>>5;_pb6=data>>6;_pb5=data>>7;}void LED3_8(u8 data){switch(data){case 0:LED(~0x01);break;case 1:LED(~0x02);break;case 2:LED(~0x04);break;case 3:LED(~0x08);break;case 4:LED(~0x10);break;case 5:LED(~0x20);break;case 6:LED(~0x40);break;case 7:LED(~0x80);break;}}void delayms(u16 i){u16 j;while(i--){for(j=0;j<220;j++){asm("nop");asm("nop");asm("nop");}}}void fchange(u16 f){_tm2al=f&0xff;_tm2ah=f>>8;}void main(){u8 worksta=1;_wdtc=0xa8;_acerl=0x00;_pcc=0x00;_pbc5=0;_pbc6=0;_csel=0;_cos=1;_acerl=0x00;_pbc|=0x0f;_pbc4=0;_pac=0xf0;_pac2=1;_papu2=1;_pbc|=0x0f;_pbpu|=0x0f;_pac|=0xf0;_papu|=0xf0;//ctm_tm2c0=0x10;_tm2c1=0xc1;_tm2al=0;_tm2ah=0>>8;_t2on=1;_mf1e=1;_t2ae=1;//stm_tm0c0=0x00;_tm0c1=0xc1;_tm0al=20000;_tm0ah=20000>>8;_mf0e=1;_t0ae=1;_t0on=1;_pawu2=1;_emi=1;while(1){KeyScan();if(KeyPress){KeyPress=0;if(keyval==1){start=1;worksta=2;music_en=0xff;switch(mu_st){case 0:Play(Music_sd,0,3,50);break;case 1:Play(Music_Two,0,3,50);break;case 2:Play(Music_Girl,0,3,50);break;case 3:Play(Music_Same,0,3,50);break;case 4:Play(Music_lzlh,0,3,50);break;case 5:Play(Music_fk,0,3,50);break;case 6:Point=SoundLength;worksta=2;break;}if(++mu_st==7)mu_st=0;}}switch(worksta){case 1:if(KEY1){LED1=1;}else{LED1=0;fchange(fout[0][1]);}if(KEY2){LED2=1;}else{LED2=0;fchange(fout[0][2]);}if(KEY3){LED3=1;}else{LED3=0;fchange(fout[0][3]);}if(KEY4){LED4=1;}else{LED4=0;fchange(fout[0][4]);}if(KEY5){LED5=1;}else{LED5=0;fchange(fout[0][5]);}if(KEY6){LED6=1;}else{LED6=0;fchange(fout[0][6]);}if(KEY7){LED7=1;}else{LED7=0;fchange(fout[0][7]);}if(KEY1 && KEY2 && KEY3 && KEY4 && KEY5 && KEY6 &&KEY7 )fchange(0);break;case 2: play_while();if(music_en==0)worksta=1;break;}}}DEFINE_ISR(tbase0,0x0c){_t0af=0;if(mytimer.enable==true){mytimer.count--;if(mytimer.count==0)mytimer.enable=false;}}DEFINE_ISR(t2,0x10){_t2af=0;BeepIO=~BeepIO;}void KeyScan(){switch(KeyStatus){case WaitStatus: //等待状态if(_pa2==0 )KeyStatus=PressStatus;break;case PressStatus: //按下状态if(_pa2==0 ){if(_pa2==0)keyval=1;KeyPress=1;KeyStatus=ReleaseStatus;}else{KeyStatus=WaitStatus;}break;case ReleaseStatus: //等待释放状态if(_pa2==0 ){}else{KeyStatus=WaitStatus;}break;}}//************************************************************************** void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) {unsigned char i,j;Sound_bak=Sound;for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表{j = i + Signature;if(j > 11){j = j-12;NewFreTab[i] = FreTab[j]*2;}elseNewFreTab[i] = FreTab[j];if(Octachord == 1)NewFreTab[i]>>=2;else if(Octachord == 3)NewFreTab[i]<<=2;}SoundLength = 0;while(Sound[SoundLength] != 0x00) //计算歌曲长度{SoundLength+=2;}Point = 0;Tone = Sound[Point];Length = Sound[Point+1]; // 读出第一个音符和它时时值LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)LDiv4 = LDiv0/4; // 算出4分音符的长度LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准}void play_while(){u8 SL,SH,SM,SLen,XG,FD;if(start==1 &&(Point < SoundLength)){SL=Tone%10; //计算出音符LED3_8(SL);SM=Tone/10%10; //计算出高低音SH=Tone/100; //计算出是否升半CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率if(SL!=0){if (SM==1) CurrentFre >>= 2; //低音if (SM==3) CurrentFre <<= 2; //高音fchange(4000000/CurrentFre);}SLen=LengthTab[Length%10]; //算出是几分音符XG=Length/10%10; //算出音符类型(0普通1连音2顿音)FD=Length/100;LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)if (FD==1)LDiv=LDiv+LDiv/2;if(XG!=1)if(XG==0) //算出普通音符的演奏长度if (SLen<=4)LDiv1=LDiv-LDiv4;elseLDiv1=LDiv*SOUND_SPACE;elseLDiv1=LDiv/2; //算出顿音的演奏长度elseLDiv1=LDiv;if(SL==0) LDiv1=0;LDiv2=LDiv-LDiv1; //算出不发音的长度=1;if (SL!=0)//c{mytimer.count=LDiv1;mytimer.enable=true;}start=0;}if(==1 && mytimer.enable==false){=2;//zif(LDiv2!=0){fchange(0);BeepIO=1;mytimer.count=LDiv2;mytimer.enable=true;}}if(==2 && mytimer.enable==false){Point+=2; //cTone=Sound_bak[Point];Length=Sound_bak[Point+1];start=1;}if(Point >=SoundLength){fchange(0);BeepIO = 1;start=0;music_en=0;}}。

基于单片机的简易电子琴设计(汇编语言)

摘要电子琴是现代电子科技与音乐结合的产物。

电子琴是一种新型的键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响.由音色,自动伴奏,自动和弦三大部分组成.它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有8个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

关键词:单片机,键盘,扬声器,电子琴AbstractElectronic organ is a modern electronic music technology and the product is a new type of keyboard instruments. It played an important role in modern music. SCM has powerful control functions and flexible programming characteristics. It has converged with modern people's lives, become an irreplaceable part. The main content is AT89C51 control of the core components, design of a electronic organ. SCM as a host to the core, with the keyboard, speaker and other core modules. In the main control module has 8 keys and a speaker. The system is steady, its simple hardware circuits, software functions, reliability of control system and high cost performance is its advantages. It also has certain practical and reference value.Key words : SCM keyboard speaker electronic organ目录引言 (1)第一章总体方案论证与设计 (3)1.1 控制模块 (3)1.2 播放模块 (4)1.2 按键控制模块 (4)第二章系统的软件设计 (7)2.1 音乐弹奏原理 (7)2.2 音乐弹奏设计 (7)2.3 软件流程图 (8)2.4 上位机软件及程序 (9)第三章系统调试与测试结果分析 (18)3.1 使用的仪器及软件 (18)3.2 系统调试 (18)3.2.1 硬件调试 (18)3.2.2 软件调试 (19)3.2.3 硬件软件联调 (20)3.3 测试结果 (20)总结 (21)致谢 ................................................................................................................ 错误!未定义书签。

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