“屏幕式”声光电子琴程序

发布者:legend9最新更新时间:2015-06-18 来源: 51hei关键字:声光电子琴  流水灯 手机看文章 扫描二维码
随时随地手机看文章
/*编写人:伍浩荣
8个按键发出8个基本音,
能播放内置音乐,音乐跟随灯光闪烁
版权所有,翻版必究
sfr P4=0xe8;//定义P4组I0口
#include
#define uint unsigned int
#define uchar unsigned char
sbit speaker=P1^4;//喇叭接30脚
sbit key1=P4^4;//流水灯按键(暂时)
sbit key2=P4^6;//播放音乐按键(暂定)
uchar a,b,num1,s1num,n1,n2;
char num;//定义num为可以负数
uchar code yinfu[]={0xfb,0xe9,      //Do
                   0xfc,0x5c,      //Re
                   0xfc,0xc1,      //Mi
                   0xfc,0xef,      //Fa
                   0xfd,0x45,      //So
                   0xfd,0x92,      //La
                   0xfd,0xd0,      //Si
                   0xfd,0xee,      //Do#
   0x00,0x00,    //间隔
};
uchar code shengri_tone[]={   1,0,1,2,1,4,3,0, //生日快乐音调
                                   1,0,1,2,1,5,4,0,
                                   1,0,1,8,6,4,3,2,0,
                                   7,0,7,6,4,5,4,0       //0代表不发声,即停顿;数字即为音调
};
 
uchar code shengri_beat[]={   24,1,24,48,48,48,72,5,//节拍
                                   24,1,24,48,48,48,72,5,
                                   24,1,24,48,48,48,48,72,5,
                                   24,1,24,48,48,48,72,5    //节拍,即tone表各音调的延时
};
uchar code ledtable[]={0x7f,0xbf,0xdf,0xef, //取反
0xf7,0xfb,0xfd,0xfe};//P0组口的发光二极管代码(焊接过程可能会相反,具体更改)
uchar code ledtable2[]={0x7f,0xbf,0xdf,0xef, //取反
0xf7,0xfb,0xfd,0xfe};//P2组口发光二极管代码,相反!
void check_key();//改为P3组为按键
void keyscan();
void turn();//顺时针流动
void back();
void qianhou();
void dangshuang();
void delay(uint z);//延时函数声明
void delay1(void);//声明第二个延时函数
void play1(void);//播放生日快乐
 
void main()
{
s1num=0;//流水灯种类标志
key1=1;
key2=1;
TMOD=0x01;
TH0=a;
TL0=b;
ET0=1;//打开定时器,但是未允许中断
TR0=1;
while(1)
{
check_key();
keyscan();
}
}
 
void time0() interrupt 1
{
TH0=a;
TL0=b;
speaker=~speaker;
}
void check_key()
{
P3=0xff;//先赋给P2组口高电平
switch(P3)//按下一个键相应4个灯亮
{
case 0xfe:P0=0xee;P2=0x77;a=0xfb;b=0xe9;EA=1;break;//P0,P2组为发光二极管组
case 0xfd:P0=0xdd;P2=0xbb;a=0xfc;b=0x5c;EA=1;break;//注意:EA不能改为TR0
case 0xfb:P0=0xbb;P2=0xdd;a=0xfc;b=0xc1;EA=1;break;
case 0xf7:P0=0x77;P2=0xee;a=0xfc;b=0xef;EA=1;break;
case 0xef:P0=0xee;P2=0x77;a=0xfd;b=0x45;EA=1;break;
case 0xdf:P0=0xdd;P2=0xbb;a=0xfd;b=0x92;EA=1;break;
case 0xbf:P0=0xbb;P2=0xdd;a=0xfd;b=0xd0;EA=1;break;
case 0x7f:P0=0x77;P2=0xee;a=0xfd;b=0xee;EA=1;break;
default:EA=0;speaker=0;//P0=0xff;P2=0xff ; 
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
  if(key1==0)
  {
   delay(5);
if(key1==0)
{
s1num++;
while(!key1);
if(s1num==1)
{
turn();
}
}
if(s1num==2)
{
back();
}
if(s1num==3)
{
qianhou();
}
if(s1num==4)
{
dangshuang();
}
if(s1num==5)
s1num=1;
  }
if(key2==0)
{
delay(5);
while(~key2);
play1();
}
}[page]
 
 void delay1(void)//第二个延时函数
{
       uchar n=15;
       while(n--)
       {
              uchar i;
              for(i=0;i<125;i++);
       }
}
void play1(void)//播放生日快乐
{
 
       uchar m=0;
       uchar s;     
       uchar c=1;
   P0=0xaa;
   P2=0x55;
       while(1)
       {
              EA=0;
              c=shengri_tone[m];                            //取音符
              s=shengri_beat[m];                      //取节拍
              a=yinfu[2*c-2];                            
              b=yinfu[2*c-1];                            
              EA=1;
              while(s--)
              {
                     delay1();
 P0=~P0;
 P2=~P2;
              }
              m++;
              if(m>=33) return;                      //数值是shengri相关表中的元素数量  
       }     
}
 
 
/*以下为N种流水灯流动花式*/
void turn()//流水灯顺时针走动(5次)
{
 
 for(num1=0;num1<8;num1++)
 {
 for(num=0;num<8;num++)
 {
    P0=ledtable[num];
  delay(30);//时间暂定
 }
 P0=0xff;//之后关闭P1组
 for(num=7;num>-1;num--)
 {
  P2=ledtable2[num];
delay(30);
 }
 P2=0xff;//之后关闭P2组
 }
}
void back()//逆时针流动
{
for(num1=0;num1<8;num1++)
{
for(num=0;num<8;num++)
{
P2=ledtable[num];
delay(30);
}
P2=0xff;
for(num=7;num>-1;num--)
{
P0=ledtable2[num];
delay(30);
}
P0=0xff;
}
}
void qianhou()//前后来回
{
for(num1=0;num1<10;num1++)
{
for(num=0;num<8;num++)
{
P0=ledtable[num];
P2=ledtable2[num];
delay(30);
}
P0=0xff;
P2=0xff;
for(num=7;num>-1;num--)
{
P0=ledtable[num];
P2=ledtable2[num];
delay(30);
}
P0=0xff;
P2=0xff;
}
}
void dangshuang()//单数双数
{
for(num1=0;num1<15;num1++)
{
 P0=0x55;
 P2=0xaa;
 delay(150);
 P0=0xaa;
 P2=0x55;
 delay(150);
 }     
}
关键字:声光电子琴  流水灯 引用地址:“屏幕式”声光电子琴程序

