📄 dhbj.lst
字号:
135 {uchar g;
136 1 P1=0xb6;delay(1); /*数码管显示"三"*/
137 1 if(P3_5==0)
138 1 {delay(10);if(P3_5==0)
139 2 {P1=0x7f;m=0;data_flag=0; /*按下OK键确认并点亮小数点*/
140 3 for(g=0;g<20;g++){DATA[g]=10;}
141 3 delay(500); /*同时DATA数组中全部写入10*/
142 3 while(1)
143 3 {
144 4 if(P3_4==0){delay(10); /*按下UP键数码管作0-9递增显示*/
145 5 if(P3_4==0){m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
146 5 }
147 4 P1=DATA_7SEG[m];delay(1);/*若不按下UP键数码管也作0-9显示*/
148 4 if(P3_5==0)
149 4 {delay(10);
150 5 if(P3_5==0) /*按下OK键显示的数据(号码)存入数组DATA中*/
151 5 {DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
152 5 } /*按下OK键超过2秒则退出向数组DATA送入号码*/
153 4 if(P3_5==0){delay(2000);if(P3_5==0)break;}
154 4 }
155 3 }
156 2 } /*数码管显示"三"*/
157 1 F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}
158 1 }
159 /***********************************************************************/
160 /*---启动报警器进入警戒工作---*/
161 void work()
162 { uchar h;
163 1 P1=0xdf; /*数码管左上角显示"1"*/
164 1 delay(1);
165 1 if(set==1) /*进入时间1循环*/
166 1 {while(cnt_1<=X[0]*100+X[1]*10+X[2])
167 2 {
168 3 delay(1000);
169 3 cnt_1++; /*计数器cnt_1累加*/
170 3 if(set!=1){EX1=0;cnt_1=0;break;}
171 3 } /*如按下Set键,则退出此循环*/
172 2 }
173 1 else {EX1=0;PCON=0x00;}/*Set不为1,则关闭外中断1,退出待机状态*/
174 1 if(set==1)
175 1 {if(cnt_1>=X[0]*100+X[1]*10+X[2])
176 2 {EX1=1;cnt_1=0;} /*时间1到,打开外中断1,计数器归零*/
177 2 /*进入待机。若有1秒以上开关动作,退出待机*/
178 2 while(1)
179 2 {PCON=0x01;if(f>=5){PCON=0x00;break;}}
C51 COMPILER V7.06 DHBJ 11/18/2005 19:59:14 PAGE 4
180 2 }
181 1 /*-----------------------------------------------------*/
182 1 EX1=0; /*关闭外中断1*/
183 1 if(set==1) /*进入时间2循环*/
184 1 {while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
185 2 {
186 3 delay(1000);
187 3 cnt_2++; /*计数器cnt_2累加*/
188 3 if(set!=1){cnt_2=0;break;}
189 3 } /*如按下Set键,则退出此循环*/
190 2 }
191 1 if(set==1)
192 1 {
193 2 bh(); /*时间2到,调用拨号子程序*/
194 2 delay(3000);
195 2 P3_7=0;//控制输出端为低
196 2 for(h=0;h<60;h++) /*发出60秒警音*/
197 2 { for(f=0;f<500;f++)
198 3 {f++;
199 4 P3_1=!P3_1;P1=0x5f;
200 4 delay(1);
201 4 }
202 3 P3_1=0;P1=0x7f;delay(500);
203 3 }
204 2 P3_7=1;//控制输出端恢复高
205 2 cnt_1=0;cnt_2=0; /*有关计数器、端口回到初始状态*/
206 2 P3_0=0;P3_1=0;P1_7=1;
207 2 for(f=0;f<3;f++)delay(60000);/*关闭3分钟,以便进行电话报警*/
208 2 }
209 1 }
210 /********************************************************************/
211 /*---拨号---*/
212 void bh()
213 {data_flag=0; /*电话号码计数器(二十位)归零*/
214 1 P3_0=1; /*接通线路*/
215 1 P1_7=0; /*数码管小数点亮*/
216 1 delay(1000);
217 1 while(DATA[data_flag]<10) /*号码小于10进入循环拨号状态*/
218 1 {
219 2 if(DATA[data_flag]==0) /*若号码为0*/
220 2 {TR0=1; /*启动T0定时器*/
221 3 if(n==20){data_flag++; /*进行20次中断,产生10个脉冲*/
222 4 n=0;TR0=0;
223 4 P3_0=1;P1_7=0;
224 4 delay(500);
225 4 }
226 3 }
227 2
228 2 if(DATA[data_flag]>0) /*若号码>0*/
229 2 {TR0=1; /*启动T0定时器*/
230 3 if(n==((DATA[data_flag])*2))/*进行号码x2次中断,产生号码个脉冲*/
231 3 {data_flag++;
232 4 n=0;TR0=0;
233 4 P3_0=1;P1_7=0;
234 4 delay(500);
235 4 }
236 3 }
237 2 }
238 1 TR0=0;
239 1 }
240 /*********************************************************************/
241 /*--主函数--*/
C51 COMPILER V7.06 DHBJ 11/18/2005 19:59:14 PAGE 5
242 void main()
243 {
244 1 init_timer(); /*定时器T0初始化*/
245 1 EA=1;EX0=1; /*开总中断,开外中断0*/
246 1 P3_0=0; /*关闭线路(挂机)*/
247 1 P3_1=0;
248 1 while(1) /*无限循环*/
249 1 {
250 2 switch(set) /*根据Set标志散转*/
251 2 {
252 3 case 0:stop();break; /*关机*/
253 3 case 1:work();break; /*警戒工作*/
254 3 case 2:in_time1();break; /*输入时间t1*/
255 3 case 3:in_time2();break; /*输入时间t2*/
256 3 case 4:in_data();break; /*输入电话号码*/
257 3 default:break;
258 3 }
259 2 if(flag!=0x55) /*若flag标志变化,数码管显示E(错误)*/
260 2 {P1=0x86;delay(1);}
261 2 }
262 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1179 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 37 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -