标题:
51单片机电子琴程序代码
[打印本页]
作者:
das
时间:
2015-4-16 03:04
标题:
51单片机电子琴程序代码
51 电子琴程序代码 姬家寨电子科技实验室 程序编程:姬学瑞 版权所有,侵权必究!
#include <REGX51.H>
#define FOSC 12000000
//=================================================================================================
//--- 音阶频率表 ---
unsigned int code JINJIEFREQ[] =
{
262,294,330,349,392,440,494,
523,587,659,699,784,880,988,
1046,1175,1319,1391,1568,1760,1976,
};
//sfr P4 = 0xC0;
//sfr P5 = 0xC8;
//sbit P5_5 = P5^5;
#define SPK P3_7//P5_5
bit RunFlag = 0;
unsigned char STH0,STL0;
//sfr AUXR = 0x8E;
#define T0FENPING 12
//=================================================================================================
//--- 定时器T0溢出中断服务程序 ---
void T0_ISR(void) interrupt 1
{
if(1 == RunFlag) //--- 在音阶播放标志为1情况下 ---
{
TH0 = STH0; //--- 重新装初值 ---
TL0 = STL0;
SPK = ~SPK; //--- P5.5引脚上的电平翻转 ---
}
}
//=================================================================================================
//--- main()主程序 ---
void main(void)
{
unsigned int i;
unsigned char j;
// AUXR |= 0x80; //--- 使能T0的计数器时钟分频值为1 ---
TMOD = 0x01; //--- 配置T0为定时模式,工作于方式2 ---
ET0 = 1; //--- 使能T0中断 ---
TR0 = 1;
EA = 1; //--- CPU开中断 ---
while(1)
{
for(j=0;j<7;j++)
{
if(0 == (P1 & (1 << j))) //--- 判断低音部分是否有键按下 ---
{
for(i=0;i<2000;i++); //--- 去按键抖动 ---
if(0 == (P1 & (1 << j))) //--- 再判断低音部分是否真得有键按下 ---
{ //--- 根据表计算低音音阶频率的定时器T0的初值 ---
STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) / 256;
STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) % 256;
TH0 = STH0; //--- 装入TH0,TL0的计数寄存器 ---
TL0 = STL0;
RunFlag = 1; //--- 置音阶播放标志为1 ---
}
while(0 == (P1 & (1 << j))); //--- 等待按键释放 ---
RunFlag = 0; //--- 清音阶播放标志 ---
SPK = 1;
}
if(0 == (P3 & (1 << j))) //--- 判断中音部分是否有键按下 ---
{
for(i=0;i<2000;i++); //--- 去按键抖动 ---
if(0 == (P3 & (1 << j))) //--- 再判断中音部分是否真得有键按下 ---
{ //--- 根据表计算中音音阶频率的定时器T0的初值 ---
STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) / 256;
STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) % 256;
TH0 = STH0; //--- 装入TH0,TL0的计数寄存器 ---
TL0 = STL0;
RunFlag = 1; //--- 置音阶播放标志为1 ---
}
while(0 == (P3 & (1 << j))); //--- 等待按键释放 ---
RunFlag = 0; //--- 清音阶播放标志 ---
SPK = 1;
}
if(0 == (P2 & (1 << j))) //--- 判断高音部分是否有键按下 ---
{
for(i=0;i<2000;i++); //--- 去按键抖动 ---
if(0 == (P2 & (1 << j))) //--- 再判断高音部分是否真得有键按下 ---
{ //--- 根据表计算高音音阶频率的定时器T0的初值 ---
STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) / 256;
STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) % 256;
TH0 = STH0; //--- 装入TH0,TL0的计数寄存器 ---
TL0 = STL0;
RunFlag = 1; //--- 置音阶播放标志为1 ---
}
while(0 == (P2 & (1 << j))); //--- 等待按键释放 ---
RunFlag = 0; //--- 清音阶播放标志 ---
SPK = 1;
}
}
}
}
复制代码
作者:
913059794
时间:
2015-5-7 15:44
好东西,谢谢
作者:
uva2015
时间:
2015-5-8 17:28
谢谢分享
作者:
万丛草111
时间:
2015-5-8 19:16
楼主真厉,不错!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1