51单片机制作电子琴

发布者:岭南布衣最新更新时间:2016-01-15 来源: eefocus关键字:51单片机  电子琴 手机看文章 扫描二维码
随时随地手机看文章
#include

unsigned char tone;
unsigned char op;

sbit led=P1^1;
sbit spk=P1^0;
sbit key1=P3^2;       //两只老虎演奏按键
sbit key2=P3^3;       //1~i演奏按键
unsigned char code shuma[]={
                           

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//用于使定时器初值变化以产生相应频率的定时
unsigned char code yinfu_H[]=

{0xfb,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0x00};          
unsigned char code yinfu_L[]=

{0xe9,0x5c,0xc1,0xef,0x45,0x92,0xd0,0xee,0x00};

 

void delay(unsigned int N)
{
       unsigned int j=N;
       while(j--)
       {
        unsigned char i;
        for(i=0;i<250;i++);
       }
}
unsigned  char code laohu[]=

{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,3,1,1,3

,1,1};//两只老虎乐谱
unsigned  char code  laohuys[]=

{220,220,220,220,220,220,220,220,220,220,235,220,220,210,150

,150,
                               

170,170,200,200,150,150,170,170,200,200,244,240,250,244,220,

250};
//定时器初始化
void initTimer(void)
{
 TMOD=0x01;
 TH0=yinfu_H[tone];
 TL0=yinfu_L[tone];
}

//定时器T0中断服务程序
void timer0(void) interrupt 1
{
 TH0=yinfu_H[tone];
 TL0=yinfu_L[tone];
 spk=~spk;        //
}

void laohu_yz()//两只老虎 演奏程序
{
 unsigned char i;
 for(i=0;i<32;i++)
 {
  led=1;
  tone=laohu[i]-1;
  delay(laohuys[i]/1.2);
  led=0;    //每个音符闪烁一次
  delay(laohuys[i]/1.5);
 }
}
void yuep_yz()//1~i音符演奏程序
{
 unsigned char i;
 for(i=0;i<16;i++)
 {
  led=1;
  if(i<8)
  {
   tone=i;
  }
  else
  {
   tone=15-i;
  }
  delay(220);
  led=0;
  delay(180);
 }
}


void jianpan()
{
  op=P2;
 switch(op)
 {
  case 0xfe:led=0;tone=0;P0=shuma[1];TR0=1;break;
  case 0xfd:led=0;tone=1;P0=shuma[2];TR0=1;break;
  case 0xfb:led=0;tone=2;P0=shuma[3];TR0=1;break;
  case 0xf7:led=0;tone=3;P0=shuma[4];TR0=1;break;
  case 0xef:led=0;tone=4;P0=shuma[5];TR0=1;break;
  case 0xdf:led=0;tone=5;P0=shuma[6];TR0=1;break;
  case 0xbf:led=0;tone=6;P0=shuma[7];TR0=1;break;
  case 0x7f:led=0;tone=7;P0=shuma[8];TR0=1;break;
  default:break;     
 }
 delay(4);
 TR0=0;
 led=1;
 P0=0xff;
}

//主程序
void main(void)
{
 initTimer();
 ET0=1;
 EA=1;

 spk=0;
while(1)
 {

  if(key1==0)//判断K1键是否按下
  {
   delay(10);
   if(key1==0)
   {
   TR0=1;
    laohu_yz();
   spk=0;
   }
  }
else if(key2==0)//判断K2键是否按下
 {
  delay(10);
  if(key2==0)
  {
  TR0=1;
  yuep_yz();
  spk=0;
  }
 }

 jianpan();//键盘检测
 }
}

关键字:51单片机  电子琴 引用地址:51单片机制作电子琴

上一篇:精巧的4*4键盘程序
下一篇:ADC0809做的51单片机8路电压采集

推荐阅读最新更新时间:2024-03-16 14:44

ARMLinux(mini2440)串口与51单片机的9位串口通讯
当51单片机的串口模式在方式2或方式3时为9位通讯方式,即当串行数据第9位为 1 时,前8位数据指示的是用来和主机通讯的从机地址;当串行数据第9位为 0 时,前8位数据则用为真正的数据。具体请参考: https://www.eeworld.com.cn/mcu/2011/0621/article_4424_1.html 而FriendlyARM的mini2440可以设置的数据位数为5~8位,即CS5,CS6,CS7,CS8。关于Linux串口的编程教学请参见: http://www.adamjiang.com/pukiwiki/index.php?Linux串口编程详解#ec39e271 查阅了一下前人的做法,有两种:1.硬方
[单片机]
ARMLinux(mini2440)串口与<font color='red'>51单片机</font>的9位串口通讯
51单片机C语言学习4
第四课 数据类型   先来简单说说C语言的标识符和关键字。标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、数组等等。C语言是大小字敏感的一种高级语言,如果我们要定义一个定时器1,可以写做 Timer1 ,如果程序中有 TIMER1 ,那么这两个是完全不同定义的标识符。标识符由字符串,数字和下划线等组成,注意的是第一个字符必须是字母或下划线,如 1Timer 是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51编译器中,只支持标识符的前32位为
[单片机]
51单片机双向跑马灯的实现
#include REGX51.H void delay(void) //延时函数 { unsigned char i, j; for(i=0;i 200;i++) { for(j=0;j 200;j++); } } void main(void) { while(1) { unsigned char i = 0; unsigned d = 0x80; for(i = 1; i 8; i++) //从右跑到左 { P0=~d; d = d 1; delay(); //延时 } //d = 0x01; for(i = 1; i 8; i++) // 从左跑到右 { P0= ~d; d = d 1; delay()
[单片机]
如何正确的使用C51单片机中的位域
定义这样的结构: typedef struct { uchar DC0_ALA:1; //电源0告警 uchar DC1_ALA:1; //电源1告警 uchar AC_ALA:1; //停电告警 uchar UN_H_ALA:1; //同频信道机失锁告警 uchar UN_L_ALA:1; //异频信道机失锁告警 uchar FAR_ALA:1; //远端通讯故障告警 uchar OPEN_ALA:1; //门襟告警 uchar x:1; }ALARM;//系统告警结构定义 定义变量并初始化: idata ALARM old_alarm={0,0,0,0,0,0,0,0}; 在main()函数中这样应用位域: if(ol
[单片机]
51单片机8X8点阵滚动显示温度--C51源代码
//LED8*8滚动显示 //列扫描,低电平有效 /*--------------------------------------------------------------*/ //包含头文件 #include reg52.h #include 74HC595.H #include intrins.h //包含_nop_()函数定义的头文件 /*--------------------------------------------------------------*/ //全局变量定义 unsigned char i,flag,t,w,t; unsigned int m,n; unsigned char t1,
[单片机]
51单片机简易温度采集与控制装置
MCU型号:IAP15F2K61S2 还好是1T的单片机,不知道换成普通的12T单片机会不会跪。。终于调统了,不过温度采集不太稳定,有1度的波动。 /*  **********************************************************************                      简易温度采集与控制装置  文件名:main.c  功能概述:      初始化数码管显示温度区间和当前温度,温度上限和温度下限默认为30度      和20度,用户可以通过矩阵键盘输入自己设定的温度区间,键盘提供set和clear      功能,首先按下set进入设置模式, 
[单片机]
51单片机心形灯实现从中间向两端流水编程
心形灯原理图 编译软件:Keil uVision5 (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343174) 单片机程序下载软件:STC-ISP (如有需要可点此链接下载:https://download.csdn.net/download/qq_36931762/11343157) 程序代码: #include reg51.h #include intrins.h unsigned char code table ={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; void De
[单片机]
<font color='red'>51单片机</font>心形灯实现从中间向两端流水编程
基于51单片机的电子时钟(数码管显示)
此次对于数码管进行一个简单的应用,同时可以设计一个电子小时钟,增加趣味性。 首先我们先进行原理图的讲解,这里我们直接使用的开发板,其原理连接图如下: 其中D(0~1)是连接在单片机的P0口上的。 从图中,我们可以看到,第一个74HC573是来控制8个数码管的位选的,就是说我要选种哪个数码管,这里的WE是低电平有效,比如说我想选中最后一个数码管,那么这里我就要将0x7f送到相应的I/O口。第二个74HC573是来控制数码管显示什么的这里0~9的16进制码如下: 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; 要想完成电子时钟,我们先要显示一个数值, 这里
[单片机]
基于<font color='red'>51单片机</font>的电子时钟(数码管显示)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved