程煜钧 通信1001 基于stc89c52单片机的16音阶电子琴设计

更新时间:2023-06-06 04:58:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理课程设计

学生姓名: 程煜钧 学生学号: 10211004 指导教师: 黄赞武

基于stc89c52单片机的十六音阶电子琴设计

一、 设计目标

设计方案以STC89C52单片机为核心,设计一个由4×4矩阵式键盘组成,能提供16个音阶的电子琴,可随意弹奏想要表达的音乐。因此本方案以AT89S51单片机为主控芯片,使4×4矩阵键盘电路、功率放大电路、扬声器等各功能电路协调工作。多音阶电子琴的主电路主要由4×4矩阵键盘电路、功率放大电路、扬声器、复位电路、晶振电路、电源电路等几部分组成。

二、 主要元件介绍 1. STC89C52

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保

存,振荡器被冻结,单片机一切工作停止,直到下一个中断

或硬件复位为止。最高运作频率35MHz,6T/12T可选。图为STC89C52的管脚图。

2. LM386

LM386是美国国家半导体公司生产的音频功率放大 器,主要应用于低电压消费类产品。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。图为LM386的芯片管脚图。

三、 软件设计

1.音调发生

了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。

在本实验中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表:

通过该表,就可以通过编程实现按键发声的功能。

2. 4×4矩阵键盘识别处理

键盘只简单地提供按键开关的行列矩阵。有关按键的识别、键码的确定与输入、去抖等功能均由软件完成。

每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线通过P3口和单片机相连。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么,还要消除按键在闭合或断开时的抖动。通过行线输出扫描码,使按键逐行动态接地,列线输入按键状态,无键按下,列线输入1,有键按下,列线输入0,由行扫描值和列线的回馈信号共同形成键编码而识别按键,通过软件查表,查出该键功能。

3. 程序流程图

(a) 主程序流程图(b) T0中断服务程序流程图

图-5 主程序和T0中断服务程序流程图

四、 硬件连接图

系统硬件连接如下图所示,单片机P1.0的输出作为音频放大电路的输入,P3口分别作为4×4矩阵键盘的行和列。

五、 课程设计总结

从大一到现在,做过了很多的课程设计也焊过很多的电路板,但是这是第一次接触单片机,也是第一次接触软件和硬件同时开工的课程设计。因为以前的课程设计都是要么纯硬件的焊接,要么就是仅仅只是编程序。而这次把这二者结合了起来对我来说确实是有一定的难度。首先是焊接的方面,虽然这次的电路较为简单,但是16个按钮的连接方式也着实让我为难了一番。其次就是如何将程序烧到芯片里面,这也是一个问题,还好有同学的帮助,用它的实验平台帮我将程序烧了进去。

而这次实验最大的体会便是仔细和认真的态度才能让你成功,所谓慢工出细活,只有一步一步把该做好的东西都做好了,该实现的功能才会实现,实验才会成功。我想这也是电信所有的课程设计想要教会我们的东西吧。

附表:实验所用程序

KEYBUF EQU 30H ;KEYBUF定义为30H STH0 EQU 31H ;STH0 定义为,31H STL0 EQU 32H ;STL0 定义为,32H TEMP EQU 33H ;TEMP 定义为,33H ORG 00H LJMP START ORG 0BH LJMP INT_T0

START: MOV TMOD,#01H ; SETB ET0 ; SETB EA ;WAIT: MOV P3,#0FFH ; CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1

LCALL DELY10MS ; MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1

NK1: CJNE A,#0DH,NK2 ; K1 MOV KEYBUF,#1 LJMP DK1

NK2: CJNE A,#0BH,NK3 ;K2 MOV KEYBUF,#2

设置定时器0的工作方式 设置定时器中断 开总中断

设置P3口为输入模式 ; P3.4清0,按键的第一行扫描延时10ms 键按下 键按下

LJMP DK1

NK3: CJNE A,#07H,NK4 ;K3键按下 MOV KEYBUF,#3 LJMP DK1

NK4: NOP ;K4键按下 DK1: MOV A,KEYBUF MOV B,#2

MOV TEMP,A

MOV DPTR,#TABLE ; MOVC A,@A+DPTR ; MOV STH0,A

