视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机音乐盒课程设计
2025-09-25 14:22:07 责编:小OO
文档
河南机电高等专科学校

课程设计报告书

课程名称:单  片  机

课题名称:电子音乐盒

专    业:自动控制系

班    级:计  控111

学    号:*******44

*    *** * *

2013 年 01月01日

1.设计目的

  通过学习单片机课程,对单片机的硬件设计,软件设计掌握有了不少了解,学习了protel 99 SE 和keil软件,锻炼了自己的编程能力,对单片机硬件和软件的设计都有了进一步的认识和提高。为以后的学习也打下了很好的基础。

2.设计要求和设计指标

(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存两首乐曲)。

(2) 可通过功能键选择乐曲,播放不同音乐。

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

(4)利用8051的内部定时器使其工作在计数器模式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;要产生的频率

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

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=580

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

3.设计内容

3.1  硬件部分

本设计中用到C51单片机,蜂鸣器,式按键。(硬件电路原理图如图1所示)

3.11 原理说明

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

(1)    硬件电路中用K1, K2, K3, K4分别接P0.0, P0.1, P0.2, P0.3作为对应歌曲按键    。

(2)    用P1.0口接蜂鸣器。

(3)    电路为12MHZ晶振频率工作。          

            音乐盒原理图

3.2.软件部分

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

4.本设计改进建议

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

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

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

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

5.收获与体会

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

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

6. 主要参考文献

[1]  单片机原理及应用 清华大学出版社

[2]  Protel 99 SE 印刷电路板设计教程 机械工业出版社

[3]  王为青,程国钢.单片机Keil Cx51应用开发技术[M].  北京:人民邮电出版社,2007.02

[4]  阎石.数字电子技术基础[M].北京:高等教育出版社,1998.12,第4版

[5]  邓元庆.数字电路与逻辑设计[M].北京:电子工业出版社,2001

附件1:元件清单

名称数量(个)型号备注
电阻1
开关1
单片机1ATC51

蜂鸣器1
电源15V
晶振112Hz
附件2:音乐程序

  K1 EQU P0.0  定义引脚

 K2 EQU P0.1

  定义蜂鸣器引脚

     

 MAIN    

     

      

     

MAIN:  JNB K1,G1    

   JNB K2,G2

  JNB K3,G3

    JNB K4,G4

    LJMP MAIN

G1: LCALL GQ1

G2: LCALL GQ2

G3: LCALL GQ3

G4: LCALL GQ4

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GQ1:

     

  设T1工作方式1

  允许中断

LOOP1:  简谱码指针清0

LOOP2:  简谱码指针放入A

     

  到表格TABLE1中取简谱码

  取到的简谱码暂存于R1

  简谱码是00H(结束码),转移

  不是00H,取低4位(节拍码)

  将节拍码存入R2中

  将取到的简谱码再放入A

  高低4位交换

  取低4位(唱名码)

  唱名码不是00H,转移

  唱名码是00H,则不发音

  转移至WY

SING:  唱名码减1

   唱名码存入50H

   乘2

      

   到表格TABLE2取计数值高8位

   计数值高8位存入TH1

   计数值高8位存入51H

   将取到的唱名码再放入A

   乘2

   唱名码加1

   到表格TABLE2取计数值低8位

   计数值低8位存入TL1    

   计数值低8位存入52H

   启动T1

WY:  调用基本单位时间(1/4拍)

   简谱码指针加1

   取下一个简谱码

FINISH:  停止T1

   重复播放

     

T1SER:  将A的值暂存于堆栈

   将PSW的值暂存于堆栈

   重置定时器初值

  MOV TH1, 51H    

   将SPK取反

   至堆栈取回PSW值

  POP ACC 至堆栈取回A值

  RETI 返回主程序

       

TABLE1:   简谱码表

  DB 84H,42H,52H,H,52H,42H

     DB 58H,04H,04H

  DB 84H,62H,82H,0B6H,0A2H

     DB 84H,52H,62H,76H,32H

     DB 48H,04H,04H

     DB 94H,0B4H,0B6H,02H

  0A4H,92H,0A2H,0B6H,02H

  0A2H,0B2H,92H,92H,82H,62H,42H

     DB 58H,04H,04H

  0A2H

     DB 84H,52H,62H,76H,32H

     DB 48H,04H,04H

       

   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GQ2:      

  

  MOV SP,#30H    

  设T1工作方式1

  允许中断

LOOP12:  简谱码指针清0

LOOP22:  简谱码指针放入A

     

  到表格TAB2中取简谱码

  取到的简谱码暂存于R1

  简谱码是00H(结束码),转移

  不是00H,取低4位(节拍码)

 MOV R2,A 将节拍码存入R2中

  将取到的简谱码再放入A

  高低4位交换

  取低4位(唱名码)

  唱名码不是00H,转移

  唱名码是00H,则不发音

  转移至WY2

