找回密码
 立即注册

QQ登录

只需一步,快速开始

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

音乐发生器 keil代码

[复制链接]
跳转到指定楼层
楼主
ID:782260 发表于 2021-3-26 13:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#define uint  unsigned int
#define uchar unsigned char
#define output P1                //P1口做输出接口  
#define input  P1       //P1口做输入接口


unsigned int code Soundtab[] = { 64580,64684,64777,64820,64898,64968,65030,65058,};  //设置T值
uint SoundTemp;        //用来存储T值
sbit Sound = P3^7;          //扬声器,接P3.7口

void delayms(uint xms)   //延时x毫秒
{
   uint x,y;
     for(x=xms;x>0;x--)
     for(y=110;y>0;y--);
}

void T0_INT(void) interrupt 1                  //中断程序
{       
     Sound = ~Sound;                                  //电平取反,发音
         TH0 = SoundTemp/256;                          //除以256                  
     TL0 = SoundTemp;                 //载入定时半周期的初始值

}

void main()
{
        TMOD = 0X01;                    //定时器T0设置为方式1
        EA = 1;                                         
        ET0 = 1;                                  //使能 T0 中断       
        TR0 = 0;                                //关闭T0定时器
        while(1)                                //循环
  {
               
         uint n;       
         uchar L,H;                             //临时保存读取的行或者列                                  
         output = 0x0f;               
            L = input;                                //读取列
         if(0x0f != L)                   //如果按键按下
        {                                          
                delayms(5);                    //延时,用于消除抖动
                L = input;                        //再读取列
                if(0x0f != L)                //说明按键按下       
                {
                        L = L & 0x0f;                //保留低4位
                        output = 0xf0;                        //准备读取行
                        delayms(1);                             //延时
                        H = input;                            //读取行
                        H = H & 0xf0;                //保留高4位
                        L = L | H;                    //将列和行的值合并
                }
        }
       
        if(L==0xee)
        {                                                                                //P1=11101110  P1^0与P1^4输入低电平         说明是按键1按下
                  n=0;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }       
        if(L==0xde)
        {                                                                                //P1=11011110  P1^0与P1^5输入低电平         说明是按键2按下
                  n=1;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }                       
        if(L==0xbe)
        {                                                                                //说明是按键3按下
                  n=2;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }                
        if(L==0x7e)
        {                                                                                //说明是按键4按下
                  n=3;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }
        if(L==0xed)
        {                                                                                //说明是按键5按下
                  n=4;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }
        if(L==0xdd)
        {                                                                                //说明是按键6按下
                  n=5;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }
        if(L==0xbd)
        {                                                                                //说明是按键7按下
                  n=6;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }
        if(L==0x7d)
        {                                                                                //说明是按键8按下
                  n=7;
                  SoundTemp = Soundtab[n];                         //读取音调的简谱码T值
              TR0 = 1;                                            //启动中断
                  while(0xf0 != output);                    //检测按键松开
              TR0 = 0;
                  Sound = 1        ;
        }
  }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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