📄 playmusic.c
字号:
//************************************************************
//Copyright(C)2008,桂林电子科技大学电子工程学院科技协会
// “梦想起航”活动例程 电子琴
//************************************************************
//*************** 程序流程图********************
//
// 按键按下
// |
// 持续一定时间
// -------------|---------------
// | | |
//获取频率值 定时器打开 产生高低电平
// | | |
// -------------|---------------
// |
// 方波驱动蜂鸣器发声
// |
// |
// 按键释放
// |
// 定时器关闭
// |
// 蜂鸣器停止发声
//
//***********************************************
#include <reg51.h>
#include"key_4x3.h" //自己使用的键盘扫描程序所在的头文件
#define uchar unsigned char
#define uint unsigned int
#define LIGHT P1
sbit BUZZER = P0^0;
/*
//基本频率表 // 1 2 3 4 5 6 7
uint code FreqTab_1[]={ 64580, 64684, 64777, 64820, 64898, 64968, 65030, //中
65058, 65110, 65157, 65178, 65217, 65252, 65283 }; //高
*/
//FreqTab_1 和FreqTab_2 的关系: 65536 - FreqTab_2[i] = FreqTab_1[i]
// 1 2 3 4 5 6 7
uint code FreqTab_2[]={ 0, 956,842, 759, 716, 635, 568, 506, //中
478, 426, 372, 358, 319, 284, 253 }; //高
uchar keynum; //按键序号
//用于获取音调频率。★注意数据类型的取值范围,是否满足要求
uchar TONE_TH0; //定时器高8位
uchar TONE_TL0; //定时器低8位
//*******************************************
//函数名:ToneCreate
//函数功能:获取新的频率值
//*******************************************
void ToneCreate(void)
{
/*
TONE_TH0 = FreqTab_1[keynum] / 256; //取音频高8位
TONE_TL0 = FreqTab_1[keynum] % 256; //取音频低8位
*/
TONE_TH0 = (65536 - FreqTab_2[keynum]) / 256; //取音频高8位
TONE_TL0 = (65536 - FreqTab_2[keynum]) % 256; //取音频低8位
TR0 = 1;
}
//*******************************************
//函数名:Initi
//函数功能:初始化,使蜂鸣器和LED不工作
//*******************************************
void Initi(void)
{
BUZZER = 0; //蜂鸣器不响
TR0 = 0; //定时器停止计时
LIGHT = 0xff; //LED不亮
}
//*******************************************
//测试函数
void main(void)
{
TMOD = 0x01; //定时器0,16位工作方式
TH0 = (65536 - 2000) / 256; //给定时器高8位装入初值,这个地方的初值关系不太重要
TL0 = (65536 - 2000) % 256; //给定时器低8位装入初值
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断 [两者都打开才行]
TR0 = 1; //启动定时器
while(1)
{
keynum = KEY_num(0); //KEY_num(0)返回键盘值,和自己使用的键盘对应
switch(keynum) //键盘扫描后返回按键序号 [1~12]
{
case 1: ToneCreate(); LIGHT = 0xfe; break; // 按键1
case 2: ToneCreate(); LIGHT = 0xfe<<1; break; // 按键2
case 3: ToneCreate(); LIGHT = 0xfe<<2; break; // 按键3
case 4: ToneCreate(); LIGHT = 0xfe<<3; break; //
case 5: ToneCreate(); LIGHT = 0xfe<<4; break; //
case 6: ToneCreate(); LIGHT = 0xfe<<5; break; //
case 7: ToneCreate(); LIGHT = 0xfe<<6; break; //
case 8: ToneCreate(); LIGHT = 0xfe<<7; break; // 按键8
case 9:
case 10:
case 11:
case 12: ToneCreate(); LIGHT = 0x00; break;
// case 0:ToneCreate();LIGHT = 0xf0;break;
default: Initi(); break; //没有按键按下,TR0=0,不响
}
}
}
//*******************************************
//函数名:TONE
//函数功能:中断函数,重新装入初值,产生我们需要的频率方波
//*******************************************
void TONE(void) interrupt 1 using 0
{
BUZZER = ~BUZZER; //取反,高低电平周期转换
TH0 = TONE_TH0; //重新置初值
TL0 = TONE_TL0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -