找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1998|回复: 10
收起左侧

新人请教一个12864显示程序与音乐程序怎样模块化,主函数怎样写?谢谢

  [复制链接]
ID:282384 发表于 2018-2-23 19:12 | 显示全部楼层 |阅读模式
#include <regx52.h>

sfr  P4  = 0xE8;//定义P4端口地址
sbit P4_4 = P4^4;//定义P4.4口位地址
sbit      speaker=P4^4;
#define BUZZER P4_4 //定义蜂鸣器控制端口
#define ON 0 //端口低电平时蜂鸣器开启
#define OFF 1 //端口高电平时蜂鸣器关闭

unsigned char timer0h,timer0l,time;
        //生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
         5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
         5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
         4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
       // 音阶频率表 高八位
code unsigned char FREQH[]={
                                0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
                                0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
                                0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                                0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                               } ;
         // 音阶频率表 低八位
code unsigned char FREQL[]={
                                 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                                 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
                                 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
                                 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                                };
void delay(unsigned char t)
   {
   unsigned char t1;
   unsigned long t2;
   for(t1=0;t1<t;t1++)
   {
    for(t2=0;t2<8000;t2++)
       {
        ;
        }
   }
   TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);                       
}
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
      {
       i=0;  
       while(i<75){         //音乐数组长度 ,唱完从头再来        
       k=sszymmh[i]+7*sszymmh[i+1]-1;
       timer0h=FREQH[k];
       timer0l=FREQL[k];
       time=sszymmh[i+2];
       i=i+3;
       song();
        }
      }
  }

回复

使用道具 举报

ID:284873 发表于 2018-2-23 23:56 | 显示全部楼层
多任务一般用RTOS的hwi、swi、task等进行处理,如果仅是您贴的代码中需加入屏幕显示功能,您这里用的51,可以在播放音乐时插中断刷新屏幕。
回复

使用道具 举报

ID:282384 发表于 2018-2-24 12:32 | 显示全部楼层
谢谢指教,我想让显示和音乐播放同时进行,写头文件模块化,主函数中断进行两个程序的执行,可以吗?怎样写
?
回复

使用道具 举报

ID:282486 发表于 2018-2-24 17:58 | 显示全部楼层
有p4吗?
回复

使用道具 举报

ID:155507 发表于 2018-2-25 10:04 | 显示全部楼层

有P4, STC12 就有

STC12C5A60S2-35I-PDIP40

STC12C5A60S2-35I-PDIP40

STC12C5A60S2-35I-PDIP40
回复

使用道具 举报

ID:274747 发表于 2018-2-25 10:36 | 显示全部楼层
调用函数
回复

使用道具 举报

ID:282384 发表于 2018-3-1 16:20 | 显示全部楼层

请赐教主函数调用函数的源程序代码,谢谢!
void main(){
        code unsigned char top[] = "^_^ 学习 ^_^ ";
        code unsigned char li0[] = "方案设计";
        code unsigned char li1[] = "为学习添活力!";
        code unsigned char bottom[] = "QQ:XXXXX";
        LCD_Init();
        while(1)
        {
                LCD_Clear();
                LCD_ShowImg(IMG);
                delay(65535);
                LCD_Flash();
                LCD_Clear();
                LCD_ShowString(0,0,top);
                delay(10000);
                LCD_ShowString(0,1,li0);
                delay(10000);
                LCD_ShowString(0,2,li1);
                delay(10000);
                LCD_ShowString(0,3,bottom);
                LCD_Flash();
                delay(65535);
        }
}
  和
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
      {
       i=0;  
       while(i<75){         //音乐数组长度 ,唱完从头再来        
       k=sszymmh[ i]+7*sszymmh[i+1]-1;
       timer0h=FREQH[k];
       timer0l=FREQL[k];
       time=sszymmh[i+2];
       i=i+3;
       song();
        }
      }
  }
两个主函数怎样合为一个,谢谢1
回复

使用道具 举报

ID:439126 发表于 2019-1-23 15:27 来自手机 | 显示全部楼层
明明是世上只有妈妈好的歌,什么生日歌?
回复

使用道具 举报

