找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11844|回复: 14
收起左侧

基于单片机的多模式带音乐跑马灯设计

  [复制链接]
ID:213668 发表于 2017-6-22 12:36 | 显示全部楼层 |阅读模式
1、有12个发光二极管做跑马灯,其中跑马灯有10种灯亮模式。
2、有键盘用以切换跑马灯的模式,并且对于跑马灯模式可以对亮灯速度进行控制。
3、每一种跑马灯模式用LED数码管进行显示。
4、当跑马灯处于一种模式时,伴随的音乐响起,音乐至少有3首,并可以对其进行切换。

单片机音乐跑马灯仿真图:
QQ截图20170622123345.png


单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. //定义特殊功能寄存器的位变量
  5. sbit key1=P3^2;//按key1可自动//外部中断
  6. sbit key2=P3^3;//按key2可切换//外部中断
  7. sbit fm=P3^7;//蜂鸣器连续的IO口
  8. sbit key3=P3^4;
  9. sbit key4=P3^5;

  10. /*uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  11. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//共阴极数码管显示码制0~F*/

  12. uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管显示码制0~F


  13. //速度模式共有5种
  14. unsigned char code SpeedCode[]={5,14,30,60,100};                                                                 
  15. uchar count2=1,RunMode=1;//音乐、流水灯标志
  16. uchar zd=1;                //自动播放标志
  17. uchar timeh,timel,i;
  18. uint LEDIndex = 0;//LED位置
  19. bit LEDDirection = 1,LEDFlag = 1;//LED方向,LED亮灭
  20. uint Timer0Count,SystemSpeed;//跑马灯速度,系统速度
  21. char SystemSpeedIndex=0;//速度模式参数

  22. //---------------------------简谱---------------------------------------
  23. //编程规则:字节高位是简谱,低位是持续时间,
  24. //代表多少个十六分音符
  25. //1-7代表中央C调,8-E代表高八度,0代表停顿
  26. //最后的0是结束标志
  27. uchar code qnzl[]={         //千年之恋
  28.         0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
  29.                 //前奏
  30.                 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  31.                 //竹林的灯火 到过的沙漠
  32.                 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
  33.                 //七色的国度 不断飘逸风中
  34.                 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  35.                 //有一种神秘 灰色的旋涡
  36.                 0x32,0x31,0x21,0x32,0x82,0x83,0x71,0x72,0x02,
  37.                 //将我卷入了迷雾中
  38.                 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
  39.                 //看不清的双手
  40.                 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
  41.                 //一朵花传来谁经过的温柔
  42.                 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
  43.                 //穿越千年的伤痛
  44.                 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  45.                 //只为求一个结果
  46.                 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  47.                 //你留下的轮廓 指引我
  48.                 0x42,0x61,0x62,0x83,0x83,0x91,0x91,
  49.                 //黑夜中不寂寞
  50.                 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
  51.                 //穿越千年的哀愁
  52.                 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  53.                 //是你在尽头等我
  54.                 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  55.                 //最美丽的感动 会值得
  56.                 0x42,0x82,0x88,0x02,0x74,0x94,0x89,0xff//结束标志
  57.                 //用一生守候
  58. };

  59. uchar code jmszl[]={ //寂寞沙洲冷
  60.         0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
  61.                 //自你走后心憔悴
  62.                 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
  63.                 //白色油桐风中纷飞
  64.                 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
  65.                 //落花似人有情 这个季节
  66.                 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
  67.                 //河畔的风放肆拼命地吹
  68.                 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
  69.                 //不断拨弄离人的眼泪
  70.                 0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
  71.                 //那样浓烈的爱再也无法给
  72.                 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
  73.                 //伤感一夜一夜
  74.                 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
  75.                 //当记忆的线缠绕过往支离破碎
  76.                 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
  77.                 //是慌乱占据了心扉                                                       
  78.                 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
  79.                 //有花儿伴着蝴蝶
  80.                 0x51,0x51,0x51,0x51,0x31,0x61,0x53,
  81.                 //孤雁可以双飞       
  82.                 0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
  83.                 //夜深人静独徘徊
  84.                 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
  85.                 //当幸福恋人寄来红色分享喜悦
  86.                 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
  87.                 //闭上双眼难过头也不敢回
  88.                 0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
  89.                 //仍然捡尽寒枝不肯安歇微带着后悔
  90.                 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,
  91.                 //寂寞沙洲我该思念谁
  92.                 0xff};         
  93.        
  94.         uchar  code  srkl[]={0x52,0x52,0x64,0x54,0x84,0x74,//生日快乐
  95.                 0x52,0x52,0x64,0x54,0x94,0x84,
  96.                 0x52,0x52,0xc4,0xA4,0x84,0x74,0x64,
  97.                 0xB2,0xB2,0xA4,0x84,0x94,0x84,
  98.                 0x52,0x52,0x64,0x54,0x84,0x74,
  99.                 0x52,0x52,0x64,0x54,0x94,0x84,
  100.                 0x52,0x52,0xc4,0xA4,0x84,0x74,0x64,
  101.                 0xB2,0xB2,0xA4,0x84,0x94,0x84,0xff};
  102.        
  103.         uchar code  goon[]={0x64,0x84,0x92,0x91,0x81,0x93,0x61,     //康定情歌
  104.                 0x54,0x62,0x82,0x92,0x91,0x81,0x92,
  105.                 0x64,0x62,0x82,0x92,0x91,0x81,0x93,
  106.                 0x61,0x54,0x82,0x62,0x51,0x61,0x51,
  107.                 0x41,0x52,0x24,0x92,0x54,0x82,0x64,
  108.                 0x52,0x42,0x94,0x82,0x62,0x51,0x61,
  109.                 0x51,0x41,0x52,0x24,0xff};
  110.        
  111.         //----------------------------简谱音调对应的定时器初值---------------------------
  112.         //适合11.0592M的晶振
  113.         uchar code chuzhi[]={
  114.                 0xff,0xff,//占位
  115.                         0xFC,0x8E,//中央C调1-7
  116.                         0xFC,0xED,       
  117.                         0xFD,0x43,       
  118.                         0xFD,0x6A,       
  119.                         0xFD,0xB3,       
  120.                         0xFD,0xF3,       
  121.                         0xFE,0x2D,
  122.                         0xFE,0x47,        //高八度1-7          
  123.                         0xFE,0x76,
  124.                         0xFE,0xA1,
  125.                         0xFE,0xC7,       
  126.                         0xFE,0xD9,
  127.                         0xFE,0xF9,
  128.                         0xFF,0x16
  129.         };
  130.        
  131.         void LEDShow(unsigned int LEDStatus)
  132.         {
  133.                 P1 = ~(LEDStatus&0x00FF);                     //P1输出低八位
  134.                 //P2 = ~((LEDStatus>>8)&0x00FF);                                  //P2输出高八位
  135.         }
  136.        
  137.         //速度选择函数
  138.         void SetSpeed(unsigned char Speed)
  139.         {
  140.                 SystemSpeed =SpeedCode[Speed];//速度模式
  141.         }
  142.        
  143.         void delay(uint z)        //延时165MS,即十六分音符
  144.         {        uint x,y;
  145.         for(x=z;x>0;x--)
  146.                 for(y=19000;y>0;y--);
  147.         }
  148.        
  149.         void delay1(uint z)        //延时1MS
  150.         {        uint x,y;
  151.         for(x=z;x>0;x--)
  152.                 for(y=112;y>0;y--);
  153.         }
  154.         //模式1(一个灯右移)
  155.         void Mode_1(void)
  156.         {
  157.                 LEDShow(0x80>>LEDIndex);
  158.                 LEDIndex = (LEDIndex+1)%8;
  159.         }
  160.        
  161.         //Mode 2
  162.         void Mode_2(void)
  163.         {
  164.                 if(LEDDirection)      //选择LED方向
  165.                         LEDShow(~(0x01<<LEDIndex)); //LED一个灭的灯左移
  166.                 else
  167.                         LEDShow(~(0x80>>LEDIndex));//LED一个灭的灯右移
  168.                 if(LEDIndex==7)
  169.                         LEDDirection = !LEDDirection;//改变方向
  170.                 LEDIndex = (LEDIndex+1)%8;//循环
  171.         }
  172.        
  173.         //Mode 3
  174.         void Mode_3(void)
  175.         {
  176.                 if(LEDDirection)
  177.                 {
  178.                         if(LEDFlag) //LED灭
  179.                                 LEDShow(0xFE<<LEDIndex);  //灭的灯左移
  180.                         else
  181.                                 LEDShow(~(0x7F>>LEDIndex));//一个亮的灯右移
  182.                 }
  183.                 else
  184.                 {
  185.                         if(LEDFlag)
  186.                                 LEDShow(0x7F>>LEDIndex); //一个灭的灯右移
  187.                         else
  188.                                 LEDShow(~(0xFE<<LEDIndex));//一个亮的灯左移
  189.                 }
  190.                 if(LEDIndex==7)
  191.                 {
  192.                         LEDDirection = !LEDDirection;
  193.                         if(LEDDirection)        LEDFlag = !LEDFlag;
  194.                 }
  195.                 LEDIndex = (LEDIndex+1)%8;
  196.         }
  197.        
  198.         //Mode 4
  199.         void Mode_4(void)
  200.         {
  201.                 if(LEDDirection)
  202.                         LEDShow(0x0F<<LEDIndex);        //四个右灯左移
  203.                 else
  204.                         LEDShow(0xF0>>LEDIndex);        //四个左灯右移
  205.                 if(LEDIndex==7)
  206.                         LEDDirection = !LEDDirection;
  207.                 LEDIndex = (LEDIndex+1)%8;
  208.         }
  209.        
  210.         //Mode 5
  211.         void Mode_5(void)
  212.         {
  213.                 if(LEDDirection)
  214.                         LEDShow(~(0x0F<<LEDIndex));//左四个灯左移
  215.                 else
  216.                         LEDShow(~(0xF0>>LEDIndex));//四个灯右移
  217.                 if(LEDIndex==7)
  218.                         LEDDirection = !LEDDirection;
  219.                 LEDIndex = (LEDIndex+1)%8;
  220.         }
  221.        
  222.         void Timer0EventRun(void)
  223.         {
  224.                 switch(RunMode)
  225.                 {
  226.                 case 1:Mode_1();break;
  227.                 case 2:Mode_2();break;
  228.                 case 3:Mode_3();break;
  229.                 case 4:Mode_4();break;
  230.                 case 5:Mode_5();break;
  231.                 default:break;
  232.                 }
  233.         }
  234.        
  235.         void song()
  236.         {
  237.                 uint temp;
  238.                 uchar jp;//jp是简谱
  239.                 i=0;
  240.                 while(1)
  241.                 {       
  242.                         if(key3==0)
  243.                         {
  244.                                 if(key3==0)
  245.                                 {
  246.                                         SystemSpeedIndex++;                //选择速度
  247.                                         if(SystemSpeedIndex>4)
  248.                                                 SystemSpeedIndex=0;
  249.                                         SetSpeed(SystemSpeedIndex);
  250.                                 }
  251.                         }
  252.                         if(key4==0)
  253.                         {
  254.                                 if(key4==0)
  255.                                 {
  256.                                         SystemSpeedIndex--;
  257.                                         if(SystemSpeedIndex<0)
  258.                                                 SystemSpeedIndex=4;
  259.                                         SetSpeed(SystemSpeedIndex);
  260.                                 }
  261.                         }
  262.                        
  263.                         P0=table[RunMode]; //共阴极数码管显示码制
  264.                        
  265.                         if(count2==0)
  266.                         {       
  267.                                 break;
  268.                         }
  269.                         if(count2==1)        //千年之恋
  270.                                 temp=qnzl[i];
  271.                         if(count2==2)        //寂寞沙洲冷
  272.                                 temp=jmszl[i];
  273.                         if(count2==3)        //生日快乐
  274.                                 temp=srkl[i];
  275.                         if(count2==4)        //康定情歌
  276.                                 temp=goon[i];
  277.                         if(temp==0xff)
  278.                                 break;
  279.                         jp=temp/16; //取数的高4位
  280.                        
  281.                         if(jp!=0)
  282.                         {
  283.                                 timeh = chuzhi[jp*2];
  284.                                 timel = chuzhi[jp*2+1];
  285.                                 TR0=1;//定时器T0的开定时器位,TR0=1表示开定时器
  286.                         }
  287.                         else
  288.                         {
  289.                                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  290.                                 fm=0;//关蜂鸣器
  291.                         }
  292.                         delay(temp%16); //取数的低4位
  293.                         TR0=0;                //唱完一个音停15MS,//定时器T0的开定时器位,TR0=0表示关定时器
  294.                         fm=0;
  295.                         i++;
  296.                 }       
  297.                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  298.                 fm=0;       
  299.         }
  300.        
  301.         main()
  302.         {       
  303.                 EX1=1;//开外部中断1
  304.                 IT1=1;//外部中断1下降沿触发方式
  305.                 EX0=1;//开外部中断0
  306.                 IT0=1;//外部中断0下降沿触发方式
  307.                
  308.                 TMOD=0x11;//定时器0,1工作在方式1
  309.                 TH0=0;TL0=0;
  310.                 TH1=0xFC;//定时器1 的高8位里写入十六进制值 0xFC
  311.                 TL1=0xFB;
  312.                 ET0=1;//定时器0的中断允许开关
  313.                 ET1=1;
  314.                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  315.                 P0=table[1];//共阴(阳)极数码管显示码制0~F
  316.                 SetSpeed(0);
  317.                 EA=1;//开总中断
  318.                 TR1=1;//启动定时器T1
  319.                
  320.                 while(1)
  321.                 {
  322.                         song();
  323.                         delay1(50);
  324.                         if(zd)//自动播放标志
  325.                         {
  326.                                 count2++;
  327.                                 if(count2>4)
  328.                                         count2=1;
  329.                                 RunMode++;
  330.                                 if(RunMode>5)
  331.                                         RunMode=1;
  332.                         }
  333.                 }
  334.         }
  335.        
  336.         void int1() interrupt 2                //自动播放歌曲和跑马灯,外部中断1
  337.         {
  338.                 EA=0;//关总中断
  339.                 if(key2==0)
  340.                 {
  341.                         if(key2==0)
  342.                         {
  343.                                 zd = 0;
  344.                                 TR0=1;        //定时器T0的开定时器位,TR0=1表示开定时器
  345.                                 i=0;//从头开始唱
  346.                                 delay1(50);
  347.                                 count2++;
  348.                                 if(count2>4)//音乐标志
  349.                                         count2=1;
  350.                                 RunMode++;
  351.                                 if(RunMode>5)//流水灯标志
  352.                                         RunMode=1;
  353.                         }
  354.                 }
  355.                 EA=1;//开总中断
  356. ……………………

  357. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
源码.zip (3.48 KB, 下载次数: 217)
回复

使用道具 举报

ID:373838 发表于 2018-7-18 09:43 | 显示全部楼层
好东西,感谢分享!!!
回复

使用道具 举报

ID:461290 发表于 2019-1-3 20:25 | 显示全部楼层
真的很给力,非常有帮助
回复

使用道具 举报

ID:461290 发表于 2019-1-3 20:26 | 显示全部楼层
真的很给力非常有帮助
回复

使用道具 举报

ID:621014 发表于 2019-10-9 13:47 | 显示全部楼层
正在學習中
回复

使用道具 举报

ID:620250 发表于 2019-10-9 19:24 | 显示全部楼层
新手正在学习中
回复

使用道具 举报

ID:65956 发表于 2019-10-10 10:52 | 显示全部楼层
下载学习了,谢谢了
回复

使用道具 举报

ID:622913 发表于 2019-10-14 09:06 来自手机 | 显示全部楼层
有没有高清的仿真图和元器件清单啊
回复

使用道具 举报

ID:664846 发表于 2019-12-16 09:46 | 显示全部楼层
跪求元器件清单表
看不清啊
回复

使用道具 举报

ID:664971 发表于 2019-12-16 11:24 | 显示全部楼层
下载了
回复

使用道具 举报

ID:713716 发表于 2020-3-22 22:58 | 显示全部楼层
感谢分享,学习!
回复

使用道具 举报

ID:735159 发表于 2020-4-22 14:02 | 显示全部楼层
球球发一份
邮箱网盘都可
急需!!!!
回复

使用道具 举报

ID:208849 发表于 2020-4-22 14:31 | 显示全部楼层
题目最后一个是什么意思?是音乐切换的时候,跑马灯也切换吗?
回复

使用道具 举报

ID:791853 发表于 2020-6-28 16:49 | 显示全部楼层
要求不是:‘有12个发光二极管做跑马灯,其中跑马灯有10种灯亮模式’,为什么仿真图上只有八个灯?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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