找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2581|回复: 0
收起左侧

多模式带音乐跑马灯单片机程序+Proteus仿真

[复制链接]
ID:744356 发表于 2020-11-13 12:36 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
捕获.PNG
共有6个模式,可以显示速率和模式。

单片机源程序如下:
  1. #include <reg51.h>

  2. #define uchar unsigned cha
  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. sbit wei=P3^0;
  11. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示码制0~F
  12. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示码制0~F
  13. //速度模式共有5种
  14. unsigned char code SpeedCode[]={100,60,30,14,5};                                                                 
  15. uchar count2=1,RunMode=1;//音乐、流水灯标志
  16. uchar zd=1;                //自动播放标志
  17. uchar timeh,timel,i;
  18. uint LEDIndex = 0;//LED位置,声明8位变量LEDIndex,用来指示8个LED哪个灯被点亮
  19. bit LEDDirection = 1,LEDFlag = 1;//LED方向,LED亮灭
  20. uint Timer0Count,SystemSpeed;//跑马灯速度,系统速度
  21. char SystemSpeedIndex=1;//速度模式参数
  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.                
  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;//LEDIndex+1对8取余,保证LEDIndex在0~7之间
  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(0xAA<<LEDIndex);  //四灭的灯左移
  180.                         else
  181.                                 LEDShow(~(0x55>>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.         //Mode 6
  222.   void Mode_6(void)
  223.   {
  224.          if(LEDDirection)
  225.                         LEDShow(~(0x1F<<LEDIndex));//左五个灯左移
  226.                 else
  227.                         LEDShow(~(0x30>>LEDIndex));//两个灯右移
  228.                 if(LEDIndex==7)
  229.                         LEDDirection = !LEDDirection;
  230.                 LEDIndex = (LEDIndex+1)%8;
  231.   }
  232.         void Timer0EventRun(void)
  233.         {
  234.                 switch(RunMode)
  235.                 {
  236.                 case 1:Mode_1();break;
  237.                 case 2:Mode_2();break;
  238.                 case 3:Mode_3();break;
  239.                 case 4:Mode_4();break;
  240.                 case 5:Mode_5();break;
  241.     case 6:Mode_6();break;
  242.                 default:break;
  243.                 }
  244.         }
  245.         
  246.         void song()
  247.         {
  248.                 uint temp;
  249.                 uchar jp;//jp是简谱
  250.                 i=0;
  251.                 while(1)
  252.                 {      
  253.                           if(key3==0)
  254.       {
  255.       delay1(7);
  256.          if(key3==0)
  257.                                 {   
  258.            
  259.                P2=tab[SystemSpeedIndex];
  260.                                         SystemSpeedIndex++;                //选择速度
  261.                                         if(SystemSpeedIndex>5)
  262.                                                 SystemSpeedIndex=1;
  263.                                         SetSpeed(SystemSpeedIndex);
  264.                                 }
  265.         while(!key3);
  266.                         }
  267.        if(key4==0)
  268.           {
  269.            delay1(7);
  270.           if(key4==0)
  271.                                 {  
  272.    
  273.                P2=tab[SystemSpeedIndex];
  274.                                         SystemSpeedIndex--;
  275.                                         if(SystemSpeedIndex<1)
  276.                                                 SystemSpeedIndex=5;
  277.                                         SetSpeed(SystemSpeedIndex);
  278.                                  }
  279.         while(!key4);
  280.        }
  281.                         P0=table[RunMode]; //共阴极数码管显示码制
  282.         P2=tab[SystemSpeedIndex];//速度显示
  283.                         if(count2==0)
  284.                         {        
  285.                                 break;
  286.                         }
  287.                         if(count2==1)        //千年之恋
  288.                                 temp=qnzl[i];
  289.                         if(count2==2)        //寂寞沙洲冷
  290.                                 temp=jmszl[i];
  291.                         if(count2==3)        //生日快乐
  292.                                 temp=srkl[i];
  293.                         if(count2==4)        //康定情歌
  294.                                 temp=goon[i];
  295.                         if(temp==0xff)
  296.                                 break;
  297.                         jp=temp/16; //取数的高4位
  298.                         
  299.                         if(jp!=0)
  300.                         {
  301.                                 timeh = chuzhi[jp*2];
  302.                                 timel = chuzhi[jp*2+1];
  303.                                 TR0=1;//定时器T0的开定时器位,TR0=1表示开定时器
  304.                         }
  305.                         else
  306.                         {
  307.                                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  308.                                 fm=0;//关蜂鸣器
  309.                         }
  310.                         delay(temp%16); //取数的低4位
  311.                         TR0=0;                //唱完一个音停15MS,//定时器T0的开定时器位,TR0=0表示关定时器
  312.                         fm=0;
  313.                         i++;
  314.                 }        
  315.                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  316.                 fm=0;        
  317.         }
  318.         
  319.         main()
  320.         {        
  321.                 EX1=1;//开外部中断1
  322.                 IT1=1;//外部中断1下降沿触发方式
  323.                 EX0=1;//开外部中断0
  324.                 IT0=1;//外部中断0下降沿触发方式
  325.                 TMOD=0x11;//定时器0,1工作在方式1
  326.                 TH0=0;TL0=0;
  327.                 TH1=0xFC;//定时器1 的高8位里写入十六进制值 0xFC
  328.                 TL1=0xFB;
  329.                 ET0=1;//定时器0的中断允许开关
  330.                 ET1=1;
  331.                 TR0=0;//定时器T0的开定时器位,TR0=0表示关定时器
  332.    wei=1;
  333.                 P0=table[1];//共阴(阳)极数码管显示码制0~F
  334.     P2=tab[1];
  335.                 SetSpeed(0);
  336.                 EA=1;//开总中断
  337.                 TR1=1;//启动定时器T
  338.                 while(1)
  339.                 {
  340.                         song();
  341.                         delay1(50);
  342.                         if(zd)//自动播放标志zd=1
  343.                         {
  344.                                 count2++;
  345.                                 if(count2>4)
  346.                                         count2=1;
  347.                                 RunMode++;
  348.                                 if(RunMode>6)
  349.                                         RunMode=1;
  350.         SystemSpeedIndex++;
  351.         if(SystemSpeedIndex>5)
  352.                                                 SystemSpeedIndex=1;
  353.         if(SystemSpeedIndex<1)
  354.                                                 SystemSpeedIndex=5;
  355.                         }
  356.                 }
  357.         }
  358.         
  359.         void int1() interrupt 2                //自动播放歌曲和跑马灯,外部中断1
  360.         {
  361.                 EA=0;//关总中断
  362.                 if(key2==0)
  363.                 {
  364.      delay1(7);
  365.                         if(key2==0)
  366.                         {
  367.                                 zd = 0;
  368.                                 TR0=1;        //定时器T0的开定时器位,TR0=1表示开定时器
  369.                                 i=0;//从头开始唱
  370.                                 delay1(5);
  371.                                 count2++;
  372.                                 if(count2>4)//音乐标志
  373.                                         count2=1;
  374.                                 RunMode++;
  375.                                 if(RunMode>6)//流水灯标志
  376.                                         RunMode=1;
  377.                         }
  378.         while(!key2);
  379.                 }
  380.                 EA=1;//开总中断
  381. }
  382. void int0() interrupt 0
  383. {
  384. EA=0;
  385. delay1(7);
  386. if(key1==0)
  387. {
  388.   delay1(5);
  389.   if(key1==0)
  390.   {
  391.    zd=1;
  392.   }
  393.   while(!key1);
  394. }
  395. EA=1;
  396. }
  397. void timer0() interrupt 1
  398. {
  399. EA=0;
  400. TR0=0;
  401. TH0=timeh;
  402. TL0=timel;
  403.   fm=~fm;
  404.   TR0=1;
  405. EA=1;
  406. }
  407. void Timer1() interrupt 3
  408. {
  409.   EA=0;
  410.   TR1=0;
  411.   TH1=0XFC;
  412.   TL1=0xfB;
  413.   Timer0Count++;
  414.   if(Timer0Count>=SystemSpeed)
  415.   {
  416.   Timer0Count=0;
  417.   Timer0EventRun();
  418.   }
  419.   TR1=1;
  420.   EA=1;
  421. }
复制代码
全部资料51hei下载地址:
多模式带音乐跑马灯.rar (61.6 KB, 下载次数: 80)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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