单片机课程设计

单片机课程设计

题目:音乐《八月桂花香》

班    级:              

姓    名:              

指导老师:              

完成日期:              

设计任务书

摘要

本设计是基于单片机的数字音乐盒设计,由单片机AT89C51芯片和LCD显示器为核心,辅以必要的电路,构成的一个单片机电子数字音乐盒。要求利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调并采用LCD显示信息,从而演奏乐曲(最少三首乐曲,每首不少于30秒),开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称),可通过功能键选择乐曲,暂停,播放。 本设计采用4*4键盘,用Protel99来画系统硬件图,采用汇编语言进行编程,编程后利用KEIL C51来进行编译,再生成的HEX文件装入芯片中,采用proteus软件来仿真,检验功能得以正常实现。该音乐盒的设计可以通过按键选择不同的曲目,播放和暂停,并通过LCD显示歌曲号及播放时间。 本设计键盘采用动态扫描方式。每次扫描一行键盘,送此行低电平,读输入口的状态值,判断有没有键按下。若有键按下,根据读入口的值选择显示值并送至显示值寄存单元,判断键值,启动计数器T0,根据次值为偏移地址找到要选择的音乐的代码的首地址,根据代码产生一定频率的脉冲,驱动蜂鸣器,放出音。同时启动定时器T1,计算音乐的播放的时间。    

关键词:数字音乐盒  AT89C51  LCD显示器  Proteus软件  4*4键盘  动态扫描  KEIL C5

一、引言

本文是应用MCS-51单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用汇编语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。

这种控制电路结构简单,可靠性高,应用性强;软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。对单片机和音乐爱好者有一定的借鉴价值。

二、总体方案

 (1)要产生音频脉冲,只要算出某一音频的周期(1/音频),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。

(2)利用8951的内部定时器使其工作在计数器模式MODE1下,改变记数值TH0及TL0以产生不同频率的方法。例如频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时956/1=956在每记数9次时将I/O口反相,就可得到中音D0(523HZ)。

记数脉冲值与频率的关系公式如下:

N=Fi/2/Fr    N:记数值

Fi:内部计时一次为1微秒.故其频率为1MHZ

Fr;要产生的频率

(3):起记数值的求法如下:

T=65536-N=65536-Fi/2/Fr 例如:设K=65536,F=1000000=Fi=1MHZ,求低音D0(523HZ),高音的D0(1046HZ)的记数值。

T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr

低音D0的T=65536-500000/262=63627

中音D0的T=65536-500000/523=64580

高音D0的T=65536-500000/1047=65059 

三、硬件设计

    

3.1硬件电路   

本设计中用到89C51单片机,喇叭,七段显示数码管LED。(硬件电路原理图如图1所示)

3.2 原理说明   

当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动定时器T1,显示歌曲号。

(1) 硬件电路中用0INT、1INT分别接S1、S2作为上、下一曲的功能键

(2) 用P1.0-P1.6控制七段码a,b,c,d,e,f。

(3) 用P2.0口控制喇叭。

(4) 电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。

硬件电路图

四、软件设计

本程序可以实现课程设计的基本要求,并可以通过按键播放两首歌曲,程序流程图如下:

五、调试与仿真

按照上面设计的电路在proteus软件内画图, 打开单片机软件开发系统Keil,选择89c51单片机,在其中编写程序,运行生成一个后缀名为hex的文件,然后将该文件下载到proteus中的AT89c51单片机中进行仿真,观察实验现象。仿真能实现播放音乐,按键选择曲目,暂停,播放功能。仿真成功后,安装好实验板,然后将音乐程序下载到电路板内 ,观察结果。能实现播放音乐,按键换曲等功能。

程序调试中出现的问题及解决的办法:

(1) 有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定要按正确格式书写或在两行指令间最好不要留空行。

(2) 程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。当用JNZ指令时,跳转范围比较少,这时要用一个标号中转。

(3) 编程时要注意,在程序开始时,要写入各定时器中断的入口地址。

(4) 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。

(5) 编程前要加流程图,这样会使思路清晰,例如数字音乐盒的设计思路完全可以按着MP3的工作方式列写流程图。

(6) LCD计时正常显示的解决办法:

a. 两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设定在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音乐不能正常播放,时间不能正常显示。

