当前位置:文档之家› 单片机电子琴设计报告

单片机电子琴设计报告

设计题目单片机电子琴摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。

我们都会抽空欣赏世界名曲,作为对精神的洗礼。

本论文设计一个基于单片机的简易电子琴。

电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本系统是以51系列单片机AT89C51为主控制器,附有矩阵键盘、LED显示管、扬声器组成。

系统完成显示输入信息、播放相应音符等基本功能。

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

关键词:AT89C51,矩阵键盘,LED显示管,蜂鸣器,1602液晶显示,1307时钟芯片。

目录第1章概述----------------------------------------------------------------------------------4第2章课程设计任务及要求-----------------------------------------------------------42.1 设计任务-------------------------------------------------------------------------------42.2 设计要求-------------------------------------------------------------------------------4第3章系统设计-----------------------------------------------------------------------------53.1设计方案-------------------------------------------------------------------------------53.2 系统设计--------------------------------------------------------------------------------53.2.2系统流程图-----------------------------------------------------------------------53.2.2 系统原理图 ------------------------------------------------------------------------73.3 文件程序代码---------------------------------------------------------------------------7第4章心得体会-----------------------------------------------------------------------------42第1章概述单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。

它的应用必定导致传统的控制技术从根本上发生变革。

因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。

电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

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

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

本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。

利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。

并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。

本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。

通过设计本系统可了解单片机的基本功能。

对单片机的了解有一个小的飞跃。

第2章课程设计任务及要求2.1 设计任务1、任务设计一简易电子琴,要求能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能。

2.2 设计要求1)具有一般演奏功能,利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一个音调的声音2)具有自动播放已存曲目功能3)显示当前正在播放的歌曲的名称和歌词4)显示时间第3章系统设计3.1设计方案该电路由时钟模块,液晶模块,键盘扫描模块组成。

时钟模块:由时钟模块1307实现,能够正确显示时间,以及扩展显示星期等等。

液晶模块:将时钟模块的信息正确的显示到液晶显示屏上,使用1602的液晶。

键盘扫描模块:对十六个按键进行逐次扫描,扫描到前八个按键时,蜂鸣器依次发出1,2,3,4,5,6,7,8的音调声,岸其余按键时,可以跳转到不同的曲目以及液晶模块显示,保留几个按键做以后的扩展用。

