单片机电子琴设计报告

时间:2024.3.19

 

设计题目  单片机电子琴 

目录

1概述 ----------------------------------------------------------------------------------4

2课程设计任务及要求-----------------------------------------------------------4

 2.1 设计任务 -------------------------------------------------------------------------------4

 2.2 设计要求 -------------------------------------------------------------------------------4

3系统设计-----------------------------------------------------------------------------5

 3.1设计方案  -------------------------------------------------------------------------------5

 3.2 系统设计 --------------------------------------------------------------------------------5

3.2.2         系统流程图 -----------------------------------------------------------------------5

 3.2.2  系统原理图 --------- ---------------------------------------------------------------7

3.3 文件程序代码---------------------------------------------------------------------------7 

4心得体会-----------------------------------------------------------------------------42

    以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有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 *string);

void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char bits,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 *string)

{

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 WeiShu,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);

   MCO=1;

   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);

   MCO=0; 

}

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;

         else

          MDO=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++;}

         else

           da=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);  //second

    TIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f);  //minute

    if(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;                           //week

    TIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f);  //date

    TIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f);  //month

    TIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f);         //year

    EA=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]);

    iicreadack();

    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();     

    //iicdelay(1);

    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 code tab[]={0xfc43,0xfd08,0,0,0xfd08,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0xfe21,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,

//1176711237755

0x30,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,

//63221117

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x40,0x18,0x20,0x19,0x20,

//6711237755

0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,

0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,

//632211

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x60,

//00000

0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,

//1155555 577755

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,

//55556511112

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,

0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,

0x15,0x10,

//3244332443

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

//32443

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

//5511

0x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,

//55555577755

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,

0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10,

0x20,0x10,

//55556511112

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,

0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,

0x15,0x10,

//3244332171

0x13,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,

//1176711237755

0x30,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,

//63221117

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x40,0x18,0x20,0x19,0x20,

//6711237755

0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,

0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,

//632211

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x60,

//33535

0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,

//1155555 577755

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,

//55556511112

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,

0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,

0x15,0x10,

//3244332443

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

//32443

0x13,0x20,0x15,0x10,0x12,0x10,0x12,0x20,0x13,0x20,

//5511

0x10,0x40,0x10,0x20,0x18,0x10,0x18,0x10,

//55555577755

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,

0x10,0x20,0x19,0x10,0x19,0x10,0x19,0x20,0x20,0x10,

0x20,0x10,

                                                                     

//55556511112

0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x0e,0x20,

0x10,0x20,0x18,0x10,0x18,0x10,0x18,0x20,0x18,0x10,

0x15,0x10,

//3244332171

0x13,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,

//结尾

//321712133423342

0x13,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;                 //开定时器1   

while(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;                           //开定时器2     while(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  心得体会

这次实验总共经历了两周的时间,从功能需求分析到功能分析,从程序的设计到程序的调试,下载,最后终于完成了这次具有实际使用价值的实验。

在设计中我运用自己平时学到的一些知识,以及自己在课下所查找的进行设计,刚开始遇到很多困难,包括对使用C语言环境语言的不熟悉,后来一起和同学研究,而一些课程设计中的故障,也请同学帮忙参考一下,最终找到了解决问题的答案。我感觉自己在设计方面提高很大,特别是在设计程序时,逻辑思维能力有所加强,同时对以前所学的知识有了更深刻的认识,并进一步的得到了巩固和提高,充分的做到了理论联系实际,也使我认识到理论与实际的差别,通过该课程设计,不但对单片机有了较为全面的认识,而且相关的知识也有了足够的掌握,我感觉最重要的还是设计思维的形成。更发现自己在平时学习中的缺陷。对以后的学习也有很大的帮助。

两周的课程设计,我所收获的不仅是学习知识方面,更多的是生活方面。我了解到,在我们生活中,应该学会与别人共同分享,分享知识,分享问题,这样更有助于我们的交流,有利于我们共同进步,有利于我们对学习养成良好的兴趣。

最后,我要感谢那些带我们课程设计的老师们,感谢你们对我们的耐心,感谢你们对我们的鼓励,让我们有信心继续下去,成功走到最后。

更多相关推荐:
单片机电子琴设计报告

单片机课程设计报告设计题目单片机电子琴摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴…

51单片机电子琴设计报告

扬州大学水利与能源动力工程学院课程设计报告题目电子琴设计课程单片机原理及应用课程设计专业电气工程及其自动化班级姓名学号0第一部任务书1分单片机原理及应用课程设计任务书一课题名称电子琴设计二课程设计目的课程设计是...

单片机电子琴设计报告

单片机课程设计报告设计题目单片机电子琴1单片机课程设计报告目录第1章概述4第2章课程设计任务及要求421设计任务422设计要求4第3章系统设计531设计方案532系统设计5322系统流程图5322系统原理图73...

基于单片机的电子琴设计报告-含有经典的程序案例

设计报告课程微机接口技术与数字控制设计名称基于单片机的电子琴设计小组成员学号专业机械电子工程日期指导老师成绩1设计任务以生活中的电子琴为设计对象实现音乐的按键控制功用尽量能弹奏出和谐而优美的旋律2设计目的通过单...

单片机电子琴设计报告

单片机课程设计报告单片机课程设计课程设计名称专业班级学生姓名学号指导教师课程设计时间1单片机课程设计报告目录第1章概述3第2章课程设计任务及要求421设计任务422设计要求4第3章系统设计531设计方案532系...

51单片机设计电子琴报告含代码

电子琴设计报告一实验目的1更深刻的了解学习8051单片机的发声原理利用定时器可以发出不同频率的脉冲不同频率的脉冲经喇叭驱动电路放大滤波后就会发出不同的音调2其次定时器按设置的定时参数产生中断这一次中断发出脉冲低...

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

河南理工大学本科课程设计报告河南理工大学单片机应用与仿真训练设计报告基于单片机的电子琴设计姓名薛吉星学号专业班级自动化088班指导老师刘巍所在学院电气工程与自动化学院20xx年7月5日1河南理工大学本科课程设计...

北邮小学期AVR单片机电子琴实验报告

北京邮电大学信息与通信工程学院小学期AVR单片机实验报告实验题目基于ATmega16L单片机的电子琴设计学生姓名学渣班级20xxXXXXXX班内序号XX学号20xxXXXXXX日期20xx年9月30日同组同学学...

专业方向课程设计报告-基于单片机的电子琴设计

专业方向课程设计报告基于单片机的电子琴设计班级组员组号基于单片机的电子琴设计1设计要求44按键组成16个按键矩阵设计成16个音然后再用一个音频放大模块来使音乐播出的声音变大用户可通过这16个键的随意组合来随意弹...

电子琴课程设计报告

物理与信息工程系课程设计报告课程名称专业综合课题名称基于单片机的电子琴设计专业电子信息科学与技术年班级09级电科3班学号姓名指导教师20##年6月1日目录封面...1目录...2第一章设计要求及工作原理.31.…

毕业设计(论文)基于单片机AT89C51的简易电子琴系统

四川职科技业技术学院毕业设计论文专科20xx届院系移动通信与软件学院课题专业电子信息工程技术班级电信1班学生姓名宁莎指导老师学号20xx01010121日期20年月日四川科技职业技术学院20xx届毕业设计论文开...

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

单片机课程设计任务书题目基于单片机的简易电子琴电路设计初始条件简易电子琴一般具有弹奏一个自然大调7声音阶的功能本课程设计要求用AT89C51等系列芯片实现控制功能利用按键实现音符和音调的输入两位的数码管进行被操...

单片机电子琴设计报告(32篇)