单片机电子琴系统设计.docx

上传人:b****4 文档编号:4036288 上传时间:2022-11-27 格式:DOCX 页数:21 大小:274.87KB
下载 相关 举报
单片机电子琴系统设计.docx_第1页
第1页 / 共21页
单片机电子琴系统设计.docx_第2页
第2页 / 共21页
单片机电子琴系统设计.docx_第3页
第3页 / 共21页
单片机电子琴系统设计.docx_第4页
第4页 / 共21页
单片机电子琴系统设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机电子琴系统设计.docx

《单片机电子琴系统设计.docx》由会员分享,可在线阅读,更多相关《单片机电子琴系统设计.docx(21页珍藏版)》请在冰豆网上搜索。

单片机电子琴系统设计.docx

单片机电子琴系统设计

总 体 概 述

本设计采用AT89S52单片机作为整个系统的控制核心,具有:

音乐琴,电子钟, LED阵列扫描显示,液晶字符显示,循环彩灯五个模块。

音乐琴采用4X4矩阵键盘为输入键盘,共有十六个基本音,并与其他功能组合,具有一定的实用性与趣味性,较好的完成题目要求。

关键词:

单片机矩阵键盘频率。

一、音乐琴系统。

1.电路原理图

 

2.系统板硬件连线

 1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;

 2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上;

3.相关程序容

 音乐产生的方法;

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

现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示

音符

频率(HZ)

简谱码(T值)

音符

频率(HZ)

简谱码(T值)

低1DO

262

63628

#4FA#

740

64860

#1DO#

277

63731

中5SO

784

64898

低2RE

294

63835

#5SO#

831

64934

#2RE#

311

63928

中6LA

880

64968

低3M

330

64021

#6

932

64994

低4FA

349

64103

中7SI

988

65030

#4FA#

370

64185

高1DO

1046

65058

低5SO

392

64260

#1DO#

1109

65085

#5SO#

415

64331

高2RE

1175

65110

低6LA

440

64400

#2RE#

1245

65134

#6

466

64463

高3M

1318

65157

低7SI

494

64524

高4FA

1397

65178

中1DO

523

64580

#4FA#

1480

65198

#1DO#

554

64633

高5SO

1568

65217

中2RE

587

64684

#5SO#

1661

65235

#2RE#

622

64732

高6LA

1760

65252

中3M

659

64777

#6

1865

65268

中4FA

698

64820

高7SI

1967

65283

下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据

低音0-19之间,中音在20-39之间,高音在40-59之间

TABLE:

DW0,63628,63835,64021,64103,64260,64400,64524,0,0

DW0,63731,63928,0,64185,64331,64463,0,0,0

DW0,64580,64684,64777,64820,64898,64968,65030,0,0

DW0,64633,64732,0,64860,64934,64994,0,0,0

DW0,65058,65110,65157,65178,65217,65252,65283,0,0

DW0,65085,65134,0,65198,65235,65268,0,0,0

DW0

2、音乐的音拍,一个节拍为单位(C调)

曲调值

DELAY

曲调值

DELAY

调4/4

125ms

调4/4

62ms

调3/4

187ms

调3/4

94ms

调2/4

250ms

调2/4

125ms

对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。

在这个程序中用到了两个定时/计数器来完成的。

其中T0用来产生音符频率,T1用来产生音拍。

4.程序框图

 

5.汇编源程序

KEYBUFEQU30H

STH0EQU31H

STL0EQU32H

TEMPEQU33H

ORG00H

LJMPSTART

ORG0BH

LJMPINT_T0

START:

MOVTMOD,#01H

SETBET0

SETBEA

WAIT:

MOVP3,#0FFH

CLRP3.4

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

LCALLDELY10MS

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY1

MOVA,P3

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYBUF,#0

LJMPDK1

NK1:

CJNEA,#0DH,NK2

MOVKEYBUF,#1

LJMPDK1

NK2:

CJNEA,#0BH,NK3

MOVKEYBUF,#2

LJMPDK1

