📄 relayctr.c
字号:
/****************************************************************************/
/* */
/* Copyright (c) 2005, 老树工作室 */
/* All rights reserved. */
/* */
/* Email:laoshu0902@163.com */
/* www.laoshu0902.bokee.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:relayctr.c */
/* 版 本:Version 1.0 */
/* 描 述:利用实时时钟和光敏检测实现一年24小时控制电灯开启关闭 */
/* */
/* 作 者:spot */
/* 函 数: */
/* time0_over_int */
/* ext1_int_proc */
/* system_init */
/* calc_lumin */
/* */
/* 历史记录: */
/* spot 2005-08-25 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"
/* 函数声明 */
void time0_over_int(void); /* 定时器0中断服务程序 ,使用第1组寄存器 */
void ext1_int_proc(void); /* 外部中断1中断服务程序,使用第2组寄存器 */
void system_init(void); /* 系统上电初始化 */
u_char calc_lumin(u_int fhz);/* 计算当前光强 */
extern void sd2000_read_date(void); /* 读取sd2000时钟数据 */
extern void sd2000_write_status(void);/* 写sd2000状态寄存器 */
/* 声明结束 */
u_int fhz_tlc555; /* tlc555输出频率 */
u_char timer_count; /* 定时计数 */
bit timer_int; /* 定时标志 */
sbit CTRL_RELAY = P3^4;
extern u_char read_date[7]; /*日期时间数据*/
/* 定时器0中断服务程序 ,使用第1组寄存器 */
void time0_over_int(void) interrupt 1 using 1
{
TF0=0;
timer_int=1;
TH0 = -(46080 / 256);
TL0 = -(46080 % 256);
}
/* 外部中断1中断服务程序,使用第2组寄存器 */
void ext1_int_proc(void) interrupt 2 using 2
{
fhz_tlc555++;
}
/* 系统上电初始化 */
void system_init(void)
{
EA = 0;
timer_int = 0;
timer_count = 0;
TMOD = 0x01; /*定时器0工作于方式1*/
TCON = 0x04; /*外部中断下降沿触发*/
TH0 = -(46080 / 256); /*定时50毫秒*/
TL0 = -(46080 % 256);
PT0 = 1; /*定时器0高优先级*/
TR0 = 1; /*定时器0启动计数*/
IE = 0x86; /*定时器0,外部中断1,CPU开中断*/
}
/* 计算当前光强 */
u_char calc_lumin(u_int fhz)
{
u_char lumin = 0;
if (fhz <= 2000)/* 光强为0 */
{
return 0;
}
else if ( (fhz > 2000) && (fhz <= 4770) )/* 光强为0~10 */
{
lumin = fhz / 277 - 7.2;
return lumin;
}
else if ( (fhz > 4770) && (fhz <= 5400) )/* 光强为10~20 */
{
lumin = fhz / 63 - 65.7;
return lumin;
}
else if ( (fhz > 5400) && (fhz <= 8200) )/* 光强为20~30 */
{
lumin = fhz / 280 + 0.7;
return lumin;
}
else if ( (fhz > 8200) && (fhz <= 9600) )/* 光强为30~40 */
{
lumin = fhz / 140 - 28.6;
return lumin;
}
else if ( (fhz > 9600) && (fhz <= 10100) )/* 光强为40~50 */
{
lumin = fhz / 50 - 152;
return lumin;
}
else if ( (fhz > 10100) && (fhz <= 12100) )/* 光强为50~60 */
{
lumin = fhz / 200;
return lumin;
}
else if ( (fhz > 12100) && (fhz <= 12900) )/* 光强为60~100 */
{
lumin = fhz / 20 - 545;
return lumin;
}
}
main()
{
u_char cur_lumin;
system_init();
sd2000_write_status();
while(1)
{
if (timer_int == 1) /* 50毫秒定时到 */
{
timer_int = 0;
timer_count++;
if (timer_count == 100) /* 5秒定时到 */
{
timer_count = 0;
fhz_tlc555 /= 5;
cur_lumin = calc_lumin(fhz_tlc555); /*计算当前光强*/
sd2000_read_date(); /* 读取当前日期时间数据 */
if ( (read_date[1] >= 0x04) && (read_date[1] <= 0x09) ) /* 在4月份到9月份之间 */
{
if ( ( (read_date[4] >= 0x06) && (read_date[4] <= 0x19) ) && (cur_lumin >= 30) )/* 在6点到19点之间并且光强大于30 */
{
CTRL_RELAY = 0; /* 继电器关 */
}
else
{
CTRL_RELAY = 1; /* 继电器开 */
}
}
else/* 在1到3月份和10到12月份之间 */
{
if ( ( (read_date[4] >= 0x07) && (read_date[4] <= 0x17) ) && (cur_lumin >= 30) )/* 在7点到17点之间并且光强大于30*/
{
CTRL_RELAY = 0; /* 继电器关 */
}
else
{
CTRL_RELAY = 1; /* 继电器开 */
}
}
fhz_tlc555 = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -