基于51单片机的数字电子琴

  • B4_856028
    了解作者
  • C/C++
    开发工具
  • 115.5KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-02-24 15:08
    上传日期
利用51单片机、喇叭、数码管制作一个简易的数字电子琴,可以播放音符、曲子,并在数码管显示音调或曲号。同时具有数字钟功能,在数码管上显示小时、分钟时间。
基于51单片机的数字电子琴.rar
  • 基于51单片机的数字电子琴
  • Listings
  • Objects
  • music.c
    5.6KB
  • music.uvgui.15520
    69.1KB
  • music.uvproj
    13.6KB
  • HL-1原理图.pdf
    112.1KB
  • music.uvopt
    4.6KB
内容介绍
#include <reg52.h> //52系列单片机头文件 #define uchar unsigned char #define uint unsigned int uchar code dis[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x08,0x40,0x01,0x39,0x5E,0x79,0x71,0x3F}; //1-F 、0 uint code yinse[]={63628,63836,64020,64103,64260,64400,64524,64580,64694,64777,64820,64898,64968,65030,65058,65110,65164,65178,65217,65252,65283};//低1~7、中1~7、高1~7 uchar code music1[]={8,8,12,12,13,13,12,11,11,10,10,9,9,8,12,12,11,11,10,10,9,12,12,11,11,10,10,9,8,8,12,12,13,13,12,11,11,10,10,9,9,8,100,80};//音调 uchar code music2[]={4,8,100,4,8,5,7,11,5,7,1,3,7,1,3,4,5,6,8,4,6,4,8,6,4,8,5,7,11,5,7,100,80}; uchar code music3[]={12,10,12,10,12,13,12,10,13,12,8,8,9,10,12,10,9,100,10,12,100,80}; uchar code music4[]={5,8,10,12,8,7,10,12,12,13,14,15,13,12,10,9,8,8,8,10,9,8,8,8,9,10,9,9,6,10,9,100,80}; uint code de1[]={2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4};//节奏 uint code de2[]={1,1,0,1,4,1,1,1,1,4,1,1,1,1,4,1,0.5,0.5,1,1,4,1,1,1,1,4,1,1,1,1,4}; uint code de3[]={2,1,1,1,6,1,1,1,1,4,2,1,1,2,1,1,2,0,1,4}; uint code de4[]={1,2,1,2,1,2,1,2,1,2,1,2,1,6,1,1,2,1,2,1,1,2,1,2,1,1,2,1,2,2,6}; uchar code dis1[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5E,0x79,0x71}; uint time=100; uchar own[50]; uchar index=0; char jilu=0; char bofang=0; //key 8 低音 9中音 10高音 14 手动 15自动 char mode=0;//手动 uchar yindiao=0;//低音 初值yinse[num+yindiao*7] sbit rect_wave=P2^3; sbit dula=P2^6; //申明U1锁存器的锁存端 sbit wela=P2^7; //申明U2锁存器的锁存端 uchar code table[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7C,0x08,0x40,0x01,0x39,0x5E,0x79,0x71,0x3F}; uint th=0; uchar show[]={0x00,0x08,0x3F,0x3F,0x3f,0x3F};//六个数码管显示的内容 void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--); } void int_timer ()//定时器0初始化 输出一定频率的方波 { TMOD=0x11; TH0=th/256; TL0=th%256; EA=1; ET0=1; TR0=1; } void Timer0_ISR(void) interrupt 1 { TH0=th/256; TL0=th%256; rect_wave=!rect_wave; } void simple(uchar num,uint tim)//播放单个音符 { th=yinse[num]; int_timer(); delayms(tim); TR0=0;//关闭中断 rect_wave=1; } void music (uchar mu[],uint d[])//播放曲子 { uint k; for(k=0;mu[k]!=80;k++) { for(;mu[k]!=100;k++) { time=d[k]*300; simple(mu[k]-1,time);//time 音符的节奏拍子长短 delayms(10); } delayms(80); } jilu=0; bofang=0; } void mus(uchar mu[]) //播放储存的曲子 { uint k; for(k=0;mu[k]!=80;k++) { for(;mu[k]!=100;k++) { simple(mu[k]-1,300); delayms(300); } delayms(80); } } void notsimple(uchar num)//播放曲子 判断曲号/储存的曲子 { switch(num) { case 0: music(music1,de1); break; case 1: music(music2,de2); break; case 2: music(music3,de3); break; case 3: music(music4,de4); break; default: mus(own); break; } } void display(uchar num) //根据键值进行赋值、播放等操作 { if(num==12&&mode==0) { jilu=1; index=0; bofang=0; } if(num==13&&mode==0) { jilu=0; bofang=1; own[index++]=100; own[index]=80; notsimple(6); } if(((num>0||num==0)&&num<7)&&mode==0) { show[0]=dis[num]; th=yinse[num+7*yindiao]; if(jilu==1) { own[index]=num+1; index++; } simple(num,300); } if(((num>0||num==0)&&num<4)&&mode==1) { show[0]=dis[num]; notsimple(num); } if( num==8||num==9||num==10) { show[1]=dis[num]; } } void matrixkeyscan()//扫描键盘 { uchar col, i, temp; uchar line = 1; uchar mask = 0x01; uchar key_val=16; for(i = 0; i < 4; i++) { P3 = ~mask; temp = P3&0xf0; if(temp != 0xf0) { delayms(10); } temp = P3&0xf0; switch(temp) { case 0xe0: col = 1; break; case 0xd0: col = 2; break; case 0xb0: col = 3; break; case 0x70: col = 4; break; default: col = 0; break; } if(col > 0) { key_val = (line - 1)*4 + col-1; while((P3&0xf0) != 0xf0); } mask <<= 1; line++; } switch(key_val) { case 8:yindiao=0;break; case 9:yindiao=1;break; case 10:yindiao=2;break; case 14:mode=0;break; case 15:mode=1;break; default:break; } display(key_val); } uchar i=0; uint jimin=2400; uchar min=59; uchar hour=23; uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; void int_timer1()//定时器1初始化 用来显示数码管 25ms 并用来计时、时钟 { TMOD=0x11; IE=0x00; TH1=0xa6; TL1=0x00; EA=1; ET1=1; TR1=1; } void Timer1_ISR(void) interrupt 3 { uchar mask = 0x01; TH1=0xa6; TL1=0x00; P0 = 0xff; for(i = 0; i < 6; i++)//挨个数码管显示数组show内对应的内容 { dula = 1; P0 = show[i]; dula = 0; P0 = 0xff; wela = 1; P0 = ~mask; wela = 0; delayms(1); mask <<= 1; } dula = 1; P0 = 0x3f; dula = 0; P0 = 0xff; wela = 1; wela = 0; delayms(1); jimin--; if(jimin==0)//满一分钟 { jimin=2400; min++; if(min==60) { min=0; hour++; hour=hour%24; } } show[2]=dis1[hour/10]; show[3]=dis1[hour%10]+ 0x80; show[4]=dis1[min/10]; show[5]=dis1[min%10]; } void main() { P0=0X00; //关闭所有数码管段选 dula=1; dula=0; P0=0xfe;//位选fe 一位数码管 wela=1; wela=0; int_timer1(); while(1) { if(min==1) //当时间为XX:01时播放曲3 { show[0]=0x66; notsimple(3); } matrixkeyscan();//不停调用键盘扫描程序 } }
评论
    相关推荐
    • 单片机课件
      单片机的课件及例题, 单片机的课件及例题, 单片机的课件及例题, 单片机的课 件及例题,
    • 爱上单片机
      一本电子爱好者都能看懂,会边看边笑的单片机入门书籍,作者杜洋曾在《无线电》上发表过“趣味单片机制作专题”、“单片机编程魔法学校”等深受读者喜爱、让无数单片机入门者热血沸腾的系列文章。本书通过生动的语言...
    • 单片机资料
      内含30个单片机应用开发的资料,包括配套单片机入门PPT。
    • 单片机课件
      单片机课的课件,对单片机的基础进行了全面的概述,也有非常精细的指导。
    • 单片机工具
      单片机工具 供单片机学习使用 免费资源 日后还会有更多资源 请联系我
    • 单片机
      单片机c 和汇编程序
    • 单片机课件
      单片机课件 ppt文件格式 介绍了单片机的结构、程序设计、定时器、中断等
    • 单片机教程
      这是一个单片机的教程,可以用于初次学习单片机的人学习。
    • 单片机入门
      很好的单片机学习资源,入门比较好适合对单片机的学习有兴趣的人,而且是名校的精彩讲解,
    • 单片机
      利用protues仿真实现基于51单片机的大棚温湿度检测系统设计