设计题目 单片机电子琴
目录
第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语言环境语言的不熟悉,后来一起和同学研究,而一些课程设计中的故障,也请同学帮忙参考一下,最终找到了解决问题的答案。我感觉自己在设计方面提高很大,特别是在设计程序时,逻辑思维能力有所加强,同时对以前所学的知识有了更深刻的认识,并进一步的得到了巩固和提高,充分的做到了理论联系实际,也使我认识到理论与实际的差别,通过该课程设计,不但对单片机有了较为全面的认识,而且相关的知识也有了足够的掌握,我感觉最重要的还是设计思维的形成。更发现自己在平时学习中的缺陷。对以后的学习也有很大的帮助。
两周的课程设计,我所收获的不仅是学习知识方面,更多的是生活方面。我了解到,在我们生活中,应该学会与别人共同分享,分享知识,分享问题,这样更有助于我们的交流,有利于我们共同进步,有利于我们对学习养成良好的兴趣。
最后,我要感谢那些带我们课程设计的老师们,感谢你们对我们的耐心,感谢你们对我们的鼓励,让我们有信心继续下去,成功走到最后。