Arduino和C51开发光敏传感器
概述
详细
一、光敏传感器
光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。光敏传感器中最简单的电子器件是光敏电阻,它能感应光线的明暗变化,输出微弱的电信号,通过简单电子线路放大处理,可以控制LED灯具的自动开关。
模块使用说明
光敏电阻模块对环境光线最敏感,一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等;
模块在环境光线亮度达不到设定阈值时,DO 端输出高电平,当外界环境光线亮度超过设定阈值时,DO端输出低电平;
DO 输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的光线亮度改变;
小板模拟量输出 AO 可以和 AD 模块相连,通过 AD 转换,可以获得环境光强更精准的数值.
二、C51单片机串口显示光照强度
光敏传感器的AO引脚输出的是模拟信号,而51单片机内部没有AD/DA转换器,不能接收模拟信号,只能接收到数字信号,所以我们需要一个能够进行AD/DA转换的模块,这里我选择了PCF8591模块来进行AD转换。
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591 具有 4 个模拟输入、1 个模拟输出和 1个串行 I2C 总线接口。PCF8591 的 3 个地址引脚 A0, A1 和 A2 可用于硬件地址编程,允许在同个 I2C 总线上接入8个PCF8591 器件,而无需额外的硬件。在 PCF8591 器件上输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输。(简单的说:可以实现4路 模拟输入,1路模拟输出,具体功能看模块使用说明)
硬件连接: 
PCF8591的使用会涉及到I2C总线,程序中也要加入对I2C的操作,Pcf8591SendByte()来选择使用PCF8591 模块的哪一路输入(这里选择AIN0)
void Pcf8591SendByte(uchar channel)
{
I2C_Start(); //开始I2C总线
I2C_SendByte(WRITEADDR); //发送写器件地址
I2C_SendByte(0x40|channel); //发送控制寄存器
I2C_Stop();
} uchar Pcf8591ReadByte() //读取值
{
uchar num;
I2C_Start();
I2C_SendByte(READADDR); //发送读器件地址
num=I2C_ReadByte(); //读取数据
I2C_Stop(); //结束总线
return num;
} void main()
{
uint adNum;
float value;
UsartInit();
while(1)
{
Pcf8591SendByte(0); //使用通道0 (可选择通道0-3)光敏传感器A0连接PCF8591传感器的AIN0
/*adNum一定是0到255之间的一个数,因为pcf8591是8位的AD/DA芯片,所以输出的范围为00000000
到11111111,即0到255*/
adNum=Pcf8591ReadByte(); //读出数值
value = adNum;
value=100.0 - value*100.0/255.0; //把光敏值转换为0-100的数值,这里255.0可更改
//(根据实际测试value最暗值)
printf("light:");
printf("%.2f\n",value); //打印数据到串口
delay1s();
}
}
打开串口调试助手,获取光照强度值:

三、Arduino串口显示光照强度
Arduino内部有AD/DA转换器,所以接收模拟信号会变得非常容易操作。
硬件连接: 
代码如下:
#define light A5 //定义模拟口A5
float Intensity = 0;//光照度数值 void setup() //初始化
{
Serial.begin(9600);//设置波特率9600
} void loop()//程序主体循环
{
Intensity = analogRead(light); //读取模拟口AD5的值,存入Intensity变量
//Intensity = 100.0 - Intensity / 6.7;//VCC接3.3V时,Intensity最高为670,最低为0
Intensity = 100.0 - Intensity / 10.23;//VCC接5V时,Intensity最高为1023,最低为0
Serial.print("Intensity = "); //串口输出"Intensity = "
Serial.print(Intensity); //串口输出Intensity变量的值
Serial.print("%\n");
delay(1000); //延时1s
}
串口读取到的光照强度值如下图:

四、总结
本文实现51单片机和Arduino串口显示光照强度,介绍了光敏传感器和PCF8591 AD/DA转换模块的使用方法,如果你对模拟信号和数字信号还不怎么了解,我建议你先去学下。学完了这个,建议去读取其他传感器的模拟信号,具体实现方法是一样的。
五、项目结构图

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
Arduino和C51开发光敏传感器的更多相关文章
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- Arduino和C51开发OLED显示屏
技术:51单片机.Arduino.OLED显示屏.U8glib 概述 OLED显示屏常常用作为智能产品的显示设备,本文简单介绍OLED显示屏的使用方法. 详细 代码下载:http://www.de ...
- Arduino和C51开发LCD1602显示屏
技术:51单片机.Arduino.LCD1602 概述 本文介绍了LCD1602显示屏,并在LCD1602上显示字符串,对LCD1602常见的问题的解决和开发方法也做了简单介绍. 详细 代码下载: ...
- Arduino和C51开发DS1302时钟
技术:51单片机.Arduino.DS1302时钟.串口通信 概述 本文实现51单片机和Arduino串口实时显示时钟功能,让读者对DS1302能够更好的理解,这次功能也和上节课学到的串口通信运用 ...
- Arduino的光敏传感器和超声波测距传感器测试代码
光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...
- Arduino可穿戴开发入门教程(大学霸内部资料)
Arduino可穿戴开发入门教程(大学霸内部资料) 试读下载地址:链接:http://pan.baidu.com/s/1mg9To28 密码:z5v8 介绍:Arduino可穿戴开发入门教程(大学霸内 ...
- x86 版的 Arduino Intel Galileo 开发板的体验、分析和应用
1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel 向对外发布了采用 x86 构架的 Arduino 开发板:Intel Galileo.这无疑是一个开源硬件领域的重 ...
- Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...
- Arduino可穿戴开发入门教程Arduino开发环境介绍
Arduino可穿戴开发入门教程Arduino开发环境介绍 Arduino开发环境介绍 Arduino不像我们使用的PC端操作系统一样,可以直接在操作系统中安装软件为操作系统编程.Arduino的软件 ...
随机推荐
- 第三章 logstash - 输入插件之tcp与redis
常用的输入插件: tcp redis 一.tcp 1.用法 input { tcp { port => 4560 codec => json_lines mode => server ...
- asp.net 获得域名,端口,虚拟目录[转]
asp.net 获得域名,端口,虚拟目录 记性不好,好多次都被路径问题给拦住了.我现在想得到一个资源的全URL路径,因此首先想得到网站当前的域名,端口和虚拟目录.看下表 底下這張表就是各種跟 Brow ...
- 快速书写常见的 Kotlin 代码 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 关于UITableView的黑线条
这里採用分组形式.底色可用图片覆盖,设置为cell(是一个view)的子视图,并把cell'的颜色设置为底色 当UITableView的cell没有满屏显示时,就会出现黑线条.我们仅仅需在初始化时,加 ...
- laravel在中间件内生成的变量如何传到控制器
在中间件内获取到一个变量,如何返回到控制器中并使用这个变量! 做了个demo: // web.php Route::get('/check', 'CheckController@check')-> ...
- scikit-learn——快速入门 - daniel-D(转)
ML sklearn快速入门 申明:该系列博客是学习 sklearn 的笔记,内容将涵盖大部分机器学习的方法.本人微博@迅猛龙Daniel,能力有限,存在任何问题,希望共同交流.该博客采用马克飞象专业 ...
- zookeeper基础知识整理
http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ...
- js 正则表验证输入
输入1-9的整数 <input type="text" class="form-control" style="width: 60px;disp ...
- Web项目MySQL配置文件运维
root@mysqltest:/etc/mysql/mysql.conf.d# cat mysqld.cnf # # The MySQL database server configuration f ...
- Android短信收到,语音播报
发送短信功能界面 /** * 发送短信Demo * * @description: * @author ldm * @date 2016-4-22 上午9:07:53 */ public class ...