传感器与射频识别之光敏传感器实验

光敏传感器实验记录

一、实验目的:
1.了解LDR系列光敏电阻的特性及工作原理; 2.掌握光敏传感器采集数据的使用方法; 3.熟悉传感器的操作、响应方式。
二、实验设备:
1.Proteus仿真软件;
2.keil c++编译软件;
3.串口调试工具和虚拟串口创建工具。
三、实验内容:
采集光敏电阻节点周期性向单片机报告采集到的电压值;
四、实验步骤及数据分析:
1.传感器选型
光导率是材料电导率增加的一种光学现象。当光落下时,即当光子落在设备上时,半导体材料价带中的电子被激发到导带。入射光中的这些光子的能量应大于半导体材料的带隙,以使电子从价带跃迁至导带。因此,当具有足够能量的光照射到器件上时,越来越多的电子被激发到导带,从而产生大量的电荷载流子。这个过程的结果是,当电路闭合时,越来越多的电流开始流过器件,因此器件的电阻降低。
在这里插入图片描述
LDR 是依赖光的设备,当光线照射到它们时,其电阻会降低,而在黑暗中会增加。当一个光敏电阻保持在黑暗中时,它的电阻非常高。这种电阻称为暗电阻。它可以高达 1012Ω,如果允许设备吸收光,其电阻将急剧下降。如果向其施加恒定电压并且光强度增加,则电流开始增加。下图显示了特定 LDR 的电阻与照度曲线。
在这里插入图片描述
电路图说明如下:
在这里插入图片描述
2.打开proteus新建工程“光敏电阻”,首先点击右上角“file”中的“新建工程”,选择新建工程的目录,如下图所示,之后直接选择默认下一步即可,最后出现Finish成功创建项目。
在这里插入图片描述
3.在proteus画出对应的光敏电阻传感器的电路图,电路图如下所示。
在这里插入图片描述
4.启动Kiel软件生成实验所需的hex文件,启动虚拟串口软件创建一对虚拟串口,启动Proteus创建文件画实验对应的电路图,将hex文件拷入到Proteus画好的单片机中,启动程序。具体操作如下所示:
首先,点击工具栏“project”中的“New uVision Project”,选择要保存的路径,输入文件名,点击“保存”,在新出现的窗口中的“search”中输入AT89C51,选中之后点击“OK”,项目创建成功。
在这里插入图片描述在这里插入图片描述在这里插入图片描述之后,右键Source Group 1,点击“Add New Item to Group’ Source Group 1’”,选中第一个.c文件,输入文件名(自己起)和文件保存的路径,然后点击“Add”即可。
在这里插入图片描述在这里插入图片描述
在“.c”文件中写入代码之后,右键“target 1”,选中第一个,再出现的弹框中先点击“output”,之后勾选“Create HEX File”,最后点击“OK”。
在这里插入图片描述在这里插入图片描述最后,点击keil工具栏中的 ,编译代码。
在这里插入图片描述5.点击proteus电路图中的芯片,将Program File中的路径设置成之前创建的keil项目的.hex文件所在的目录,然后点击“确定”即可,最后点击proteus左下角的“运行”按钮在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
6. 通过LCD1602显示屏观察光敏电阻电压数据(注:串口号需要根据实际情况进行选择)。
7. 关键代码分析
(需要新建三个c文件,两个h文件)

// main.c
#include <reg52.h>
#include "lcd1602.h"
#include "ldr.h"
#include <stdio.h>
#include <stdlib.h>

/* 在晶振为11.0592Mhz时大约延时1ms*/
void delay_ms(unsigned int count)           
{
     int i,j;
     for(i=0;i<count;i++)
     for(j=0;j<112;j++);
}

// 转换显示
void convert_display(unsigned short value)
{
  unsigned char x0,x1,x2,x3;
 
  lcd1602_write_command(0xc6);  // 将光标移动到第二行第六列位置
 
    // 提取数字转换成字符
    value = value + 138;
    x0 = (value / 100) + 0x30;
  x1 = ((value % 100) /10) + 0x30;  
  x2 = (value % 10) + 0x30; 
  
    
 
    // 在LCD1602中显示
    lcd1602_write_char(x0);
    lcd1602_write_char('.');
  lcd1602_write_char(x1); 
  lcd1602_write_char(x2);
}

void main(){
    char txt[10];
    unsigned char value;
    lcd1602_init();      
    lcd1602_write_string("LDR Sensor");
    while(1){
        value = ldr_read();
        convert_display(value);
        delay_ms(1000);
    }   
}
#include <reg52.h>
#include "ldr.h"

sbit rd_adc=P2^7; //Read(RD) pin of ADC0804
sbit wr_adc=P2^6; //Write(WR) pin of ADC0804
sbit intr_adc=P3^2; //Interrupt(INTR) pin of ADC0804?

/* 在晶振为11.0592Mhz时大约延时1ms*/
void ldr_delay_ms(unsigned int count)       
{
     int i,j;
     for(i=0;i<count;i++)
     for(j=0;j<112;j++);
}

// 读取光敏电阻值
unsigned char ldr_read(){
unsigned char value = 0;
  wr_adc=0; //send LOW to HIGH pulse on WR pin
  ldr_delay_ms(1);
  wr_adc=1;
  while(intr_adc==1); //wait for End of Conversion
  rd_adc=0; //make RD = 0 to read the data from ADC0804
  value=P1; //copy ADC data
  //delay_ms(1000);
  ldr_delay_ms(1);
  rd_adc=1;   //make RD = 1 for the next cycle
  
  return value;
}