NK3:

CJNEA,#07H,NK4

MOVKEYBUF,#3

LJMPDK1

NK4:

NOP

DK1:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,A+DPTR

MOVP0,A

MOVA,KEYBUF

MOVB,#2

MULAB

MOVTEMP,A

MOVDPTR,#TABLE1

MOVCA,A+DPTR

MOVSTH0,A

MOVTH0,A

INCTEMP

MOVA,TEMP

MOVCA,A+DPTR

MOVSTL0,A

MOVTL0,A

SETBTR0

DK1A:

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JNZDK1A

CLRTR0

NOKEY1:

MOVP3,#0FFH

CLRP3.5

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

LCALLDELY10MS

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY2

MOVA,P3

ANLA,#0FH

CJNEA,#0EH,NK5

MOVKEYBUF,#4

LJMPDK2

NK5:

CJNEA,#0DH,NK6

MOVKEYBUF,#5

LJMPDK2

NK6:

CJNEA,#0BH,NK7

MOVKEYBUF,#6

LJMPDK2

NK7:

CJNEA,#07H,NK8

MOVKEYBUF,#7

LJMPDK2

NK8:

NOP

DK2:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,A+DPTR

MOVP0,A

MOVA,KEYBUF

MOVB,#2

MULAB

MOVTEMP,A

MOVDPTR,#TABLE1

MOVCA,A+DPTR

MOVSTH0,A

MOVTH0,A

INCTEMP

MOVA,TEMP

MOVCA,A+DPTR

MOVSTL0,A

MOVTL0,A

SETBTR0

DK2A:

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JNZDK2A

CLRTR0

NOKEY2:

MOVP3,#0FFH

CLRP3.6

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

LCALLDELY10MS

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY3

MOVA,P3

ANLA,#0FH

CJNEA,#0EH,NK9

MOVKEYBUF,#8

LJMPDK3

NK9:

CJNEA,#0DH,NK10

MOVKEYBUF,#9

LJMPDK3

NK10:

CJNEA,#0BH,NK11

MOVKEYBUF,#10

LJMPDK3

NK11:

CJNEA,#07H,NK12

MOVKEYBUF,#11

LJMPDK3

NK12:

NOP

DK3:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,A+DPTR

MOVP0,A

MOVA,KEYBUF

MOVB,#2

MULAB

MOVTEMP,A

MOVDPTR,#TABLE1

MOVCA,A+DPTR

MOVSTH0,A

MOVTH0,A

INCTEMP

MOVA,TEMP

MOVCA,A+DPTR

MOVSTL0,A

MOVTL0,A

SETBTR0

DK3A:

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JNZDK3A

CLRTR0

NOKEY3:

MOVP3,#0FFH

CLRP3.7

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

LCALLDELY10MS

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY4

MOVA,P3

ANLA,#0FH

CJNEA,#0EH,NK13

MOVKEYBUF,#12

LJMPDK4

NK13:

CJNEA,#0DH,NK14

MOVKEYBUF,#13

LJMPDK4

NK14:

CJNEA,#0BH,NK15

MOVKEYBUF,#14

LJMPDK4

NK15:

CJNEA,#07H,NK16

MOVKEYBUF,#15

LJMPDK4

NK16:

NOP

DK4:

MOVA,KEYBUF

MOVDPTR,#TABLE

MOVCA,A+DPTR

MOVP0,A

MOVA,KEYBUF

MOVB,#2

MULAB

MOVTEMP,A

MOVDPTR,#TABLE1

MOVCA,A+DPTR

MOVSTH0,A

MOVTH0,A

INCTEMP

MOVA,TEMP

MOVCA,A+DPTR

MOVSTL0,A

MOVTL0,A

SETBTR0

DK4A:

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JNZDK4A

CLRTR0

NOKEY4:

LJMPWAIT

DELY10MS:

MOVR6,#10

D1:

MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

INT_T0:

MOVTH0,STH0

MOVTL0,STL0

CPLP1.0

