找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机电子琴+按键播歌

[复制链接]
跳转到指定楼层
楼主
ID:635608 发表于 2019-11-8 12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define output P1
#define input P1

typedef unsigned int u16;  
typedef unsigned char u8;
enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15}; //????16??????
uchar code table[]={      //???鶨??,????????
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned int code Freqtab[] = {  //?????????????
     64021,64103,64260,64400,      //????3 4 5 6
     64524,64580,64684,64777,      //????7,????1 2 3
     64820,64898,64968,65030,      //????4 5 6 7
     65058,65110,65157,65178};     //????1 2 3 4
uint FreqTemp;  
u8 flag;
sbit SPEAK = P3^7;   //???????????? J7??P37????
sbit k1=P3^2;            //????P32 ????k1
unsigned int C;    //???????????????
#define L1 262         
#define L2 284
#define L3 311
#define L4 349
#define L5 392
#define L6 440
#define L7 494
#define Z1 523
#define Z2 587
#define Z3 659
#define Z4 698
#define Z5 784
#define Z6 880
#define Z7 987
#define H1 1046
#define H2 1174
#define H3 1318
#define H4 1396
#define H5 1567
#define H6 1760
#define H7 1975
unsigned code GP[]={Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z6,Z5,Z6,H1,Z5,       //???????????
                    Z3,Z3,Z4,Z3,H4,H1,Z3,H1,H1,Z7,Z4,Z4,Z7,
                                        Z7,Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z6,Z5,Z6,H1,
                                        Z5,Z2,Z3,Z4,H1,Z7,H1,H2,H2,H3,H1,H1,Z7,
                                        Z6,Z6,Z7,Z5,Z6,H1,H2,H3,H2,H3,H5,H2,H1,
                                        H1,Z7,H1,H3,H3,Z6,Z7,H1,Z7,H1,H2,H1,Z5,
                                        Z5,H4,H3,H2,H1,H3,H3,H3,H6,H6,H5,H5,H3,
                                        H2,H1,H1,H2,H1,H2,H5,H3,H3,H6,H6,H5,H5,
                                        H3,H2,H1,H1,H2,H1,H2,Z7,Z6,Z6,0xff};
unsigned code JP[]={4,4,/**/12,4,8,8,/**/20,8,/**/12,4,8,8,      //?????????
                    20,4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,8,8,
                                        /**/20,4,4,/**/12,4,8,8,/**/20,8,/**/12,4,8,8,
                                        /**/20,4,4,/**/8,4,12,3,1,/**/12,4,12,/**/4,4,
                                        4,4,8,8,/**/20,4,4,/**/12,4,8,8,/**/24,/**/
                                        8,4,4,8,8,/**/24,/**/4,4,8,4,4,8,/**/12,4,12,
                                        /**/8,8,8,4,4,/**/16,8,/**/12,4,12,4,/**/4,4,12,8,
                                        /**/12,4,8,8,/**/16,8,/**/12,4,12,4,/**/4,4,12,8,
                                        /**/12,4,8,3,1,/**/32};
void delay()          //?????????????????  ???15.6ms
{
uint i,j;
for(i=70;i>0;i--)
   {for(j=110;j>0;j--);}
}
void delay1ms(uint n)   //??????????? ??? 0us ,???n????
{
    uint a,b,c;
for(c=n;c>0;c--)
     for(b=199;b>0;b--)
         for(a=1;a>0;a--);
}
void delayxiaodou(u16 i) //???????????
{
while(i--);
}
uint key_input(void)     //?????????
{
uchar temp1,temp2;   //????????????л?????
    uchar num = 16;       //??????????
output = 0x0f;  
    temp1 = input;    //??????
if(0x0f != temp1)     //????????
{        
  delay1ms(5);   //?????????????
  temp1 = input;   //??ζ????
  if(0x0f != temp1)  //?????????????
  {
            temp1 = temp1 & 0x0f; //?????4λ
   output = 0xf0;   //????????
   delay1ms(1);   //?????£??????????????
   temp2 = input;   //???????
   temp2 = temp2 & 0xf0; //?????4λ
   temp1 = temp1 | temp2; //??temp1??temp2??????
  }
}
switch(temp1)        //?ж????λ?? switch???
{
        case 0xee:num=0;break;  
        case 0xde:num=1;break;  
        case 0xbe:num=2;break;   
        case 0x7e:num=3;break;
  case 0xed:num=4;break;               
        case 0xdd:num=5;break;           
        case 0xbd:num=6;break;            
        case 0x7d:num=7;break;   
  case 0xeb:num=8;break;   
        case 0xdb:num=9;break;   
        case 0xbb:num=10;break;   
        case 0x7b:num=11;break;   
  case 0xe7:num=12;break;   
        case 0xd7:num=13;break;   
        case 0xb7:num=14;break;   
        case 0x77:num=15;break;      
  default:break;
}
return num;         //???????λ??
}
  
void T0_INT(void) interrupt 1     //1???ж? ??????
{
     flag=1;
  TL0 = FreqTemp;                //???????????????
     TH0 = FreqTemp >> 8;
     SPEAK = ~SPEAK;                    //????
}

void Int0Init()
{      //???? INT0
  IT0=1;//????????????????????
  EX0=1;//?? INT0 ???ж??????
  EA=1;//?????ж?
}

int main()
{
    flag=1;
    TMOD = 0X01;  //?????T0????????1
EA = 1;
ET0 = 1;
TR0 = 0;
EA=1;         //?????ж?
    ET1=1;        //??t1?ж?
Int0Init();
while(1)
{

if(flag==1)
    {
   uint num,temp;  
   TR1 = 0;
   num = key_input();
   temp = num;
   P0 = table[num];
     if(16 != num)
     {
    FreqTemp = Freqtab[num];
    TR0 = 1;
    while(0xf0 != output);  //????????
    TR0 = 0;
    SPEAK = 1;
     }
    }
    else if(flag==0)
       {
   
     uchar i,j;

   
      while(1)
    { i=0;
        while(GP[i]!=0xff)
       {
     if(flag == 1)
    break;
    C=460830/GP[i];
          TH1=(8192-C)/32;
          TL1=(8192-C)%32;
          TR1=1;//???????0
          for(j=0;j<JP[i];j++)
         {
            delay();
         }
          TR1=0;
          i++;
       }
         SPEAK=0;
   flag = 1;
   break;
    }
      
  }
     
}
return 0;
}
void T1_time()interrupt 3  //?????????????
{  
TR1=0;
SPEAK=!SPEAK;
TH1=(8192-C)/32;
TL1=(8192-C)%32;
TR1=1;
}
void  Int0Init1()interrupt 0  //?????????????
{
  delayxiaodou(1000) ;
  if(k1==0)
  {
   flag=!flag;
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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