51单片机设计电子琴报告含代码
- 格式:doc
- 大小:110.05 KB
- 文档页数:8
基于51单片机的16键电子琴课程设计报告.docx
本课程设计旨在设计一款基于51单片机的16键电子琴,利用该电子琴进行乐器演奏
练习。
课程设计的目标是通过51单片机的控制,使乐器的按键实现发声功能,即在按下按
键后,将发出相应的音调,且声音质量较为清晰、拒绝杂音;同时,设计外设及程序使乐
器美观并能在一定程度上体现主人的个性操作习惯,体现出一定程度上的可定制性和稳定性。
课程设计使用MCS-51单片机作为核心芯片,搭建计算机与电子琴模块之间的桥梁,
通过控制要求,配备8位延时定时器、8位计数器/比较器和定时/计数器模块的硬件模块,通过定时/计数器去控制音色的发声数量,再加以PCB板设计,完成各模块的焊接、网络
接线,通过连接各功能模块,实现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单片机简易电子琴因本人初学单片机程序过于简陋请见谅程序:#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单片机的简单电子琴代码#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();}}。
电子琴设计报告一、实验目的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指令系统及引脚。
#include<STC12C5A60S2.h>#include<LCD1602.h> //包含LCD1602的显示函数等#include<KEY_SCAN.h> //包含键值扫描函数,输出key_num#define FSCLK 11059200 //晶振频率sbit BEEP=P1^4; //蜂鸣器输出脚unsigned int fre[16]={100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1 400,1500,1600};//存好预定的频率值,可以设定任意想要的频率/********************************************************** ********************** 函数功能:延时函数,函数名Delay_ms() ** 函数说明:利用软件延时,占用CPU,经调试最小单位大约为1ms ** 入口参数:time:需要延时的时间,单位ms** 出口参数:无void Delay_ms(unsigned int time)unsigned int i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);** 函数功能:定时翻转跟蜂鸣器相连的引脚的电平,输出一定频率的脉冲信号** 函数说明:定时器0中断服务函数** 入口参数:无** 出口参数:无void time0() interrupt 1 //使用定时器0的工作方式2,定时器中断服务程序TH0 = (65536-FSCLK/(12*fre[piano]))/256; //每次中断,重新配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[piano]))%256; //每次中断,程序配置定时器的低8位BEEP=!BEEP; //然后取反音乐输出,输出一个反电平} //短时间内多次取反则输出一定频率的脉冲/********************************************************** ********************** 函数功能:主函数** 入口参数:无** 出口参数:无void main()unsigned char piano=0,key=0; //初始值LCD_1602_Init(); //液晶显示前进行初始化TMOD = 0X01; //定时器使能TH0 = (65536-FSCLK/(12*fre[0]))/256; //配置定时器的高8位TL0 = (65536-FSCLK/(12*fre[0]))%256; //配置定时器的低8位ET0 = 1; //允许定时器0中断EA = 1; //打开总中断Write_1602_String("Welcome",0X80); //开机显示欢迎语:WelcomeWrite_1602_String("By 20192305007",0X80+0x40); //显示作者:20192305007Delay_ms(5000); //延时5s后开始进入正式程序LCD_1602_Init(); //液晶屏初始化Write_1602_String("Happy Play",0X80); //显示开始使用:Happy Playwhile(1){ //在这段函数中,不断扫描键值,每当键值不等于0时,说明有键被按下,//此时开始播放对应的音阶。
课程设计说明书题目:基于单片机的电子琴设计院(系):电子工程与自动化学院专业:测控技术与仪器(卓越) 学生姓名:学号:指导教师:2013 年9 月21 日目录1 摘要 (1)2 关键字 (1)3 设计任务及要求 (1)4 方案可行性论证 (1)5 程序框图 (2)6 关键单元电路与程序介绍 (3)6.1 复位与震荡电路 (3)6.2 4x4矩阵键盘 (3)6.3数码管与LED灯 (4)6.4 蜂鸣器 (6)6.5 音乐相关知识 (7)7 调试过程 (11)8 总结与体会 (11)9 参考文献 (11)10 附录 (12)10.1 设备与仪器 (12)10.2 软件 (12)10.3 原件清单 (12)10.4原理图与PCB图 (13)10.5 总程序 (14)10.6 实物图 (31)【摘要】:打造一个多功能电子琴,核心是一块单片机。
单片机读取键值,为内置定时器赋初值,定时器每溢出一次,驱动蜂鸣器的引脚电平就取反一次,产生相应频率的方波,即音调;设好键值与数码管段码表的对应关系,键按下时,数码管显示对应音调。
一首音乐储存在一个表中,表中的数据是音调与节拍,单片机读取音符的音调与节拍,根据音调赋予定时器初值,根据节拍决定定时器工作的时间,也就是蜂鸣器响的时间,一个接一个地读取音符,即可播放一首歌曲。
节拍用led灯的点亮个数表示。
单片机读取音乐表中的节拍,控制led 灯的点亮个数,达到显示节拍的效果。
特别要注意的是:该方案采用了两个定时器,T0、T1。
T0作为驱动蜂鸣器的定时器,要给予高优先级,不然会被T1干扰,音质变差。
【关键字】:单片机、stc89c52、电子琴、C51、keil。
【设计任务及要求】:1.通过按键能够发出相应的音符并播放产生乐音,实现演奏;2.演奏的同时可数字显示当前的音调,利于培养乐感3.可以选定播放固定乐曲自动演奏,演奏时LED进行节拍指示;4.在自动演奏和奏乐的过程中按停止键则中断演奏;5.可以选择调节音或小。
目录摘要 (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).它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果。
BUZZ EQU P1.0ORG 0000HLJMP STARTORG 000BHLJMP INT_T0ORG 0100HSTART:CLR EAMOV TMOD,#01H ;设置定时器0为工作模式1SETB ET0 ;开定时器0中断SETB EA ;开总中断CLR TR0 ;关闭定时器0MOV R1,#0FFHKE: LCALL KEYCJNE R1,#0FFH,KE2 ; 无键按下,返回startCLR TR0SJMP STARTKE2: CJNE R1,#1FH,KE1 ;MON键按下,音乐LJMP START0KE1: LCALL KEYCJNE R1,#09H,KEY2 ;K0键按下MOV 30H,#0FEH ;设置音阶7MOV 31H,#06HLJMP SET_TIMERKEY2: CJNE R1,#08H,KEY3 ;K1键按下MOV 30H,#0FEH ;设置音阶1MOV 31H,#022HLJMP SET_TIMERKEY3: CJNE R1,#0AH,KEY4 ;K2键按下MOV 30H,#0FEH ;设置音阶#1MOV 31H,#03DHLJMP SET_TIMERKEY4: CJNE R1,#0CH,KEY5 ;K3键按下MOV 30H,#0FEH ;设置音阶2MOV 31H,#056HLJMP SET_TIMERKEY5: CJNE R1,#01H,KEY6 ;K4键按下MOV 30H,#0FEH ;设置音阶#2MOV 31H,#06EHLJMP SET_TIMERKEY6: CJNE R1,#03H,KEY7 ;K5键按下MOV 30H,#0FEH ;设置音阶3MOV 31H,#085HLJMP SET_TIMERKEY7: CJNE R1,#05H,KEY8 ;K6键按下MOV 30H,#0FEH ;设置音阶4MOV 31H,#09AHLJMP SET_TIMERKEY8: CJNE R1,#00H,KEY9 ;K7键按下MOV 30H,#0FEH ;设置音阶#4MOV 31H,#0AEHLJMP SET_TIMERKEY9: CJNE R1,#02H,KEY10 ;K8键按下MOV 30H,#0FEH ;设置音阶5MOV 31H,#0C1HLJMP SET_TIMERKEY10:CJNE R1,#04H,KEY11 ;K9键按下MOV 30H,#0FEH ;设置音阶#5MOV 31H,#0D3HLJMP SET_TIMERKEY11:CJNE R1,#06H,KEY12 ;KA键按下MOV 30H,#0FEH ;设置音阶6MOV 31H,#0E4HLJMP SET_TIMERKEY12:CJNE R1,#07H,KEY13 ;KB键按下MOV 30H,#0FEH ;设置音阶#6MOV 31H,#0F4HLJMP SET_TIMERKEY13:CJNE R1,#0EH,KEY14 ;KC键按下MOV 30H,#0FFH ;设置音阶7MOV 31H,#03HLJMP SET_TIMERKEY14:CJNE R1,#0FH,KEY15 ;KD键按下MOV 30H,#0FFH ;设置音阶1MOV 31H,#011HLJMP SET_TIMERKEY15:CJNE R1,#0DH,KEY16 ;KE键按下MOV 30H,#0FFH ;设置音阶#1MOV 31H,#1FHLJMP SET_TIMERKEY16:CJNE R1,#0BH,KEY17 ;KF按下MOV 30H,#0FFH ;设置音阶2MOV 31H,#2BHLJMP SET_TIMERKEY17:CJNE R1,#10H,KEY18 ;TV/ME按下,停止LJMP STARTKEY18:CJNE R1,#12H,KEY19 ;EG/DL按下MOV 30H,#0FCH ;设置音阶低#1MOV 31H,#79HLJMP SET_TIMERKEY19:CJNE R1,#14H,KEY20 ;CLB键按下MOV 30H,#0FCH ;设置音阶低2MOV 31H,#0ADHLJMP SET_TIMERKEY20:CJNE R1,#16H,KEY21 ;EXEC键按下MOV 30H,#0FCH ;设置音阶低#2MOV 31H,#0DCHLJMP SET_TIMERKEY21:CJNE R1,#11H,KEY22 ;RG/FS键按下MOV 30H,#0FDH ;设置音阶低3MOV 31H,#0AHLJMP SET_TIMERKEY22:CJNE R1,#13H,KEY23 ;RW/IS键按下MOV 30H,#0FDH ;设置音阶低4MOV 31H,#33HLJMP SET_TIMERKEY23:CJNE R1,#15H,KEY24 ;COMP键按下MOV 30H,#0FDH ;设置音阶低#4MOV 31H,#5CHLJMP SET_TIMERKEY24:CJNE R1,#17H,KEY25 ;SCAL按下MOV 30H,#0FDH ;设置音阶低5MOV 31H,#82HLJMP SET_TIMERKEY25:CJNE R1,#18H,KEY26 ;FI/LS按下MOV 30H,#0FDH ;设置音阶低#5MOV 31H,#0A5HLJMP SET_TIMERKEY26:CJNE R1,#1AH,KEY27 ;EV/UN按下MOV 30H,#0FDH ;设置音阶低6MOV 31H,#0C7HLJMP SET_TIMERKEY27:CJNE R1,#1CH,KEY28 ;MOVE键按下MOV 30H,#0FDH ;设置音阶低#6MOV 31H,#0E7HLJMP SET_TIMERKEY28:CJNE R1,#1EH,KEY29 ;STEP键按下MOV 30H,#0FFH ;设置音阶高5MOV 31H,#60HLJMP SET_TIMERKEY29:CJNE R1,#19H,KEY30 ;F2/NX键按下MOV 30H,#0FFH ;设置音阶高#2MOV 31H,#37HLJMP SET_TIMERKEY30:CJNE R1,#1BH,KEY31 ;EC/EP键按下MOV 30H,#0FFH ;设置音阶高3MOV 31H,#042HLJMP SET_TIMERKEY31:CJNE R1,#1DH,NOKEY ;SRB键按下MOV 30H,#0FFH ;设置音阶高4MOV 31H,#4DHLJMP SET_TIMERSET_TIMER:SETB TR0 ;发声LJMP KENOKEY:CLR TR0 ;无键按下LJMP KESTART0:MOV 40H,#00HNEXT0: MOV A,40HMOV DPTR,#TABLEMOVC A,@A+DPTR ;查表取音调和节拍MOV R2,AJZ END0 ;为零,返回startANL A,#0FHMOV R5,A ;将节拍存入R5MOV A,R2SW AP AANL A,#0FHJNZ SING ;根据音调决定是否演奏.CLR TR0JMP D1SING: DEC AMOV 22H,A ;将音调存入22H.RL AMOV DPTR,#TABLE1MOVC A,@A+DPTR ;根据音调决定定时器初值.MOV TH0,A ;放入TH0MOV 21H,AMOV A,22HRL AINC AMOVC A,@A+DPTRMOV TL0,A ;放入TL0MOV 20H,ASETB TR0 ;启动定时D1 :LCALL KEYCJNE R1,#0FFH,D9LJMP STARTD9: CALL DELAYCJNE R1,#10H,D8LJMP STARTD8: INC 40HJMP NEXT0END0: CLR TR0JMP STARTINT_T0: ;T0中断服务程序CJNE R1,#1FH,D6PUSH ACCPUSH PSWMOV TL0,20H ;重赋初值.MOV TH0,21HCPL P1.0POP PSWPOP ACCSJMP D7D6:MOV TH0,30H ;定时器赋初值MOV TL0,31HCPL BUZZ ;输出方波D7:RETIKEY:MOV A,#81HMOV DPTR,#0FFFFHMOVX @DPTR,AKEY1:ACALL KSJNZ LK1ACALL DELAJMP ALSLK1:ACALL DELACALL KSJNZ LK2AJMP ALSLK2:MOV R3,#0FEHMOV R4,#00HLK:MOV DPTR,#0FFFDHMOV A,R3MOVX @DPTR,AINC DPTRMOVX A,@DPTRJB ACC.0,LONEMOV A,#00HAJMP LKPLONE:JB ACC.1,LTWOMOV A,#08HAJMP LKPLTWO:JB ACC.2,LTHEMOV A,#10HAJMP LKPLTHE:JB ACC.3,NEXTMOV A,#18HAJMP LKPLKP:ADD A,R4PUSH ACCLK4:ACALL DELACALL KSJNZ LK4POP ACCMOV R1,AKEND:RETNEXT:INC R4MOV A,R3JNB ACC.7,ALSRL AMOV R3,AAJMP LKALS: MOV A,#0FFHAJMP KENDDEL:MOV R7,#01HDEL1:MOV R6,#0FFHDJNZ R6,$DJNZ R7,DEL1RETKS:MOV DPTR ,#0FFFDHMOV A,#00HMOVX @DPTR,AINC DPTRMOVX A,@DPTRCPL AANL A,#0FHRETDELAY:MOV R7,#02H ;延时子程序D2: MOV R4,#50D3: MOV R3,#248DJNZ R3,$DJNZ R4,D3DJNZ R7,D2DJNZ R5,DELAYRET。
目录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计数器的脉冲有两个来源:一个是外部脉冲源,另一个是系统的时钟振荡器。
电子琴设计报告一、实验目的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指令系统及引脚。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程的Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含8K可反复擦写的程序存储器和12B的随机存储数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89S52单片机课灵活应用于各种控制领域。
其主要工作特性如下:①片内程序存储器含8K的Flash程序存储器,可擦写寿命为1000次;②片内程序存储器256字节的RAM;③具有32根可编程I/O口线;④具有3个可编程定时器;⑤中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;⑥串行口是具有一个全双工口的可编程串行通信口;⑦具有一个数据指针DPTR;⑧低功耗工作模式有空闲模式和掉电模式;⑨具有可编程的3级程序锁定位;⑩AT89S52工作电源电压为5(+—0.2)V,且典型值为5V;AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.输出模块输出电路采用蜂鸣器。
3.输入模块采用键盘输入实现电子琴功能键盘模块的设计,考虑到了电子琴的特殊之处,就是在进行音符播放的过程中,要有多个音调及其变调的多次输入过程,从操作简单和设计合理等方面考虑,需要对每个符号位进行单独定义键位,所以,在设计中,采用了4×4 键盘,利用其丰富的键位资源,可以实现对计算中每一个数位和符号位的单独定义。
B.程序设计B.1 程序总体设计本程序共分主程序,键盘扫描程序,播放程序,回放程序四个程序。
B.2 程序主要模块主程序/**************************************************共有7种音符有三种音调可选择**************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charuint code table1[]={ //低音0 ,63628 ,63835 ,64021 ,64103,64260 ,64400 ,64524};uint code table2[]={ //中音0 ,64580 ,64684 ,64777 ,64820,64898 ,64968 ,65030};uint code table3[]={ //高音0 ,65058 ,65110 ,65157 ,65178,65217 ,65252 ,65283};uint table[12]={0};sbit beep=P2^3;uint num,CTH0,CTL0,i,j,m;uchar temp;void delay(uint);void keyscan();void play(uint );void init();void replay();void main(){init();while(1){keyscan();}}void delay(uint z){uint a;uchar b;for(a=z;a>0;a--)for(b=110;b>0;b--);}void init(){TMOD=0x01;EA=1; //开总中断ET0=1; //开定时器中断}void keyscan(){P3=0xfe; //检测第一行temp=P3;temp=temp&0xf0;while(temp!=0xf0) //初始列置高电平,行置底电平{delay(300);//消抖temp=P3;temp=temp&0xf0;while(temp!=0xf0){ //确认按键按下temp=P3;switch(temp){case 0xee:num=7;break;case 0xde:num=8;break;case 0xbe:num=9;break;case 0x7e:break;}play(num); //演奏音符while(temp!=0xf0){temp=P3; //检验是否释放temp=temp&0xf0;}TR0=0; //按键关闭之后,停止定时器工作beep=1;}}P3=0xfd; //检测第二行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:break;}play(num);while(temp!=0xf0){temp=P3;temp=temp&0xf0;}TR0=0;beep=1;}}P3=0xfb; //检测第三行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=1;break;case 0xdb:num=2;break;case 0xbb:num=3;break;case 0x7b:break;}play(num);while(temp!=0xf0){temp=P3;temp=temp&0xf0;}TR0=0;beep=1;}}P3=0xf7; //检测第四行temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(300);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:break;case 0xd7:num=0;break;case 0xb7:replay();break;case 0x77:break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void play(uint num){CTH0=table3[num]/256;CTL0=table3[num]%256;TR0=1;table[i++]=num;}void timer0() interrupt 1{TH0=CTH0;TL0=CTL0;beep=~beep;}void replay(){for(j=0;j<=i;j++){m=table[j+1];play(m);delay(1000);TR0=0;beep=1;delay(1000);}beep=1;TR0=0;}六、实验感想及总结设计过程中遇到的问题有很多,但是,在努力下都得到了解决,例如:始时遇到的到导线交错,难于查看电路,容易产生短路、断路问题,经结合所学识与实践经验,对电路进行了重新布线,实行了贴板引线焊接,解决了这一问题;电源供电,再外加一个自做电源,个体大、质量成,影响美观,然后就结合系统所需,改用了电池组供电;软件设计中也是也到了很多问题,如:头文件调用合适函数、循环……但是,在最后的检测中,我们完成了计划中的全部功能,可以清晰的播放音符的同时,还可以实现音调的调整及音乐的存储和回放。
七、参考文献:张迎新等编著《单片基础教程——单片机基础》(第二版)北京航空航天大学出版社2006.8刘坤,宋戈,赵洪波,张宪栋。
《51 单片机C 语言应用开发技术大全》人民邮电出版社2008黄智伟编著《全国大学生电子设计竞赛——制作实训》北京航空航天大学出版社2007.2黄智伟编著《全国大学生电子设计竞赛——技能实训》北京航空航天大学出版社2007.2胡汉才著,《单片机原理及其接口技术》清华大学出版社 2004年2月李朝青著,《单片机原理及接口技术》北京航空航天大学出版社 2005年10月徐君毅著,《单片微型计算机原理与应用》上海科技出版社 1988年5月邓子礼著,《单片微机及外围集成电路技术手册》上海实用计算机自动控制工程公司 1990年7月周立功著,《单片机实验与实践教程》北京航空航天大学出版社 2006年5月余永权著,《ATMEL89系列单片机应用技术》北京航空航天大学出版社 2002年8月赵秀菊著,《单片机与测控技术》东南大学出版社 1994年6月。