找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1991|回复: 0
收起左侧

单片机8键电子琴

[复制链接]
ID:321563 发表于 2018-7-7 12:50 | 显示全部楼层 |阅读模式
#include <reg52.H>
unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]=  {64820,64898,64968,65030,65058,65110,65157,65178};  //音符表 do re mi fa sol la xi duo

unsigned int aa;

sbit K1=P1^0;  //音符按键
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;

sbit Speak=P2^0; //喇叭
/***********************1ms*****************************/
void delay_1ms(unsigned int q)
{
        unsigned int i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

void main(void)   //主程序
{                         
    TMOD=0x01;
        ET0=1;
        EA=1;
        Speak=0;
        while(1)
                {
           if(!K1)               
                    {
                           delay_1ms(20);//延时去抖
                                  if(!K1)
                                  {
                                     aa=0;
                     key=0;//将音乐的值赋值给定时器以便发出对应的声音
                                         P0=0xC0;//显示0
                     STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                     STL0=tab[key]%256;
                                     TR0=1;
                                     while(!K1)
                                   ;
                  }
            }
                if(!K2)               
                    {
                           delay_1ms(20);//延时去抖
                                  if(!K2)
                                  {
                                    aa=0;
                    key=1;
                                        P0=0xF9;//显示1
                    STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                   STL0=tab[key]%256;
                                   TR0=1;
                                   while(!K2)
                                   ;
                  }
           }
                if(!K3)               
                    {
                           delay_1ms(20);//延时去抖
                                  if(!K3)
                                  {
                                   aa=0;
                   key=2;
                                   P0=0xA4;//显示2
                    STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                   STL0=tab[key]%256;
                                   TR0=1;
                                   while(!K3)
                                   ;
                  }
             }               
                if(!K4)               
                    {
                          delay_1ms(20);//延时去抖
                           if(!K4)
                                 {
                                  aa=0;
                  key=3;
                                  P0=0xB0;//显示3
                  STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                   STL0=tab[key]%256;
                                   TR0=1;
                                   while(!K4)
                                   ;
                 }
              }               
                if(!K5)               
                    {
                           delay_1ms(20);//延时去抖
                                  if(!K5)
                                  {
                                   aa=0;
                   key=4;
                                        P0=0x99;//显示4
                   STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                   STL0=tab[key]%256;
                                   TR0=1;
                                   while(!K5)
                                   ;
                  }
              }
                if(!K6)               
                    {
                         delay_1ms(20);//延时去抖
                         if(!K6)
                          {
                            aa=0;
                key=5;
                                P0=0x92;//显示5
                STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                STL0=tab[key]%256;
                                TR0=1;
                                while(!K6)
                                ;
               }
            }
                if(!K7)               
                    {
                         delay_1ms(20);//延时去抖
                        if(!K7)
                        {
                          aa=0;
              key=6;
                          P0=0x82;//显示6
              STH0=tab[key]/256;        //计算音符对应的定时器计数值
                          STL0=tab[key]%256;
                          TR0=1;
                          while(!K7)
                          ;
            }
           }
                if(!K8)               
                    {
                         delay_1ms(20);//延时去抖
                         if(!K8)
                                {                                 
                                 aa=0;
                 key=7;
                                 P0=0xF8;//显示7
                 STH0=tab[key]/256;        //计算音符对应的定时器计数值
                                 STL0=tab[key]%256;
                                 TR0=1;
                                 while(!K8)
                                 ;
                }
             }
                 if(aa<50000)aa++;
                 delay_1ms(20);               
                 if(aa>=150) //延时时间数字越大越久
                    {
                         TR0=0;
                     Speak=0;//当按键弹起的时候,蜂鸣器停止发音
                        }       
             }                       
         }

void t0(void) interrupt 1 using 0 {     //定时器T0中断服务函数
        TH0=STH0;
        TL0=STL0;
        Speak=~Speak;                                  //产生方波
}

TIM截图20180707124949.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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