SING2:  唱名码减1

   唱名码存入50H

   乘2

  MOV DPTR, #TABLE2    

  MOVC  A,@A+DPTR 到表格TABLE2取计数值高8位

  MOV  TH1, A 计数值高8位存入TH1

  MOV  51H, A 计数值高8位存入51H

  MOV  A, 50H 将取到的唱名码再放入A

  RL  A 乘2

  INC  A 唱名码加1

  MOVC  A,@A+DPTR 到表格TABLE2取计数值低8位

  MOV  TL1, A 计数值低8位存入TL1    

  MOV  52H, A 计数值低8位存入52H

  SETB  TR1 启动T1

WY2: LCALL  DELAY 调用基本单位时间(1/4拍)

  INC 40H 简谱码指针加1

  SJMP LOOP22 取下一个简谱码

FINISH2:  停止T1

  LJMP MAIN

      

TAB2:   简谱码表

     

      

      

      

      

     

      

     

     

      

      

      

  DB 42H,52H

  DB H,62H,82H,94H,92H,0D2H

  DB 0D2H,0C2H,0B2H,92H,84H,04H

  DB 92H,82H,62H,52H,44H,22H,42H

  DB 54H,52H,42H,54H,42H,52H

  DB H,62H,82H,94H,92H,0D2H

  DB 0C2H,0B2H,0B2H,0C2H,0B4H,04H

  DB 84H,82H,62H,0A2H,0B2H,42H,52H

  DB H,04H,54H,04H

  DB 44H,04H,04H,04H

  DB 00H    

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GQ3:

     

  MOV SP,#30H    

  设T1工作方式1

  允许中断

LOOP13:  简谱码指针清0

LOOP23:  简谱码指针放入A

     

  到表格TAB3中取简谱码

  取到的简谱码暂存于R1

  简谱码是00H(结束码),转移

  不是00H,取低4位(节拍码)

  将节拍码存入R2中

  将取到的简谱码再放入A

  高低4位交换

  取低4位(唱名码)

  唱名码不是00H,转移

  唱名码是00H,则不发音

  转移至WY3

SING3:  唱名码减1

  MOV  50H,A 唱名码存入50H

  RL  A 乘2

  MOV DPTR, #TABLE2    

  MOVC  A,@A+DPTR 到表格TABLE2取计数值高8位

  MOV  TH1, A 计数值高8位存入TH1

  MOV  51H, A 计数值高8位存入51H

  MOV  A, 50H 将取到的唱名码再放入A

  RL  A 乘2

  INC  A 唱名码加1

  MOVC  A,@A+DPTR 到表格TABLE2取计数值低8位

  MOV  TL1, A 计数值低8位存入TL1    

  MOV  52H, A 计数值低8位存入52H

  SETB  TR1 启动T1

WY3:  调用基本单位时间(1/4拍)

  INC 40H 简谱码指针加1

  SJMP LOOP23 取下一个简谱码

FINISH3: CLR TR1 停止T1

  LJMP MAIN

     

TAB3:   简谱码表

     

      

     

      

      

     

      

     

      

     

      

      

      

     

      

      

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

G    

  MOV SP,#30H    

  设T1工作方式1

  允许中断

LOOP14:  简谱码指针清0

LOOP24:  简谱码指针放入A

     

  到表格TAB4中取简谱码

  取到的简谱码暂存于R1

  简谱码是00H(结束码),转移

  不是00H,取低4位(节拍码)

  将节拍码存入R2中

  将取到的简谱码再放入A

  高低4位交换

  取低4位(唱名码)

  唱名码不是00H,转移

  唱名码是00H,则不发音

  转移至WY4

SING4:  唱名码减1

  MOV  50H,A 唱名码存入50H

  RL  A 乘2

  MOV DPTR, #TABLE2    

  MOVC  A,@A+DPTR 到表格TABLE2取计数值高8位

  MOV  TH1, A 计数值高8位存入TH1

  MOV  51H, A 计数值高8位存入51H

  MOV  A, 50H 将取到的唱名码再放入A

  RL  A 乘2

  INC  A 唱名码加1

  MOVC  A,@A+DPTR 到表格TABLE2取计数值低8位

  MOV  TL1, A 计数值低8位存入TL1    

  MOV  52H, A 计数值低8位存入52H

  SETB  TR1 启动T1

WY4:  调用基本单位时间(1/4拍)

  INC 40H 简谱码指针加1

  SJMP LOOP24 取下一个简谱码

FINISH4:  停止T1

  LJMP MAIN

     

TAB4:   简谱码表

     

      

      

      

      

     

      

     

      

     

      

      

      

     

      

     

TABLE2:  唱名码表

     

     

     

     

DELAY:  延时187ms的循环次数

LP1:  延时0.935ms的循环次数

      

  DJNZ  R4,LP1    

   节拍数未到,转移

  RET    

  程序结束下载本文

显示全文
专题