【C51单片机】声控LED智能灯
一、项目要求
设计一款声控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智能灯相关推荐
- C51单片机实验——LED流水灯
实验一 LED流水灯实验报告 实验名称:LED流水灯实验 实验环境:普中实验系统:Keil μVision 4软件: 实验目的: (1)掌握uVision实验环境的使用 (2)掌握单片机I/O控制方法 ...
- 微型计算机系统与接口流水灯,单片机的LED流水灯系统设计2.doc
单片机的LED流水灯系统设计2 学号:0809111030 2010 - 2011学年 第2学期 <单片机应用技术> 课 程 设 计 报 告 题 目: 单片机的LED流水灯系统设计 专 业 ...
- 基于c51单片机的毕业设计——智能温度控制
本设计采用AT89C51单片机为控制芯片,硬件上用dsb18202做温度采集(有需要也可以采用dht11温湿度模块)直流电机作为降温风扇,用户可通过按键来控制转速的大小,用继电器来控制电阻丝提高温度. ...
- 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 ...
- 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边.doc
WORD格式.分享 精品.资料 单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过 ...
- 单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...
单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的 应该是这样的 先 ...
- 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边
单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的应该是这样的先奇数亮 ...
- proteus8单片机c语言仿真教程,入门学习Proteus 8仿真软件以及C51单片机的LED点亮(C语言)——实例...
入门学习Proteus 8仿真软件以及C51单片机LED的点亮(C语言)--实例 一.点亮LED的程序编译 1.打开Keil uVision 4新建一个工程 2.在Atmel下寻找AT89C52芯片并 ...
- 单片机led灯闪烁实验总结_51单片机实现LED流水灯
流水灯 用51单片机实现点亮1个2个3个--8个流水灯.我们选择P1口作为控制端口,输出0时LED灯点亮.流水灯实现步骤如下: 点亮第一个LED灯,对P1口赋值为" 1111 1110&qu ...
最新文章
- 《LeetCode力扣练习》第64题 最小路径和 Java
- HBase、Redis、MongoDB、Couchbase、LevelDB 五款主流NoSQL数据库大比拼
- android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;...
- 协议关键技术_北京理工大学与华为签署战略合作协议
- JAVA--虚函数,抽象函数,抽象类,接口
- 行为模型:客户行为智能分析模型
- 蓝屏分析_电脑突发蓝屏现象?教你如何快速修复
- 排序系统 c语言程序设计,c语言程序设计(排序算法).docx
- 1423 poj Big Number 公式题
- Jmeter --- Http Cookie Manager
- linux zen 补丁,Mageia 7.1 发布,修复AMD Zen 2支持
- 如何保持格式拆分工作表?
- Java测试框架-junit5详解
- 小米机器如何无root激活XPOSED框架的流程
- A股数据day级前复权数据下载与存储
- vscode中setting设置
- php guzzlehttp,使用Guzzle执行HTTP请求
- YoloV3学习笔记(一)—— 打标签
- JavaScript中onload和unload用法
- 回车、换行、空格的ASCII码值(不同OS平台下文件换行定义)
热门文章
- [论文阅读笔记]Two-Stream Convolutional Networks for Action Recognition in Videos
- 十年•杭研技术秀 | “网易云存储服务”从0到1发展之路
- 运筹系列60:TSP问题数据
- vtkImageView2三视图(横断面,冠状面,矢状面)
- matlab lmtool,借用许可证
- MATLAB Simulink
- MathWorks 中国
- python设计积分越高中奖率越大的抽奖功能
- 计算机网络——网络控制协议报文ICMP
- android 平板苹果平板,iPad和安卓平板怎么选?不看绝对会后悔
- 盒子模型详细讲解(图码交融)
- Match.com被逼做DownToEarth免费交友社群,社群网站也可转战男女交友!