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的软件 ...
随机推荐
- nodejs中thiskeyword的问题
再分析详细内容之前,必需要好好阅读下面下面两篇blog 学习Javascript闭包(closure) Javascript的this使用方法 这两篇文章是阮一峰老师对Javascript的闭包和th ...
- Windows Server 2008 R2 小技巧 (转)
一些 Windows Server 2008 R2 的小技巧,包括启用「God Mode (上帝模式)」.添加「快速启动」工具栏.启用桌面「个性化」服务.停用「密碼複雜性」要求,对老程序员熟悉新版的 ...
- PyTorch保存模型与加载模型+Finetune预训练模型使用
Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...
- 57. 三数之和 &&
题目 57. 三数之和 给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组. 样例 如S = {-1 0 1 2 -1 -4}, 你需要返回的 ...
- Populating Next Right Pointers in Each Node II leetcode java
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- Add Binary Leetcode java
题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...
- Android模仿三星手机系统滑动条滑动时滑块变大的特效
使用三星手机的过程中发现三星手机系统自带的滑动条有一个特效.比方调节亮度的滑动条.在滑动滑块的过程中,滑块会变大.功能非常小可是体验却非常好,于是决定做一个这种效果出来.好了废话不多说了,以下開始实现 ...
- 转: gcc 指定运行时动态库路径
gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...
- Mysql正则匹配某列是否含有手机号
SELECT COUNT(1) FROM t_user WHERE user_name REGEXP ".[1][35678][0-9]{9}."; 解释: 正则中 .的意思是所有 ...
- 判断一个整数是否是2的n次方
参考:http://bbs.csdn.net/topics/370058619 如题,如何判断一个整数是否是2的N次方,我能想到的方法有两个 1.一直除2,看最后是否等于1.(最笨的方法) 2.转换成 ...