RETITABLE:

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB7FH,6FH,77H,7CH,39H,5EH,79H,71H

TABLE1:

DW64021,64103,64260,64400

DW64524,64580,64684,64777

DW64820,64898,64968,65030

DW65058,65110,65157,65178

END

二、时钟系统

1 原理图

2工作原理

利用单片机89S52作为本系统的中控模块。

电路设有四个按键,一个为功能选择开关,能够选择调节时间、日期、第一个闹钟、第二个闹钟;第二个为“加”按钮,能够实现数字的累加;第三个为“减”按钮,能够实现数字的递减;第四个为确定选择开关。

电路程序取用单片机部其中一个定时中断系统作为基准秒频,这样能够使CPU达到最大利用。

功能调节时显示电路仍然能够达到同步显示。

当调节的闹钟时间与时钟显示的时间相等时,声光报警电路动作,取用LM386能够放大单片机输出的音频信号,推动扬声器发出乐耳的音乐,时钟程序的整体设计方案是用单片机驱动电路控制时钟显示,为显示提供电源,用软件程序控制时种运行和各种调节功能。

三、LED列阵扫描显示系统

1. 原理图

2.系统板硬件连线

我们把行列总线接在单片机的i0口,然后把上面分析到的扫描代码送入总线, 就可以得到显示的汉字了。

 在这个例子里,由于一共用到16行,16列, 如果将其全部接入89c51

单片机, 一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。

 实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。

 而行方向16条线则接在p0口和p2口。

3.相关C程序容

#include

unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsignedcharcodegraph[3][8]={{0x12,0x14,0x3c,0x48,0x3c,0x14,0x12,0x00},

                               {0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00},

                               {0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00}

                              };

unsignedcharcount;

unsignedcharta;

voidmain(void)

{

 unsignedchari,j;

 TMOD=0x01;

 TH0=(65536-4000)/256;

 TL0=(65536-4000)%256;

 TR0=1;

 ET0=1;

 EA=1;

 while

(1)

   {

     if(P2_0==0)

       {

         for(i=5;i>0;i--)

         for(j=248;j>0;j--);

         if(P2_0==0)

           {

             count++;

             if(count==3)

               {

                 count=0;

               }

             while(P2_0==0);

           }

       }

   }

}

voidt0(void)interrupt1using0

{

 TH0=(65536-4000)/256;

 TL0=(65536-4000)%256;

 P3=tab[cnta];

 P1=graph[count][cnta];

 ta++;

 if(cnta==8)

   {

     ta=0;

   }

}

四:

LCD字符显示

1        C程序:

#include

#defineucharunsignedchar

sbitrs=P1^2;

sbitrw=P1^1;

sbite=P1^0;

delay(uchartime)

{while(time>0)

 {time--;}

}

voidenrw()

{rs=0;

 rw=0;

 e=0;

 delay(250);

 e=1;

}

write_data(ucharc)

{P2=c;

 rs=1;

 rw=0;

 e=0;

 delay(250);

 e=1;

}

init_lcd(void)//初始化

{

P2=0x01;//清屏幕

enrw();

P2=0x38;//数据长度为8位,双行显示,5*7字符。

enrw();

P2=0x0c;//打开显示开关

enrw();

P2=0x06;//地址计数递增,显示屏不移动

enrw();

}

write_cmd(ucharm)//写命令,注意与写数据的区别

{P2=m;

 enrw();

}

position(ucharrow,ucharcolum)//写位置

{ucharp;

 if(row==1)

   p=0x82+colum-1;

 else

   p=0xC0+colum-1;

   write_cmd(p);

}

display(uchar*s)//写字符串,简单的指针应用

{

for(;*s!

='\0';s++)

 write_data(*s);

}

voidmain()

{unsignedintm,n;

 m=1;

 n=2;

 init_lcd();

 position(m,1);

 display("wolcome");

 position(n,1);

 display("congratulations");

 while

(1){;}

}

2:

原理图

3:

液晶的显示

