简易电子琴的设计与制作
0xff,0x02 //高 7 (0x27)7. }; uchar code Music_hzcb[]={//《挥着翅膀的女孩》系统自带歌曲音符 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03, 0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02, 0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02, 0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0xff,0xff}; /*uchar code Music_tyshg[]={//《同一首歌》 系统自带歌曲音符 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
其中心控制模块是采用 AT89S52 单片机来控制整个系统, 其中 P2.4 连接音响驱动电路, P3.0 和 P3.1 连接下载电路。 在 P2 口连接有 3 个按键开关,它们一端接 5 伏电源,一端接地,只要有一个按键被按 下,并被单片机扫描到,则会播放该按键对应的歌曲。在 P1 口接有 4*4 的矩阵键盘,P3 口 接有 5 个按键开关,只要有一个按键被按下,并被单片机扫描到,则会发出该按键对应的单 个音符。 在电子琴主要电路设计中, 我们采用了 AT89S52 单片机芯片,其特点及管脚封装介绍如 下。 AT89S52 是一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可编程 Flash 存储 器。使用 Atmel 公司高密度非易失性存储器技术制造,与工业 80C51 产品指令和引脚完全 兼容。AT89S52 具有以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗 定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行 口,片内晶振及时钟电路。另外,AT89S52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择 节电模式。空闲模式下,CPU 停止工作,允许 RAM、定时器/计数器、串口、中断继续工作。 掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中 断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash AT89S52。 AT89S52 的引脚如右图所示。 P3 口亦作为 AT89S52 特殊功能(第二功能)使用,如下所示。 在 flash 编程和校验时,P3 口也接收一些控制信号。
uchar code table[]={ //数码管段选码 0x88,0x83,0xC6,0xA1,0x86,0x8E,0x82, //A - G 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //1 - 7 0x79,0x24,0x30,0x19,0x12,0x02,0x78 //1. - 7. }; uchar code Music_Code[]={ //音调对应的计数初值 //占 0 位 0xf8,0x8c,//低 1 (0x01)a -数码管显示方式 0xf9,0x5b,// 2 b 0xfa,0x14,// 3 c 0xfa,0x66,// 4 d 0xfb,0x03,// 5 e 0xfb,0x8f,// 6 f 0xfc,0x0b,//低 7(0x07)g 0xfc,0x43,//中 1 (0x11) 0xfc,0xab,// 2 0xfd,0x08,// 3 0xfd,0x33,// 4 0xfd,0x81,// 5 0xfd,0xc7,// 6 0xfe,0x05,//中 7 (0x17) 0xfe,0x21,//高 1 (0x21)1. 0xfe,0x55,// 2 2. 0xfe,0x84,// 3 3. 0xfe,0x99,// 4 4. 0xfe,0xc0,// 5 5. 0xfe,0xe3,// 6 6. (33)
实
验
报
告
实验课程:
单片机原理与应用课程设计
小组成员:姚东清 李亚妮 柳宇航 田云云 林素梅 专业班级: 通信工程中兴 131 班
目的
为了进一步掌握单片机的原理与熟练其应用, 本实验设计制作了一个可以实现根据不同 的按键产生不同的音符, 并显示音符的符号的以及产生不同的歌曲, 并显示歌曲的序号的功 能简易电子琴。
频率、声音的实现和产生: 单片机的频率和声音输出的原理是, 利用琴键控制定时器的开中断和闭中断, 即实现发 音和闭音。 在此期间通过对定时器的定时时间进行控制来产生不同频率的方波, 使蜂鸣器发
出不同音阶的声音。把相应琴键对应的音符变换为定常数,作为数据表格存放在储存器中。 由程序查表得到定时常数,用以控制定时器产生方波的频率。但下一个键按下时,再查一下 此琴键所对应音符的定时常数。依次进行下去,就可以了。用定时器 T0 方式 1 来产生琴键 对应音符的频率的方波,由 P2.4 输出蜂鸣器。 音符频率表如下:
三、原理图及程序
#include <REGX52.H>
//调系统头文件
#define uchar unsigned char //uchar 代替 unsigned char #define uint unsigned int //uint 代替 unsigned char //#define keyport P1; #define SMG P0
#define Speak P2_4 //定义蜂鸣器接口 #define Key1 P2_0 //定义按键 1(播放 "挥着翅膀的女孩") #define Key2P2_1 //定义按键 2(播放 "同一首歌") #define Key3 P2_2 //定义按键 3(播放 "两只蝴蝶") uchar sth; //按键发出音调的初值(低位) uchar stl; //高位 uchar num; uchar i; uchar j; void key(); //uchar KeyScan(); //void display(); //void speak(); //数码管显示对应音调 函数 //按键后 给定时器 0 赋对应音调的初值 从而发出声音