51单片机串口通信及电子音响Word文档下载推荐.docx
《51单片机串口通信及电子音响Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《51单片机串口通信及电子音响Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
音乐中所用的声音主要是乐音。
乐音听起来有的高,有的低,这就叫音高。
音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低。
比如,女人唱歌时声带振动频率高,男人唱歌时声带振动频率低,所以男声比女声低。
音乐中所用乐音的范围从每秒钟振动16次的最低音到每秒钟振动4186次的最高音,大约97个。
现在最大的钢琴可以奏出其中的88个音,是音乐范围最大的乐器。
人唱歌时因受生理限制,所能唱出的乐音仅是乐音范围中的一小部分。
不同音高的乐音是用C、D、E、F、G、A、B来表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫唱名。
把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。
两个音之间的距离有两个“半音”的,就叫“全音”。
在钢琴等键盘乐器上,C-D、D-E、F-G、G-A、A-B两音之间隔着一个黑键,它们之间的距离就是全音;
E-F、B-C两音之间没有黑键相隔,它们之间的距离就是半音。
通俗地说,那些唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上#号(如#4、#1)或者b号(如b7、b3)的叫变化音。
#叫升记号,表示把音在原来的基础上升高半音;
b叫降记号,表示把音在原来的基础上降低半音。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
在设计中我将音乐的简谱编成音符表和节拍表。
所谓简谱,是指一种简易的记谱法。
有字母简谱和数字简谱两种。
一般所称的科谱,系指数字简谱。
数字简谱以可动唱名法为基础,用1、2、3、4、5、6、7代表音阶中的7个基本音级,读音为do、re、mi、fa、sol、la、si,休止以O表示。
每一个数字的时值名相当于五线谱的4分音符
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲,不同频率的脉冲经滤波放大电路驱动喇叭,就会发出不同的音调。
对于单片机而言,产生不同频率的脉冲非常方便,可以利用它的定时/计数器T0,工作模式1,设定计数值TH0和TL0,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平。
因为定时参数不同,所以产生不同频率的脉冲信号。
在此情况下,C调的各音符频率与在12Mz的单片机下的计数值T的对照表4.1所示。
T的值决定了TH0和TL0的值,其关系如下。
TH0=T/256,TL0=T%256。
表4.1C调各音符频率与计数值T(12Mz单片机,T0工作模式1)对照表
音符
频率
简谱码(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
低3MI
330
64021
#6LA#
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
1245
65134
466
64463
高3MI
1318
65157
低7LA
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3MI
659
64777
1865
65268
中4FA
698
64820
高7SI
1976
65283
除了音符以外,节拍也是音乐的关键组成部分。
节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现。
如果1/4拍的延时设为0.1秒,则1拍的延时是0.4秒。
只要知道1/4拍的延时时间,其余的节拍延时时间就是它的倍数。
表4.2所示的为1/4节拍和1/8节拍的延时时间设定。
表4.21/4节拍和1/8节拍的延时时间
曲调值(1/4节拍)
延时DELAY
曲调值(1/8节拍)
调4/4
125ms
62ms
调3/4
187ms
调3/4ms
94ms
调2/4
250ms
⑵单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:
计数值,Fi:
内部计时一次为1uS,故其频率为1MHz,Fr:
要产生的频率)
3)其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
4)每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。
但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,
5)建立音乐的步骤:
1、先把吧乐谱的音符找出,然后由上表建立T值表的顺序。
2、把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。
3、简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。
1.6程序流程图
开始
T0初始化并开中断允放T0中断
装入音符到T值到T0
启动T0工作
停止T0工作
T0中断入口
重装TH0,TL0初值
P1.7取反
中断返回
1.7程序设计
源程序设计如下:
org0000h
sjmpmain
org000bh
movth0,r1
movtl0,r0
cplp1.7
reti
main:
movtmod,#01h
movie,#82h
movdptr,#tab
loop:
clra
movca,@a+dptr
movr1,a
incdptr
movr0,a
orla,r1
jznext0
mova,r0
anla,r1
cjnea,#0ffh,next
next:
setbtr0
sjmpnext1
next0:
clrtr0
next1:
movr2,a
loop1:
acalld200c
djnzr2,loop1
ajmploop
d200c:
movr3,#81h
d200b:
mova,#0ffh
d200a:
deca
jnzd200a
decr3
cjner3,#00h,d200b
ret
tab:
db0feh,25h,04h,0feh,25h,02h
db0feh,25h,02h,0fdh,80h,04h
db0feh,84h,02h,0feh,84h,02h
db0feh,84h,04h,0feh,25h,04h
db0feh,25h,02h,0feh,84h,02h
db0feh,0c0h,04h,0feh,84h,02h
db0feh,98h,02h,0feh,84h,02h
db0feh,57h,08h,00h,00h,04h
db0ffh,0ffh
end
上面程序歌曲表为《新年好》的乐谱
项目二:
MCS-51串行口应用实训㈠——双机通信
⑴掌握串行口工作方式的程序设计,掌握单片机通信程序编制方法。
⑵了解实现串行通信的硬环境,数据格式的协议,数据交换的协议。
⑶掌握双机通信的原理和方法。
⑴利用MCS-51单片机串行口,实现双机通信。
⑵本实验将1号实验机键盘上键入的数字显示到2号实验机的数码管上。
1.3实训电路
1.4实训步骤
1.4.1实训连线
用随机所配的串行通信电缆把两台实验仪RS232-9芯串行接口相连。
1.4.2PC环境
1号机发送,2号机接收
①1号机:
在与PC联机状态下,编辑、调试程序,然后编译、连接、下载程序,退出系统,联机状态,释放串口;
在“P.”状态下按F2功能键,使系统进入串行口出借状态,显示
“P......”,键入“EXEC”用连续方式运行程序。
②2号机:
在与PC联机状态下,编辑、调试程序,然后编译、连接、下载程序,退出系统联机状态,释放串口;
③在1号机上输入数字键通过串行口发送到2号机的LED显示器上。
同理亦可实现从2号机键盘输入数字串行发送到1号机的LED显示器上。
1.4.3观察运行结果
以连续方式运行程序,观察LED显示器数据收发是否正常。
1.5编程提示
由任务可知,对于一个单片机系统而言,要求程序要完成的功能一是将本机的按键通过串口用异步通信的方式发送出去,二是对接收到另一单片机传送到串口的数据,先保存下来,再送LED数码管依次显示出来。
因此,程序将为分三个部分组成,其一是随时扫描键盘,如果有键按下,则调用串口发送程序;
其二是串口接收程序,只要有数据到了,就执行数据接收程序,并把数据送到显示数组里;
其三是动态显示程序。
为了完成这三个并行任务,最简单的方法采用中断进行任务分配,将串口接收程序使用串口中断对输入的数据进行检测和接收,将动态显示程序使用定时中断完成,而键盘扫描则采用主程序实时检测。
1.6参考程序流程
1.7程序代码
OUTBITEQU08002;
数码管位控制口
OUTSEGEQU0800;
数码管段控制口
INEQU0991;
键盘读入口
HASRCVEQU20H.0;
接受标志位
LEDBUFEQU40H;
显示缓冲
RECBUFEQU50H;
接受缓冲
ORG0000H
LJMPSTART
ORG0023H;
串口中断入口
LJMPSIN
LEDMAP
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
DELAY:
MOVR7,#0
DELAYLOOP:
DJNZR7,DELAYLOOP
DJNZR6,DELAYLOOP
RET
DISPLAYLED:
MOVR0,#LEDBUF
MOVR1,#6
MOVR2,#00100000B
LOOP:
MOVDPTR,#OUTBIT
MOVA,#0
MOVX@DPTR,A
MOVA,@R0
MOVA,R2
MOVR6,#1
CALLDELAY
RRA
MOVR2,A
INCR0
DJNZR1,LOOP
TESTKEY:
MOVDPTR,IN
MOVXA,@DPTR
CPLA
ANLA,#0FH
KEYTABLE:
DB16H,15H,14H,0FFH
DB13H,12H,11H,10H
DB0DH,0CH,0BH,0AH
DB0EH,03H,06H,09H
DB0FH,02H,05H,08H
DB00H,01H,04H,07H
GETKEY:
MOVDPTR,#OUTBIT
MOVP2,DPH
MOVR0,#LOW
MOVR1,#00100000B
MOVR2,#6
KLOOP:
MOVA,R1
MOVR1,A
MOVXA,@R0
ANLA,@0FH
JNZGOON1
DJNZR2,KLOOP
MOVR2,#0FFH
SJMPWXIT
GOON1:
DECA
RLA
MOVR2,A
MOVR1,LOOPC
EXIT:
MOVDPTR,#KEYTABLE
MOVCA,@A+DPTR
WAETRELEASE:
MOVDPRT,#OUTBIT
CLRA
MOVR6,#10
CALLTESTKEY
JNZWAITRELEASE
START:
MOVSP,#60H
MOVIE,#0
MOVTMOD,#020H;
定时器1工作于方式2
MOVTH1,#0F3H
MOVTL1,#0F3H;
波尔率为2400
ANLPCON,#07FH
ORLPCON,#80H
MOVSCON,#05OH
MOVLEDBUF,#0FFH
MOVLEDBUF+1,#0FFH
MOVLEDBUF+2,#0
SETBTR1
SEEBES
SETBEA
MLOOP:
JBHASRCV,RCVDATA;
接受到数据?
CALLDISPLAYLED;
显示
JZMLOOP
CALLGETKEY
MOVSBUF,A
LJMPMLOOP
RCVDATA:
CLRHASRCV
MOVA,RCVBUF
MOVB,A
MOVDPTR,#LEDMAP
MOVLEDBUF+5,A
MOVA,B
SWAPA
MOVLEDBUF+4,A
SIN:
JNBTI,S0_R
CLRTI
NOP
SJMPS0_RET
S0_R:
CLRRI
MOVRCVBUF,SBUF
SETBHASRCV
S0_RET:
RETI
END
(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的配合和支持)