3.2 系统设计3.2.1 系统流程图分析各项设计要求后,可绘制如下程序流程图3.2.2 系统原理图3.3文件程序代码(1).液晶模块头文件sbit LCD_RS = P3^6; sbit LCD_RW = P3^5; sbit LCD_EN = P3^3; sfr LCDData=0x80;void LCDWrite(bit cd,unsigned char input);void LCDWait(unsigned char CiShu);void LCDDelay();void LCDInitialize();void LCDPrintString(unsigned char x,unsigned char y,unsigned char *st ring);void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char bit s,unsigned int number);unsigned char ReadState();void LCDInitialize(){LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x08);LCDDelay();LCDWrite(0,0x01);LCDDelay();LCDWrite(0,0x06);LCDDelay();LCDWrite(0,0x0c);}void LCDWrite(bit cd,unsigned char DATA){LCDWait(20);LCD_RS=cd;LCD_RW=0;LCD_EN=0;LCDData=DATA;LCD_EN=1;LCD_EN=0;}void LCDPrintString(unsigned char x,unsigned char y,unsigned char *st ring){unsigned char address;address=x+(1-y)*0x40+0x80;LCDWrite(0,address);while(*string!='\0')LCDWrite(1,*string);string++;}}void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char Wei Shu,unsigned int number){unsigned char address;unsigned char j,temp[5];address=x+(1-y)*0x40+0x80;LCDWrite(0,address);//if(number>0){temp[0]=(number%100000)/10000+48;temp[1]=(number%10000)/1000+48;temp[2]=(number%1000)/100+48;temp[3]=(number%100)/10+48;temp[4]=number%10+48;for(j=5-WeiShu;j<5;j++){LCDWrite(1,temp[j]);}}void LCDWait(unsigned char CiShu) {unsigned char i;for(i=0;i<CiShu;i++){if(ReadState()&0x80)continue; else break;}}unsigned char ReadState(){unsigned char temp;P0=0xff;LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_EN=1;temp=LCDData;LCD_EN=0;return temp;}void LCDDelay(){unsigned int a;for(a=0;a<1000;a++);}(2).时钟芯片模块头文件void iicdelay(unsigned int times); void iicstart(){MDE=1;MDO=1;iicdelay(2);MCO=1;iicdelay(2);MDO=0;iicdelay(2);}void iicstop(){MDE=1;MDO=0;iicdelay(2);iicdelay(2); MDO=1;}void iicack() {MDE=1;MCO=0;MDO=0;iicdelay(2); MCO=1;iicdelay(2); MCO=0;iicdelay(1); MDO=1;}void iicnack() {MDE=1;//MCO=0;MDO=1;iicdelay(2); MCO=1;iicdelay(2);}bit iicreadack(){bit ack;MCO = 0;iicdelay(2);MDE=1;MDO=1;MCO=1;iicdelay(2);MDE=0;ack=MDI;MCO=0;return ack;}void iicwriteda(unsigned char da) {unsigned char i;MDE=1;for(i=0;i<8;i++){MCO=0;iicdelay(0);if((da<<i)&0x80)MDO=1;elseMDO=0;iicdelay(2);MCO=1;iicdelay(3);}MCO=0;}unsigned char iicreadda() {unsigned char da;int i;da=0;MDE=1;MDO=1;MDE=0;for(i=0;i<8;i++){MCO=0;iicdelay(3);MCO=1;iicdelay(1);if(MDI==1){da=da<<1;da++;}elseda=da<<1;}MCO=0;return da;}void iicdelay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=5;j>0;j--);}void ReadTime(unsigned char TIME[7]) {bit EATemp;unsigned char temp;EATemp=EA;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();iicdelay(1);iicstart();iicwriteda(0xd1);iicreadack();TIME[0]=iicreadda(); iicack();TIME[1]=iicreadda(); iicack();TIME[2]=iicreadda(); iicack();TIME[3]=iicreadda(); iicack();TIME[4]=iicreadda(); iicack();TIME[5]=iicreadda();iicack();TIME[6]=iicreadda();iicnack();iicstop();iicdelay(1);TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f); //secondTIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f); //minuteif(TIME[2]&0x40){if(TIME[2]&0x20)temp=0x80;else temp=0x40;TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f); //hour TIME[2]|=temp;}else{TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);}TIME[3]=TIME[3]&0x07; //weekTIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f); //dateTIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f); //monthTIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f); //yearEA=EATemp;}void SetTime(unsigned char TIME[7]){bit EATemp;unsigned char temp=0;unsigned char TimeTemp[7];EATemp=EA;for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];temp=0;TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10);TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10);if((TimeTemp[2]&0xc0)==0x00){TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); }else{if((TimeTemp[2]&0xc0)==0x01)temp=0x40;else temp=0x60; TimeTemp[2]&=0x3f;TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); TimeTemp[2]|=temp;}TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10); TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10);TimeTemp[0]&=0x7f;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(TimeTemp[0]);iicreadack();iicwriteda(TimeTemp[1]);iicreadack();iicwriteda(TimeTemp[2]);iicreadack();iicwriteda(TimeTemp[3]);iicreadack();iicwriteda(TimeTemp[4]);iicwriteda(TimeTemp[5]);iicreadack();iicwriteda(TimeTemp[6]);iicreadack();iicstop();iicdelay(1);EA=EATemp;}void SwitchRTC(unsigned char SWITCH) {unsigned char temp;bit EATemp;EATemp=EA;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicstop();iicstart();iicwriteda(0xd1);iicreadack();temp=iicreadda();iicnack();iicstop();//iicdelay(1);if(SWITCH)temp&=0x7f; else temp|=0x80;iicstart();iicwriteda(0xd0);iicreadack();iicwriteda(0x00);iicreadack();iicwriteda(temp);iicreadack();iicstop();//iicdelay(1);EA=EATemp;(3)主体程序#include<aduc848.h>#include <INTRINS.H>#include<LCD1602.h>#include<rtc.h>sbit lie0=P2^3;sbit lie1=P2^2;sbit lie2=P2^1;sbit lie3=P2^0;sbit PWM1=P2^6;unsigned char temp;unsigned char key;unsigned char STH0,STL0;unsigned char jishi=0;unsigned char n=0; //n为节拍常数变量unsigned char a[7]={00,59,19,3,4,8,10}; unsigned char b[7];void delay1s(void){unsigned char i,k;for(k=100;k>0;k--)for(i=100;i>0;i--);}/*定时器0中断*/void TIMER0(void) interrupt 1{TH0=STH0;TL0=STL0;PWM1=~PWM1;}/*定时器1中断*/void int0() interrupt 3 //采用中断3 控制节拍节拍延时{ TH1=0xd8;TL1=0xef;n--;}/*定时器2中断*/void int1() interrupt 5 //采用中断3 控制节拍节拍延时{ TH2=0xd8;TL2=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!}unsigned int codetab[]={0xfc43,0xfd08,0,0,0xfd08,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0 xfe21,0,0,};/*unsigned char code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; */unsigned char code music_tab_1[]={/*1*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10,0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,0x2b,0x60,/*2*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,//550x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10, 0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20, 0x19,0x20,0x20,0x10,0x20,0x10,//632211170x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20, 0x18,0x40,0x18,0x20,0x19,0x20,//67112377550x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20, 0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//6322110x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x60,//000000x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,//1155555 5777550x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10, 0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10, 0x19,0x20,0x20,0x10,0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//55110x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20, 0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10, 0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443321710x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10, 0x18,0x60,0x01,0x40,0x01,0x40,//第二次/*3*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,/*4*/0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10,0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60,//550x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10, 0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20, 0x19,0x20,0x20,0x10,0x20,0x10,//632211170x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x40,0x18,0x20,0x19,0x20,//67112377550x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20, 0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,//6322110x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20, 0x18,0x60,//335350x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,//1155555 5777550x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x10,0x10, 0x10,0x20,0x10,0x20,0x10,0x20,0x19,0x10,0x19,0x10, 0x19,0x20,0x20,0x10,0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20, 0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//324430x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,//55110x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20, 0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10, 0x20,0x10,//0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20, 0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10, 0x15,0x10,//32443321710x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x20,0x19,0x10,0x18,0x60,0x01,0x40,0x01,0x40,//结尾//33420x13,0x20,0x15,0x20,0x18,0x30,0x19,0x10,0x18,0x10,0x15,0x10,0x18,0x40,0x13,0x40,0x13,0x40,0x12,0x40,0x15,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,0x00};unsigned char code music_tab_2[]={ 0x10,0x03, 0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02,0x17,0x02, 0x11,0x01, 0x0D,0x02, 0x0D,0x02, 0x10,0x66,0x0F,0x03, 0x10,0x02, 0x15,0x02, 0x0F,0x15, 0x0D,0x03,0x0D,0x03, 0x0E,0x66, 0x0D,0x03, 0x0E,0x03, 0x15,0x66,0x0D,0x01, 0x15,0x02, 0x15,0x02, 0x15,0x02, 0x11,0x66,0x0E,0x03, 0x0E,0x02, 0x11,0x02, 0x11,0x15, 0x10,0x03,0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02, 0x17,0x02,0x11,0x15, 0x0D,0x03, 0x0D,0x03, 0x10,0x66, 0x0F,0x03,0x10,0x02, 0x15,0x02, 0x0F,0x01, 0x0D,0x03, 0x0E,0x02,0x15,0x03, 0x11,0x03, 0x11,0x02, 0x15,0x02, 0x16,0x03,0x16,0x03, 0x17,0x03, 0x15,0x16, 0x15,0x02, 0x11,0x03,0x10,0x03, 0x10,0x03, 0x11,0x02, 0x0F,0x02, 0x10,0x15,0x15,0x03, 0x16,0x03, 0x17,0x66, 0x16,0x03, 0x17,0x02,0x19,0x02, 0x16,0x15, 0x0F,0x03, 0x0F,0x03, 0x15,0x03,0x11,0x03, 0x15,0x02, 0x17,0x02, 0x17,0x15, 0x10,0x03, 0x11,0x03, 0x15,0x02, 0x11,0x02, 0x16,0x03, 0x16,0x03, 0x15,0x66, 0x0F,0x03, 0x0F,0x16, 0x18,0x02, 0x17,0x02, 0x16,0x02, 0x15,0x02, 0x17,0x00, 0x17,0x02, 0x1A,0x01, 0x19,0x02, 0x19,0x02, 0x17,0x03, 0x16,0x03, 0x15,0x02, 0x15,0x02, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x16,0x03, 0x19,0x02, 0x17,0x15, 0x17,0x02, 0x1A,0x01, 0x19,0x01, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x16,0x03, 0x11,0x02, 0x10,0x01, 0x00,0x00};void main(void){unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD=0x11;IE=0xaa;TH1=0xd8;TL1=0xef;TH2=0xd8;TL2=0xef;P2=0xe0;P3=0x0f;I2CCON=0xE8;SetTime(a);SwitchRTC(1);LCDInitialize();while(1){P1=0xf0;P2=0xff;lie0=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=4;break;case 0x0b:key=8;break;case 0x07:key=12;break;}P0=tab[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp&0x0f;while(temp!=0x0f){temp=P1;temp=temp&0x0f;}TR0=0;} }P1=0xf0;P2=0xff;lie1=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=5;break;case 0x0b:key=9;break;case 0x07:key=13;break;}P0=tab[key];STH0=tab[key]/256; STL0=tab[key]%256;TR0=1;temp=temp&0x0f;while(temp!=0x0f){temp=P1;temp=temp&0x0f;}TR0=0;}}P1=0xf0;P2=0xff;lie2=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=2;break;case 0x0d:key=6;break;case 0x0b:key=10;break;case 0x07:key=14;break;}P0=tab[key];}}P1=0xf0;P2=0xff;lie3=0;temp=P1;temp=temp & 0x0f;if (temp!=0x0f){delay1s();temp=P1;temp=temp & 0x0f;if (temp!=0x0f){temp=P1;temp=temp & 0x0f; switch(temp){case 0x0e:key=3;break;case 0x0d:key=7;break;case 0x0b:key=11;break;case 0x07:key=15;break;}P0=tab[key];}}switch(key){case 0,4,8,12,1,5,9,13,8,12,7,11,15:break;case 2:{play_1:{a_1: p=music_tab_1[i];if(p==0x00){ i=0, delayms(1000); goto play_1;} //如果碰到结束符,延时1秒,回到头再来一遍else if(p==0xff) { i=i+1;delayms(100),TR1=0; goto a_1;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab_1[i++], n=music_tab_1[i++];} //取频率常数和节拍常数TR1=1; //开定时器1while(n!=0) PWM1=~PWM1,delay(m); //等待节拍完成, 通过P1口输出音频TR1=0; //关定时器1}break;}case 6:{play_2:{a_2: p=music_tab_2[i];if(p==0x00) { i=0, delayms(1000); goto play_2;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR2=0; goto a_2;} //碰到休止符,延时100ms,取下一音符else{m=music_tab_2[i++], n=music_tab_2[i++];} //取频率常数和节拍常数TR2=1; //开定时器2while(n!=0) PWM1=~PWM1,delay(m);//等待节拍完成, 通过P1口输出音频(TR2=0; //关定时器2} break;}case 3:{jishi=1; break;}default:break;}if(jishi==1){ReadTime(b);LCDPrintNumber(0,1,2,b[0]);//LCDPrintString(3,1,1,"-");LCDPrintNumber(4,1,2,b[1]);//LCDPrintString(6,1,1,":");LCDPrintNumber(7,1,2,b[2]);//LCDPrintString(9,1,1," ");LCDPrintNumber(10,1,2,b[4]);//LCDPrintString(12,1,,1," ");LCDPrintNumber(13,1,2,b[5]);//LCDPrintString(15,1," ");LCDPrintString(0,0,"HuNan University!");}}}第6章心得体会这次实验总共经历了两周的时间,从功能需求分析到功能分析,从程序的设计到程序的调试,下载,最后终于完成了这次具有实际使用价值的实验。

相关主题