基于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/

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的51单片机彩灯控制器设计代码示例,供参考: ``` #include <reg51.h> #define uchar unsigned char #define uint unsigned int // 定义RGB LED引脚 sbit R = P2^0; sbit G = P2^1; sbit B = P2^2; // 定义光敏电阻引脚 sbit LDR = P3^7; // 定义调节灯光亮度的电位器引脚 sbit POT = P3^6; // 定义按键引脚 sbit KEY = P3^5; // 延时函数 void delay(uint i) { while(i--); } // ADC采集函数 uchar ADC_Read(uchar chn) { uchar ADC_Value; ADC_CONTR = ADC_POWER | ADC_SPEEDH | chn; delay(10); ADC_CONTR |= ADC_START; while(!(ADC_CONTR & ADC_FLAG)); ADC_CONTR &= ~ADC_FLAG; ADC_Value = ADC_RES; return ADC_Value; } // 控制RGB LED亮度和颜色 void Control_RGB_LED(uchar r_val, uchar g_val, uchar b_val) { R = r_val; G = g_val; B = b_val; } // 主函数 void main() { uchar ldr_val, pot_val; uchar r_val, g_val, b_val; uchar mode = 0; // 初始化ADC ADC_RES = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDH | ADC_SPEEDL; delay(5); while(1) { // 采集光敏电阻的值 ldr_val = ADC_Read(7); // 采集电位器的值 pot_val = ADC_Read(6); // 根据光敏电阻的值调整灯光亮度 r_val = (255 - ldr_val) * pot_val / 255; g_val = (255 - r_val) * pot_val / 255; b_val = (255 - g_val) * pot_val / 255; // 根据按键切换灯光模式 if(KEY == 0) { delay(1000); mode++; if(mode > 2) { mode = 0; } } // 根据不同的灯光模式设置RGB LED颜色 switch(mode) { case 0: Control_RGB_LED(r_val, g_val, b_val); // RGB LED颜色跟随环境光线和电位器调节 break; case 1: Control_RGB_LED(255, 0, 0); // 红色闪烁 delay(500); Control_RGB_LED(0, 255, 0); // 绿色闪烁 delay(500); Control_RGB_LED(0, 0, 255); // 蓝色闪烁 delay(500); break; case 2: Control_RGB_LED(255, 255, 255); // 白色呼吸灯 for(uchar i = 0; i < 255; i++) { r_val = i; g_val = i; b_val = i; Control_RGB_LED(r_val, g_val, b_val); delay(50); } for(uchar i = 255; i > 0; i--) { r_val = i; g_val = i; b_val = i; Control_RGB_LED(r_val, g_val, b_val); delay(50); } break; default: break; } } } ``` 该代码实现了根据环境光线和电位器调节RGB LED的颜色和亮度,同时可以通过按键切换不同的灯光模式,包括闪烁和呼吸灯两种效果。具体实现还需要根据具体的硬件电路进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值