解决办法:将定时器1设定在工作方式1,16位计数,计50ms,效果有很大改观。但还有问题。

b. 当音乐为全4拍起始时,此时音乐节奏与定时器T1中断频率错开,LCD显示和音乐播放都会好一些。

c. 另外,在歌曲中,当遇到一个音符发音为4拍,在编曲中为*CH,因时间较长,当定时器T1此时来中断时,就会对歌曲播放产生影响,若改为发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。

改进方案:若采用可以定时时间更长的单片机,可以避免所有问题。

六、总结

(1) 本学期学习单片机的课时不多,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,明显的改善了,首先对于硬件电路的工作原理有了进一步的学习,同时有了一个提升;软件方面,在程序的设计,程序的调试方面都有了很大的进步。

(2) 在一个好的氛围里才能静下心来做东西,在这一段时间里,寝室成员都认真对待这次课程设计,在遇到不懂的地方互相讨论,查阅资料,互助解决问题。另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,这是我们第一次利用汇编语言编写程序实现各功能。我们也是这么做的,这一点在这次的课程设计中十分重要。

(3) 通过这次课程设计,我体会到了成功的喜悦,听着自己设计的程序下载到单片机中播放出音乐,心理非常自豪。这次的课程设计在一定程度上改变了我学习单片机这门课程的态度,从最初的认为学它没有什么实际意义,到如今爱上单片机学习,并希望能将理论运用到实践,设计出更好更完整的系统。我明白了一个人要想做好一件事,就必须具备自信心,耐心,还要有毅力,要胆大心细,要勇于尝试,要手脑并用,最后才能交出一份令人满意的答卷。

七、参考文献

[1] 李林功、吴飞青、王兵、丁晓.编著《单片机原理与应用》.机械工业出版社,20##年7月。

[2] 郭天祥.主编《新概念51单片机C语言教程》.电子工业出版社,20##年12月。

[3] 徐惠民.主编《微机原理与接口技术》.高等教育出版社,20##年8月。

[4] 张毅刚、彭喜元、姜守达、乔立岩.编著《新编MCS-51单片机应用设计》.哈尔滨工业大学出版社,20##年4月。

[5] 彭伟.主编《单片机C语言程序设计实训100例—基于8051+Proteus仿真》.电子工业出版社,20##年8月。

附录一:

音乐《八月桂花香》汇编程序:      

ORG 0000H

       LJMP START

       ORG 000BH

       INC 20H ;中断服务,中断计数器加1

       MOV TH0,#0D8H

       MOV TL0,#0EFH ;12M晶振,形成10毫秒中断

       RETI

START:

       MOV SP,#50H

       MOV TH0,#0D8H

       MOV TL0,#0EFH

       MOV TMOD,#01H

       MOV IE,#82H

MUSIC0:

       NOP

       MOV DPTR,#DAT ;表头地址送DPTR

       MOV 20H,#00H ;中断计数器清0

MUSIC1:

       NOP

       CLR A

       MOVC A,@A+DPTR ;查表取代码

       JZ END0 ;是00H,则结束

       CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行

       LJMP MUSIC3

MUSIC5:

       NOP

       MOV R6,A ;R6=18H音符的频率

       INC DPTR; DPTR加一

       MOV A,#0

       MOVC A,@A+DPTR ;取节拍代码送R7

       MOV R7,A ;R7=30H音符发音的时间

       SETB TR0 ;启动计数

MUSIC2:

       NOP

       CPL P2.3 ;P2.3是音乐输出引脚

       MOV A,R6

       MOV R3,A ;R3=R6=18H

       LCALL DEL

       MOV A,R7

       CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?

       ;不等,则继续循环

       MOV 20H,#00H ;等于,则取下一代码

       INC DPTR

       LJMP MUSIC1

MUSIC3:

       NOP ;休止100毫秒

       CLR TR0

       MOV R2,#0DH ;R2=13

MUSIC4:

       NOP

       MOV R3,#0FFH ;R3=255

       LCALL DEL

       DJNZ R2,MUSIC4

       INC DPTR

       LJMP MUSIC1

END0:

       NOP

       MOV R2,#0FFH ;歌曲结束,延时1秒后继续

MUSIC6:

       MOV R3,#00H

       LCALL DEL

       DJNZ R2,MUSIC6

       LJMP MUSIC0

DEL:

       NOP

