?? 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 + -