⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playmusic.c

📁 单片机实现在的电子琴
💻 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 + -