蓝猫淘气 发表于 2015-12-28 14:14
把电路图和源码pose上
#include //头文件
#include
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar leave=1;//标记当前是关灯,1关。0开
void main()
{
T0_init(); //定时器0初始化
while(1)
{
if(guang==0) //检测光线偏暗
{
if(rs==1) //判断是否有人.有人进入打开灯
{
relay=0; //吸合继电器,打开灯
T0_num=0;
time=0;
TR0=0;
leave=1;
}
else //否则表示人走
{
if(leave==1) //开始定时20s,定时时间到就自动关闭灯
TR0=1;
else
relay=1; //定时时间到,关闭灯
}
}
else //光线偏亮,无需开灯
{
relay=1; //关闭灯
}
}
}#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include
#define uchar unsigned char
#define uint unsigned int
/**********************引脚定义************************/
sbit relay=P2^1; //继电器定义
sbit guang=P3^7; //光敏电阻输入
sbit rs=P3^2; //人体热释传感器输入
/**********************变量定义************************/
uchar T0_num;
uchar time;
extern uchar leave;
/*********************************************************
函数名称:void T0_init()
函数作用:定时器0初始化函数
参数说明:
*********************************************************/
void T0_init()
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0、T1的模式1
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
TR0=0; //关闭定时器
}
/*********************************************************
函数名称:void T0_interrupt(void) interrupt 1 using 0
函数作用:定时器0中断处理函数
参数说明:
*********************************************************/
void T0_interrupt(void) interrupt 1 using 0
{
TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值
T0_num++;
if(T0_num==20) //20*50ms=1s定时完成
{
T0_num=0; //清除后,重新开始定时
time++; //秒数加1
}
if(time==20) //20S到
{
TR0=0; //关闭定时
leave=0;
time=0; //清除秒数
}
}
#endif