完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
实现一个键控制5种花样流水灯,一个键控制1-7个音阶,并录入,和播放,还有自动播放自带歌曲并且RGB LED随着音乐变化颜色。。。。目前烧入到单片机放,在自己焊接的PCB板上,运行很慢很卡。。求各位大神帮忙,非常感谢!!!!!!!!!!!!!!!!!!附:电路图!!!!非常感谢,
#include #define uchar unsigned char #define uint unsigned int uint code a[14]={63625,63833,64019,64104,64260,64400,64524, 65058,65110,65157,65178,65217,65252,65283};//各音符对应定时初值 char b[100]={8,9,10,11,12,13,14,1,1,5,5,6,6,5,15,16};//歌曲编码,该数组前七个元素对应1-7音阶(1) char i=0,j=7,l=0,num7=1,num9=5,h=0,k; ***it k0=P0^7; ***it k1=P2^1; ***it k2=P2^2; ***it k3=P2^3; ***it k4=P2^4; ***it k5=P2^5; ***it k6=P2^6;//1-7音阶对应按键 ***it k7=P2^7;//播放录入 ***it k9=P2^0;//流水灯 ***it speak=P3^7;//蜂鸣器 ***it RGBred=P3^3; ***it RGBgreen=P3^5; ***it RGBblue=P3^6; uchar shunxu[3][3]={ //定义RGB彩灯亮的顺序 {0,0,1}, {0,1,0}, {1,0,0} } ; void chushideng() //RGB彩灯点亮的函数 { RGBblue=shunxu[h][0]; RGBred=shunxu[h][1]; RGBgreen=shunxu[h][2]; h++; if(h==3) h=0; } void init() { TMOD=0x11;//设置定时器的工作方式; TH1=(65536-45872)/256; TL1=(65536-45872)%256; TH0=(65536-45872)/256; TL0=(65536-45872)%256;//给计数器赋初值; EA=1;//开总中断 ET0=1; ET1=1; PT0=1; TR1=0;//打开0,1中断 TR0=1; } void delayms(int x) { int m,n; for(m=0;m } void song() { i=7;//(1) while(b[i]!=16&&num7==0)//16表示乐曲结束 { if(b[i]==15)//15表示乐曲中间的休止符 { delayms(250); } if(b[i]!=15)//(0-13表示正常的音符) { P1=0xff; chushideng(); TR1=1; delayms(250); TR1=0; delayms(125); } i++; } RGBblue=1; RGBred=1; RGBgreen=1; num7=1; } void keyscan2() { if(k9==0)//五种流水灯 { delayms(10); if(k9==0) { while(!k9); num9++; if(num9>5) num9=0; } } switch(num9) { case 0: P1=0xfe; delayms(100); for(k=0;k<7;k++) { P1<<=1; P1|=0x01; delayms(100); }; P1=0xdf; delayms(200); for(k=7;k>0;k--) { P1>>=1; P1|=0x80; delayms(100); }; break; case 1: P1=0xfe; delayms(100); for(k=0;k<7;k++) { P1<<=1; P1|=0x01; delayms(100); }; break; case 2: P1=0xfc; delayms(100); for(k=0;k<4;k++) { P1<<=2; P1|=0x03; delayms(100); }; break; case 3: P1=~P1; delayms(100); break; case 4: P1=0x7e; delayms(100); P1=0xbd; delayms(100); P1=0xdb; delayms(100); P1=0xe7; delayms(100); P1=0xdb; delayms(100); P1=0xbd; delayms(100); P1=0x7e; delayms(100); break; case 5: P1=0xff; break; } if(k0==0) { delayms(5); if(k0==0) { while(!k0); i=0; TR1=1; delayms(125); TR1=0; b[j++]=1; b[j]=16; } } if(k1==0) { delayms(10); if(k1==0) { while(!k1); i=1; TR1=1; delayms(125); TR1=0; b[j++]=2; b[j]=16; } } if(k2==0) { delayms(10); if(k2==0) { while(!k2); i=2; TR1=1; delayms(125); TR1=0; b[j++]=3; b[j]=16; } } if(k3==0) { delayms(10); if(k3==0) { while(!k3); i=3; TR1=1; delayms(125); TR1=0; b[j++]=4; b[j]=16; } } if(k4==0) { delayms(10); if(k4==0) { while(!k4); i=4; TR1=1; delayms(125); TR1=0; b[j++]=5; b[j]=16; } } if(k5==0) { delayms(10); if(k5==0) { while(!k5); i=5; TR1=1; delayms(125); TR1=0; b[j++]=5; b[j]=16; } } if(k6==0) { delayms(10); if(k4==0) { while(!k6); i=6; TR1=1; delayms(125); TR1=0; b[j++]=6; b[j]=16; } } song(); } void main() { init(); while(1) keyscan2(); } void T1time() interrupt 3 //定时器T0的中断函数 { TH1=a[b[i]-1]/256; TL1=a[b[i]-1]%256; speak=~speak; if(num7==0) { RGBblue=~RGBblue; RGBgreen=~RGBgreen; RGBred=~RGBred; } } void T0time() interrupt 1 { TH0=(65536-200)/256; TL0=(65536-200)%256; TR0=0; if(k7==0) { delayms(5); while(!k7); if(k7==0) num7=0; } TR0=1; }
|
|
相关推荐
3个回答
|
|
|
|
|
|
|
|
|
|
这个程序单片机效率好低呀,大部分都用于延时等待去了,还有两个定时器拥戴时候注意,不要打架哦
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
512 浏览 0 评论
778 浏览 1 评论
746 浏览 1 评论
电路小知识 | 交流电路复数的基础知识以及相位差和电抗的计算
601 浏览 0 评论
1815 浏览 3 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 20:55 , Processed in 0.616288 second(s), Total 83, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号