📄 wxbj.lst
字号:
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE WXBJ
OBJECT MODULE PLACED IN wxbj.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE wxbj.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89X55.H>//加载头文件
2 #define uchar unsigned char//变量类型的宏定义
3 #define uint unsigned int//变量类型的宏定义
4 uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
5 0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的数码管段码*/
6 #define reset() {WDT=0x1e;WDT=0xe1;}//看门狗启动/复位宏定义
7 uchar act[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管驱动位码数组
8 void delay(uint k);//延时子函数声明
9 void dis_check1(uchar m);//显示报警时的地址、时间子函数
10 sfr WDT=0xa6;//看门狗寄存器定义
11
12 /*************外部函数声明************/
13 extern void delay_iic(int n);
14 extern void wr_24c01(char a,char b);
15 extern uchar rd_24c01(char a);
16 extern void shift8(char a);
17 extern void ack();
18 extern void stop();
19 extern void start();
20
21 /***************************/
22 sbit MSKEY=P1^7; /*功能键标志*/
23 sbit MONKEY=P1^6;//月按键
24 sbit DAYKEY=P1^5;//天按键
25 sbit HOUKEY=P1^4;//时按键
26 sbit MINKEY=P1^3;//分按键
27 sbit CHECKKEY=P3^2;//查询按键
28 sbit P3_0=P3^0;
29 sbit P3_1=P3^1;
30 sbit P3_2=P3^2;
31 sbit P3_3=P3^3;
32
33 //------------------
34 bit d_05s=0; /*0.5秒标志*/
35 bit rdflag=1;//读取标志
36 bit checkflag;//查询标志
37 bit IO_flag=0;//报警触发标志
38 bit T1_startflag; //第一路定时启动标志
39 bit T1_endflag; //第一路定时结束标志
40 bit T2_startflag;// 第二路定时启动标志
41 bit T2_endflag;//第二路定时结束标志
42 bit out_P1_2; //第二路继电器输出
43 bit out_P3_1; //第一路继电器输出
44 bit ALMstart;//报警时间启动标志
45 bit ALMmin_iicflag;//报警所用时间写入24C01标志
46 bit iic_rdflag;//读取24C01标志
47
48 //------------------
49 uchar x,y,memoryoverflag;//变量定义
50 uchar MS=0;//工作模式定义
51 uchar deda=0; /*100mS计数单元清零*/
52 uint cnt;
53 uchar ALMadd,discnt;//报警地址暂存、显示屏扫描计数器
54 char iic_cnt,ALMmin;//24C01单元计数、报警时间(分)
55 uchar sec,min,hou,day,mon;//秒、分、时、天、月
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 2
56 uchar temp_min,temp_hou,temp_day;//临时存放的分、时、天
57
58 /*===================*/
59 uchar T1min_st,T1hou_st,T1min_end,T1hou_end;//第一路定时(分、时)开始、结束时间
60 uchar T2min_st,T2hou_st,T2min_end,T2hou_end;//第二路定时(分、时)开始、结束时间
61
62 /*********************/
63 void dis_time(uchar m);//函数列表
64 void dis_adjtime(uchar m);
65 void dis_check(uchar m);
66 void dis_adjT1_st(uchar m);
67 void dis_adjT1_end(uchar m);
68 void dis_adjT2_st(uchar m);
69 void dis_adjT2_end(uchar m);
70 void dis_adjALMtime(uchar m);
71 void scankey();
72 void conv();
73 void pdT(void);
74 void dis_check(uchar m);
75
76 /***********************/
77 /*定时器T0初始化100ms*/
78 void init_timer0()
79 {
80 1 TMOD=0x11;
81 1 TH0=-(50235/256);
82 1 TL0=-(50235%256);
83 1 TR0=1;
84 1 }
85
86 /*定时器T1初始化2ms*/
87 void init_timer1()
88 {
89 1 TH1=-(1000/256);
90 1 TL1=-(1000%256);
91 1 TR1=1;
92 1 }
93
94 //***********初始化子函数************
95 void init(void)
96 { P0=0xff;P1=0xff;P2=0xff;P3=0xff;
97 1 ALMstart=0;reset()
98 1 rdflag=0;
99 1 discnt=0;
100 1 init_timer0();
101 1 init_timer1();
102 1 IE=0x8f;PT1=1;
103 1 IT1=1;
104 1 EA=0;// 关总中断
105 1 x=rd_24c01(4);delay_iic(250);
106 1 if(x!=88)
107 1 {sec=0;min=0;hou=0;day=1;mon=1;
108 2 wr_24c01(4,88);delay_iic(250);
109 2 wr_24c01(5,1);delay_iic(250);
110 2 wr_24c01(6,3);delay_iic(250);
111 2 }
112 1 x=rd_24c01(6);delay_iic(250);
113 1 if(x>59){wr_24c01(6,3);delay_iic(250);}
114 1 //-------------------------------
115 1 iic_cnt=rd_24c01(5);delay_iic(250);
116 1 //----------------------------------
117 1 ALMmin=rd_24c01(6);delay_iic(250);
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 3
118 1 EA=1;
119 1 }
120
121 /*********延时Kx1ms子函数*****************/
122 void delay(uint k)
123 {
124 1 uint i,j;
125 1 for(i=0;i<k;i++){
126 2 for(j=0;j<60;j++)
127 2 {;}reset()}
128 1 }
129
130 /*100mS定时中断服务子函数*/
131 void time_zd0(void) interrupt 1 using 1
132 {
133 1 TH0=-(50235/256);
134 1 TL0=-(50235%256);
135 1 deda++;
136 1 }
137
138 /***********外部中断1子函数,报警触发*************/
139 void extern_zd1(void) interrupt 2 using 2
140 {IO_flag=1;delay(200);}
141 //===========================================
142 void IO_fnc()
143 { uchar temp;
144 1 if(IO_flag)
145 1 { EA=0;
146 2 ALMadd=P3;ALMadd=ALMadd>>4;
147 2 ALMmin=rd_24c01(6);delay_iic(250);
148 2 iic_cnt=rd_24c01(5);delay_iic(250);
149 2 iic_cnt++;//地址指针加1
150 2 temp=rd_24c01(7);delay_iic(250);
151 2 if(temp!=55)
152 2 {if(iic_cnt==31){wr_24c01(7,55);delay_iic(250);memoryoverflag=55;}}
153 2 if(iic_cnt>31)iic_cnt=2;
154 2 x=iic_cnt*4;
155 2 wr_24c01(x,ALMadd);delay_iic(250);
156 2 wr_24c01(x+1,day);delay_iic(250);
157 2 wr_24c01(x+2,hou);delay_iic(250);
158 2 wr_24c01(x+3,min);delay_iic(250);
159 2 //**************************
160 2 wr_24c01(5,iic_cnt);delay_iic(250);
161 2 MS=15;IO_flag=0;
162 2 temp_day=day;temp_hou=hou;temp_min=min;
163 2 ALMstart=1;EA=1;
164 2 }
165 1 }
166
167 /**************************/
168 /*2mS定时中断服务子函数*/
169 void time_zd1(void) interrupt 3 using 3
170 {
171 1 TH1=-(1000/256);// 重载定时初值
172 1 TL1=-(1000%256);
173 1 if(discnt>7)discnt=0;// 显示为8位数码管
174 1 if(cnt>700)cnt=0;// 报警时的闪烁周期
175 1 switch(MS)
176 1 {
177 2 case 0:{dis_time(discnt);}break;// 显示走时
178 2 case 1:{dis_adjtime(discnt);}break;// 显示调时
179 2 case 2:{dis_adjT1_st(discnt);}break; //显示T1调整及设定
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 4
180 2 case 3:{dis_adjT1_end(discnt);}break;// 显示T2调整及设定
181 2 case 4:{dis_adjT2_st(discnt);}break;// 显示T3调整及设定
182 2 case 5:{dis_adjT2_end(discnt);}break;// 显示T4调整及设定
183 2 case 6:{dis_adjALMtime(discnt);}break;// 显示报警时间调整及设定
184 2 case 10:{dis_check(discnt);}break;// 查询时显示的报警历史记录(翻页)
185 2 case 15:{dis_check1(discnt);}break;// 报警触发时,显示此时的报警地点、时间
186 2 default:break;
187 2 }
188 1 discnt++;cnt++;
189 1 }
190
191 /*****************************/
192 void dis_check1(uchar m)// 报警触发时,显示此时的报警地点、时间
193 {
194 1 if(cnt<350)
195 1 {switch(m)
196 2 {case 0:{P0=SEG7[temp_min%10];}break;
197 3 case 1:{P0=SEG7[temp_min/10];}break;
198 3 case 2:{P0=SEG7[temp_hou%10];}break;
199 3 case 3:{P0=SEG7[temp_hou/10];}break;
200 3 case 4:{P0=SEG7[temp_day%10];}break;
201 3 case 5:{P0=SEG7[temp_day/10];}break;
202 3 case 6:{P0=SEG7[ALMadd%10];}break;
203 3 case 7:{P0=SEG7[ALMadd/10];}break;
204 3 default:break;
205 3 }
206 2 P2=act[m];P0_7=1;}
207 1 else
208 1 P2=0xff;
209 1 }
210
211 //===============================
212 void dis_check(uchar m)// 查询时显示的报警历史记录(翻页)
213 {
214 1 switch(m)
215 1 {case 0:{P0=SEG7[temp_min%10];}break;
216 2 case 1:{P0=SEG7[temp_min/10];}break;
217 2 case 2:{P0=SEG7[temp_hou%10];}break;
218 2 case 3:{P0=SEG7[temp_hou/10];}break;
219 2 case 4:{P0=SEG7[temp_day%10];}break;
220 2 case 5:{P0=SEG7[temp_day/10];}break;
221 2 case 6:{P0=SEG7[ALMadd%10];}break;
222 2 case 7:{P0=SEG7[ALMadd/10];}break;
223 2 default:break;
224 2 }
225 1 P2=act[m];P0_7=1;
226 1 }
227
228 /*******************************/
229 void dis_time(uchar m) //显示走时
230 {
231 1 switch(m)
232 1 {case 0:{P0=SEG7[min%10];}break;
233 2 case 1:{P0=SEG7[min/10];}break;
234 2 case 2:{P0=SEG7[hou%10];}break;
235 2 case 3:{P0=SEG7[hou/10];}break;
236 2 case 4:{P0=SEG7[day%10];}break;
237 2 case 5:{P0=SEG7[day/10];}break;
238 2 case 6:{P0=SEG7[mon%10];}break;
239 2 case 7:{P0=SEG7[mon/10];}break;
240 2 default:break;
241 2 }
C51 COMPILER V7.06 WXBJ 11/18/2005 20:24:48 PAGE 5
242 1 if(!d_05s) {P0_7=0;}
243 1 else {P0_7=1;}
244 1 P2=act[m];
245 1 }
246
247 /****************************/
248 void dis_adjtime(uchar m)// 显示调时
249 {
250 1 switch(m)
251 1 {case 0:{P0=SEG7[min%10];}break;
252 2 case 1:{P0=SEG7[min/10];}break;
253 2 case 2:{P0=SEG7[hou%10];}break;
254 2 case 3:{P0=SEG7[hou/10];}break;
255 2 case 4:{P0=SEG7[day%10];}break;
256 2 case 5:{P0=SEG7[day/10];}break;
257 2 case 6:{P0=SEG7[mon%10];}break;
258 2 case 7:{P0=SEG7[mon/10];}break;
259 2 default:break;
260 2 }
261 1 P0_7=1;
262 1 P2=act[m];
263 1 }
264
265 /****************************/
266 void dis_adjT1_st(uchar m) //显示T1调整及设定
267 {
268 1 switch(m)
269 1 {case 0:{P0=SEG7[T1min_st%10];}break;
270 2 case 1:{P0=SEG7[T1min_st/10];}break;
271 2 case 2:{P0=SEG7[T1hou_st%10];}break;
272 2 case 3:{P0=SEG7[T1hou_st/10];}break;
273 2 case 4:{P0=0x00;}break;
274 2 case 5:{P0=0x00;}break;
275 2 case 6:{P0=SEG7[1];}break;
276 2 case 7:{P0=0x31;}break;
277 2 default:break;
278 2 }
279 1 if(!T1_startflag) P0_7=1;
280 1 else P0_7=0;
281 1 P2=act[m];
282 1 }
283
284 /************************************/
285 void dis_adjT1_end(uchar m) //显示T2调整及设定
286 {
287 1 switch(m)
288 1 {case 0:{P0=SEG7[T1min_end%10];}break;
289 2 case 1:{P0=SEG7[T1min_end/10];}break;
290 2 case 2:{P0=SEG7[T1hou_end%10];}break;
291 2 case 3:{P0=SEG7[T1hou_end/10];}break;
292 2 case 4:{P0=0x00;}break;
293 2 case 5:{P0=0x00;}break;
294 2 case 6:{P0=SEG7[2];}break;
295 2 case 7:{P0=0x31;}break;
296 2 default:break;
297 2 }
298 1 if(!T1_endflag) P0_7=1;
299 1 else P0_7=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -