📄 water.lst
字号:
C51 COMPILER V8.08 WATER 03/29/2008 20:23:36 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE WATER
OBJECT MODULE PLACED IN water.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE water.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 太阳能热水器自动上水控制 V3.4
3
4 V3.2 使用中断加定时方式开关阀,增看门狗、空闲模式
5 V3.3 修正V3.2缺陷,增60min上水总时间控制
6 V3.4 修正V3.3的错误,经实地安装试用。
7
8 LED 上水开阀时闪烁,开阀完成上水时闪亮(长时间灭,瞬间亮),水满
9 后关阀闪烁,结束后灭。
10 Beep完成一个操作后鸣叫
11 ********************************************************************/
12 #include<reg51.h>
13 #define uchar unsigned char
14 #define uint unsigned int
15 sfr AUXR = 0x8E; //定义AT89S51扩展寄存器
16 sfr WDTRST = 0xA6;
17 //sbit led1=P1^6;
18 //sbit K1 =P1^1; //上水控制键P3.2 INT0 *ledkeyP3.2
19 //sbit YS =P1^0; //水满后溢水信号P3.3 INT1 *ledkeyP3.3
20 sbit LED =P0^7; //操作批示灯P0.7 *ledkeyP1.0
21 sbit KF=P2^6; //开阀线P2.6 *ledkeyP1.2
22 sbit GF=P2^7; //关阀线P2.7 *ledkeyP1.3
23 sbit KFdw=P2^2; //开阀到位P2.2 *ledkeyP3.4
24 sbit GFdw=P2^3; //关阀到位P2.3 *ledkeyP3.5
25 sbit Beep =P2^5 ; //蜂鸣器,开关阀结束时鸣叫提示P2.5 *ledkeyP1.7
26 void Dog();
27 void delayms(uchar ms);
28 void delayled(uchar ll);
29 void MingJiao();
30 void TingZhi();
31 bit FMKGbz=1; //阀门开关标志位,1可开,0可关
32 bit led_bz=0; //瞬闪LED允许位
33 bit Nbz=0;
34 bit KongXianbz=0; //进入空闲模式允许位
35
36
37 //sbit LED =P1^0; //操作批示灯P0.7
38 //sbit KF=P1^2; //开阀线P2.6
39 //sbit GF=P1^3; //关阀线P2.7
40 //sbit KFdw=P3^4; //开阀到位P2.2
41 //sbit GFdw=P3^5; //关阀到位P2.3
42 //sbit Beep =P1^7 ; //蜂鸣器,开关阀结束时鸣叫提示
43 //void Dog();
44 //void delayms(uchar ms);
45 //void delayled(uchar ll);
46 //void MingJiao();
47 //void TingZhi();
48 //bit FMKGbz=1; //阀门开关标志位,1可开,0可关
49 //bit led_bz=0; //瞬闪LED允许位
50 //bit Nbz=0;
51 //bit KongXianbz=0; //进入空闲模式允许位
52
53
54 uchar S_timer=0;
55 uint M_timer=0;
C51 COMPILER V8.08 WATER 03/29/2008 20:23:36 PAGE 2
56 uint ledoff_timer=20000;//led熄灭时长
57
58 void main()
59 {
60 1 uint N=0;
61 1
62 1 AUXR = 0xff; // 初始化看门狗相关寄存器
63 1 Dog();
64 1
65 1 LED=1,KF=1,GF=1,Beep=0;
66 1
67 1 TMOD=0x11; //赋初值,8M晶振,50ms一次中断,T0初值为7DCB
68 1 TH0=0x7D;
69 1 TL0=0xCB;
70 1 TH1=0x15; //最长允许上水时间定时,90ms一次
71 1 TL1=0xA0;
72 1 ET0=1; //定时器T0中断允许
73 1 ET1=1; //定时器T1中断允许
74 1
75 1 IT0=1; //下降沿触发
76 1 IT1=1;
77 1 EX0=1; //打开中断0,响应上水键K1
78 1 EX1=0; //关闭中断1,不响应溢水信号键
79 1 EA=1; //总中断允许
80 1
81 1 while(1)
82 1 {
83 2 Dog();
84 2 if(led_bz) //瞬闪LED
85 2 {
86 3 if(Nbz) //上次的延时计数清零
87 3 {
88 4 Nbz=0;
89 4 N=0;
90 4 }
91 3 N++;
92 3 if(N > ledoff_timer)
93 3 {
94 4 N=0;
95 4 LED=0;
96 4 delayms(50);
97 4 LED=1;
98 4 }
99 3 }
100 2 if(KFdw==0 & FMKGbz==1) //开阀到位
101 2 {
102 3 TR0=0;
103 3 TH0=0x7D;
104 3 TL0=0xCB;
105 3 S_timer=0;
106 3
107 3 TingZhi();
108 3 FMKGbz=0;
109 3 led_bz=1;
110 3 EX1=1;
111 3 }
112 2 if(GFdw==0 & FMKGbz==0) //关阀到位
113 2 {
114 3 TR0=0;
115 3 TR1=0;
116 3 TH0=0x7D;
117 3 TL0=0xCB;
C51 COMPILER V8.08 WATER 03/29/2008 20:23:36 PAGE 3
118 3 S_timer=0;
119 3
120 3 TingZhi();
121 3 FMKGbz=1;
122 3 led_bz=0;
123 3 EX0=1;
124 3 KongXianbz=1;
125 3 }
126 2 if(KongXianbz & FMKGbz)
127 2 {
128 3 PCON=0x00; //只有在关阀完成后才允许进入空闲模式
129 3 }
130 2 // led1=0; //此三句指示是否进入空闲模式,调试用
131 2 // //delayms(100);
132 2 // led1=1;
133 2 }
134 1 }
135
136
137
138 void Dog(void)
139 {
140 1 WDTRST=0x1E;
141 1 WDTRST=0xE1;//初始化看门狗/喂狗
142 1 }
143
144
145 void KaiFa(void) interrupt 0 /*INT0*******************************************************/
146 {
147 1 EX0=0;
148 1 EX1=1;
149 1 KongXianbz=0; //禁止进入空闲模式
150 1
151 1 ledoff_timer=0; //使led灯长亮
152 1 KF=1;
153 1 GF=0;
154 1 FMKGbz=1;
155 1
156 1 TH0=0x7D;
157 1 TL0=0xCB;
158 1 TR0=1;
159 1
160 1 TH1=0x15; //90ms中断一次
161 1 TL1=0xA0;
162 1 TR1=1; //开最长允许上水时间定时器60min
163 1 LED=0;
164 1 led_bz=1;
165 1 Nbz=1;
166 1 M_timer=0;
167 1 }
168
169
170 void GuanFa(void) interrupt 2 /*INT1*******************************************************/
171 {
172 1 //PCON=0;
173 1 EX0=1;
174 1 EX1=0;
175 1
176 1 ledoff_timer=0; //使led灯长亮
177 1 KF=0;
178 1 GF=1;
179 1 FMKGbz=0;
C51 COMPILER V8.08 WATER 03/29/2008 20:23:36 PAGE 4
180 1 TR0=1;
181 1 LED=0;
182 1 led_bz=0;
183 1 }
184
185
186 void timer0() interrupt 1 /*定时器0中断,4s后停止阀门动作******************/
187 {
188 1 TH0=0x7D;
189 1 TL0=0xCB;
190 1 S_timer++;
191 1 if(S_timer==80) //定时4s后停止阀门动作
192 1 {
193 2 TR0=0;
194 2 TingZhi();
195 2 FMKGbz=~FMKGbz;
196 2 S_timer=0;
197 2 KongXianbz=1; //允许进入空闲模式,下一步进入空闲模式
198 2
199 2 if(FMKGbz) led_bz=0;//关阀状态时关LED灯
200 2 }
201 1 }
202
203
204 void timer1() interrupt 3 /*定时器1中断,40000*0.09=3600s后停止阀门动作***最大1小时47分钟*****/
205 {
206 1 TH1=0x15; //90ms中断一次
207 1 TL1=0xA0;
208 1 M_timer++;
209 1 if(M_timer==40000)
210 1 {
211 2 TR1=0;
212 2 if(GFdw)
213 2 {
214 3 ledoff_timer=0; //使led灯长亮
215 3 KF=0;
216 3 GF=1;
217 3 TH0=0x7D;
218 3 TL0=0xCB;
219 3 TR0=1;
220 3 EX0=1;
221 3 EX1=0;
222 3 // led_bz=0;
223 3 }
224 2 M_timer=0;
225 2 }
226 1 }
227
228
229 void delayms(unsigned char ms) /*延时子程序**************************************/
230 {
231 1 uchar i;
232 1 while(ms--)
233 1 {
234 2 Dog(); //此处必须喂狗,否则被复位
235 2 for(i = 0 ; i < 120 ; i++);
236 2 }
237 1 }
238
239
240 void TingZhi(void) /*阀门动作停止***********************/
241 {
C51 COMPILER V8.08 WATER 03/29/2008 20:23:36 PAGE 5
242 1 KF=1;
243 1 GF=1;
244 1 ledoff_timer=20000; //使led灯长亮
245 1
246 1 TR0=0;
247 1 LED=1;
248 1 MingJiao();
249 1
250 1 }
251
252
253 void MingJiao() /*鸣叫子程序*************************/
254 {
255 1 Beep=1;
256 1 delayms(100);
257 1 Beep=0;
258 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 507 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 2
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -