任务描述
通过编程实现光照强度数据的读取,在节点模块的液晶屏幕上进行显示,当用手遮挡的光敏传感器时,光照数据会相应发生变化。
知识引入
光照传感器在生活中应用广泛,光敏传感器的应用主要是光敏电阻的应用,因此在自动控制、家用电器中存在广泛的应用,例如:在电视机中作亮度自动调节、在照相机中作自动曝光、在路灯、航标中作自动电路控制、防盗报警装置等。
光敏传感器的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、光电耦合器、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。
1.实验电路图
光照传感器采用灵敏度高的光敏电阻作为采集点,STC15使用P00进行ADC模数转换采集数据,其中增加一块LM393进行电压比对,当超过一定值(可调电阻控制)时,LM393数据引脚连接STC15的P0引脚输出高,原理图如下:
#include "WZ01_SN_A_V1.0.h" #include "Uart1.h" #include "Uart3.h" #include "ADC.h" /*-源码分析----------------- 以上四个头文件功能描述如下: WZ01_SN_A_V1.0.h:设备厂家单片机定义的头文件; Uart1.h:串口1收发以及端口的映射的头文件。 Uart3.h:串口3收发以及端口的映射的头文件。 ADC.h: ADC转换头文件 ------------------*/ //uchar LineBuf[16]; ulong System1MsCnt = 0; //系统1ms计数器 ulong SystemSecond = 0; //初始化定时器0 void Timer0Init() { AUXR |= 0x80; //定时器0为1T模式 // AUXR &= 0x7f; //定时器0为12T模式 TMOD = 0x00; //设置定时器为模式0(16位自动重装载) TL0 = T1MS; //初始化计时值 TH0 = T1MS >> 8; TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 EA = 1; //使能外部总中断 } //*功能描述: 定时器0中断服务函数(启动后每1MS进入一次) void Timer0_ISR() interrupt 1 using 1 { static uint counter0=0; counter0++; System1MsCnt++; if(System1MsCnt%1000==0) { // BUZZER = !BUZZER; } } //主函数 void main(void) { uint value0=0; //定义整形变量用来存储光照值 uint value1=0; //定义整形变量用来存储端口值 uchar buff[20]={0}; //定义字符数组存储串口发送字符串 BUZZER_INIT(); //蜂鸣器初始化 Timer0Init(); //定时器初始化 Uart1Init(); //串口1初始化 Uart3Init(); //串口3初始化 InitADC(); //ADC转换初始化 SetBit(P1M1,1); //设置P11置1,为高阻输入 ClrBit(P0M1,1); //设置P01清0,为准双向 /*-源码分析----------------- 以上两个函数引用自WZ01_BR13_A_V1.0.h头文件,具体功能如下: 1. #define SetBit(reg,bit) (reg|=(1<<(bit))),P11置1 SetBit(reg,bit):对reg寄存器的第bit位置1操作。 2. #define ClrBit(reg,bit) (reg&=~(1<<(bit))),P01清0 ClrBit(reg,bit):对reg寄存器的第bit位置0操作。 P1M1、P0M1寄存器功能详细定义参见项目三。 -----------------*/ OledInit(); //液晶屏初始化 OledClear(); //液晶屏清屏 OledDispString(1,1," 光照检测 "); while(1) { value0 = ((uint)(255-GetADCResult(0)) ; value1 = DATA_IO1; //value0 = ((uint)(255-GetADCResult(1)) ; /*-源码分析----------------- 以上两行代码功能分析如下: 1. GetADCResult(0)函数引用自 "ADC.h"头文件,功能为读取光照传感器IO0脚的数据,为实际的光照值。 由于函数获取的值越大,对应的光照强度约暗,不符合人们的逻辑思维,因此用(255-GetADCResult(0))进行换算,以符合数值大小与明暗度的大小对应。 2. 通过引脚定义,读取光照传感器IO1脚的数据,为数字量,通过传感器上的电位器调节参考值设置阀值,当高于阀值此处为1否则为0。 相关引脚定义参考”WZ01_BR13_A_V1.0.h”头文件。 #define BUZZER P45 //蜂鸣器端口定义 #define DATA_IO0 P10 #define DATA_IO1 P11 #define DATA_IO2 P02 #define DATA_IO3 P03。 -----------------*/ sprintf(buff,"V0:%d V1:%d\r\n",value0,value1); //V0表示模拟量 V1表示数字量 //以下代码 参照温湿度代码详解 不在讲述 OledClearHalf(2); OledDispString(3,1,buff); sprintf(buff,"#var 1 %d\r",value0); Send3String(buff); sprintf(buff,"#var 2 %d\r",value1); Send3String(buff); DelayMs(1000); } } |