找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机播放音乐的同时显示点阵汉字,求思路

[复制链接]
ID:887271 发表于 2021-3-1 22:40 | 显示全部楼层 |阅读模式
由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现

用蜂鸣器 播放音乐  和点阵循环显示 生日快乐 汉字 都弄好了
现在想播放音乐的时候 点阵也显示  
怎么实现呢
用中断吗

birth.zip

76.02 KB, 下载次数: 16

回复

使用道具 举报

ID:387856 发表于 2021-3-2 09:23 | 显示全部楼层
定时器用来做显示,主程序里播放音乐
回复

使用道具 举报

ID:887271 发表于 2021-3-2 10:26 | 显示全部楼层
liuhailan5757 发表于 2021-3-2 09:23
定时器用来做显示,主程序里播放音乐

你看我程序 附件就是   不行啊   跳到显示字符 音乐就停了
回复

使用道具 举报

ID:387856 发表于 2021-3-2 10:33 | 显示全部楼层
晕哦  你定时器里还加了delay  还用了for循环   哎呀 你这个看了教不了了
回复

使用道具 举报

ID:387856 发表于 2021-3-2 10:38 | 显示全部楼层
还有就是  你8乘以8的点阵可以显示 牛哥生日快乐 ,显示汉子 至少的8乘以12的点阵,一般是16乘以16的才用来显示汉字
回复

使用道具 举报

ID:387856 发表于 2021-3-2 10:39 | 显示全部楼层
我都没注意看,你定时器中断里还用了while(1)。人才啊
回复

使用道具 举报

ID:887271 发表于 2021-3-2 10:41 | 显示全部楼层
liuhailan5757 发表于 2021-3-2 10:38
还有就是  你8乘以8的点阵可以显示 牛哥生日快乐 ,显示汉子 至少的8乘以12的点阵,一般是16乘以16的才用来 ...

你没仔细看  点阵显示已经测试好了 现在就是同时进行音乐和字符显示
回复

使用道具 举报

ID:887271 发表于 2021-3-2 10:41 | 显示全部楼层
liuhailan5757 发表于 2021-3-2 10:39
我都没注意看,你定时器中断里还用了while(1)。人才啊

刚学两天  不会啊  随便写的
回复

使用道具 举报

ID:887271 发表于 2021-3-2 10:43 | 显示全部楼层
liuhailan5757 发表于 2021-3-2 10:39
我都没注意看,你定时器中断里还用了while(1)。人才啊

给我修改下吧
回复

使用道具 举报

ID:390416 发表于 2021-3-2 11:20 | 显示全部楼层
cdqwin 发表于 2021-3-2 10:41
刚学两天  不会啊  随便写的

https://pan.baidu.com/s/1qY6X3eG这个是百度盘,如果需要点阵,可以看看我发的贴子
回复

使用道具 举报

ID:693038 发表于 2021-3-2 12:10 | 显示全部楼层
首先一个,函数实现一般都是放在.c,放.h的一般都是宏和声明,中断不宜处理过多东西,更不宜做延时,你要扫描点阵,可以算一下你多久发一次数据,把定时器,设成发送一次数据间隔的时间去扫描,你2MS发送一次的话就做成2MS中断,循环扫,发完数据立马跳出中断,在中断里面太久会影响主程序和其他中断运行,先把这些基本框架整理好,才好往下调...
回复

使用道具 举报

ID:57657 发表于 2021-3-2 13:46 | 显示全部楼层
lincheng15 发表于 2021-3-2 12:10
首先一个,函数实现一般都是放在.c,放.h的一般都是宏和声明,中断不宜处理过多东西,更不宜做延时,你要扫 ...

不是不能在中断内太久,是中断内停留绝对不能超过2MS。
回复

使用道具 举报

