#include<reg51.h> //包含51单片机寄存器定义的头文件
/*sbit P14=P1^4; //将P14位定义为P1.4引脚
sbit P15=P1^5; //将P15位定义为P1.5引脚
sbit P16=P1^6; //将P16位定义为P1.6引脚
sbit P17=P1^7; //将P17位定义为P1.7引脚 */
unsigned char keyval; //定义变量储存按键值
sbit sound=P3^7; //将sound位定义为P3.7
unsigned int C; //全局变量,储存定时器的定时常数
unsigned int f; //全局变量,储存音阶的频率
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xa3,0x8c,0xc8};
//以下是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
#define 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
/**************************************************************
函数功能:软件延时子程序
**************************************************************/
/* void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
} /*
/*******************************************
函数功能:节拍的延时的基本单位,延时200ms
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/*******************************************
函数功能:输出音频
入口参数:F
******************************************/
void Output_Sound(void)
{
C=(46083/f)*10; //计算定时常数
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //开定时T0
P2=table[keyval];
delay(); //延时200ms,播放音频
TR0=0; //关闭定时器
sound=1; //关闭蜂鸣器
keyval=0xff; //播放按键音频后,将按键值更改,停止播放
}
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{
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位赋初值
while(1) //无限循环
{
switch(keyval)
{
case 1:f=l_dao; //如果第1个键按下,将低音1的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 2:f=l_re; //如果第2个键按下,将低音2的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 3:f=l_mi; //如果第3个键按下,将低音3的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 4:f=l_fa; //如果第4个键按下,将低音4的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 5:f=l_sao; //如果第5个键按下,将低音5的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 6:f=l_la; //如果第6个键按下,将低音6的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 7:f=l_xi; //如果第7个键按下,将低音7的频率赋给f
Output_Sound(); //转去计算定时常数
break;
case 8:f=dao; //如果第8个键按下,将中音1的频率赋给f
Output_Sound(); //转去计算定时常数
break;
}
}
}
/**************************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波
**************************************************************/
void Time0_serve(void ) interrupt 1 using 1
{
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
sound=~sound; //将P3.7引脚取反,输出音频方波
}
/**************************************************************
函数功能:定时器T1的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/
void time1_serve(void) interrupt 3 using 2 //定时器T1的中断编号为3,使用第2组寄存器
{
TR1=0; //关闭定时器T0
if(P1==0xfe) //如果检测到接P1.0引脚的列线为低电平“0”
keyval=1; //可判断是S1键被按下
if(P1==0xfd) //如果检测到接P1.1引脚的列线为低电平“0”
keyval=2; //可判断是S2键被按下
if(P1==0xfb) //如果检测到接P1.2引脚的列线为低电平“0”
keyval=3; //可判断是S3键被按下
if(P1==0xf7) //如果检测到接P1.3引脚的列线为低电平“0”
keyval=4; //可判断是S4键被按下
if(P1==0xef) //如果检测到接P1.4引脚的列线为低电平“0”
keyval=5; //可判断是S5键被按下
if(P1==0xdf) //如果检测到接P1.5引脚的列线为低电平“0”
keyval=6; //可判断是S6键被按下
if(P1==0xbf) //如果检测到接P1.6引脚的列线为低电平“0”
keyval=7; //可判断是S7键被按下
if(P1==0x7f) //如果检测到接P1.7引脚的列线为低电平“0”
keyval=8; //可判断是S8键被按下
TR1=1; //开启定时器T1
TH1=(65536-500)/256; //定时器T1的高8位赋初值
TL1=(65536-500)%256; //定时器T1的高8位赋初值
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的8按键LM386放大数码管显示电子琴设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、proteus仿真。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
80、基于51单片机8按键LM386放大数码管显示电子琴电路图及proteus仿真及程序.rar (38个子文件)
80、基于51单片机8按键LM386放大数码管显示电子琴电路图及proteus仿真及程序
proteus仿真
程序
电子琴.M51 7KB
电子琴_Uv2.Bak 2KB
电子琴.Opt 1015B
电子琴_Opt.Bak 973B
Text1.OBJ 6KB
Text1.C 6KB
电子琴.lnp 43B
Text1.LST 11KB
电子琴.plg 246B
电子琴.Uv2 2KB
电子琴 5KB
电子琴.hex 2KB
电子琴1.PWI 742B
电子琴1.DSN 126KB
Last Loaded 电子琴1.DBK 127KB
电路图
电子琴.PRJPCB 53KB
PCB1.PcbDoc 346KB
__Previews
Sheet1.SchDocPreview 47KB
History
电子琴.~(1).PRJPCB.Zip 5KB
Sheet1.~(1).SchDoc.Zip 14KB
电子琴.~(2).PRJPCB.Zip 5KB
电子琴.PcbDoc.htm 4KB
电子琴.PrjPcbStructure 48B
Sheet1.SchDoc 127KB
电子琴.OutJob 3KB
电子琴.PcbDocPreview 24KB
程序
电子琴.M51 7KB
电子琴_Uv2.Bak 2KB
电子琴.Opt 1015B
电子琴_Opt.Bak 973B
Text1.OBJ 6KB
Text1.C 6KB
电子琴.lnp 43B
Text1.LST 11KB
电子琴.plg 246B
电子琴.Uv2 2KB
电子琴 5KB
电子琴.hex 2KB
共 38 条
- 1
资源评论
>行者<
- 粉丝: 209
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功