ID:454000 发表于 2019-1-23 20:26 | 显示全部楼层
12864的案例我空间案例很多,你可以参考一下。你上面的代码不适合多首歌曲播放,最好的方式是将音符与节拍编辑好一起放到一个数组里,
例如0x11,0x04,
其中0x11中的0x1指的是中音,
(uint16 code FreTab_Low[7]={262,294,330,349,392,440,494};      //低音频率表
uint16 code FreTab_Mid[7]={523,578,659,698,784,880,988};                //中音频率表
uint16 code FreTab_Hight[7]={1046,1175,1318,1397,1568,1760,1976};        //高音频率表),
后一个1指向的是 523HZ,那就是说通过0x11能找到高中低音中的音符,0x04表示节拍(一种音符延时的长短),那么只要保证数组指针在++就能取出数组里的参数,一首歌一个数组就能摆平。

下面是具体一个例子:

#include<reg51.h>       

#define uint8        unsigned char   
#define uint16  unsigned int

sbit Music=P2^0;
sbit sw=P3^0;
void DelayMS(uint16 dly)
{
        uint16 x,y;
        for(x=dly;x>0;x--)
                for(y=247;y>0;y--);
}

uint16 code FreTab_Low[7]={262,294,330,349,392,440,494};                //低音频率表
uint16 code FreTab_Mid[7]={523,578,659,698,784,880,988};                //中音频率表
uint16 code FreTab_Hight[7]={1046,1175,1318,1397,1568,1760,1976};        //高音频率表

//大海啊故乡
uint8 code  Happy_Birthday1[]={0x11,0x04,0x12,0x04,0x11,0x0a,0x07,0x02,0x06,0x02,
0x05,0x04,0x13,0x04,0x13,0x0f,0x13,0x04,0x14,0x04,
0x13,0x0a,        0x12,0x02,0x11,0x02,0x06,0x04,0x12,0x04,0x12,0x0f,
0x07,0x04,0x11,0x04,0x07,0x0a,0x06,0x02,0x05,0x02,
0x05,0x04,0x12,0x04,0x12,0x0f,0x14,0x0a,0x13,0x04,0x11,0x04,0x06,0x04,0x11,0x18,
0x15,0x04,0x16,0x04,0x15,0x0a,0x13,0x04,0x15,0x04,0x16,0x04,0x15,0x0f,
0x16,0x04,0x15,0x04,0x14,0x04,0x11,0x02,0x11,0x02,0x16,0x04,0x15,0x04,0x15,0x18,
0x13,0x04,0x14,0x04,0x13,0x0a,0x12,0x02,0x11,0x02,0x06,0x04,0x12,0x04,0x12,0x0f,
0x14,0x04,0x15,0x04,0x14,0x04,0x13,0x04,0x11,0x04,0x06,0x04,
0x11,0x18,0x15,0x04,0x16,0x04,0x15,0x0a,0x13,0x04,0x15,0x04,0x16,0x04,0x15,0x0f,
0x16,0x04,0x15,0x04,0x14,0x04,0x11,0x02,0x11,0x02,0x16,0x04,0x15,0x04,0x15,0x18,
0x13,0x04,0x14,0x04,0x13,0x0a,0x12,0x02,0x11,0x02,
0x06,0x04,0x12,0x04,0x12,0x0f,
0x14,0x04,0x15,0x04,0x14,0x04,0x13,0x04,0x11,0x04,0x06,0x04,0x11,0x18,
0x00,0x00
};
//祝你生日快乐
uint8 code  Happy_Birthday2[]={0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,
0x14,0x0a,0x13,0x14,
0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,
0x15,0x0a,0x14,0x14,
0x11,0x05,0x11,0x05,0x21,0x0a,0x16,0x0a,
0x14,0x0a,0x13,0x0a,0x22,0x0a,
0x17,0x05,0x17,0x05,0x16,0x0a,0x14,0x0a,
0x15,0x0a,0x14,0x14,0x00,0x00

};
//辣妹子
uint8 code  Happy_Birthday3[]={
       
0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x06,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x16,0x04,
0x16,0x04,
0x06,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x06,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x06,0x04,
0x06,0x04,
0x06,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,


0x16,0x04,
0x16,0x04,
0x16,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x13,0x04,
0x13,0x04,
0x06,0x08,

0x16,0x04,
0x13,0x02,
0x15,0x02,
0x16,0x04,
0x13,0x02,
0x15,0x02,

0x16,0x04,
0x16,0x04,
0x16,0x08,

0x11,0x04,
0x15,0x02,
0x13,0x02,
0x13,0x02,
0x15,0x02,

0x13,0x04,
0x13,0x04,
0x06,0x08,

0x13,0x04,
0x13,0x02,
0x13,0x02,
0x16,0x04,
0x16,0x04,

0x16,0x18,

0x16,0x0a,
0x21,0x04,


0x13,0x04,
0x13,0x04,
0x03,0x08,


0x00,0x00
};



uint16 Fre;  //存放获取频率值的变量

                         /*-----------------------------------------------
                         函数名:Timer_Init()
                         函数功能:对两个定时器初始化
                         入口参数:无
------------------------------------------------*/
void Timer_Init()
{
        TMOD=0x11;
        EA=1;
        ET0=1;
        ET1=0;
        TR0=0;
        TR1=0;
}
/*-----------------------------------------------
函数名:Timer0_Ser()
函数功能:定时器0的中断服务程序,主要是产生需要的频率
从而驱动喇叭发出相应的音符
入口参数:无
------------------------------------------------*/
void Timer0_i() interrupt 1
{
        TH0=Fre/256;
        TL0=Fre%256;
        if(Music==0)
                Music=1;
        else Music=0;               
}

/*-----------------------------------------------
函数名:Music_Play(uchar *MusicTab)
函数功能:音乐播放函数,
入口参数:*MusicTab  所要播放音乐的首地址
------------------------------------------------*/
void Music_Play(uint8 *MusicTab)
{
        uint8 *pMusic;
        uint8 temp,i;
       
        pMusic=MusicTab;  //将歌曲首地址给指针变量
        while(*pMusic!=0)
        {
                if((*pMusic&0xf0)==0x00)
                        Fre=65536-1000000/FreTab_Low[*pMusic&0x0f];
                else if((*pMusic&0xf0)==0x10)
                        Fre=65536-1000000/FreTab_Mid[*pMusic&0x0f];
                else if((*pMusic&0xf0)==0x20)
                        Fre=65536-1000000/FreTab_Hight[*pMusic&0x0f];
               
                TH0=Fre/256;                //计算频率初值,赋高八位
                TL0=Fre%256;                //计算频率初值,赋低八位
                TH1=0x3c;                    //定时器1赋初值,定时50ms
                TL1=0xb0;
               
                pMusic++;                    //获得节拍值
                temp=*pMusic;
                TR0=1;                        //开启定时器T0
                TR1=1;                        //开启定时器T1
                for(i=0;i<temp;i++)
                {
                        while(TF1==0);        //判断定时器1是否溢出
                        TH1=0x3c;
                        TL1=0xb0;
                        TF1=0;       
                }
                pMusic++;
        }
}
/*-----------------------------------------------
函数名:main()
函数功能:主函数
入口参数:无
------------------------------------------------*/
void main()
{       
       
           while(1)
        {
                int k;
                Timer_Init();
               
               
                if(sw==0)                      
                {
                        DelayMS(10);                        
                        if(sw==1)           
                                break;
                        while(sw==0);
                        {
                                k++;
                               
                               
                                if(k==1)
                                {
                                        Music_Play(Happy_Birthday1);
                                }
                               
                                else if(k==2)
                                {
                                        Music_Play(Happy_Birthday2);
                                       
                                }
                               
                                else if(k==3)
                                {
                                        Music_Play(Happy_Birthday3);
                                        k=0;
                                }
                               
                               
                               
                        }
                }
        }
}

懂了这个再同12864整合一下就OK了,不是很难


评分

参与人数 5黑币 +127 收起 理由
就你**** + 10
站着说话不腰疼 + 15
刀刀见红 + 10
areyouok + 12 回帖助人的奖励!
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:472242 发表于 2019-3-14 07:45 | 显示全部楼层
已经有你想要的作品呢,看这里:http://www.51hei.com/bbs/dpj-152388-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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