资源描述
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。
单片机课程设计
实验报告
电子音调发生器
姓名:
日期: 6月29日星期一
目录
( 一) 实验目的 2
( 二) 设计任务及要求 2
( 三) 工作原理及设计思路 2
( 四) 实现功能设计 3
( 五) 软件设计 3
( 六) 电路设计 35
( 七) 调试 36
( 八) 实验体会 37
( 一) 实验目的
1. 了解计算机发声原理。
2. 熟悉定时器和键盘扫描电路的工作原理及编程方法。
( 二) 设计任务及要求
利用实验平台上的开关k0-k7和蜂鸣器设计电子音调发生器, 要求:
1.利用实验平台上开关k0-k7进行音调选择, 即拨动不同的开关产生不同的音调, 依次拨动K0~K7, 蜂鸣器发出1234567i八个音调。
2.编写2支歌曲, 并可进行选择播放。
( 三) 工作原理及设计思路
音节由不同频率的方波产生, 音节与频率的关系如表1所示。要产生音频方波, 只要算出某一音频的周期( 1/频率) , 然后将此周期除以2, 即为半周期的时间。利用计时器计时此半周期时间, 每当计时到后就将输出方波的I/0反相, 然后重复计时此半周期时间再对I/O反相, 就可在I/O脚得到此频率的方波。在ZKS-03实验仪上, 产生方波的I/O脚选用P1.7, 经过跳线选择器JP1将单片机的P1.7与蜂鸣器的驱动电路相连。这样P1.7输出不同频率的方波, 蜂鸣器便会发出不同的声音。另外, 音乐的节拍是由延时实现的, 如果1拍为0.4秒, 1/4拍是0.1秒。只要设定延时时间, 就可求得节拍的时间。延时作为基本延时时间, 节拍值只能是它的整数倍,
每个音节相应的定时器初值X可按下法计算:
( 1/2) *(1/f)=(12/fose)*(216-x)
即 x=216-(fose/24f)
其中f:音调频率, 当晶振fose=11.0592MHz时, 音节”1”相应的定时器初值为x,则可得x=63777D=F921H 其它的可同样求得。
表1
音调
频率( Hz)
X(HEX)
1
262
F921
2
294
F9E1
3
330
FA8C
4
349
FAD8
5
392
FB68
6
440
FBE9
7
494
FC5B
i
523
FC8F
( 四) 实现功能设计
实现两个主要功能: 电子琴与音乐播放; 一个辅助功能: 在液晶上显示相关信息。
1、 电子琴: 4*4的矩阵16个按键, 按键0实现两个功能的切换, 其余按键分别发出音调 低音5、 6、 7, 中音1、 2、 3、 4、 5、 6、 7, 高音1、 2、 3、 4、 5。
发音的同时在液晶显示屏上显示出对应的音调。
2、 音乐播放: 按键0实现两个功能的切换, 按键1实现播放类型选择( 单曲循环播放、 所有循环播放) , 其余按键分别对应一首歌。当前已经有9首歌。
播放的同时, 在液晶上显示出歌名。
( 五) 软件设计
根据要实现的功能, 流程图如下:
开始
系统初始化
判断按键
判断按键
电子琴
液晶显示
录音
调整时钟
功能选择
音乐
#include <AT89X52.H>
#include <intrins.h>
#define nop _nop_()
#define uchar unsigned char
#define uint unsigned int
#define PAI_BASE 15
#define MUSIC_NUM 9
#define SCAN_CYCLE 500
#define BEEP P3_3
/***************液晶显示相关变量***********************************/
sbit LCD_RS = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;
static uchar th0_f; //在中断中装载的 T0 的值高 8 位
static uchar tl0_f; //在中断中装载的 T0 的值低 8 位
static timebuffer,Record_counter,Record_flag=0;
static uchar key2,key=16,scounter=0,Record_time;
static uchar s_musicCounter=0x00,s_tableCounter;
bit Rplay_flag=0;
bit K0_flag=0;
bit Music_flag0;
bit Music_flag=0;
bit Freq_flag=0;
bit disptime_flag=0;
bit musicAutoFlag=0;
//sbit BEEP = P3_3; //喇叭输出脚
//延时子程序1
void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时, 忙, 等待。lcd-busy为0时,闲, 可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L, RW=L, E=高脉冲, D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H, RW=L, E=高脉冲, D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* 设定显示位置 */
/* */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址变量
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
delay(15); //等待LCD电源稳定
lcd_wcmd(0x38); //16*2显示, 5*7点阵, 8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开, 关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*******************************************************************/
/* */
/* 清屏子程序 */
/* */
/*******************************************************************/
void lcd_clr()
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
//静态显示字符串
void lcd_string(char *strpoint) /*在当前显示位置显示LCD 字符串*/
{ register i=0;
while(strpoint[i]!=0){
lcd_wdat(strpoint[i]);
i++;
}
}
/*************************************************************************/
/*Constant Tables*/
const char code c_music1[]={0x82,0x01,0x81,0x94,0x84, /*生日快乐歌*/
0xb4,0xa4,0x04,
0x82,0x01,0x81,0x94,0x84,
0xc4,0xb4,0x04,
0x82,0x01,0x81,0xf4,0xd4,
0xb4,0xa4,0x94,
0xe2,0x01,0xe1,0xd4,0xb4,
0xc4,0xb4,0x04,
0x00};
const char code c_music2[]={0x62, 0x52, /*两只蝴蝶*/
0x64, 0x64, 0x02, 0x52, 0x62, 0x52,
0x44, 0x44, 0x04, 0x22, 0x42,
0x54, 0x52, 0x62, 0x52, 0x42, 0x22, 0x42,
0x14, 0x14, 0x04, 0x62, 0x52,
0x64, 0x64, 0x02, 0x52, 0x62, 0x52,
0x44, 0x44, 0x04, 0x22, 0x42,
0x54, 0x52, 0x62, 0x52, 0x42, 0x22, 0x42,
0x54, 0x54, 0x04, 0x62, 0x82,
0x84, 0x84, 0x02, 0x82, 0x92, 0x82,
0x64, 0x64, 0x04, 0x52, 0x52,
0x54, 0x52, 0x62, 0x52, 0x42, 0x22, 0x91, 0x41,
0x42, 0x42, 0x44, 0x44, 0x44,
0x02, 0x82, 0x82, 0x92,
0xb2, 0xa2, 0xa2, 0x92, 0x64, 0x52, 0x62,
0x64, 0x64, 0x02, 0x62, 0x62, 0x82,
0x94, 0x94, 0x02, 0x22, 0x62, 0x52,
0x54, 0x54, 0x04, 0x62, 0x82,
0x82, 0x62, 0x84, 0x02, 0xb2, 0xb2, 0xa2,
0x92, 0xa2, 0x64, 0x02, 0x92, 0x92, 0xa2,
0x92, 0x82, 0x62, 0x52, 0x52, 0x62, 0x52, 0x62,
0x84, 0x84, 0x02, 0x82, 0x82, 0x92,
0x92, 0x82, 0x62, 0x52, 0x52, 0x12, 0x12, 0x22,
0x44, 0x44, 0x44, 0x44,
0x00};
const char code c_music3[]={0x04, 0x42, 0x41, 0x51,
0x62, 0x62, 0x52, 0x41, 0x51, 0x54, 0x02, 0x41, 0x51, /*老鼠爱大米*/
0x62, 0x62, 0x52, 0x42, 0x44, 0x02, 0x11, 0x21,
0x14, 0x11, 0x11, 0x21, 0x41, 0x44, 0x02, 0x42,
0x42, 0x42, 0x42, 0x41, 0x51, 0x54, 0x42, 0x51, 0x61,
0x62, 0x62, 0x82, 0x91, 0x51, 0x54, 0x62, 0x51, 0x41,
0x42, 0x42, 0x52, 0x61, 0x81, 0x84, 0x02, 0x81, 0x81,
0x92, 0x41, 0x41, 0x42, 0x61, 0x01, 0x52, 0x42, 0x42, 0x51, 0x41,
0x44, 0x44, 0x44, 0x62, 0x61, 0x81,
0x82, 0x81, 0x81, 0x82, 0x81, 0x91, 0x94, 0x62, 0x52,
0x42, 0x42, 0x42, 0x51, 0x61, 0x64, 0x02, 0x61, 0x81,
0x82, 0x82, 0x82, 0x91, 0xb1, 0xb2, 0x92, 0x82, 0x62,
0x52, 0x42, 0x42, 0x22, 0x54, 0x02, 0x61, 0x81,
0x82, 0x82, 0x81, 0x92, 0x81, 0x94, 0x62, 0x52,
0x42, 0x42, 0x42, 0x51, 0x61, 0x64, 0x02, 0x61, 0x81,
0x82, 0x82, 0x82, 0x91, 0xb1, 0xb2, 0x92, 0x82, 0x61, 0x51,
0x52, 0x52, 0x54, 0x54, 0x41, 0x62, 0x71,
0x62, 0x52, 0x54, 0x54, 0x62, 0x51, 0x41,
0x44, 0x62, 0x51, 0x41, 0x44, 0x62, 0x52,
0x62, 0x42, 0x62, 0x91, 0x81, 0x84, 0x02, 0x61, 0x81,
0x92, 0x91, 0x81, 0x82, 0x91, 0x81, 0x84, 0x61, 0x51, 0x42,
0x52, 0x51, 0x61, 0x52, 0x41, 0x51, 0x41, 0x53, 0x62, 0x51, 0x41,
0x44, 0x62, 0x51, 0x41, 0x44, 0x62, 0x52,
0x62, 0x42, 0x61, 0x92, 0x81, 0x84, 0x02, 0x61, 0x81,
0x92, 0x92, 0xb2, 0x81, 0x91, 0x82, 0x01, 0x81, 0x61, 0x51, 0x41,
0x54, 0x51, 0x41, 0x51, 0x61, 0x54, 0x62, 0x62,
0x54, 0x02, 0x42, 0x44, 0x44,
0x00};
const char code c_music4[]={0x04, 0x02, 0x41, 0x51, 0x62, 0x61, 0x61, 0x62, 0x52, /*梦醒时分*/
0x62, 0x81, 0x61, 0x62, 0x61, 0x81, 0x92, 0x92, 0x92, 0xa2,
0x82, 0x62, 0x62, 0x62, 0x61, 0x51, 0x42, 0x41, 0x41, 0x42, 0x22,
0x62, 0x81, 0x41, 0x44, 0x51, 0x52, 0x01, 0x52, 0x42,
0x81, 0x61, 0x52, 0x52, 0x41, 0x51, 0x62, 0x61, 0x61, 0x62, 0x52,
0x62, 0x81, 0x61, 0x62, 0x61, 0x81, 0x92, 0x91, 0x91, 0x92, 0xa2,
0x82, 0x62, 0x61, 0x81, 0x81, 0x81, 0x92, 0xb2, 0xb2, 0x92,
0x72, 0x52, 0x52, 0x81, 0x81, 0x92, 0xb2, 0xb2, 0x92,
0xb2, 0xc2, 0xc4, 0xc4, 0x01, 0x81, 0x81, 0x81,
0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xc1, 0xc1, 0xc2, 0xb1, 0xa1,
0xb2, 0xb2, 0xb2, 0xc2, 0x62, 0x82, 0x82, 0x81, 0x81,
0x92, 0xb1, 0xb1, 0xb2, 0xb2, 0xc2, 0x91, 0xb1, 0xb2, 0xb1, 0xb1,
0xc2, 0xc1, 0xc1, 0xc2, 0xb2, 0xd2, 0xc1, 0x81, 0x81, 0x81, 0x81, 0x81,
0xd2, 0xd2, 0xd2, 0xf2, 0xd2, 0xc1, 0xc1, 0xc2, 0xb1, 0xa1,
0xb2, 0xb2, 0xb2, 0xc2, 0x62, 0x82, 0x82, 0x81, 0x81,
0x92, 0xb1, 0xb1, 0xb2, 0xb1, 0xb1, 0xc2, 0x91, 0xb1, 0xb2, 0xb1, 0xb1,
0xc2, 0xc1, 0xc1, 0xc2, 0xb2, 0xd4, 0xc2, 0x01, 0xb1,
0xb4, 0xb4, 0xb4, 0xb4,
0x00};
const char code c_music5[]={0x54, 0x64, 0x64, /*大长今*/
0x64, 0x02, 0x52, 0x44,
0x24, 0x44, 0x44,
0x51, 0x43, 0x44, 0x44,
0x54, 0x64, 0x64,
0x64, 0x02, 0x82, 0x64,
0x64, 0x54, 0x64,
0x64, 0x64, 0x64,
0x84, 0x94, 0x94,
0x94, 0x84, 0x64,
0x64, 0x84, 0x94,
0x81, 0x91, 0x82, 0x84, 0x84,
0x54, 0x64, 0x64,
0x54, 0x02, 0x62, 0x64,
0x54, 0x64, 0x24,
0x41, 0x23, 0x94, 0x94,
0x24, 0x24, 0x24,
0x54, 0x64, 0x64,
0x64, 0x02, 0x52, 0x44,
0x24, 0x44, 0x44,
0x51, 0x43, 0x44, 0x44,
0x54, 0x64, 0x64,
0x64, 0x02, 0x82, 0x64,
0x64, 0x54, 0x64,
0x64, 0x64, 0x64,
0x84, 0x94, 0x94,
0x94, 0x02, 0x82, 0x64,
0x64, 0x84, 0x94,
0x84, 0x84, 0x84,
0x54, 0x64, 0x64,
0x54, 0x02, 0x62, 0x64,
0x54, 0x64, 0x24,
展开阅读全文