收藏 分销(赏)

单片机课程设计电子音调发生器.doc

上传人:精*** 文档编号:9843848 上传时间:2025-04-10 格式:DOC 页数:76 大小:762KB 下载积分:16 金币
下载 相关 举报
单片机课程设计电子音调发生器.doc_第1页
第1页 / 共76页
单片机课程设计电子音调发生器.doc_第2页
第2页 / 共76页


点击查看更多>>
资源描述
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。 单片机课程设计 实验报告 电子音调发生器 姓名: 日期: 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,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服