基于51单片机具有存储记忆节拍功能的电子琴源程序(共9页).doc

上传人:飞****2 文档编号:14027769 上传时间:2022-05-02 格式:DOC 页数:9 大小:40KB
返回 下载 相关 举报
基于51单片机具有存储记忆节拍功能的电子琴源程序(共9页).doc_第1页
第1页 / 共9页
基于51单片机具有存储记忆节拍功能的电子琴源程序(共9页).doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《基于51单片机具有存储记忆节拍功能的电子琴源程序(共9页).doc》由会员分享,可在线阅读,更多相关《基于51单片机具有存储记忆节拍功能的电子琴源程序(共9页).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上基于51单片机有存储功能的电子琴源程序#include /包含51单片机寄存器定义的头文件sbit P14=P14; /将P14位定义为P1.4引脚sbit P15=P15; /将P15位定义为P1.5引脚sbit P16=P16; /将P16位定义为P1.6引脚sbit P17=P17; /将P17位定义为P1.7引脚unsigned char keyval; /定义变量储存按键值sbit sound=P37; /将sound位定义为P3.7sbit P31=P30; /将P31位定义为P3.1引脚sbit P34=P34; /将P34位定义为P3.4引脚sbit

2、P35=P35; /将P35位定义为P3.5引脚unsigned int C; /全局变量,储存定时器的定时常数unsigned int f; /全局变量,储存音阶的频率unsigned char s; /全局变量,储存节拍/以下是C调低音的音频宏定义#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 /将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 /将“l_mi”宏定义为低音“3”的频率311Hz#define l_fa 349 /将“l_fa”宏定义为低音“4”的频率349Hz#def

3、ine l_sao 392 /将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 /将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 /将“l_xi”宏定义为低音“7”的频率494Hz /以下是C调中音的音频宏定义#define dao 523 /将“dao”宏定义为中音“1”的频率523Hz#define re 587 /将“re”宏定义为中音“2”的频率587Hz#define mi 659 /将“mi”宏定义为中音“3”的频率659Hz#define fa 698 /将“fa”宏定义为中音“4”的频率698Hz#define

4、sao 784 /将“sao”宏定义为中音“5”的频率784Hz#define la 880 /将“la”宏定义为中音“6”的频率880Hz#define xi 987 /将“xi”宏定义为中音“7”的频率53 /以下是C调高音的音频宏定义#define h_dao 1046 /将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 /将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 /将“h_mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 /将“h_fa”宏定义为高音“4”的频率1396Hz#d

5、efine h_sao 1567 /将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 /将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 /将“h_xi”宏定义为高音“7”的频率1975Hz/*函数功能:软件延时子程序*/ void delay20ms(void) unsigned char i,j;for(i=0;i100;i+) for(j=0;j60;j+) ; /*函数功能:节拍的延时的基本单位,延时200ms*/void delay() unsigned char i,j; for(i=0;i250;i+) f

6、or(j=0;j250;j+) ; /*函数功能:输出音频入口参数:F*/void Output_Sound(void) C=(50000/f)*10; /计算定时常数 TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; /可证明这是13位计数器TL0低5位的赋初值方法 TR0=1; /开定时T0 for(s=0;s2;s+) delay(); /延时200ms,播放音频 TR0=0; /关闭定时器 sound=1; /关闭蜂鸣器 keyval=0xff; /播放按键音频后,将按键值更改,停止播放/*函数功能:主函数*/void

7、 main(void) unsigned char n,m,k,x,z; unsigned char pu41; /定义数组pu用于存储键盘扫描结果 while(1) m=0; /对m付初值 n=0; /对n付初值 k=0; /对k付初值 x=0; /对x付初值 EA=1; /开总中断 ET0=1; /定时器T0中断允许ET1=1; /定时器T1中断允许TR1=1; /定时器T1启动,开始键盘扫描 TMOD=0x10; /分别使用定时器T1的模式1,T0的模式0 TH1=(65536-500)/256; /定时器T1的高8位赋初值 TL1=(65536-500)%256; /定时器T1的高8位

8、赋初值 while(n!=1&m40) /无限循环 P34=0; /点亮P3.4口的LED灯用作扫描键盘时的指示灯P35=1; /关闭P3.5口的LED灯用作播放时的指示灯 switch(keyval) case 1:f=dao; /如果第1个键按下,将中音1的频率赋给f Output_Sound(); /转去计算定时常数 pum=dao; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 2:f=l_xi; /如果第2个键按下,将低音7的频率赋给f Output_Sound(); /转去计算定时常数 pum=l_xi; /将键

9、盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 3:f=l_la; /如果第3个键按下,将低音6的频率赋给f Output_Sound(); /转去计算定时常数 pum=l_la; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 4:f=l_sao; /如果第4个键按下,将低音5的频率赋给f Output_Sound(); /转去计算定时常数 pum=l_sao; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break

10、; case 5:f=sao; /如果第5个键按下,将中音5的频率赋给f Output_Sound(); /转去计算定时常数 pum=sao; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 6:f=fa; /如果第6个键按下,将中音4的频率赋给f Output_Sound(); /转去计算定时常数 pum=fa; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 7:f=mi; /如果第7个键按下,将中音3的频率赋给f Output_Sound(); /转去计

