找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2419|回复: 0
打印 上一主题 下一主题
收起左侧

单片机电子琴制作

[复制链接]
跳转到指定楼层
楼主
ID:205181 发表于 2017-5-26 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//-------------------------------------------------
//名称:可演奏的电子琴
//-------------------------------------------------
//说明:矩阵键盘模拟演奏电子琴,数码管显示按键号
//-------------------------------------------------
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//共阳数码管编码
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//0123456789ABCDEF
uint code  music[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65085,65110,65157,65178};
//音符      频率HZ 简谱(T值)
//低 3 M 330  64021
//低 4 FA 349  64103
//低 5 SO 392  64260
//低 6 LA 440  64400
//低 7 SI 494  64524
//中 1 DO 523  64580
//中 2 RE 587  64684
//中 3 M 659  64777
//中 4 FA 698  64820
//中 5 SO 784  64898
//中 6 LA 880  64968
//中 7 SI 988  65030
//高 1 DO 1046 65058
//高 2 RE 1175 65110
//高 3 M 1318 65157
//高 4 FA 1397 65178
sbit BEEP = P2^1;  //蜂鸣器
uchar KeyNO;       //按键序号
//-----------------------------------------------------------------------
//延时
//-------------------------------------------------------------------------
void delayms(unsigned int t)//延时1ms程序
{
unsigned int i,j;
for(i=0;i<t;i++)//循环语句
for(j=0;j<120;j++)//循环语句
;
}
//键盘矩阵扫描子程序
void Keys_Scan()
{  uchar Tmp,key;
    //高四位置0,放入四行
P1 = 0x0f; //P1输出0x0f
delayms(1); //延时1ms
Tmp = P1 ^ 0x0f;//读取P1
switch(Tmp)
{
   case 1: key = 0; break;//键值为0
  case 2: key = 1; break;//键值为1
  case 4: key = 2; break;//键值为2
  case 8: key = 3; break;//键值为3
  default: return; //无键按下
}
P1 = 0xf0;    //P1输出0xF0
delayms(1);    //延时1ms
Tmp = P1 >> 4 ^ 0x0f;//读取P1
switch(Tmp)
{
   case 1: key += 0; break;//键值+0
  case 2: key += 4; break;//键值+4
  case 4: key += 8; break;//键值+8
  case 8: key += 12;break;//键值+12
  default: return;//无键按下
}
  KeyNO=key;  //获取键值
}
//--------------key---------------------------------------
void Play_Tone() interrupt 1
{
TH0 = music[KeyNO]/256;  //不同的按键 产生不同的频率声音
TL0 = music[KeyNO]%256;  //不同的按键 产生不同的频率声音
    BEEP=~BEEP;              //蜂鸣器取反,输出音乐
}
void main()
{ P0 = 0xBF;              //初始显示'-'
TMOD=0x01;              //设置定时器0 16定时模式   
IE=0x82;                //开中断
while(1)
{
   P1=0xF0;               //输出
   if(P1!=0xF0)           //有键按下
   {
     Keys_Scan();     //扫描键盘
     P0= tab[KeyNO];   //显示按键
     TR0=1;             //启动定时器,根据按键发音
   }
     else
  {
    TR0=0;
  }      //关定时器 停止播放
  delayms(2);          //延时2ms
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表