📄 relayctr.lst
字号:
C51 COMPILER V6.12 RELAYCTR 09/24/2005 16:14:14 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE RELAYCTR
OBJECT MODULE PLACED IN G:\C51PRJ\RELAYCTR\RELAYCTR.OBJ
COMPILER INVOKED BY: e:\keil\c51\BIN\C51.EXE G:\C51PRJ\RELAYCTR\RELAYCTR.C DB SB OE
stmt level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:relayctr.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:利用实时时钟和光敏检测实现一年24小时控制电灯开启关闭 */
14 /* */
15 /* 作 者:spot */
16 /* 函 数: */
17 /* time0_over_int */
18 /* ext1_int_proc */
19 /* system_init */
20 /* calc_lumin */
21 /* */
22 /* 历史记录: */
23 /* spot 2005-08-25 Creat Inital version. (Version 1.0) */
24 /****************************************************************************/
25
26 #include <reg52.h>
27 #include <absacc.h>
28 #include <intrins.h>
29 #include "../includes/types.h"
30
31 /* 函数声明 */
32 void time0_over_int(void); /* 定时器0中断服务程序 ,使用第1组寄存器 */
33 void ext1_int_proc(void); /* 外部中断1中断服务程序,使用第2组寄存器 */
34 void system_init(void); /* 系统上电初始化 */
35 u_char calc_lumin(u_int fhz);/* 计算当前光强 */
36
37 extern void sd2000_read_date(void); /* 读取sd2000时钟数据 */
38 extern void sd2000_write_status(void);/* 写sd2000状态寄存器 */
39
40 /* 声明结束 */
41
42 u_int fhz_tlc555; /* tlc555输出频率 */
43 u_char timer_count; /* 定时计数 */
44 bit timer_int; /* 定时标志 */
45
46 sbit CTRL_RELAY = P3^4;
47
48 extern u_char read_date[7]; /*日期时间数据*/
49
50 /* 定时器0中断服务程序 ,使用第1组寄存器 */
51 void time0_over_int(void) interrupt 1 using 1
52 {
53 1 TF0=0;
54 1 timer_int=1;
55 1 TH0 = -(46080 / 256);
C51 COMPILER V6.12 RELAYCTR 09/24/2005 16:14:14 PAGE 2
56 1 TL0 = -(46080 % 256);
57 1 }
58
59 /* 外部中断1中断服务程序,使用第2组寄存器 */
60 void ext1_int_proc(void) interrupt 2 using 2
61 {
62 1 fhz_tlc555++;
63 1 }
64
65 /* 系统上电初始化 */
66 void system_init(void)
67 {
68 1 EA = 0;
69 1 timer_int = 0;
70 1 timer_count = 0;
71 1
72 1 TMOD = 0x01; /*定时器0工作于方式1*/
73 1 TCON = 0x04; /*外部中断下降沿触发*/
74 1 TH0 = -(46080 / 256); /*定时50毫秒*/
75 1 TL0 = -(46080 % 256);
76 1 PT0 = 1; /*定时器0高优先级*/
77 1 TR0 = 1; /*定时器0启动计数*/
78 1 IE = 0x86; /*定时器0,外部中断1,CPU开中断*/
79 1 }
80
81 /* 计算当前光强 */
82 u_char calc_lumin(u_int fhz)
83 {
84 1 u_char lumin = 0;
85 1
86 1 if (fhz <= 2000)/* 光强为0 */
87 1 {
88 2 return 0;
89 2 }
90 1 else if ( (fhz > 2000) && (fhz <= 4770) )/* 光强为0~10 */
91 1 {
92 2 lumin = fhz / 277 - 7.2;
93 2 return lumin;
94 2 }
95 1 else if ( (fhz > 4770) && (fhz <= 5400) )/* 光强为10~20 */
96 1 {
97 2 lumin = fhz / 63 - 65.7;
98 2 return lumin;
99 2 }
100 1 else if ( (fhz > 5400) && (fhz <= 8200) )/* 光强为20~30 */
101 1 {
102 2 lumin = fhz / 280 + 0.7;
103 2 return lumin;
104 2 }
105 1 else if ( (fhz > 8200) && (fhz <= 9600) )/* 光强为30~40 */
106 1 {
107 2 lumin = fhz / 140 - 28.6;
108 2 return lumin;
109 2 }
110 1 else if ( (fhz > 9600) && (fhz <= 10100) )/* 光强为40~50 */
111 1 {
112 2 lumin = fhz / 50 - 152;
113 2 return lumin;
114 2 }
115 1 else if ( (fhz > 10100) && (fhz <= 12100) )/* 光强为50~60 */
116 1 {
117 2 lumin = fhz / 200;
C51 COMPILER V6.12 RELAYCTR 09/24/2005 16:14:14 PAGE 3
118 2 return lumin;
119 2 }
120 1 else if ( (fhz > 12100) && (fhz <= 12900) )/* 光强为60~100 */
121 1 {
122 2 lumin = fhz / 20 - 545;
123 2 return lumin;
124 2 }
125 1 }
126
127 main()
128 {
129 1 u_char cur_lumin;
130 1
131 1 system_init();
132 1 sd2000_write_status();
133 1
134 1 while(1)
135 1 {
136 2 if (timer_int == 1) /* 50毫秒定时到 */
137 2 {
138 3 timer_int = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -