课程设计报告书
课程名称:单 片 机
课题名称:电子音乐盒
专 业:自动控制系
班 级:计 控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 | ||
| 单片机 | 1 | ATC51 | |
| 蜂鸣器 | 1 | ||
| 电源 | 1 | 5V | |
| 晶振 | 1 | 12Hz |
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
程序结束下载本文