DEL3:

       MOV R4,#02H

DEL4:

       NOP

       DJNZ R4,DEL4

       NOP

       DJNZ R3,DEL3

       RET

       NOP

DAT:

       DB 18H, 30H, 1CH, 10H

       DB 20H, 40H, 1CH, 10H

       DB 18H, 10H, 20H, 10H

       DB 1CH, 10H, 18H, 40H

       DB 1CH, 20H, 20H, 20H

       DB 1CH, 20H, 18H, 20H

       DB 20H, 80H, 0FFH, 20H

       DB 30H, 1CH, 10H , 18H

       DB 20H, 15H, 20H , 1CH

       DB 20H, 20H, 20H , 26H

       DB 40H, 20H , 20H , 2BH

       DB 20H, 26H, 20H , 20H

       DB 20H, 30H , 80H , 0FFH

       DB 20H, 20H, 1CH , 10H

       DB 18H, 10H, 20H , 20H

       DB 26H, 20H , 2BH , 20H

       DB 30H, 20H , 2BH , 40H

       DB 20H, 20H , 1CH , 10H

       DB 18H, 10H, 20H, 20H

       DB 26H, 20H , 2BH, 20H

       DB 30H, 20H, 2BH , 40H

       DB 20H, 30H, 1CH , 10H

       DB 18H, 20H , 15H , 20H

       DB 1CH, 20H , 20H , 20H

       DB 26H, 40H, 20H , 20H

       DB 2BH, 20H, 26H , 20H

       DB 20H, 20H, 30H , 80H

       DB 20H, 30H, 1CH , 10H

       DB 20H, 10H, 1CH , 10H

       DB 20H, 20H, 26H , 20H

       DB 2BH, 20H, 30H , 20H

       DB 2BH, 40H, 20H , 15H

       DB 1FH, 05H, 20H , 10H

       DB 1CH, 10H, 20H , 20H

       DB 26H, 20H, 2BH , 20H

       DB 30H, 20H, 2BH , 40H

       DB 20H, 30H, 1CH , 10H

       DB 18H, 20H , 15H , 20H

       DB 1CH, 20H , 20H , 20H

       DB 26H, 40H, 20H , 20H

       DB 2BH, 20H, 26H , 20H

       DB 20H, 20H, 30H, 30H

       DB 20H, 30H, 1CH, 10H

       DB 18H, 40H, 1CH, 20H

       DB 20H, 20H, 26H, 40H

       DB 13H, 60H, 18H , 20H

       DB 15H, 40H, 13H , 40H

       DB 18H, 80H, 00H

       END

 

第二篇:单片机课程设计心得

单片机课程设计心得(20xx-11-22 14:31:20)

标签:杂谈

做了两周的单片机课程设计,我有了很多的体会和感想。 分类:单片机

我们的课程设计有两个主要内容:一个是出租车计费器系统(还包括255计数和50000计数);另一个就是温度报警系统。实习可以在实验室里做,也可以在寝室里自己做,我大部分时间还是在寝室里做的。

出租车计费器的设计是第一周的内容,由于有了老师的设计图和程序,只需要改一下自己所要求的变量就好。单片机的编程用的主要是汇编语言,说实话,我对汇编语言谈不上掌握,充其量只是了解。学校安排的课程真的太少了,关于语言部分的学习只学了几节课的内容,整本单片机书的内容也是学了三分之一多一点。

第二周的内容就是温度报警系统的设计。这个内容没有现成的程序和设计图,需要我们真正亲手去编,最郁闷的莫过于画设计图。按照实验要求上的图画了出来,加载程序以后却不能正常运行,改了好多次都没有成功。同学们电脑上软件的版本差异也影响了交流。有些元件的型号不同,但在选用时图形确很相似,致使选错了元件,影响了结果。

这两周的实习真的有点郁闷,程序里面的好多内容不懂,自我感觉是单片机我们所学的内容还不足以编出这两个程序,但是只好硬着头皮去看去理解。但在学习过程中也充满了乐趣,当看懂了程序的一些语句,画出了要求的设计图,那我喜悦那种成就感油然而生。 这次实习让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。

单片机是很重要的一门课程,老师和一些工作的朋友都曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。最后感谢老师对我们的精心指导和帮助,感谢同学们对我的帮助。

相关推荐