我们的STC板能实现的东西真的很多呢,但是我们还有一些功能没有测试过,那就是温度和光照传感器
我们以几个例子来测试并学习一下这两个传感器
- 温度光照测试
- 光照报警器
- 光敏开关
温度光照测试
实验现象
单片机根据测量地、时间等不同因素,相应的温度信息(包含零下温度值)将显示在数码管左边三位,相应光数据显示在右侧三位
实验原理
LED数码管电路我们前面已经接触过了,这里就不再做阐述
光敏和热敏电阻电路
(注意,最右侧的数码管上面的Rt是热敏电阻,Rop是光敏电阻)
- 热敏电阻随温度呈线性变化
- 光敏电阻电流随光强线性变化
- 通过AD采集光敏电阻和热敏电阻的输出值,输出对应的AD值,光照值直接为AD值,而采集的温度AD值,首先把10位转换成8位AD值,然后再通过查找对应的表来获取温度
代码解析
设计流程图如下:
- 涉及到的变量定义
- 子函数部分
我们可以知道,我们需要变量用来判断是否按下K1键,从而确定不同的报警方式,同时我们也需要使用按键消抖
一些函数声明如下:
同时我们也需要一个温度对应表
也需要设置不同的时间来使我们的不同块有不同的显示效果
AD转换部分代码可参照导航按键,我们只需要修改其中如何显示我们的数值即可
只是考虑情况复杂了一些而已,因为我们需要分别考虑上限和下限,利用变量,不停地判断条件即可
光照报警器
实验现象
key1改变光照警报器的模式
(1)当模式为警报下限时,通过用遮光板或者手指改变光敏电阻的光照强度,低于下限警报值时,蜂鸣器发声。
(2)按下Key1,当模式为警报上限时,通过用手电筒或闪光灯改变光敏电阻的光照强度,高于上限警报值时,蜂鸣器发声。
实验原理
电路图如下:
通过AD采集光敏电阻的值,检测AD求其平均值,这样可以达到稳定性。根据实际需要,设定警报上限和下限值,比较检测值与警报值,如果超过警报值,beep取反,产生方波,蜂鸣器发声
代码解析
设计流程图如下:
主函数应该包含下述部分
- 设置P0为推挽模式,设置P2^ 3为推挽模式,设置P3^4为推挽模式其它为准双向口模式
- 开定时器中断和AD中断
- 循环调用SEG_Display()方法显示检测值。
其中 void SEG_Display() 要设置
-
5、6、7号数码管分别用于显示当下值。
-
0、1、2号数码管显示警报值。
其余就主要是中断和AD转换的代码了
光敏开关
实验现象
当手指触摸到光敏电阻时,通过光照强度变化来控制开关标志位flag,进而控制led灯的亮灭。
实验原理
电路图如下:
- 通过AD采集光敏电阻的值,检测AD求其平均值,这样可以达到稳定性。
- 这个实验的关键就是确定合适的光照阀值,经过多次尝试摸索后将(light_old/light_new)>1.30,作为光照的阀值,此时默认为手指按下状态,flag取反,控制led灯的亮灭,实现开关功能
代码解析
设计流程图如下:
主函数中的主体框架为:
-
设置P0为推挽模式,设置P2^3为推挽模式,其它为准双向口模式
-
开AD中断
-
循环调用SEG_Display()方法显示datelight。
-
利用flag控制P0的数值,来控制led灯的亮灭。
其代码要比报警器要简单很多
最重要的就是初始化光照AD转换结果寄存器及控制寄存器
其余的中断,AD转换与上面的类似