一、项目要求

设计一款声控LED智能灯,该灯含有8个灯珠,采用一个按键统一控制灯的开与关,也可以通过声音控制开灯,开灯后根据环境光亮度,点亮多个灯珠(最暗时点亮8个灯珠,最亮时点亮1个灯珠)。

二、使用的硬件

1. 51单片机实验板,以及电源线、下载线、杜邦线

2. 声音传感器、PCF8591数模转换模块、光敏电阻、独立按键、LED灯

三、设计方案

通过外部中断的开关和声音传感器统一控制灯的开与关,然后用PCF8591数模转换上的光敏电阻把当前环境光的亮度传给单片机,单片机通过光照强度来控制亮几个灯

系统连接图:

四、源代码

1、PCF8591数模转换函数

#include <pcf8591.h>
sbit scl=P2^0;       //I2C  时钟
sbit sda=P2^1;       //I2C  数据
bit ack;             //应答标志位
/*******************************************************************
功能:     启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{sda=1;         /*发送起始条件的数据信号*/_nop_();scl=1;_nop_();        /*起始条件建立时间大于4.7us,延时*/_nop_();_nop_();_nop_();_nop_();    sda=0;         /*发送起始信号*/_nop_();        /* 起始条件锁定时间大于4μs*/_nop_();_nop_();_nop_();_nop_();       scl=0;       /*钳住I2C总线,准备发送或接收数据 */_nop_();_nop_();
}/*******************************************************************
功能:     结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{sda=0;      /*发送结束条件的数据信号*/_nop_();       /*发送结束条件的时钟信号*/scl=1;      /*结束条件建立时间大于4μs*/_nop_();_nop_();_nop_();_nop_();_nop_();sda=1;      /*发送I2C总线结束信号*/_nop_();_nop_();_nop_();_nop_();
}/*******************************************************************
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  I2C_SendByte(u8  c)
{u8  i;for(i=0;i<8;i++)  /*要传送的数据长度为8位*/{if((c<<i)&0x80)sda=1;   /*判断发送位*/else  sda=0;                _nop_();scl=1;               /*置时钟线为高,通知被控器开始接收数据位*/_nop_(); _nop_();             /*保证时钟高电平周期大于4μs*/_nop_();_nop_();_nop_();         scl=0; }_nop_();_nop_();sda=1;                /*8位发送完后释放数据线,准备接收应答位*/_nop_();_nop_();   scl=1;_nop_();_nop_();_nop_();if(sda==1)ack=0;     else ack=1;        /*判断是否接收到应答信号*/scl=0;_nop_();_nop_();
}/*******************************************************************
功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
********************************************************************/
u8   I2C_RcvByte()
{u8  retc=0,i; sda=1;                     /*置数据线为输入方式*/for(i=0;i<8;i++){_nop_();           scl=0;                  /*置时钟线为低,准备接收数据位*/_nop_();_nop_();                 /*时钟低电平周期大于4.7μs*/_nop_();_nop_();_nop_();scl=1;                  /*置时钟线为高使数据线上数据有效*/_nop_();_nop_();retc=retc<<1;if(sda==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */_nop_();_nop_(); }scl=0;    _nop_();_nop_();return(retc);
}
/********************************************************************
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{  if(a==0)sda=0;              /*在此发出应答或非应答信号 */else sda=1;               /*0为发出应答,1为非应答信号 */_nop_();_nop_();_nop_();      scl=1;_nop_();_nop_();                    /*时钟低电平周期大于4μs*/_nop_();_nop_();_nop_();  scl=0;                     /*清时钟线,住I2C总线以便继续接收*/_nop_();_nop_();
}
/************************************************************
* 函数功能      : PCF8591的输出端输出模拟量
******************* *****************************************/
bit Pcf8591_DaConversion(u8 addr,u8 channel,u8 Val)
{Start_I2c();              //启动总线I2C_SendByte(addr);            //发送器件地址if(ack==0)return(0);I2C_SendByte(0x40|channel);              //发送控制字节if(ack==0)return(0);I2C_SendByte(Val);            //发送DAC的数值  if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}
/************************************************************
* 函数功能      : 写入一个控制命令
************************************************************/
bit PCF8591_SendByte(u8 addr,u8 channel)
{Start_I2c();              //启动总线I2C_SendByte(addr);            //发送器件地址if(ack==0)return(0);I2C_SendByte(0x40|channel);              //发送控制字节if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}
/************************************************************
* 函数功能      : 读取一个转换值*/u8 PCF8591_RcvByte(u8 addr)
{  u8 dat;Start_I2c();          //启动总线I2C_SendByte(addr+1);      //发送器件地址if(ack==0)return(0);dat=I2C_RcvByte();          //读取数据0Ack_I2c(1);           //发送非应答信号Stop_I2c();           //结束总线return(dat);
}

2、Main函数

#include<config.h>
#include<uart.h>
#include <pcf8591.h>
sbit RL=P2^2;  //声控
sbit gnd=P3^4;
//sbit Switch=P3^2;
sbit beep=P2^3;    //蜂鸣器引脚
int flag=1,flag1=1;
u8 print[20];
void delay_ms(u16 x)//毫秒延时函数
{u16 i;u8 j;for(i=0;i<x;i++)for(j=0;j<115;j++);
}void delay_us(u8 t) //10倍微秒延时函数,延时10*t微秒
{u8 i;for(i=0;i<=t;i++);
}void Alarm(u8 t) //蜂鸣器报警,持续t秒
{u8 i,j,k;  for(j=0;j<t;j++){ for(i=0;i<200;i++){beep=0;delay_us(50);beep=1;delay_us(50);}for(k=0;k<100;k++){beep=0;delay_us(110);beep=1;delay_us(110);}}
}
void main()
{u8 light;P1=0xff;EA=1;IT0=1;EX0=1;gnd=0;Init_COM();   //初始化flag=1;while(1){PCF8591_SendByte(AddWr,1);//启动AIN0通道模数转换,光敏light=PCF8591_RcvByte(AddWr);//读出转换数字值light=255-light;delay_ms(200);sprintf(print,"L:%3bu",light);Print_str_COM(print);   //将采集的值送串口if(RL==1){flag=!flag;delay_ms(150);}     if(flag==0){//if(light=0){   P1=0XFF;}if(light>0&&light<30){P1=0X00;}if(light>=30&&light<60){P1=0X01;}if(light>=60&&light<90){P1=0X03;}if(light>=90&&light<120){P1=0X07;}if(light>=120&&light<150){P1=0X0F;}if(light>=150&&light<180){P1=0X1F;}if(light>=180&&light<210){P1=0X3F;}if(light>=210&&light<=255){P1=0X7F;}//delay_ms(3000);//P1=0XFF;}else {P1=0XFF;delay_ms(10);//break;}    }
}
void int0() interrupt 0
{flag=!flag;
}

五、实验效果

由于不能上传视频,所以我将效果视频上传至优酷,请点击观看------->声控LED智能灯

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

【C51单片机】声控LED智能灯相关推荐

  1. C51单片机实验——LED流水灯

    实验一 LED流水灯实验报告 实验名称:LED流水灯实验 实验环境:普中实验系统:Keil μVision 4软件: 实验目的: (1)掌握uVision实验环境的使用 (2)掌握单片机I/O控制方法 ...

  2. 微型计算机系统与接口流水灯,单片机的LED流水灯系统设计2.doc

    单片机的LED流水灯系统设计2 学号:0809111030 2010 - 2011学年 第2学期 <单片机应用技术> 课 程 设 计 报 告 题 目: 单片机的LED流水灯系统设计 专 业 ...

  3. 基于c51单片机的毕业设计——智能温度控制

    本设计采用AT89C51单片机为控制芯片,硬件上用dsb18202做温度采集(有需要也可以采用dht11温湿度模块)直流电机作为降温风扇,用户可通过按键来控制转速的大小,用继电器来控制电阻丝提高温度. ...

  4. ESP8266开发之旅 阿里云物联网平台篇② MQTT.FX客户端模拟 调试 MQTT LED智能灯控制系统

    文章目录 1. 前言 2.LED智能灯控制系统 2.1 概念图 2.2 创建产品 2.3 创建物模型 2.4 创建设备 2.4.1 LED_Device1 -- 对应ESP8266 设备1 2.4.2 ...

  5. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边.doc

    WORD格式.分享 精品.资料 单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过 ...

  6. 单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...

    单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的 应该是这样的 先 ...

  7. 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边

    单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的应该是这样的先奇数亮 ...

  8. proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...

    入门学习Proteus 8仿真软件以及C51单片机LED的点亮(C语言)--实例 一.点亮LED的程序编译 1.打开Keil uVision 4新建一个工程 2.在Atmel下寻找AT89C52芯片并 ...

  9. 单片机led灯闪烁实验总结_51单片机实现LED流水灯

    流水灯 用51单片机实现点亮1个2个3个--8个流水灯.我们选择P1口作为控制端口,输出0时LED灯点亮.流水灯实现步骤如下: 点亮第一个LED灯,对P1口赋值为" 1111 1110&qu ...

最新文章

  1. 《LeetCode力扣练习》第64题 最小路径和 Java
  2. HBase、Redis、MongoDB、Couchbase、LevelDB 五款主流NoSQL数据库大比拼
  3. android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;...
  4. 协议关键技术_北京理工大学与华为签署战略合作协议
  5. JAVA--虚函数,抽象函数,抽象类,接口
  6. 行为模型:客户行为智能分析模型
  7. 蓝屏分析_电脑突发蓝屏现象?教你如何快速修复
  8. 排序系统 c语言程序设计,c语言程序设计(排序算法).docx
  9. 1423 poj Big Number 公式题
  10. Jmeter --- Http Cookie Manager
  11. linux zen 补丁,Mageia 7.1 发布,修复AMD Zen 2支持
  12. 如何保持格式拆分工作表?
  13. Java测试框架-junit5详解
  14. 小米机器如何无root激活XPOSED框架的流程
  15. A股数据day级前复权数据下载与存储
  16. vscode中setting设置
  17. php guzzlehttp,使用Guzzle执行HTTP请求
  18. YoloV3学习笔记(一)—— 打标签
  19. JavaScript中onload和unload用法
  20. 回车、换行、空格的ASCII码值(不同OS平台下文件换行定义)

热门文章

  1. [论文阅读笔记]Two-Stream Convolutional Networks for Action Recognition in Videos
  2. 十年•杭研技术秀 | “网易云存储服务”从0到1发展之路
  3. 运筹系列60:TSP问题数据
  4. vtkImageView2三视图(横断面,冠状面,矢状面)
  5. matlab lmtool,借用许可证 - MATLAB Simulink - MathWorks 中国
  6. python设计积分越高中奖率越大的抽奖功能
  7. 计算机网络——网络控制协议报文ICMP
  8. android 平板苹果平板,iPad和安卓平板怎么选?不看绝对会后悔
  9. 盒子模型详细讲解(图码交融)
  10. Match.com被逼做DownToEarth免费交友社群,社群网站也可转战男女交友!