请教下51单片机如何让蜂鸣器和点阵LED同时工作?
我想让蜂鸣器播放音乐的同时,点阵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
你看看是不是可以用中断
这么久了 你实现了吗?