|
/**************************************************************************************
* 电子琴
接线说明*
p2.7<-->蜂鸣器
P0<-->数码管
P1<-->矩阵键盘
* ************************************************************************************* */
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "key.h"
#define u8 unsigned char //对数据类型进行声明定义
#define u16 unsigned int
#define smg P0
sbit led=P2^7; //定义P20口是led
sbit test1=P3^6;
u16 Tab_F[]={ 262,286,331,349,392,440,494,//低音
523,587,659,698,784,880,988,//中音
1046,1175,1318,1396,1568,1760,1975};//高音
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 key_num;
u16 Freq,T_cnt;
bit beep;
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
***+****************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=(65536-100)/256; //给定时器赋初值,定时1ms
TL0=(65536-100)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
key_num=KeyDown();
if(key_num!=0xff)
{
P0=~smgduan[key_num]; //显示按键
Freq=Tab_F[key_num]; //发声
beep=1;
T_cnt=0;
EA=1;
}
};
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=(65536-89)/256; //给定时器赋初值,定时0.1ms
TL0=(65536-89)%256;
i++;
//test1=~test1;
if(i>(5000/Freq))
{
i=0;
if(beep==1)
{led=~led;}
}
T_cnt++;
if(T_cnt==1000)
{
beep=0;
led=0;
EA=0;
}
}
|
-
-
电子琴.zip
237.62 KB, 下载次数: 12, 下载积分: 黑币 -5
|