MOV TH0,A ; INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A

MOV TL0,A ; SETB TR0 ; DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A

CLR TR0 ;NOKEY1: MOV P3,#0FFH ; CLR P3.5 ; MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2

LCALL DELY10MS ; MOV A,P3 ANL A,#0FH XRL A,#0FH

因为查表里都是字,所以乘2的查表数据指向表头 查表 将数据高位送TH0 将数据低位送TH0 启动定时器T0 关闭定时器T0

设置P3口为输入模式 清0 P3.5,按键的第二行扫描 延时10ms MUL AB ;

JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2

NK5: CJNE A,#0DH,NK6 ;K5键按下 MOV KEYBUF,#5 LJMP DK2

NK6: CJNE A,#0BH,NK7 ;K6键按下 MOV KEYBUF,#6 LJMP DK2

NK7: CJNE A,#07H,NK8 ;K7键按下 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MOV A,KEYBUF

MOV B,#2

MUL AB ;因为查表里都是字,所以乘2的查表数据

MOV TEMP,A

MOV DPTR,#TABLE ; 指向表头 MOVC A,@A+DPTR ; 查表 MOV STH0,A ;

MOV TH0,A ;将数据高位送TH0 INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A

MOV TL0,A ;将数据低位送TH0 SETB TR0 ;启动定时器T0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A

;K8键按下

CLR TR0 ; 关闭定时器T0

NOKEY2: MOV P3,#0FFH ;设置P3口为输入模式 CLR P3.6 ; 清0 P3.6,按键的第三行扫描 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3

LCALL DELY10MS ; 延时10ms MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3

NK9: CJNE A,#0DH,NK10 ;K9键按下 MOV KEYBUF,#9 LJMP DK3

NK10: CJNE A,#0BH,NK11 ;K10键按下 MOV KEYBUF,#10 LJMP DK3

NK11: CJNE A,#07H,NK12 ;K11键按下 MOV KEYBUF,#11 LJMP DK3

NK12: NOP ; K12键按下 DK3: MOV A,KEYBUF MOV B,#2

MUL AB ;因为查表里都是字,所以乘2的查表数据

MOV TEMP,A

MOV DPTR,#TABLE ;指向表头 MOVC A,@A+DPTR ;查表 MOV STH0,A

MOV TH0,A ;将数据高位送TH0 INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A

MOV TL0,A ;将数据低位送TH0 SETB TR0 ;启动定时器T0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A

CLR TR0 ;NOKEY3: MOV P3,#0FFH ; CLR P3.7 ; MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4

LCALL DELY10MS ; MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4

NK13: CJNE A,#0DH,NK14 ; K13 MOV KEYBUF,#13 LJMP DK4

NK14: CJNE A,#0BH,NK15 ;K14 MOV KEYBUF,#14 LJMP DK4

关闭定时器T0

设置P3口为输入模式 清0 P3.7,按键的第四行扫描延时10ms 键按下 键按下

NK15: CJNE A,#07H,NK16 ;K15键按下 MOV KEYBUF,#15 LJMP DK4

NK16: NOP ; K16键按下 DK4: MOV A,KEYBUF MOV B,#2

MOV TEMP,A

MOV DPTR,#TABLE ; MOVC A,@A+DPTR ; MOV STH0,A

MOV TH0,A ; INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A

MOV TL0,A ; SETB TR0 ;DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A

CLR TR0 ; NOKEY4: LJMP WAIT

DELY10MS: MOV R6,#10 ; 10msD1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET

INT_T0: CPL P1.0 ; T0 MOV TL0,STL0 RETI

TABLE: DW MUL AB

; 因为查表里都是字,所以乘2的查表数据

指向表头 查表 将数据高位送TH0 将数据低位送TH0 启动定时器T0 关闭定时器T0 延时子程序 中断服务程序,输出方波

MOV TH0,STH0

64021,64103,64260,64400 ;低3,低4,低5,低6

DW 64524,64580,64684,64777 ;低7,中1,中2,中3 DW 64820,64898,64968,65030 ;中4,中5,中6,中7 DW 65058,65110,65157,65178 ;高1,高2,高3,高4 END

本文来源:https://www.bwwdw.com/article/nk11.html

Top