本栏目有个关于用ADC0804实现一个数字电压表的例子,现在我们用ADC0804和光敏电阻+隔离的双向交流可控硅来做一个白/夜自动检测控制灯的实验,类似智能台灯或自动路灯的例子。模数转换器还可以做其它实际用途,只是你没有想到或去做。
一、ADC0804和可控硅硬件电路
首先我们看一下本站XY900_USB型开发板的部分电路,以此为例做个检测自然光来自动控制灯泡开关的简单实验:
(XY900开发板相关控制部分,光敏电阻在板的上方,也可以控制日光灯)
我们知道当ADC0804输入最大5V时(上图相当于光敏电阻在强光时)转换到的数据接近最大255,在房间大约是200左右,在黄昏时也就是快天黑,在本板ADC0804检测后转换的数据大概是80~120,取个合适的值,当小于这个数时自动执行点亮灯泡的输出控制即可,我们还增设了一个开关,为的晚上可以控制。
二、功能描述
1.到黄昏时自动亮灯,白天自动熄灭(适合做路灯);
2.增加一个控制开关(例-P3.5),在黄昏至晚上时可用开关去控制灯的关或开,白天这个开关无效,因为白天要亮灯干吗,呵呵。
三、提示
1.光敏电阻要尽量远离或背对着灯,避免判断出现错乱。
2.若是在XY900板上实验,也可先不急着接上灯,运行程序-用手遮挡光敏电阻,观察P2.4/LED(控制可控硅的端口)变化,并操作开关去体验。
四、C51程序清单
(对于下面程序中判断ad_data的值可根据光线环境自行修改)
/**********************************************************************
* 程序名称:ADC0804白/夜自动控制灯
* 功能说明:根据AD转换后数值判断后自动点亮或熄灭灯(驱动光耦+可控硅);
* 开关key_1在晚上可控制灯开或关,白天无效。
* 实验对象:XY-900_USB型单片机学习板
* 提 示:把J22跳线帽跳到左边,启用光敏电阻
* 月夜听风-http://www.mcusy.cn
***********************************************************************/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit cs=P3^2; //
sbit wr=P3^6;
sbit rd=P3^7;
sbit key_1=P3^5; //手动开关
sbit lamp=P2^4; //输出控制灯泡端
uchar ad_data; //读到的数
//--------------------------------------------------------------
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------------------------------------------
void adc0804() //读AD0804子函数
{
rd=1;wr=1; //读ADC
P1=0xff; //先置位
cs=0;wr=0;wr=1; //启动转换
rd=0; //读转换后数据
_nop_(); _nop_(); //稍延时
ad_data=P1; //读出的数据赋与ad_data
rd=1;cs=1; //读完
delay(1); //稍延时
}
//--------------------------------------------------------------
void control() //控制子函数
{
if(ad_data<120) //ad_data的数小于120? 这里可视环境亮度自行修改
//也就是到了黄昏了
{
lamp=0; //点亮灯
do{ //循环检测按键
adc0804();
if(key_1!=1)//如果按下了开关键
{
delay(10); while(key_1!=1); //是否放开?
if(lamp==0){lamp=1;} //若灯是亮的就熄灭
else lamp=0; //否则点亮
delay(10); //稍延时
}
}
while(ad_data<120); //在ad_data小于120时继续执行do~while循环,否则退出
lamp=1; //灯灭
}
else lamp=1;
}
//--------------------------------------------------------------
void main() //主函数
{
while(1) //死循环
{ adc0804(); control(); } //ADC/控制
}