微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教下51单片机如何让蜂鸣器和点阵LED同时工作?

请教下51单片机如何让蜂鸣器和点阵LED同时工作?

时间:10-02 整理:3721RD 点击:

我想让蜂鸣器播放音乐的同时,点阵LED播放动画,应该怎么做?
放在主函数里一条一条指令的执行是肯定不行的,开始我打算用中断,但是不行。仔细思考后觉得中断也是单线程,一旦执行中断就会将当前函数暂停,只有当中断执行完毕才会返回,并不能起到同时执行两个函数的作用。
后来想到了电脑上编程中常用的多线程,但又不知道单片机是否支持。百度找资料,基本全都涉及到Linux了。向交流群里请教,得到的答复是51单片机可以多线程,但不实用,可以用动态扫描的方法。
具体他也没说太多,我也不好意思多问太麻烦人家,所以我个人理解就是将两个函数的指令一条插一条的执行,利用速度差造成同时执行的假象,类似于数码管动态显示那样。
按照这种方法,C代码实现起来很困难,因为两个函数基本就是个大循环,很难在中间插入什么指令。
刚学单片机不久,不知道有没有什么方法可以两两个函数同时执行?能够让蜂鸣器播放音乐的同时,又让点阵LED播放动画?



附上两个功能函数的代码
void play()  //蜂鸣器播放音乐
{
uint i,j=0,k;
uint aa[]={1,5,3,6,8,2,7,9,10};
uint bb[]={100,300,700,150,330,130,660} ;
while(song_long[j]!=0||song_tone[j]!=0)
{
  for(i=0;i<song_long[j]*20;i++)  //通过延时来控制每个音节的播放时长
  {
    speak=~speak;      /*通过延时来控制1和0的间隔时间
            从而控制播放音节*/
    for(k=0;k<song_tone[j]/3;k++);   
  }
  delay(10);
  j++;
}
}

void LED()    //点阵LDE播放动画
{
uchar i,j,n;
uint k;
uchar* p=&aa[0];
for(j=0;j<32;j++)
{
  for(n=0;n<3;n++)
  {
   for(i=0;i<8;i++)
   {   
    P2=bb[i];
    P0=*(p+j+i);
    for(k=0;k<1000;k++);
   }
  }
}
}
编码数组就不贴了

这个我没想过

上系统μc\os II才能实现,裸机情况下不能多任务

单纯的51真的不能实现吗?

加个计时器中断,两个函数来回跳,应该可以吧?

小编你好,最近我也在研究这个蜂鸣器,我是这样做的,让一个led亮的同时蜂鸣器响,led灭时蜂鸣器不响!
我的思路是这样的:比如led亮500ms,这个延时500ms是在蜂鸣器响的程序里延时,led灭500ms,这个灭的时间500ms直接用一个延时函数!
如果有什么疑问,欢迎交流!

能解释的在明白些吗

动态和定时是需要的

首先说明,线程的 概念不太清楚,上层的东西也不熟悉!但是很纳闷:(单核)cpu 怎么可能同时执行两条指令呢,理论上任何时候都是一条一条执行的啊!
时间片轮询的方法可以 解决你的方法! 还有就是 把两个程序合并为一个程序,共同使用循环,也是可以的

我想弄明白 这个,有没有人能加我QQ,970387665

能不能加我QQ970387665,我不太明白这个,想学习一下,谢谢

能加我QQ吗?我这里有两个程序 如何合成一个

我的QQ是952404515

你看看是不是可以用中断

这么久了   你实现了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top