基于51单片机的音乐喷泉彩灯proteus仿真原理图PCB

功能:
0.本系统采用STC89C52作为单片机
1.彩灯由8个LED组成,喷泉由5V小水泵模拟
2.音乐信号通过ADC0832采集到单片机,单片机通过信号幅度的大小来调节喷泉和彩灯的工作,从而实现音乐喷泉彩灯节奏协同
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include <reg52.h>
#include "main.h"
#include "tlc0832.h"

unsigned char dat;
unsigned char h1;

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

void Delay(unsigned char z)
{
    unsigned char y;
    for (; z > 0; z--)
        for (y = 5; y > 0; y--)
            ;
}

void Fountain(void)
{
    
    dat = ReadADC(AIN0_GND); //检测AD值,音量越大值越小
    
    dat = (dat>128)?128:dat; //去掉大于128的数据
    
    dat = 128 - dat; //处理AD值,以使音量越大,dat值越大
    
    h1 = 128 - dat; //处理h1值
    
    WATERPUMP = 1; //关闭水泵

    Delay(h1);

    if(h1>40)  LED0=1; else LED0=0;    //ad值对比 点亮相应的灯
	if(h1>50)  LED1=1; else LED1=0;	   //ad值对比 点亮相应的灯
	if(h1>60)  LED2=1; else LED2=0;	   //ad值对比 点亮相应的灯
	if(h1>70)  LED3=1; else LED3=0;	   //ad值对比 点亮相应的灯
	if(h1>80)  LED4=1; else LED4=0;	   //ad值对比 点亮相应的灯
	if(h1>90)  LED5=1; else LED5=0;	   //ad值对比 点亮相应的灯
	if(h1>100) LED6=1; else LED6=0;	   //ad值对比 点亮相应的灯
	if(h1>110) LED7=1; else LED7=0;	   //ad值对比 点亮相应的灯

    WATERPUMP = 0; //开启水泵

    Delay(dat+10); //加10是为了使喷泉达到喷发临界值
}



ADC代码:

#include "tlc0832.h"

unsigned char ReadADC(unsigned char channel)
{
	unsigned char i=0,value=0,value1=0;
    bit SGL;
    bit ODD;
    
    switch (channel)
    {
        case AIN0_AIN1: SGL = 0; ODD = 0; break;
        case AIN1_AIN0: SGL = 0; ODD = 1; break;
        case AIN0_GND: SGL = 1; ODD = 0; break;
        case AIN1_GND: SGL = 1; ODD = 1; break;
    }

    TLC0832_CLK = 0;
    TLC0832_DQ = 1;
    TLC0832_CS = 0;  //开始
    TLC0832_CLK = 1; //第一个上升沿
    TLC0832_CLK = 0;
    TLC0832_DQ = SGL;
    TLC0832_CLK = 1; //第二个上升沿
    TLC0832_CLK = 0;
    TLC0832_DQ = ODD;
    TLC0832_CLK = 1; //第三个上升沿
    TLC0832_CLK = 0; //第三个下降沿
    TLC0832_DQ = 1;
    for (i = 0; i < 8; i++)
    {
        TLC0832_CLK = 1;
        TLC0832_CLK = 0; //开始从第四个下降沿接收数据
        value <<= 1;
        if (TLC0832_DQ)
            value++;
    }
    for (i = 0; i < 8; i++)
    { //接收校验数据
        value1 >>= 1;
        if (TLC0832_DQ)
            value1 += 0x80;
        TLC0832_CLK = 1;
        TLC0832_CLK = 0;
    }
    TLC0832_CS = 1;
    TLC0832_CLK = 1;
    if (value == value1) //与校验数据比较,正确就返回数据,否则返回0
        return value;
    else
        return 0;
}

仿真演示视频:
https://www.bilibili.com/video/BV1oU4y117Sp/

实物演示视频:
https://www.bilibili.com/video/BV1rN4y1P7mw/