//ldr.c
#include <reg52.h>
#include "ldr.h"

sbit rd_adc=P2^7; //Read(RD) pin of ADC0804
sbit wr_adc=P2^6; //Write(WR) pin of ADC0804
sbit intr_adc=P3^2; //Interrupt(INTR) pin of ADC0804?

/* 在晶振为11.0592Mhz时大约延时1ms*/
void ldr_delay_ms(unsigned int count)       
{
     int i,j;
     for(i=0;i<count;i++)
     for(j=0;j<112;j++);
}

// 读取光敏电阻值
unsigned char ldr_read(){
unsigned char value = 0;
  wr_adc=0; //send LOW to HIGH pulse on WR pin
  ldr_delay_ms(1);
  wr_adc=1;
  while(intr_adc==1); //wait for End of Conversion
  rd_adc=0; //make RD = 0 to read the data from ADC0804
  value=P1; //copy ADC data
  //delay_ms(1000);
  ldr_delay_ms(1);
  rd_adc=1;   //make RD = 1 for the next cycle
  
  return value;
}

// lcd1602.c
#include "lcd1602.h"
#include <reg52.h>

#define LCD_Port P0      
sbit rs=P2^0;            
sbit rw=P2^1;            
sbit en=P2^2;        

/* 在晶振为11.0592Mhz时大约延时1ms*/
void delay(unsigned int count)          
{
     int i,j;
     for(i=0;i<count;i++)
     for(j=0;j<112;j++);
}

void lcd1602_write_command (char cmnd)  /* LCD16x2 command funtion */
{
    LCD_Port =(LCD_Port & 0x0F) | (cmnd & 0xF0);/*发送上半字节 */
    rs=0;            
    rw=0;            
    en=1; 
    delay(1);
    en=0;
    delay(2);
    
    LCD_Port = (LCD_Port & 0x0F) | (cmnd << 4);/* 发送低字节 */
    en=1;           
    delay(1);
    en=0;
    delay(5);
}

void lcd1602_write_char (char char_data) 
{
    LCD_Port =(LCD_Port & 0x0F) | (char_data & 0xF0);/* 发送上半字节 */
    rs=1;            
    rw=0;        
    en=1;  
    delay(1);
    en=0;
    delay(2);

    LCD_Port = (LCD_Port & 0x0F) | (char_data << 4);/*发送低字节 */
    en=1;            
    delay(1);
    en=0;
    delay(5);

}

void lcd1602_write_string (char *str)    
{
    int i;
    for(i=0;str[i]!=0;i++)  
    {
        lcd1602_write_char (str[i]);  
    }
}

void lcd1602_write_string_xy (char row, char pos, char *str)  
{
    if (row == 0)
    lcd1602_write_command((pos & 0x0F)|0x80);
    else if (row == 1)
    lcd1602_write_command((pos & 0x0F)|0xC0);
    lcd1602_write_string(str);       
}

void lcd1602_init (void)         
{
    delay(20);       
    lcd1602_write_command (0x02);   /* 4bit模式 */
    lcd1602_write_command (0x28);   /* 初始化为4位模式 */
    lcd1602_write_command (0x0C);   /* 显示打开光标关闭 */
    lcd1602_write_command (0x06);   /* 光标递增 */
    lcd1602_write_command (0x01);   /* 清屏*/
    lcd1602_write_command (0x80);   /* 反回首页位置 */
}

void lcd1602_rolling_left(unsigned short duration){
    lcd1602_write_command(0x18); 
    delay(duration);
}

void lcd1602_rolling_right(unsigned short duration){
    lcd1602_write_command(0x1c); 
    delay(duration);
}

void lcd1602_clear(){
    lcd1602_write_command (0x01);   /* 清屏*/
}

// ldr.h
#ifndef __LDR_H__
#define __LDR_H__

// 读取光敏电阻值
unsigned char ldr_read();

#endif

// lcd1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
// 发送命令
void lcd1602_write_command (char cmnd);
// 发送数据
void lcd1602_write_char (char char_data);
// 显示字符串
void lcd1602_write_string (char *str);
// 在指定位置显示字符串
void lcd1602_write_string_xy (char row, char pos, char *str);
// 初始化
void lcd1602_init (void);
// 向左滚动
void lcd1602_rolling_left(unsigned short duration);
// 向右滚动
void lcd1602_rolling_right(unsigned short duration);
// 清屏
void lcd1602_clear();
#endif

五、实验小结:

实验结果截图:

请添加图片描述

LDR依赖于光电导性,就本项目来说,光电导性可以概括光敏电阻受到光线照射时具有低电阻值,没有受到光线照射时具有高电阻值。在一个复杂电路中,LDR无法只依靠自身来发挥作用,经常需要使用分压器,以在驱动FET和读取光照强度时提供更好的粒度。分压器由两个串联的电阻组成。在这两个电阻之间,我们会测量出一个有用的电压值。
分压器不适合用于负载,仅可用于信号控制和测量。过大的负载将会对分压器产生影响并使电阻升温,好的方法是使用稳压器或降压转换器来降压,从而为负载提供稳定的电压。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@小冯@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值