找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1782|回复: 5
打印 上一主题 下一主题
收起左侧

单片机程序为什么只能单一地实现蜂鸣器响而不能使蜂鸣器与心型流水灯同时实现功能?

[复制链接]
跳转到指定楼层
楼主

        程序为什么只能单一的实现蜂鸣器响而不能使蜂鸣器与心型流水灯同时实现功能呢?问题出在哪?哪位大神指导指导

新建 DOC 文档.doc

730 KB, 下载次数: 8

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:402946 发表于 2020-11-16 00:13 来自手机 | 只看该作者
因为程序是一步一步执行,从主程序看,找执行播放音乐函数,播放完音乐再去执行流水灯的程序,这两个程序是排着队串行处理的,要想并行处理,可以试试将蜂鸣器发声的相关程序放在定时器中断函数中。中。
回复

使用道具 举报

板凳
ID:88256 发表于 2020-11-16 00:23 | 只看该作者
不太明白你的描述,心形灯会亮吗?你的程序写的就是先播放曲子然后亮灯,所以是不可能同时动作的,想要曲子和灯一起,就不能顺序写下来
回复

使用道具 举报

地板
ID:420836 发表于 2020-11-16 00:56 | 只看该作者
函数play_song()包含while(1)语句。 将“ 1”更改为适当的条件。
回复

使用道具 举报

5#
ID:213173 发表于 2020-11-16 06:58 | 只看该作者
给你一个蜂鸣器音乐与流水灯同时实现功能的编程思路,不代表此程序能够直接正常运行。
#include "reg52.h"

sbit buzzer=P2^3 ;                        //蜂鸣器控制脚 

unsigned char code SONG1[]={//音乐频率数组,
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00};
unsigned char code SONG2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯数组

unsigned char Count;
unsigned int i;
unsigned char j;

void Time0_Init()
{
        TMOD = 0x21;
        TH0  = 0x3C;//50ms
        TL0  = 0xB0;//50ms
        TH1  = 0x00;
        TL1  = 0x00;
        TR0  = 1;
        TR1  = 1;
        EA          = 1;
        ET0  = 1;
        ET1  = 1;
}

void Time0_Int() interrupt 1
{
    TH0  = 0x3C;
    TL0  = 0xB0;
        Count++;
        if(Count%5==0)//250ms节拍
        {
                i++;
                if(i=='\0')
                        i=0;
                TH1=SONG1[i];//T1重装值,音乐频率
        }
        if(Count==10)//500ms流水灯变化速度
        {
                Count=0;
                j++;
                if(j=='\0')
                        j=0;
                P0=SONG2[j];//流水灯花样
        }
}

void Timer1Int() interrupt 3
{
        buzzer=~buzzer;       
}

void main()
{
        Time0_Init();
        while(1);
}

回复

使用道具 举报

6#
ID:8222 发表于 2020-11-16 07:50 | 只看该作者
play_song()里有死循环while(1),程序到这里打转转了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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