11、算定时常数 pum=mi; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 8:f=re; /如果第8个键按下,将中音2的频率赋给f Output_Sound(); /转去计算定时常数 pum=re; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 9:f=h_re; /如果第9个键按下,将高音2的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_re; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一

12、个元素付值 break; case 10:f=h_dao; /如果第10个键按下,将高音1的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_dao; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 11:f=xi; /如果第11个键按下,将中音7的频率赋给f Output_Sound(); /转去计算定时常数 pum=xi; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 12:f=la; /如果第12个键按下,将中音6的频率赋给f

13、 Output_Sound(); /转去计算定时常数 pum=la; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 13:f=h_la; /如果第13个键按下,将高音6的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_la; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 14:f=h_sao; /如果第14个键按下,将高音5的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_sao; /将键盘扫描的结果

14、付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 15:f=h_fa; /如果第15个键按下,将高音4的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_fa; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; case 16:f=h_mi; /如果第16个键按下,将高音3的频率赋给f Output_Sound(); /转去计算定时常数 pum=h_mi; /将键盘扫描的结果付数组pu的元素 m+; /付值完毕m自动加1用于对数组的下一个元素付值 break; ca

15、se 17:n=1; /跳出循环 break; while(puk!=0) /播放通过按键写入的音乐 P34=1; /关闭P3.4口的LED灯用作扫描键盘时的指示灯P35=0; /打开P3.5口的LED灯用播放时的指示灯 f=puk; Output_Sound(); k+; for(z=0;z41;z+) puz=0; /*函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波*/ void Time0_serve(void ) interrupt 1 using 1 TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32;

16、 /可证明这是13位计数器TL0低5位的赋初值方法 sound=!sound; /将P3.7引脚取反,输出音频方波 /*函数功能:定时器T1的中断服务子程序,进行键盘扫描,判断键位*/ void time1_serve(void) interrupt 3 using 2 /定时器T1的中断编号为3,使用第2组寄存器 TR1=0; /关闭定时器T0 P1=0xf0; /所有行线置为低电平“0”,所有列线置为高电平“1” P2=0xff; if(P1&0xf0)!=0xf0) /列线中有一位为低电平“0”,说明有键按下 delay20ms(); /延时一段时间、软件消抖 if(P1&0xf0)!=

17、0xf0) /确实有键按下 P1=0xfe; /第一行置为低电平“0”(P1.0输出低电平“0”) if(P14=0) /如果检测到接P1.4引脚的列线为低电平“0” keyval=1; /可判断是S1键被按下 if(P15=0) /如果检测到接P1.5引脚的列线为低电平“0” keyval=2; /可判断是S2键被按下 if(P16=0) /如果检测到接P1.6引脚的列线为低电平“0” keyval=3; /可判断是S3键被按下 if(P17=0) /如果检测到接P1.7引脚的列线为低电平“0” keyval=4; /可判断是S4键被按下 P1=0xfd; /第二行置为低电平“0”(P1.1

18、输出低电平“0”) if(P14=0) /如果检测到接P1.4引脚的列线为低电平“0” keyval=5; /可判断是S5键被按下 if(P15=0) /如果检测到接P1.5引脚的列线为低电平“0” keyval=6; /可判断是S6键被按下 if(P16=0) /如果检测到接P1.6引脚的列线为低电平“0” keyval=7; /可判断是S7键被按下 if(P17=0) /如果检测到接P1.7引脚的列线为低电平“0” keyval=8; /可判断是S8键被按下 P1=0xfb; /第三行置为低电平“0”(P1.2输出低电平“0”) if(P14=0) /如果检测到接P1.4引脚的列线为低电平

19、“0” keyval=9; /可判断是S9键被按下 if(P15=0) /如果检测到接P1.5引脚的列线为低电平“0” keyval=10; /可判断是S10键被按下 if(P16=0) /如果检测到接P1.6引脚的列线为低电平“0” keyval=11; /可判断是S11键被按下 if(P17=0) /如果检测到接P1.7引脚的列线为低电平“0” keyval=12; /可判断是S12键被按下 P1=0xf7; /第四行置为低电平“0”(P1.3输出低电平“0”) if(P14=0) /如果检测到接P1.4引脚的列线为低电平“0” keyval=13; /可判断是S13键被按下 if(P15

20、=0) /如果检测到接P1.5引脚的列线为低电平“0” keyval=14; /可判断是S14键被按下 if(P16=0) /如果检测到接P1.6引脚的列线为低电平“0” keyval=15; /可判断是S15键被按下 if(P17=0) /如果检测到接P1.7引脚的列线为低电平“0” keyval=16; /可判断是S16键被按下 if(P31=0) delay20ms(); if(P31=0) /确定P2.1脚确实有按键按下 keyval=17; TR1=1; /开启定时器T1 TH1=(65536-500)/256; /定时器T1的高8位赋初值 TL1=(65536-500)%256; /定时器T1的高8位赋初值 专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