单片机报告.docx
《单片机报告.docx》由会员分享,可在线阅读,更多相关《单片机报告.docx(21页珍藏版)》请在冰点文库上搜索。
单片机报告
单片机课程设计
实验报告
电子音调发生器
姓名:
杨柳
学号:
09232022
班级:
通信0907
指导教师:
付文秀
电子音调发生器
(一)实验目的
1、了解计算机发声原理。
2、熟悉定时器和键盘扫描电路的工作原理及编程方法。
(二)设计任务及要求
自行设计电路及编写程序制作电子音调发生器,要求:
1、利用开关进行音调选择,即拨动不同的开关产生不同的音调,依次拨动K0~K7,蜂鸣器发出1234567i八个音调。
2、编写2支歌曲,并可进行选择播放。
(三)工作原理及设计思路
(1)发音部分
简单音调的实现
音调由不同频率的方波产生,音调与频率的关系如下所示。
音调
频率(Hz)
X(HEX)
1
523
FC44
2
587
FCAC
3
659
FD09
4
698
FD34
5
784
FD82
6
880
FDC8
7
988
FE06
i
1046
FE22
要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。
在电路板上,产生方波的I/O脚选用P3.7,将单片机的P3.7与蜂鸣器的驱动电路相连。
这样P3.7输出不同频率的方波,蜂鸣器便会发出不同的声音。
每个音节相应的定时器初值X可按下法计算:
(1/2)*(1/f)=(12/fose)*(216-x)
即x=216-(fose/24f)
其中f:
音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=FC44,其它的可同样求得。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍。
乐曲的实现
乐曲的实现就是简单音调实现的组合,将乐曲的音调和节拍制成一个表,通过查表的方式以简单音调发生的方法将乐曲播放出来。
(2)显示部分
显示电路采用LCD显示屏,可显示歌词及歌曲号。
LCD显示的原理为:
LCD液晶显示用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,我们采用2行16个字的1602液晶模块。
LCD1602基于HD44780液晶芯片的,HD44780内置了DDRAM,DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下:
想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码,但具体的写入是要按LCD模块的指令格式来进行的。
一行可有40个地址,在1602中我们就用前16个,第二行也一样用前16个地址。
但是写入地址的时候要注意:
例如第二行第一个字符的地址是40H,那么不能直接写入40H,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码41H,41H这一个字节的代码就能让LCD模块在屏幕的阵点上显示“A”字。
这是因为在LCD模块上固化了字模存储器,这就是CGROM和CGRAM。
HD44780内置了192个常用字符的字模,存于字符产生器CGROM(CharacterGeneratorROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(CharacterGeneratorRAM)。
其部分对应关系如下:
若要显示字符,就要先定义字符显示的位置,再将字符代码写入。
(四)硬件描述
1、总体框图:
2、仿真原理图:
(五)程序清单
RSBITP2.0;定义液晶显示端口标号
RWBITP2.1
EBITP2.2
;********************************************
T0THEQU24H;T0两个暂存变量
T0TLEQU23H
ORG0000H
LJMPINITION
ORG000BH
LJMPT0INT
ORG0100H
;********************************************
;*************************液晶初始化******************
INITION:
MOVSP,#70H
MOVP0,#01H;清屏
CALLENABLE
MOVP0,#38H;8位,2行显示
CALLENABLE
MOVP0,#0CH;屏显on,关光标
CALLENABLE
MOVP0,#06H;计数地址加1,自动右移
CALLENABLE
;******************************************
;开机提示
;******************************************
MOVP0,#80H
CALLENABLE
MOVDPTR,#TABLE0;写数据的第一行
CALLWRITE1
MOVP0,#00010000B;光标左移两位
CALLENABLE
MOVP0,#00010000B
CALLENABLE
CALLDEL0
LJMPMAIN
;*********************************************写指令
ENABLE:
CLRRS
CLRRW
SETBE
CALLDEL0
CLRE
RET
;**********************************************写数据
WRITE1:
MOVR1,#00H;查表程序,从表头到表尾
A1:
MOVA,R1
MOVCA,@A+DPTR
CALLWRITE2
INCR1
CJNEA,#00H,A1;未到字符串末尾继续
RET
WRITE2:
MOVP0,A;直接将数据写入液晶屏
SETBRS
CLRRW
SETBE
CALLDEL0
CLRE
RET
DEL0:
MOVR4,#020H
C0:
MOVR5,#020H
C1:
DJNZR5,C1
DJNZR4,C0
RET
;******************************************
TABLE0:
DB'WELCOMHERE',00H
;*************************内存初始化******************
INITIAL:
MOVR3,#08H
MOVR0,#30H
M1:
MOV@R0,#00H
INCR0
DJNZR3,M1
RET
;*************************选择按键播放八个音调******************
MAIN:
MOVSP,#80H;初始化堆栈
MOVTMOD,#11H;定时器0工作方式1,定时器1工作方式1
SETBEA
SETBET0;计数器0允许
SETBET1;计数器1允许
START:
SETBP3.7;关蜂鸣器
CLRTR0;定时器不允许
SCAN:
;键盘扫描
MOVA,P1
CJNEA,#0FFH,SU_KEY;判断键盘按下,跳到SU_KEY,若未按,继续扫描
NOP
LJMPSCAN
SU_KEY:
SU_KEY1:
JBP1.0,SU_KEY2;如果不是第1个键按下,转
MOVDPH,#0FCH
MOVDPL,#44H
SJMPPLAY
SU_KEY2:
JBP1.1,SU_KEY3;如果不是第2个键按下,转
MOVDPH,#0FCH
MOVDPL,#0ACH
SJMPPLAY
SU_KEY3:
JBP1.2,SU_KEY4;如果不是第3个键按下,转
MOVDPH,#0FDH
MOVDPL,#09H
SJMPPLAY
SU_KEY4:
JBP1.3,SU_KEY5;如果不是第4个键按下,转
MOVDPH,#0FDH
MOVDPL,#34H
SJMPPLAY
SU_KEY5:
JBP1.4,SU_KEY6;如果不是第5个键按下,转
MOVDPH,#0FDH
MOVDPL,#82H
SJMPPLAY
SU_KEY6:
JBP1.5,SU_KEY7;如果不是第6个键按下,转
MOVDPH,#0FDH
MOVDPL,#0C8H
SJMPPLAY
SU_KEY7:
JBP1.6,SU_KEY8;如果不是第7个键按下,转
MOVDPH,#0FEH
MOVDPL,#06H
SJMPPLAY
SU_KEY8:
JBP1.7,KEY1;如果不是第8个键按下,转
MOVDPH,#0FEH
MOVDPL,#22H
SJMPPLAY
PLAY:
MOVT0TH,DPH;存高位字符
MOVT0TL,DPL;存低位字符
MOVTH0,T0TH
MOVTL0,T0TL
SETBTR0;启动定时器0
MOVR2,#01B;1/4拍
DJNZR2,PLAY
LCALLDELAY
SJMPJUDGE
JUDGE:
JBP2.4,START;按键未按下,则继续扫描,否则,开始放音乐
;*************************选择按键播放音乐******************
KEY1:
JBP2.5,KEY2;第一个键(P2.5)按下,放音音乐1
MOVR2,#00H
LCALLMODD;歌曲号显示
MOVDPTR,#MU_TAB1
AJMPMUSIC
KEY2:
JBP2.6,KEY3;第二个键(P2.6)按下,放音乐2
MOVR2,#01H
LCALLMODD;歌曲号显示
MOVDPTR,#MU_TAB2
AJMPMUSIC
KEY3:
JBP2.7,NEXT_2;第三个键(P2.7)按下,放音乐3
MOVR2,#02H
LCALLMODD;歌曲号显示
MOVDPTR,#MU_TAB3
AJMPMUSIC
NEXT_2:
LJMPSTART;返回
MUSIC:
MOVTMOD,#01H
MOVIE,#82H;允许T0中断
MOVR7,#00H
LOOP:
CLRA
MOVCA,@A+DPTR;查表取代码
MOVR1,A;定时器高八位存R1
INCDPTR
PUSHDPH;保护现场
PUSHDPL
GECI1:
JBP2.5,GECI2;第一个键(P2.5)按下,显示歌词1
MOVDPTR,#GE1
AJMPGECI
GECI2:
JBP2.6,GECI3;第二个键(P2.6)按下,显示歌词2
MOVDPTR,#GE2
AJMPGECI
GECI3:
JBP2.7,TIAOCHU;第三个键(P2.7)按下,显示歌词3
MOVDPTR,#GE3
AJMPGECI
TIAOCHU:
LJMPSTART
GECI:
LCALLQINGCHU
MOVP0,#0C0H;显示的位置
CALLENABLE
XIANSHI1:
MOVA,R7;查表取音乐汉语拼音显示
MOVCA,@A+DPTR
CALLWRITE2
INCR7
CJNEA,#00H,XIANSHI1
MOVP0,#00010000B;将光标左移一位
CALLENABLE
MOVP0,#00010000B;将光标左移一位
CALLENABLE
POPDPL
POPDPH
CLRA
MOVCA,@A+DPTR
MOVR0,A;定时器低八位存R0
ORLA,R1
JZNEXT0;相或结果全0为休止符
MOVA,R0
ANLA,R1
CJNEA,#0FFH,NEXT;相与结果为0FFH表示乐曲结束
MOVP0,#01H;清屏
CALLENABLE
LJMPINITION;从头开始演奏
NEXT:
MOVT0TH,R1;装定时初值
MOVTH0,T0TH
MOVT0TL,R0
MOVTL0,T0TL
SETBTR0;启动定时器
SJMPNEXT1
NEXT0:
CLRTR0;关闭定时器
NEXT1:
CLRA
INCDPTR
MOVCA,@A+DPTR;查延时常数
MOVR2,A
LOOP1:
ACALLD200
DJNZR2,LOOP1;控制延时次数
INCDPTR
AJMPLOOP
D200:
MOVR3,#81H;延时程序
D200B:
MOVA,#0FFH
D200A:
DECA
JNZD200A
DECR3
CJNER3,#00H,D200B
RET
QINGCHU:
MOVA,#00100000B
MOVP0,#0C0H;将第二行的第一位置0
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第二位置0
MOVP0,#0C1H
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第三位置0
MOVP0,#0C2H
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第四位置0
MOVP0,#0C3H
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第五位置0
MOVP0,#0C4H
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第六位置0
MOVP0,#0C5H
LCALLENABLE
LCALLWRITE2
MOVA,#00100000B;将第二行的第七位置0
MOVP0,#0C6H
LCALLENABLE
LCALLWRITE2;将第二行的第三位置0
;***************************************************
;定时器0中断子程序,定时音乐
;***************************************************
T0INT:
;中断服务子程序
MOVTH0,T0TH
MOVTL0,T0TL
CPLP3.7;反相输出,演示音乐
RETI
;******************************************
;显示
;******************************************
MODD:
MOVP0,#8EH
LCALLENABLE
MOVA,R2
MOVDPTR,#TABLE2
MOVCA,@A+DPTR
LCALLWRITE2
RET
TABLE2:
DB31H,32H,33H
GE1:
db'happy',00h,'happy',00h,'new',00h,'year',00h,'happy',00h,'happy',00h,'new',00h,'year',00h
db'happy',00h,'happy',00h,'new',00h,'year',00h,'to',00h,'you',00h,'all',00h
GE2:
DB'happy',00H,'happy',00H,'birthday',00H,'birthday',00H,'to',00H,'you',00H
DB'happy',00H,'happy',00H,'birthday',00H,'birthday',00H,'to',00H,'you',00H
DB'happy',00H,'happy',00H,'birthday',00H,'birthday',00H,'to',00H,'you',00H
DB'happy',00H,'happy',00H,'birthday',00H,'birthday',00H,'to',00H,'you',00H
GE3:
DB'twinkle',00h,'twinkle',00h,'twinkle',00h,'twinkle',00h,'little',00h,'star',00h,'star',00h,'how',00h,'I',00h,'wonder',00h,'wonder',00h,'what',00h,'you',00h,'are',00h,'up',00h,'up',00h,'above',00h,'above',00h,'theworld',00h,'so',00h,'high',00h,'like',00h,'like',00h,'a',00h,'diamond',00h,'in',00h,'the',00h,'sky',00h
;*************************延时子程序******************
DELAY:
MOV30H,#100;延长时间等待,键盘消抖
D1:
MOVR5,#200
D2:
DJNZR5,D2
DJNZ30H,D1
RET
;*******************happynewyear******************************
MU_TAB1:
DB0FCH,44H,04H,0FCH,44H,04H
DB0FCH,44H,04H,0FBH,04H,06H
DB0FDH,09H,04H,0FDH,09H,04H
DB0FDH,09H,06H,0FCH,44H,06H
DB0FCH,44H,04H,0FDH,09H,04H
DB0FDH,82H,04H,0FDH,82H,04H
DB0FDH,34H,04H,0FDH,09H,04H
DB0FCH,0ACH,06H
DB0FCH,0ACH,04H,0FDH,09H,04H
DB0FDH,34H,04H,0FDH,34H,04H
DB0FDH,09H,04H,0FCH,0ACH,04H
DB0FDH,09H,04H,0FCH,44H,04H
DB0FCH,44H,04H,0FDH,09H,04H
DB0FCH,0ACH,04H,0FBH,04H,04H
DB0FCH,0CH,04H,0FCH,0ACH,04H
DB0FCH,44H,06H
DB0FFH,0FFH
;*******************twinklestar******************************
MU_TAB3:
DB0FCH,44H,04H,0FCH,44H,04H,0FDH,82H,04H,0FDH,82H,04H
DB0FDH,0C8H,04H,0FDH,0C8H,04H,0FDH,82H,06H
DB0FDH,34H,04H,0FDH,34H,04H,0FDH,09H,04H,0FDH,09H,04H
DB0FCH,0ACH,04H,0FCH,0ACH,04H,0FCH,44H,06H
DB0FDH,82H,04H,0FDH,82H,04H,0FDH,34H,04H,0FDH,34H,04H
DB0FDH,09H,04H,0FDH,09H,04H,0FCH,0ACH,06H
DB0FDH,82H,04H,0FDH,82H,04H,0FDH,34H,04H,0FDH,34H,04H
DB0FDH,09H,04H,0FDH,09H,04H,0FCH,0ACH,06H
DB0FFH,0FFH,0FFH,0FFH
;*******************happybirthday******************************
MU_TAB2:
DB0FDH,82H,04H,0FDH,82H,04H,0FDH,0C8H,04H,0FDH,82H,04H
DB0FEH,22H,04H,0FEH,06H,06H
DB0FDH,82H,04H,0FDH,82H,04H,0FDH,0C8H,04H,0FDH,82H,04H
DB0FEH,56H,04H,0FEH,22H,06H
DB0FDH,82H,04H,0FDH,82H,04H,0FEH,0C1H,04H,0FEH,22H,04H
DB0FEH,06H,04H,0FDH,0C8H,06H
DB0FEH,9AH,04H,0FEH,9AH,04H,0FEH,85H,04H,0FEH,22H,04H
DB0FEH,56H,04H,0FEH,22H,06H
DB0FFH,0FFH,0FFH,0FFH
END
(六)实现功能介绍
1、可以播放1234567i八个音调
2、可以实现3首歌的选曲功能
3、可以通过LCD显示歌曲号及歌词
(七)关键技术分析
(1)键盘读取程序
键盘键值读取程序包括键盘扫描、消除抖动,按键按下与否会影响与按键相连接的端口的电平的高低与否,因此通过判断端口的电平高低便可判断按键是否按下,从而选择程序执行方向。
因为键盘为机械开关,容易引入抖动。
为了消除抖动干扰,在程序中要加入消除抖动的部分,即延时程序。
(2)中断计时
程序中采用中断控制方波的输出,定时器0计数时间到时调用中断,使方波输出端口取反,从而改变计时常数,输出不同频率的方波,产生声音,在播放音乐的时候通过延时程序通过控制音节的节拍。
(3)蜂鸣器发声
蜂鸣器的以PNP三极管做驱动,三极管和P3.7相连,所以当P3.7口输出的高低电平交替变化的时候可以使蜂鸣器震动发声。
(4)LCD显示
LCD1602的D0~D7和C52的P0.0~P0.7相连,可以将命令和数据通过P0口输出到LCD,从而控制LCD的显示。
主要指令要求可参看程序。
(八)调试时的问题
此次实验的的硬件电路很简单,外围电路主要有8个按键,复位电路,晶振电路,蜂鸣器及LCD显