上一篇:51单片机制作霓虹灯的程序+电路图
下一篇:利用串口输入整数简单代码

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

51单片机点亮双向流水灯
#include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr P0M1 = 0x93; void delay(uint ms){ uint i,j; for(i = 0 ;i ms ; i++) for (j = 0;j 121;j++); } void display(){ uint i,j; for(i = 0;i 7;i++){ P0 = _crol_(P0,1); delay(500); } for(j
[单片机]
ARM S2C2410A控制5个LED流水灯
无论是S3C2410A还是S3C2440A,其IO口B都是11位二进制数,xxx xxxx xxxx,现在控制第5、6、7、8为做输出点亮LED灯(共阳极,输出0点亮),即xx8 765x xxxx,GPBCON equ 0x56000010 GPBDAT equ 0x56000014 GPBUP equ 0x56000018 xport xmain area Init,code,readonly entry export xmain ldr r
[单片机]
ARM S2C2410A控制5个LED<font color='red'>流水灯</font>
AVR单片机实践--ATmega16按键控制流水灯
一、实验目的 1.掌握AVR单片机开发平台的搭建方法。 2.掌握GPIO的编程方法。 二、实验内容及结果 1.设计程序 自行设计电路,包括流水灯和4个按键,完成“按键控制流水灯样式”的程序编写与调试。 具体要求如下: (1)初始状态下,所有LED灯点亮; (2)K1为启/停键,按下后控制LED流水灯按照当前指定样式运行或停止; (3)K2为流水灯样式选择键,分两种样式,默认为样式1。每次按下K2当前样式立即转变。 样式1:每次仅一个LED熄灭,熄灭LED从L0至L7转移,如此循环运行。 样式2:每次仅一个LED熄灭,熄灭LED从L7至L0转移,如此循环运行。 2.实验结果 (1)在下方贴出使用Proteus绘制的电
[单片机]
AVR单片机实践--ATmega16按键控制<font color='red'>流水灯</font>
LPC2103流水灯
#include inc\lpc2103.h #include inc\config.h #define uchar unsigned char #define uint unsigned int void Sys_Init(void) { PINSEL0=0x00000000;//使用GPIO功能,将所有的管脚连接到GPIO PINSEL1=0x00000000;//使用GPIO功能,将所有的管脚连接到GPIO IO0DIR=1 17 | 1 18 | 1 19;//设置IO口管脚的方向,相应位置1为输出, IO0SET=1 17 | 1 18 | 1 19;//初始化IO电平,IOSET对应位置
[单片机]
arm力天电子 lpc2148流水灯驱动程序详解
一个破流水灯程序看了两天了,void WriteByte(unsigned char data)这部分还是没看懂,力天电子上面介绍说这部分三端口的数据输入,选出8位的串行数据。 选择16,17,18,19四个控制位,主要跟电路图的连接有关,4块74HC595,组成32位(如图所示),从下往上依次是0~31为,图中写反了。因此到D13对应的引脚应该是16,D12对应的是17,D11对应的是18,D10对应的是19. 当16,17,18,19分别为低电平时二极管才能够导通发光。高电平时熄灭 1#include NXP/iolpc2148.h 2#define SCLK 0x01 24 //指定P1.24管脚,通过
[单片机]
arm力天电子 lpc2148<font color='red'>流水灯</font>驱动程序详解
proteus7.7+Keil2仿真80C51控制流水灯
在今年夏天发布的关于8051的诸多博文中, 我都是用STC89C52RC实验箱来验证8051控制程序的正确性的. 这样做的好处是可以直接和真正的8051单片机打交道, 且能熟练掌握将.hex文件烧写到8051程序存储器的步骤. 但凡事都不是绝对的. 若总是用实物来进行实验, 我们每修改一次控制程序, 就要重新烧写一次.hex文件: 在使用软件烧写的过程中, 有时还会出现各种各样的问题, 这无疑是较低效的. 况且如果实验箱的某个器件出现了故障, 这肯定会影响到实验结果, 继而影响我们对控制程序正确与否的判断. 由于我们大多数人对实验箱内部接线情况并不了解, 若实验箱真的出现故障, 我们也无法将故障原因找出. 除了实验箱本身存在的
[单片机]
proteus7.7+Keil2仿真80C51控制<font color='red'>流水灯</font>
C51单片机学习笔记(二)——花样流水灯的实现
1.单片机引脚、晶振、复位的作用 复位电路:,复位是单片机的初始化操作。单片机启动时都需要先付薇,其作用是“清零”,也就是CPU和其他部件处于一个确定的初始状态,并从这个初始状态开始。 复位实质上是单片机的复位脚保持很短时间的高电平,按键复位就是通过按键接高电平(按一下的时间已经足够) 时钟电路(晶振):产生时间信号,使单片机按照一定的时间规律进行指令,晶振频率越高,时钟信号的周期就小,单片机运行也就越快。 32个I/O口 P1.0 ~ P1.7 对应1 ~ 8 号引脚 P2.0 ~ P2.7 对应21 ~ 28 号引脚 P3.0 ~ P3.7 对应10 ~ 17 号引脚 P0.0 ~ P0.7 对应39
[单片机]
C51单片机学习笔记(二)——花样<font color='red'>流水灯</font>的实现
单片机自学笔记之:流水灯设计程序
#include reg52.h //52系列 单片机 头文件 #include intrins.h //C51库自带头文件 #define uchar unsigned char //宏定义无符号字符型为uchar #define uint unsigned int //宏定义无符号整型为uint void delay(uint z); //声明延时函数 uchar aa; //定义无符号变量 void main() //主函数 { aa=0xfe; //给变量赋初值 while(1) //大循环,无限循环 { P1=aa; //给P1口赋值1010 1010 delay(500); //调用延时子函数延
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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