《电子综合课程设计报告.doc》由会员分享,可在线阅读,更多相关《电子综合课程设计报告.doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2022年-2023年建筑工程管理行业文档 齐鲁斌创作电子综合课程设计报告院 系: 延安大学西安创新学院理工系班 级: 电子信息工程0701班指导老师: 黄同 李娣娜姓 名: 张 三 06111028李 四 06111025王 五 06111026目 录一、课题名称及设计组成员3二、课题内容及要求3三、方案论证31、方案132、方案243、方案比较4四、系统硬件设计41、系统总体结构图42、系统原理图53、核心芯片介绍54、各子系统设计55、PCB图5五、程序设计51、程序功能描述52、模块1-n流程图53、程序源代码及注释6六、系统调试161、电路焊接162、调试步骤163、调试中出现的问题
2、、原因及排除方法17七、参考文献19八、收获和体会19一、课题名称及设计组成员课题名称计算机钢琴和音乐发生器程序设计人姓名学号分工张三06111028李四06111025王五06111026报告日期2010年 月 日二、课题内容及要求1、计算机钢琴基本功能:I、利用键盘按键“q、w、e、r、t、y、u”实现音调的重低音输入,利用键盘按键“a、s、d、f、g、h、j”实现音调的低音输入,利用键盘按键“z、x、c、v、b、n、m”实现音调的中音输入,利用键盘按键“1、2、3、4、5、6、7”实现音调的重低音输入。II、实现菜单选择以及处理各种功能键的多种中级功能。2、音乐播放系统控制实现功能: 制
3、作一个菜单,使用菜单条选择功能,让用户选择演奏的乐曲。 用定时器方式演奏画皮之主题曲画心实现音乐演奏。 提示使用ESC键或者ENTER键可以退出当前过程或返回DOS。 实现控制变量可以控制不同的效果以及要求,如播放速度,间隔等。 界面美观,程序结构化程度高,模块结构合理。 设计出相应的音乐取码软件。3、实验环境16位的汇编语言程序设计有几种工作环境,本实验以及所有程序都是通过MASM5.0编译的,MASM5.0一个汇编语言的编译、连接、调试及运行的集成环境。支持标号的快速定位,编译速度快。三、方案论证1、方案1基于PC计算机的时钟晶振为1.1931816MHz,利用电脑里面的蜂鸣器发出声音。各
4、音阶标称频率值:/*-*/音符:1234567(重低音)对应频率(Hz):131147165175196220247(低音)对应频率(Hz):262294330349392440494(中音)对应频率(Hz):523587659698784880988(高音)对应频率(Hz):1046117513181397156817601975/*-*/2、方案2PC机扬声器电路以及相关接口电路如下:PC机扬声器电路以及相关接口电路3、方案比较四、系统硬件设计1、系统总体结构图系统方框图2、系统原理图Protel中的原理图3、核心芯片介绍4、各子系统设计5、PCB图五、程序设计1、程序功能描述程序开始,显
5、示提示信息,对缓存区初始化。按键扫描,接着调用发音子程序在把AL送缓存区,发出与按键相对应频率的声音,从而实现计算机钢琴功能。并不停地对Esc键、Enter键扫描,当Esc键或Enter键按下时,就退出程序。当按下p时,显示播放音乐目录。当按下数字选择键时,播放程序中预设的曲目。当检测到q时,退出到计算机钢琴演奏状态。2、模块1-n流程图开始显示缓存区,变量初始化键盘扫描调用发音子程序是否Esc或Enter键是否p键是否为q键返回DOSYNNYYN播放音乐菜单播放音乐程序键盘扫描是否播放完毕YN3、程序源代码及注释;/*-*/;编译环境:MASM5.0;日期:2009-3-2;时间:8:03;
6、数据段定义data segment;数据定义段assumeds:data;建立数据段寄存器寻址msg_1 db $,0dh,0ah;定义字节msg_2db0dh,0ah,In this OS. you can press below keys to enjoy:$msg_3db0dh,0ah,Super Low:q-w-e-r-t-y-u$msg_4db0dh,0ah, Low:a-s-d-f-g-h-j$msg_5db0dh,0ah, Mid:z-x-c-v-b-n-m$msg_6db0dh,0ah, Hig:1-2-3-4-5-6-7$msg_7 db0dh,0ah,Anytime you
7、 can press Esc or Enter to exit.$msg_8db0dh,0ah,Whats more, you can press p to play music!$msg_9db0dh,0ah,Please select the music(press q to exit the main menu):$msg_10db0dh,0ah,1. Huaxin$msg_11db0dh,0ah,2. Jingle bells$msg_12db0dh,0ah,3. Happy birthday to you$msg_13db0dh,0ah,4. Happy new year$msg_2
8、1db0dh,0ah, $;/*-*/;字符显示show macro str;宏定义,输入参数:字符串str leadx,str;装入str的有效地址 mov ah,09h;调用中断21,09h显示字符串 int 21h endm;宏定义结束;/*-*/;/*-*/;主函数mainprocfar;主函数过程定义mov ax,data;取数据段地址mov ds,ax;装载数据段寄存器ds,使之指向当前数据段showmsg_21showmsg_1;调用宏,显示字符串showmsg_2showmsg_3showmsg_4showmsg_5showmsg_6showmsg_7showmsg_8show
9、msg_21movbx,0;设定查表数组下标初值;/*-*/;/*-*/;音乐播放程序1play_m1procnearnext5:movbx,0next3:moval,music_n1bx;取出music频率值 push ax moval,music_d1bx;取出music节拍 mov jiepai,al pop axcmpal, 0;是否为音乐结束标志符jeinput;是则退出playpushbx;保存bx,bx为music频率指针movbx,0look1:cmpkey_tbx,al;查表取出对应频率值的指针bxjenext1;找到就beepincbx;指针+1andbx,0ffhjmpl
10、ook1;未找到则继续查找next1:shlbx,1;指针2,计算频率表指针movcx,note_tbx;取得对应数组下标值的频率值cmpcx,0jenext4callbeep;调用固定频率子程序callpause;调用停顿时间popbx;获得music指针incbx;继续取得下一个音符jmpnext3next4:callnobeepcallpause;调用停顿时间popbx;获得music指针incbx;继续取得下一个音符jmpnext3play_m1 endp;/*-*/;/*-*/mainendp;主函数过程结束;/*-*/;/*-*/;固定频率响beep procnearmovdx,0
11、012hmovax,34dchdivcx;ax为所得分频值out42h,al;输出频率值,低8位moval,ahout42h,al;输出频率值,高8位callspk_on;开启蜂鸣器movah,00h;取时钟计数值int1ahmoval,jiepai;18.2次为1000ms, 2次约为100msaddal,speedcbw ;al值转为16位axaddax,dx;加上当前时钟计数值,得到计数终值movbx,ax;计数终值置入bxdelay1:movah,00hint1ah;取时钟计数值cmpbx,dx;到终值吗?jnzdelay1;未到,继续延时callspk_off;关闭蜂鸣器retbee
12、p endp;/*-*/;/*-*/;音符间隔停顿时间pause procnearcallspk_off;关闭蜂鸣器movah,00h;取时钟计数值int1ahmoval,jiange;18.2次为1000ms, 2次约为100mscbw ;al值转为16位axaddax,dx;加上当前时钟计数值,得到计数终值movbx,ax;计数终值置入bxdelay3:movah,00hint1ah;取时钟计数值cmpbx,dx;到终值吗?jnzdelay3;未到,继续延时retpause endp;/*-*/;/*-*/;开启蜂鸣器spk_on procnearpushax;保存ax的值inal,61h
13、;获取61h端口的当前值oral,03h;把61h端口低二位置1,即打开蜂鸣器out61h,al;输出数据到61h端口popax;恢复ax的值retspk_on endp;/*-*/;/*-*/codeends;代码段结束endmain;主程序结束;/*-*/六、系统调试1、电路焊接一般无须连接电路,如果想要听到美妙的音乐效果,可以把电脑里面的蜂鸣器接口用导线引出来,外接一个大的扬声器,效果出人意料,非常好听的。2、调试步骤程序直接运行就可以正常工作,如果想要修改参数或添加新的歌曲,可以参考以下步骤:1)运行ASM_MUSIC.EXE音乐代码提取软件,按照歌谱,直接用鼠标电击一个一个的输入就行
14、了,输入完成后,用鼠标电击END键,即可结束输入,然后复制,粘贴到源文件里面的相应位置;2)保存文档,接着用MASM5.0汇编工具编译生成EXE文件;3)运行所生成的EXE文件即可。程序正常运行截图如下:3、调试中出现的问题、原因及排除方法在编程调试的过程中,遇到了很多麻烦,总结起来有以下几点:问题1:寄存器不够用怎么办?原因:使用了太多的寄存器,AX、BX、CX、DX。解决办法:使用外部变量定义,定义外部变量的方法为:变量名数据类型 ?比如节拍变量定义:jiepai db ?;节拍变量定义问题2:跳转,转移指令跳出的范围太大,编译出现错误怎么办?原因:程序结构过于复杂,庞大。解决办法:使用过
15、程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用CALL调用子过程就可以了,这样就可以避免使用跳转和转移指令了。比如开启蜂鸣器子过程:;/*-*/;开启蜂鸣器spk_on procnearpushax;保存ax的值inal,61h;获取61h端口的当前值oral,03h;把61h端口低二位置1,即打开蜂鸣器out61h,al;输出数据到61h端口popax;恢复ax的值retspk_on endp;/*-*/调用子过程如下:callspk_on;关闭蜂鸣器问题3:寄存器的值变幻无常,怎么办?原因:程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会
16、导致其它与之相关寄存器的值的改变。解决办法:堆栈是保护环境的主要工具,一旦用错,后过将很严重,比如我们在调试程序的过程中,遇到过这样的问题:在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来!这样就造成了所有的寄存器的值都的生了变化,包括数据和代码段寄存器,这样不出问题才怪呢?!所以,要记住,PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的变量的语句,一定会出问题!解决的办法只有一个,把push和pop对上号。问题4:要显示的字符串过多,但又不想重复写代码,既要美观,又要易读,怎么办?原
17、因:过于频繁的调用中断显示字符串,导致程序过于庞大和复杂,可读性差。解决办法:解决这种问题的最好方法是直接把显示部分写成子过程,但是子过程在传递参数的时候不方便,所以就用宏定义,宏定义可以很方便的传递参数,不仅使得程序美观好看,而且可读性好,程序代码紧凑。例如:先在数据段Data Segment里面定义要显示的字符串:msg_1 db $,0dh,0ah;定义字节msg_2 db0dh,0ah,In this OS. you can press below keys to enjoy:$再在代码段Code Segment里面定义要调用的宏:;/*-*/;字符显示Showmacro str;宏定
18、义,输入参数:字符串str leadx,str;装入str的有效地址 mov ah,09h;调用中断21,09h显示字符串 int 21h endm;宏定义结束;/*-*/要显示字符串就可以直接调用宏了,可以带参数,如下所示:Showmsg_1Showmsg_2问题4:汇编里面怎样进行查表处理?原因:还不够牢固的掌握汇编编程解决办法:汇编里面进行查表处理的我只掌握了一种简单的设计,直接用下标例如:要用查表实现不同频率的选择时,可先在数据段Data Segment里面定义要用到的频率数据:note_tdw 131,147,165,175,196,220,247;重低音dw 262,294,330
19、,349,392,440,494;低音 dw 523,587,659,698,784,880,988;中音 dw 1046,1175,1318,1397,1568,1760,1975;高音dw0;休止符0再利用MOV指令实现数据的读取,不但的循环查表,直到找到对应的下标值,由于定义的数据为16为二进制数据,所以要取到下一个数据,每次BX就要加2,或者先令BX加1再左移一位即可。movcx,note_tbx;取得对应数组下标值的频率值七、参考文献1)16/32位微机原理、汇编语言及接口技术(第二版)机械工业出版社钱晓捷、陈涛等。2)汇编语言程序设计教程(周艳萍 邹伟著)清华大学出版社。3)PC机汇编语言实战精解(李春生著)南开大学出版社。八、收获和体会应该包括对项目更进一步完善或功能扩展的想法。通过整整一个星期的摸索和编程,查资料,终于把程序完成了,和小组的成员一起讨论问题,分析问题,发现问题,解决问题,也收获了不少,我们的编程技术都有所提高,我们的体会就是:要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。第11页 共13页