《马福文多功能高级电子琴课设报告(共23页).docx》由会员分享,可在线阅读,更多相关《马福文多功能高级电子琴课设报告(共23页).docx(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上单片机课程设计多功能高级电子琴实验报告班 级:通信1507姓 名: 马福文学 号:指导老师:于振宇2017年6月13日目录1. 应用背景及需求分析1.计算机得到广泛普及,利用计算机发声原理,液晶显示原理,红外扫描原理能够做出单片机多功能电子琴。2.汇编语言成为学习的风尚,编程的基本思想深入人心。3.熟悉定时器,蜂鸣器,液晶显示屏,数码管,LED灯,红外接收器,中断程序和键盘扫描电路的工作原理及编程方法,在市场上占有一定份额。2. 设计目标及性能指标利用JD51开发板上的定时器,蜂鸣器,液晶显示屏,数码管,LED灯,红外接收器,红外遥控器,键盘按键设计高级电子琴,要求:
2、1、 扫描方式,读取红外遥控器键值,并把获得的键值显示于8个LED,同时蜂鸣器响。2、 当所按键是09时,1个七段显示器显示对应的数字。液晶屏显示相应的数字。3、 当所按键是18时,蜂鸣器发出音调1、2、3、4、5、6、7、i。4、 按下CH+时,8个LED呈跑马灯闪烁三个循环。5、 当所按键是0时,播放同一首歌。3.设计原理音节由不同频率的方波产生,音节与频率的关系通过查表可得。要产生音频方波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此
3、频率的方波。 在JD51单片机上,产生方波的I/O脚选用P2.4,通过跳线选择器将单片机的P2.4与蜂鸣器的驱动电路相连。这样P2.4输出不同频率的方波,蜂鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍。每个音节相应的定时器初值X可按下法计算: (1/2)*(1/f)=(12/fose)*(216-x)即 x=216-(fose/24f)其中f:音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H 其
4、它的可同样求得。 表1 音调频率(Hz)X(HEX)1262F9212294F9E13330FA8C4349FAD85392FB686440FBE97494FC5Bi523FC8F4.设计方案及思路数码管显示电路4.1 总体框图液晶显示电路 红外遥控器控制,键盘控制 89C51 单片机 LED灯输出电路声音输出电路按键重播控制音乐播放控制红外遥控控制程序中断控制 硬件图4.2蜂鸣电路模块鸣器驱动电路和89C51组成。 选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100MA驱动电流。当89C51输出为低电平时蜂鸣器产生蜂鸣音,89C51 输出为高电平时,蜂鸣器不发声。5.软件设计流程及描述根据
5、要实现的功能,流程图如下:熟悉定时器和键盘扫描电路的工作原理及编程方法。开始系统初始化判断按键判断按键电子琴LED,数码管,液晶显示播放音调播放音乐,中断服务红外遥控音乐5.1软件设计思路高级电子琴主要的工作是将红外遥控器的信息读取,然后根据按键,用计数器输出相对应的频率,实现电子琴的音调。程序主要为8部分,红外接收、键盘扫描、中断计时、LED灯显示、数码显示、液晶显示、音乐播放、主程序,他们分别执行不同的功能。5.2各部分功能介绍5.2.1红外接收程序 红外发送以及接收部分,遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms仍
6、未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。一个完整的全码=引导码+用户码+用户码+数据码+数据反码。其中,引导码高电平4.5ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行什么动作的判断。连发代码是在持续按键时发送的码。它告知接收端,某键是在被连续地按着。5.2.2键盘键值读取程序键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。按键的识别主要有两种方法:行反转法和行
7、扫描法。因为键盘为机械开关,容易引入抖动。为了消除抖动干扰,在程序中要加入消除抖动的部分。5.2.3中断计时中断部分,中断定时器1主要负责输出不同频率的方波,产生声音,中断定时器1主要是计时按键时间及按键间隔时间的功能,在播放音乐的时候,还担任着播放音乐的节拍的任务。5.2.4 LED灯显示这个部分主要是点亮LED灯,实现灯与音调的对应亮灭。5.2.5数码管显示这个部分主要是数码管显示数字,实现数字与音调的对应显示以及循环滚动显示。5.2.6液晶显示这个部分主要是液晶显示屏显示文字,实现音调与相应的文字和歌曲名称的对应。5.2.7音乐播放音乐播放部分主要是播放音乐。 5.2.8主程序主程序主要
8、是随时发出按键的声音功能,并且通过红外的扫描,判断是否是播放按键声音还是播放音乐,还是继续发出按键声音。MAIN: JNB P3.2,IR ;遥控扫描 LJMP MAIN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。 ;=; 解码程序IR: ;以下对遥控信号的9000微秒的初始低电平信号的识别 MOV R6,#10IR_SB: ACALL DELAY882 ;调用882微秒延时子程序 JB P3.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序 DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退
9、出解码程序 ;识别连发码,和跳过4.5ma的高电平。 JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲 ACALL DELAY2400 JNB P3.2,IR_Rp ;这里为低电平,认为是连发码信号。 ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码 ;以下32位数据码的读取,0和的识别 MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 IR_4BYTE: MOV R3,#8IR_8BIT: JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
10、 MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0 LCALL DELAY1000IR_8BIT_0: MOV A,R1 ;将R1中地址的给A RRC A ;将C中的值0或1移入A中的最低位 MOV R1,A ;将A中的数暂时存放在R1中 DJNZ R3,IR_8BIT ;接收地址码的高8位 INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据, ;存放在1AH/1BH/1CH/1DH的RAM中 ;解码成功 JMP IR_GOTO IR_
11、Rp: ;这里为重复码执行处 ;按住遥控按键时,每过108ms就到这里来 JMP IR_GOTO IR_ERROR: ;错语退出 LJMP MAIN ;退出解码子程序 ;=6.实验源程序/*程序功能说明*扫描方式,读取红外遥控器键值,并把获得的键值显示于8个LED,同时蜂鸣器响.当所按键是09时,1个七段显示器显示对应的数字。液晶屏显示相应的数字当所按键是18时,蜂鸣器发出音调1、2、3、4、5、6、7、i。按下CH+时,8个LED呈跑马灯闪烁三个循环。当所按键是0时,播放同一首歌*/ ;端口引脚定义区LCD_RSBITP2.6 ;1602数据命令选择端口LCD_RWBITP3.6 ;1602
12、读写选择端口LCD_ENBITP2.7 ;1602使能端口LCD_DATAEQUP0 ;1602数据端口;变量声明区ALL_FLAGEQU20H ;标志位LCD_FLAGEQUALL_FLAG.7;1602读忙标志位LCD_DATEQU22H ;1602数据命令字DELAYEDEQU23H ;延时字ORG 0000H LJMP MAINorg 000bhjmp tim0ORG 0030HMAIN: JNB P3.2,IR ;遥控扫描 LJMP MAIN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。 ;=; 解码程序IR: ;以下对遥控信号的9000微秒的初始低电平信号的
13、识别 MOV R6,#10IR_SB: ACALL DELAY882 ;调用882微秒延时子程序 JB P3.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序 DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序 ;识别连发码,和跳过4.5ma的高电平。 JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲 ACALL DELAY2400 JNB P3.2,IR_Rp ;这里为低电平,认为是连发码信号。 ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码 ;以下32位数据码的读取,
14、0和的识别 MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 IR_4BYTE: MOV R3,#8IR_8BIT: JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0 LCALL DELAY1000IR_8BIT_0: MOV A,R1 ;将R1中地址的给A RRC A ;将C中的值0或1移入A中的最低位 MOV R1,A ;将A中的数暂时存放
15、在R1中 DJNZ R3,IR_8BIT ;接收地址码的高8位 INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据, ;存放在1AH/1BH/1CH/1DH的RAM中 ;解码成功 JMP IR_GOTO IR_Rp: ;这里为重复码执行处 ;按住遥控按键时,每过108ms就到这里来 JMP IR_GOTO IR_ERROR: ;错语退出 LJMP MAIN ;退出解码子程序 ;=;遥控执行部份IR_GOTO: ;判断两个数据码是否相反 MOV A,1CH CPL A CJNE A,1DH,IR_ERROR ;两个数据码
16、不相反则退出 MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来! CLR P2.4 ;蜂鸣器鸣响嘀嘀嘀的声音,表示解码成功 LCALL DELAY2400 LCALL DELAY2400 LCALL DELAY2400 SETB P2.4 ;蜂鸣器停止 LCALL JZPD;键值判断完回到这一点 ;清除遥控值使连按失效 MOV 1AH,#00H MOV 1BH,#00H MOV 1CH,#00H MOV 1DH,#00H LJMP MAIN;键值判断JZPD:MOV A,1DHIRD0: CJNE A,#0E9H,IRD1 ;按键0判断显示MOV R3,#200 MAIN0:
17、MOV TMOD,#01H ;初始化,工作方式1 MOV TL0,#21H ;写入计数初值 MOV TH0,#0F9H SETB TR0 ;启动计数WAIT0:JNB TF0,WAIT0 CLR TF0 DJNZ R3,MAIN0LCALLLCD_INITMOVLCD_DAT,#30HLCALLLCD_W_DATA LJMP MUSTART1 RETIRD1: CJNE A,#0F3H,IRD2 ;按键1判断显示MOV R3,#100MAIN01:MOV TMOD,#01H ;初始化,工作方式1 MOV TL0,#21H ;写入计数初值 MOV TH0,#0F9H SETB TR0 ;启动计数
18、 WAIT1:JNB TF0,WAIT1 CLR TF0 CPLP2.4DJNZ R3,MAIN01 ;LCALLLCD_INITMOVDPTR,#ZIFUCHUANMOVLCD_DAT,#01HLCALLLCD_SET_POSITIONLCALLLCD_PRINT_STR;MOVLCD_DAT,#31H;LCALLLCD_W_DATARETIRD2: CJNE A,#0E7H,IRD3 ;按键2判断显示MOV R3,#200 MAIN02:MOV TMOD,#01H MOV TL0,#0E1H ;写入计数初值 MOV TH0,#0F9H SETB TR0WAIT2:JNB TF0,WAIT2
19、 CLR TF0 CPL P2.4 ;蜂鸣器响 DJNZ R3,MAIN02LCALLLCD_INITMOVLCD_DAT,#02HLCALLLCD_SET_POSITIONMOVLCD_DAT,#32HLCALLLCD_W_DATARETIRD3: CJNE A,#0A1H,IRD4 ;按键3判断显示MOV R3,#200MAIN03:MOV TMOD,#01H MOV TL0,#08CH MOV TH0,#0FAH SETB TR0WAIT3:JNB TF0,WAIT3 CLR TF0 CPL P2.4 DJNZ R3,MAIN03LCALLLCD_INITMOVLCD_DAT,#03HL
20、CALLLCD_SET_POSITIONMOVLCD_DAT,#33HLCALLLCD_W_DATARETIRD4: CJNE A,#0F7H,IRD5 ;按键4判断显示MOV R3,#200MAIN04:MOV TMOD,#01H MOV TL0,#0D8H MOV TH0,#0FAH SETB TR0WAIT4:JNB TF0,WAIT4 CLR TF0 CPL P2.4 DJNZ R3,MAIN04LCALLLCD_INITMOVLCD_DAT,#04HLCALLLCD_SET_POSITIONMOVLCD_DAT,#34HLCALLLCD_W_DATARETIRD5: CJNE A,#
21、0E3H,IRD6 ;按键5判断显示MOV R3,#200 MAIN05:MOV TMOD,#01H MOV TL0,#068H MOV TH0,#0FBH SETB TR0WAIT5:JNB TF0,WAIT5 CLR TF0 CPL P2.4 DJNZ R3,MAIN05LCALLLCD_INITMOVLCD_DAT,#05HLCALLLCD_SET_POSITIONMOVLCD_DAT,#35HLCALLLCD_W_DATARETIRD6: CJNE A,#0A5H,IRD7 ;按键6判断显示MOV R3,#200 MAIN06:MOV TMOD,#01H MOV TL0,#0E9H M
22、OV TH0,#0FBH SETB TR0WAIT6:JNB TF0,WAIT6 CLR TF0 CPL P2.4 DJNZ R3,MAIN06LCALLLCD_INITMOVLCD_DAT,#06HLCALLLCD_SET_POSITIONMOVLCD_DAT,#36HLCALLLCD_W_DATARETIRD7: CJNE A,#0BDH,IRD8 ;按键7判断显示MOV R3,#200 MAIN07:MOV TMOD,#01H MOV TL0,#05BH MOV TH0,#0FCH SETB TR0WAIT7:JNB TF0,WAIT7 CLR TF0 CPL P2.4 DJNZ R3,
23、MAIN07LCALLLCD_INITMOVLCD_DAT,#07HLCALLLCD_SET_POSITIONMOVLCD_DAT,#37HLCALLLCD_W_DATARETIRD8: CJNE A,#0ADH,IRD9 ;按键8判断显示MOV R3,#200 MAIN08:MOV TMOD,#01H MOV TL0,#08FH MOV TH0,#0FCH SETB TR0WAIT8:JNB TF0,WAIT8 CLR TF0 CPL P2.4 DJNZ R3,MAIN08LCALLLCD_INITMOVLCD_DAT,#38HLCALLLCD_W_DATARETIRD9:CJNE A,#0
24、B5H,IRDp ;按键9判断显示 MOV R3,#200MAIN09:MOV TMOD,#01H ;初始化,工作方式1 MOV TL0,#21H ;写入计数初值 MOV TH0,#0F9H SETB TR0 ;启动计数WAIT9:JNB TF0,WAIT9 CLR TF0 DJNZ R3,MAIN09LCALLLCD_INITMOVLCD_DAT,#01HLCALLLCD_SET_POSITIONMOVLCD_DAT,#39HLCALLLCD_W_DATARETIRDp:CJNE A,#0B8H,IRDEND;按键PLAY判断显示LCALLLCD_INITMOVLCD_DAT,#50HLCA
25、LLLCD_W_DATAMOV A,#0FEH;给A赋值成MOV R0,#24LOOP:MOV P1,A;点亮LED1MOV R3,#150MAIN10:MOV TMOD,#01H ;初始化,工作方式1 MOV TL0,#21H ;写入计数初值 MOV TH0,#0F9H SETB TR0 ;启动计数WAIT10:JNB TF0,WAIT10 CLR TF0 DJNZ R3,MAIN10RL A;A的值循环左移一位DJNZ R0,LOOP MOV 1AH,#00H MOV 1BH,#00H MOV 1CH,#00H MOV 1DH,#00HLJMP MAINIRDEND:RET;=; 延时子程
26、序;=882;1.085x (202x4)+5)=882DELAY882: MOV R7,#202DELAY882_A: NOP NOP DJNZ R7,DELAY882_ARET ;=1000;1.085x (229x4)+5)=999.285DELAY1000: MOV R7,#229DELAY1000_A: NOP NOP DJNZ R7,DELAY1000_ARET;=2400;1.085x (245x9)+5)=2397.85DELAY2400: MOV R7,#245DELAY2400_A: NOP NOP NOP NOP NOP NOP NOP DJNZ R7,DELAY2400
27、_ARET;=; 延时子程序 TAO;=882;1.085x (202x4)+5)=882MUSTART1: ;歌曲的播放程序mov tmod,#01h ;设定时方式mov ie,#82h ;开中断start0:mov 30h,#00h ; next: mov a,30hmov dptr,#tablemovc a,a+dptr ;查表取音调和节拍mov r2,ajz end0 ;为零,不进行处理.anl a,#0fhmov r5,a ;将节拍存入R5mov a,r2swap aanl a,#0fhjnz sing ;根据音调决定是否演奏.clr tr0jmp DD sing: dec amov
28、 22h,a ;将音调存入22H.rl amov dptr,#DIAOZImovc a,a+dptr ;根据音调决定定时器初值.mov th0,a ;放入TH0mov 21h,amov a,22hrl ainc amovc a,a+dptrmov tl0,a ;放入TL0mov 20h,asetb tr0 ;启动定时DD: call delayinc 30hjmp nextend0: clr tr0SETBP2.4MOV IE,#01H;jmp START0LJMPIRD0tim0: ;定时器中断服务程序push accpush pswmov tl0,20h ;重赋初值.mov th0,21h
29、cpl p2.4 pop pswpop accreti delay: mov r7,#02h ;延时子程序 d2: mov r4,#187 d3: mov r3,#248djnz r3,$djnz r4,d3djnz r7,d2djnz r5,DELAYRETDIAOZI: ;决定音调的定时初值. DW64580,64684,64777,64820 DW64898,64968,65030,64260 DW64400,64524,65058,63835,64021table: ;决定音调和节拍的表格,不同的歌曲只是此表不同,同一首歌DB88H,14H,24H,36H,42H,34H,14H,28
30、H,14H,94H;DB1FH,88H,14H,24H,34H,32H,42H,54H,14H;DB46H,32H,54H,22H,32H,32H,22H,2CH,38H,54H,74H;DB76H,62H,68H,54H,52H,62H,74H,62H,52H,3FH;DB46H,42H,54H,64H,54H,42H,32H,28H,0A4H,0A2H;DB92H,84H,94H,1FH,0B8H,68H,46H,52H,68H;DB74H,72H,72H,74H,62H,52H,3FH,0B8H,68H;DB46H,52H,68H,64H,62H,62H,64H,42H,32H,2FH;
31、DB58H,14H,24H,36H,42H,34H,12H,12H,26H,22H,24H,22H,12H;DB94H,9CH,0A8H,0A6H,92H,84H,64H,54H,22H,22H,46H,42H,44H,32H,22H,5FHDB00RET/*1602读命令函数,高位存至LCD_LAG中*/LCD_R_DATA:MOVLCD_DATA,#0FFHLCD_BUSY:CLRLCD_RSSETBLCD_RWNOPSETBLCD_ENNOPMOVAcc,LCD_DATAMOVC,Acc.7MOVLCD_FLAG,CCLRLCD_ENNOPJBLCD_FLAG,LCD_BUSYRET/*
32、1602写数据函数,数据存在LCD_DAT*/LCD_W_DATA:LCALLLCD_R_DATASETBLCD_RSCLRLCD_RWNOPMOVLCD_DATA,LCD_DATSETBLCD_ENNOPCLRLCD_ENRET/*1602写命令函数,命令存在LCD_DAT,检测忙信号*/LCD_W_CMD:LCALLLCD_R_DATACLRLCD_RSCLRLCD_RWNOPMOVLCD_DATA,LCD_DATSETBLCD_ENNOPCLRLCD_ENRET/*1602写命令函数,命令存在LCD_DAT,不检测忙信号*/LCD_CMD:CLRLCD_RSCLRLCD_RWNOPMOV
33、LCD_DATA,LCD_DATSETBLCD_ENNOPCLRLCD_ENRET/*1602初始化函数*/LCD_INIT:MOVDELAYED,#30LCALLDELAY_MSMOVLCD_DAT,#38HLCALLLCD_CMDMOVDELAYED,#10LCALLDELAY_MS MOVLCD_DAT,#38HLCALLLCD_CMDMOVDELAYED,#10LCALLDELAY_MSMOVLCD_DAT,#38HLCALLLCD_CMDMOVDELAYED,#10LCALLDELAY_MSMOVLCD_DAT,#38HLCALLLCD_W_CMDMOVLCD_DAT,#08HLCALLLCD_W_CMDMOVLCD_DAT,#01HLCALLLCD_W_CMDMOVLCD_DAT,#06HLCALLLCD_W_CMDMOVLCD_DAT,#0CHLCALLLCD_W_CMDRET;设置显示位置子程序LCD_SET_POSITION:MOVA,LCD_DATADDA,#80HMOVLCD_DAT,ACALLLCD_W_CMDRETLCD_PRINT_STR:;显示字符串的程序NO_OVER:CLRAMOVCA,A+DPTRMOVLCD_DAT,ACALLLCD_W_DATAINCDPTRJNZNO
限制150内