51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > ◆本站实例 > 详细内容
用51单片机做一个实用的自动路灯
作者:月夜听风  发布时间:2010/1/15  阅读次数:3689  字体大小: 【】 【】【

       本栏目有个关于用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/控制
}

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[2]
  • 评论人:[BOBO] 时间: [2011/11/13 8:56:35] IP:[221.176.148.17*]
  • good
  • 评论人:[匿名] 时间: [2010/1/23 3:10:03] IP:[183.11.16.14*]
  • 好,详细!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号