ID:387856 发表于 2021-3-2 14:24 | 显示全部楼层
//我大概给你写了个框架,要你自己去调节音符,
//显示也是现成的了,你自己添加字进来就行
//你这个8乘以8的 要显示字很难
#include<reg51.h>
#include<intrins.h>
#define duo  12                //这里定义哆来咪,就是声音的频率,你要自己去调,要改这里的参数得到正确的哆来咪
#define rui  11
#define mi  10
#define fa  9
#define suo  8
#define la  7
#define xi  6
sbit spk = P1^0;
unsigned char t1 = 0;//显示中用到的变量
unsigned char zhi = 0;//显示第几个字
unsigned char t2 = 0;//每一个字的段位,要8段才凑成一个字
unsigned int dis_time = 0;//每一个字显示的时间
unsigned char yp = 0;//声音的频率寄存器         就是音阶
code unsigned char num[3][8]={{0x80,0x84,0x44,0x34,0x0f,0x34,0x44,0xc4}, //大
                                                      {0x84,0x94,0x94,0xff,0x94,0x95,0x86,0x8c}, //生
                                                          {0x00,0xff,0x49,0x49,0x49,0x49,0xff,0x00},};//日
code unsigned char wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描的段位
void delay(unsigned int time)
{
while(time--);
}
void timer0() interrupt 1
{
if(t1<2)
{
  P3 = num[zhi][t2];
  P0 = wei[t2];
}
if(t1==2)
{
  P0 = 0xff;
  P3 = 0x00;
  }
t1++;
if(t1==3)
{
  t1 = 0;
  t2++;
  if(t2==8)
  {
   t2 = 0;
   dis_time++;
   if(dis_time==100)
   {
    dis_time = 0;
    zhi++;
    if(zhi==3)
     zhi = 0;
   }
  }
}
}
void timer1() interrupt 3
{
unsigned char i;
i++;
if(i==yp)
{
  i = 0;
  spk^=1;
  }
}
void main()
{
P0 = 0x00;
P3 = 0xff;
TMOD = 0x00;                                //模式0
TL0 = 0xfe;                                 //65536-11.0592M/12/1000
TH0 = 0xff;
TR0 = 1;                                    //启动定时器
ET0 = 1;                                    //使能定时器中断
TL1 = 0xfe;                                 //
TH1 = 0xff;
TR1 = 0;                                    //启动定时器
ET1 = 1;                                    //使能定时器中断
EA = 1;
while(1)
{
  TR1=1;
  yp = duo;
  delay(50000);//这些延时是控制歌曲的节奏的,就是拍子。你自己根据生日快乐的歌曲的谱子去做节奏延时
  delay(50000);
  yp = rui;
  delay(50000);
  delay(50000);
  yp = mi;
  delay(50000);
  delay(50000);
  yp = fa;
  delay(50000);
  delay(50000);
  yp = suo;
  delay(50000);
  delay(50000);
  yp = la;
  delay(50000);
  delay(50000);
  yp = xi;
  delay(50000);
  delay(50000);
  TR1 = 0;                 //
  spk = 0;                 //
  delay(50000);         //
  delay(50000);         //这4句 就是掷音符,这里的延时就是掷音的长度
  TR1 = 1;
  yp = xi;
  delay(50000);
  delay(50000);
  yp = la;
  delay(50000);
  delay(50000);
  yp = suo;
  delay(50000);
  delay(50000);
  yp = fa;
  delay(50000);
  delay(50000);
  yp = mi;
  delay(50000);
  delay(50000);
  yp = rui;
  delay(50000);
  delay(50000);
  yp = duo;
  delay(50000);
  delay(50000);
  TR1 = 0;
  spk = 0;
  delay(50000);
  delay(50000);
}
}
回复

使用道具 举报

ID:57657 发表于 2021-3-2 16:41 | 显示全部楼层
你可以按照这个去修改 http://www.51hei.com/bbs/dpj-53492-1.html
回复

使用道具 举报

ID:517951 发表于 2021-3-2 20:23 | 显示全部楼层
定时中断处理函数要简洁精悍,否则会假死,我遇到过,精简之后就功能正常了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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