1.线段的显示点阵图形式液晶由M行×N列个显示单元组成,假设LCD显示屏

有64行,每行有128列,每8列对应1个字节的8个位,即每行由16字节,共16×8=128

个点组成,屏上64×16个显示单元和显示RAM区1024个字节相对应,每一字节的容

和屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H~00FH的16个字

节的容决定,当(000)=FFH时,则屏的左上角显示一条短亮线,长度为8个点;当(3FFH)

=FFH时,则屏的右下角显示一短亮线;当(000H)=FFH,(001H)=00H,(002H)=FFH,

(003H)=00H,…(00EH)=FFH,(00FH)=00H时,则在屏的顶部显示一条由8段亮线

和8条暗线组成的虚线。

这就是LCD显示的基本意思。

2.字符的显示当用LCD显示一个字符时就较复杂了,因为一个字符由6×8或8

×8点阵组成,即要找到和屏上某几个位置对应的显示RAM区的8个字节,并且要使每个

字节的不同的位为‘1’,其它的为‘0’,为‘1’的点亮,为‘0’的点暗,这样一来就组

成某个字符。

但对于带字符发生器的控制器(如T6963C)来说,显示字符就比较简单了,

可让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM

对应的地址,设立光标,在此送上该字符对应的代码即可。

3.汉字的显示汉字的显示一般采用图形方式,事先从微机中提取要显示的汉字的

点阵码,每个汉字占32字节,分左右两半部,各占16字节,左边为1、3、5…,右边为2、

4、6…,根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设

立光标,送上要显示的汉字的第一个字节,光标位置加1,送第二字节,换行按列对齐,

送第三字节…直到32字节显示完就可在LCD上得到一个完整的汉字。

带T6963C的液晶图形显示模块和8031单片机的连接

1.LCD显示控制器T6963CT6963C是点阵式液晶图形显示控制器,能直接和8031

单片机连接(见附图);可以以图形、字符方式或合成显示;部有字符发生器,共128个

字符,允许CPU随时访问显示RAM,并可进行位操作。

2.带T6963C的液晶图形显示模块(MGLS12864T)和8031单片机的连接

带T6963C的液晶图形显示模块MGLS12864T和8031单片机的连接见附图。

由图可以看

出,MGLS12864T的数据线和8031的数据总线相接,它的C/D接8031的地址线A0,/CE

2

接8031外扩系统地址译码器74LS138的一个输出端;MGLS12864T的/WR,/RD分别和8031

的/WR,/RD相接,/RESET,VCC,/HALT接+5V,VO接-5V~-15V可调,VEE接-

5V~-15V;FG、GND接8031的GND。

T6963C的主要指令见表1。

参数1参数2指令代码功能

1.水平位置垂直位置21H光标指针设置

2.地址(低5位)00H22HCGRAM偏置地址设置

3.低字节高字节24H地址指针位置

4.低字节高字节40H文本区首址

5低字节00H41H文本区宽度(字节数/行)

6.低字节高字节42H图形区首址

7.低字节00H43H图形区宽度(字节数/行)

8.无无8XH显示方式设置

9.无无9XH光标闪烁,显示,文本,图形显示

10.无无AXH光标形状选择

11.无无BXH数据自动读/写方式设置

12.D1(仅写才有)无C0—C5H数据一次写/读,地址加1或不变

13.无无D0H屏读

14.无无D8H屏拷贝

15.无无FXH位操作

对T6963C进行操作前应先读状态字,T6963C的状态字中的各位含意如表2。

表2

位状态10

STA0:

指令读写状态准备好忙

STA1:

数据读写状态准备好忙

STA2:

数据自动读状态准备好忙

STA3:

数据自动写状态准备好忙

STA4:

未用

STA5:

控制器运行检测可能性可能不能

STA6:

屏读/拷贝出错状态出错正确

STA7:

闪烁状态检测正常显示关显示

五、参考书目

1、《单片机原理及应用》主编:

万文略大学

2、《单片及应用技术与实例》主编:

沙占友电子工业

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1