📄 jnsk.lst
字号:
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE JNSK
OBJECT MODULE PLACED IN jnsk.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE jnsk.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89x051.H> //器件配置文件
2 #define uchar unsigned char //变量类型的宏定义
3 #define uint unsigned int
4 uchar DATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66,
5 0xb6,0xbe,0xe0,0xfe,0xf6}; /*0~9的数码管段码*/
6 uchar x[4]; /* 存放走时的数组*/
7 uchar y[4]={0,0,0,0}; /* 存放定时1的数组*/
8 uchar z[4]={0,0,0,0}; /* 存放定时2的数组*/
9 uchar act[4]={0xfe,0xfd,0xfb,0xf7}; /*四位数码管的位选码*/
10 void delay(uint k); //延时子函数声明
11 void conv(); //走时转换子函数声明
12 void p_out(); //判别定时到否子函数声明
13 void p_out1(); //判别定时到否子函数1声明
14 void t_adj(); //走时调整子函数声明
15 uchar deda=0; /*100mS计数单元清零*/
16 bit d_05s=0; /*0.5秒标志*/
17 bit o_f1=0; /*定时1启/停标志*/
18 bit o_f2=0; /*定时2启/停标志*/
19 uchar set=0; /*功能键标志*/
20 uchar h=0;
21 uchar n=0;
22 uchar m=0;
23 uchar flag;
24 uchar left=0;
25 uchar sec=0;
26 uchar min=0;
27 uchar hour=0;
28 uchar min1=0;
29 uchar hour1=0;
30 uchar min2=0;
31 uchar hour2=0;
32 uchar up=0;
33 bit flag1=0;
34 bit flag2=0;
35
36 /*显示走时*/
37 void time()
38 {
39 1 for(h=0;h<4;h++)
40 1 {P1=DATA_7SEG[x[h]]; //输出数码管的字形码
41 2 P3=act[h];p_out(); //输出数码管的位码。判断输出
42 2 if(P3_2==0){if(d_05s==1)P1_0=1;else P1_0=0;} /* 百位数码管点亮时,控制小数点
43 2 (秒点)闪烁*/
44 2 delay(2);} //每位数码管点亮2ms
45 1 if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;}/* 若定时1启动,
46 1 点亮十位数码管小数点*/
47 1 else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则十位数码管
48 1 小数点不亮*/
49 1 delay(2);
50 1 if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /* 若定时2启动,
51 1 点亮个位数码管小数点*/
52 1 else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则个位数码管
53 1 小数点不亮*/
54 1 delay(2);
55 1 }
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 2
56
57 /*定时器T0初始化*/
58 void init_timer0()
59 {
60 1 TMOD=0x11;
61 1 TH0=-(50235/256);
62 1 TL0=-(50235%256);
63 1 IE=0x8a;
64 1 TR0=1;
65 1 }
66
67 /*定时器T1初始化*/
68 void init_timer1()
69 {
70 1 TH1=-(5000/256);
71 1 TL1=-(5000%256);
72 1 }
73
74
75 /*延时k*1ms子函数*/
76 void delay(uint k)
77 {
78 1 uint i,j;
79 1 for(i=0;i<k;i++){
80 2 for(j=0;j<60;j++)
81 2 {;}}
82 1 }
83
84 /*100mS定时中断服务子函数*/
85 void zd0(void) interrupt 1
86 {
87 1 TH0=-(50235/256); //重装100ms定时初值
88 1 TL0=-(50235%256);
89 1 deda++; //100ms计时单元递增
90 1 }
91
92 /*10mS定时中断服务子函数*/
93 void zd1(void) interrupt 3
94 {uchar i,j;i=P1;j=P3;
95 1 TH1=-(5000/256);
96 1 TL1=-(5000%256);
97 1 if(m==1)n++;
98 1 if(n>=30){n=0;m=0;}
99 1 P3_7=0;
100 1 P1=0xff;
101 1 if(P1!=0xff)
102 1 {
103 2 if(n==0)m=1;
104 2 {if(n==1)
105 3 {
106 4 if(P1_0==0){set++;left=0;}
107 4 if(set>=4)set=0;
108 4 if(set==1)flag=0x55;
109 4 if(P1_1==0)left++;
110 4 if(left>=4)left=0;
111 4 if(P1_2==0){up++;
112 5 switch(left)
113 5 {
114 6 case 0:{if(up>=10)up=0;}break;
115 6 case 1:{if(up>=6)up=0;}break;
116 6 case 2:{if(up>=10)up=0;}break;
117 6 case 3:{if(up>=3)up=0;}break;
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 3
118 6 default:break;
119 6 }
120 5 }
121 4 if(P1_2==0){
122 5 switch(set)
123 5 {case 0:break;
124 6 case 1:x[left]=up;break;
125 6 case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
126 6 case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
127 6 default:break;}
128 5 }
129 4 else {
130 5 switch(set)
131 5 {case 0:break;
132 6 case 1:up=x[left];break;
133 6 case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
134 6 case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
135 6 default:break;}
136 5 }}
137 3 }}
138 1 P1=i;P3=j;
139 1 }
140
141 /*显示调整走时*/
142 void t_adj()
143 {p_out1();
144 1 for(h=0;h<4;h++) //四位数码管每位点亮3ms
145 1 {if(h==left)P1=0x00;
146 2 else {P1=DATA_7SEG[x[h]];
147 3 P3=act[h];p_out();
148 3 delay(3);}}
149 1 P1=DATA_7SEG[up];P3=act[left];
150 1 hour=x[3]*10+x[2];min=x[1]*10+x[0];
151 1 p_out();
152 1 delay(12); //需调整的数码管点亮12ms
153 1 if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;} /*若定时1启动,
154 1 点亮十位数码管小数点*/
155 1 else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则十位数码管
156 1 小数点不亮*/
157 1 delay(12); //需调整的数码管点亮12ms
158 1 if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /*若定时2启动,
159 1 点亮个位数码管小数点*/
160 1 else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则个位数码管
161 1 小数点不亮*/
162 1 delay(12); //需调整的数码管点亮12ms
163 1 }
164
165 /*显示调整定时1*/
166 void t1_adj()
167 {p_out1();
168 1 for(h=0;h<4;h++) //四位数码管每位点亮3ms
169 1 {if(h==left)P1=0x00;
170 2 else {P1=DATA_7SEG[y[h]];
171 3 P3=act[h];p_out();
172 3 delay(3);}}
173 1 P1=DATA_7SEG[up];P3=act[left]; //需调整的数码管点亮18ms
174 1 hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
175 1 p_out();
176 1 delay(18);
177 1 if(o_f1==1){P1=0x01;P3_3=0;P3_2=1;P3_1=0;P3_0=1;} /*若定时1启动,
178 1 点亮十位数码管小数点*/
179 1 else{P1=0x01;P3_3=0;P3_2=1;P3_1=1;P3_0=1;} /*否则十位数码管
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 4
180 1 小数点不亮*/
181 1 p_out();
182 1 delay(18); //需调整的数码管点亮18ms
183 1 }
184
185
186 /*显示调整定时2*/
187 void t2_adj()
188 {p_out1();
189 1 for(h=0;h<4;h++) //四位数码管每位点亮3ms
190 1 {if(h==left)P1=0x00;
191 2 else {P1=DATA_7SEG[z[h]]; //需调整的数码管点亮18ms
192 3 P3=act[h];p_out();
193 3 delay(3);}}
194 1 P1=DATA_7SEG[up];P3=act[left];
195 1 hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
196 1 p_out();
197 1 delay(18);
198 1 if(o_f2==1){P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=0;} /*若定时2启动,
199 1 点亮个位数码管小数点*/
200 1 else{P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=1;} /*否则个位数码管
201 1 小数点不亮*/
202 1 p_out();
203 1 delay(18); //需调整的数码管点亮18ms
204 1 }
205
206
207 /*时、分、秒计时单元转换*/
208 void conv()
209 {
210 1 if(deda<=5)d_05s=0; //每500ms,秒点取反
211 1 else d_05s=1;
212 1 if(deda>=10){sec++;deda=0;} //每1000ms,秒单元递增
213 1 if(sec>=60){min++;sec=0;} //每60s,分单元递增
214 1 if(min>=60){hour++;min=0;} //每60m,时单元递增
215 1 if(hour>=24){hour=0;} //每24h,时单元清零
216 1 }
217
218 /*判别定时到否子函数*/
219 void p_out()
220 {
221 1 if(o_f1==1) //若定时1启动
222 1 {if(hour==hour1) //定时1时间到
223 2 {if(min==min1)
224 3 {flag1=1;if(d_05s==1)P3_4=0;else P3_4=1;}}} //继电器输出标志置1,蜂鸣器间断鸣响
225 1 if(flag1==1) P3_5=0; //若输出标志为1,继电器吸合
226 1
227 1 if(o_f2==1) //若定时2启动
228 1 {if(hour==hour2) //定时2时间到
229 2 {if(min==min2)
230 3 {flag1=0;if(d_05s==1)P3_4=0;else P3_4=1;}}} //继电器输出标志置0,蜂鸣器间断鸣响
231 1 if(flag1==0) P3_5=1; //若输出标志为0,继电器释放
232 1 }
233
234 /*判别定时到否子函数1*/
235 void p_out1()
236 {
237 1 if(o_f1==1) //若定时1启动
238 1 {if(hour==hour1) //定时1时间到
239 2 {if(min==min1)
240 3 {flag1=1;}}} //继电器输出标志置1
241 1 if(flag1==1) P3_5=0; //若输出标志为1,继电器吸合
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 5
242 1
243 1 if(o_f2==1) //若定时2启动
244 1 {if(hour==hour2) //定时2时间到
245 2 {if(min==min2)
246 3 {flag1=0;}}} //继电器输出标志置0
247 1 if(flag1==0) P3_5=1; //若输出标志为0,继电器释放
248 1 }
249
250
251 /*主函数*/
252 void main()
253 {
254 1 init_timer0(); /*定时器T0初始化*/
255 1 init_timer1(); /*定时器T1初始化*/
256 1
257 1 while(1)
258 1 {
259 2 /*将显示缓冲数组内容移到时、分计时单元*/
260 2 hour=x[3]*10+x[2];min=x[1]*10+x[0];
261 2 hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
262 2 hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
263 2 conv(); /*时、分、秒及100mS单元转换*/
264 2 /*将转换后的时、分计时单元内容移到显示缓冲数组*/
265 2 x[3]=hour/10;x[2]=hour%10;x[1]=min/10;x[0]=min%10;
266 2 y[3]=hour1/10;y[2]=hour1%10;y[1]=min1/10;y[0]=min1%10;
267 2 z[3]=hour2/10;z[2]=hour2%10;z[1]=min2/10;z[0]=min2%10;
268 2 switch(set)
269 2 {
270 3 case 0:time();break;/*显示走时*/
271 3 case 1:t_adj();break;/*显示调整走时*/
272 3 case 2:t1_adj();break;/*显示调整定时1*/
273 3 case 3:t2_adj();break;/*显示调整定时2*/
274 3 default:break;
275 3 }
276 2 if(flag!=0x55) /*判断RAM受干扰标志,若受干扰,
277 2 则显示器闪烁告警*/
278 2 {uchar i;P3_4=1;P3_5=1;
279 3 for(i=0;i<100;i++) /*点亮显示器200mS*/
280 3 {
281 4 P1=DATA_7SEG[x[3]];P3=0xf7;delay(1);
282 4 P1=DATA_7SEG[x[2]];P3=0xfb;delay(1);
283 4 P1=DATA_7SEG[x[1]];P3=0xfd;delay(1);
284 4 P1=DATA_7SEG[x[0]];P3=0xfe;delay(1);
285 4 }
286 3
287 3 P1=0xff;P3=0xff;delay(400); /*熄灭显示器200mS*/
288 3 P3_7=0;
289 3 /*如有键按下达0.5S则退出闪烁状态同时掉电标志置55H。*/
290 3 if(P1!=0xff){
291 4 delay(10);if(P1_0==0)flag=0x55;F0:if(P1!=0xff)goto F0;
292 4 }P3_7=1;
293 3 }
294 2 else TR1=1;/*启动定时器1*/
295 2 }}
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1359 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 41 1
C51 COMPILER V7.06 JNSK 11/18/2005 20:06:16 PAGE 6
IDATA SIZE = ---- ----
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -