单片机竞赛论文 电子琴1.docx
- 文档编号:9619593
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:25
- 大小:232.48KB
单片机竞赛论文 电子琴1.docx
《单片机竞赛论文 电子琴1.docx》由会员分享,可在线阅读,更多相关《单片机竞赛论文 电子琴1.docx(25页珍藏版)》请在冰豆网上搜索。
单片机竞赛论文电子琴1
一、设计任务
应用单片机制作一个电子音乐琴,使其能够弹奏音乐。
二、要求
1、基本要求:
1、具有七个基本键。
(1234567)
2、音调输出清晰正确。
2、发挥部分:
1、扩展出高、低各7个音符键。
2、使其具有延音效果。
3、具有乐谱回放功能。
总体概述
本设计采用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;
unsignedcharcnta;
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];
cnta++;
if(cnta==8)
{
cnta=0;
}
}
四:
LCD字符显示
1C程序:
#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、《单片及应用技术与实例》主编:
沙占友电子工业出版社
3、《C程序设计》主编:
谭浩强清华大学出版社
组号:
第23组
参赛队员:
尤明
段宁
邵凌
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机竞赛论文 电子琴1 单片机 竞赛 论文 电子琴