📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 06/15/2005 16:56:55 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MAIN.C BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS
stmt level source
1 /***********************************************************/
2 /* */
3 /* CPU:AT89c55WD 20MHZ */
4 /* Copyright 2004.09 Comelit */
5 /* AUTHOR: LV_XIAO_LU */
6 /* */
7 /***********************************************************/
8
9 #include "reg52.h"
10 #include "define.h"
11 #include "variable.h"
12 #include "typedef.h"
13 #include "function.h"
14
15
16 sfr WDTRST = 0xa6;
17 sfr T2MOD = 0xc9;
18
19 sbit DIVA_STATUS_PORT = P3^2;
20 sbit MES_SW = P1^7;
21 sbit CALL_SW = P1^6 ;
22 sbit DISP_CTR_PORT = P3^5;
23
24
25 void Cpu_init(void);
26 void Diva_sts_hd(void);
27 void Judge_work_mode(void);
28 void Timer2_init(void);
29 sbit LED_CTR = P1^1 ;
30 /************************************************/
31 /*
32 /************************************************/
33
34 void main(void)
35 {
36 1
37 1 /* special_addr1 = 0xaa;
38 1 special_addr2 = 0x55;
39 1 special_addr1 = 0xa0;
40 1 init_code_b[0]=0xff;
41 1 init_code_b[1]=0xff;
42 1 init_code_b[2]=0xff;*/
43 1
44 1 Cpu_init();
45 1 Mes_init();
46 1 Init_mb9002_ic(1); //BLUE
47 1 Hsio_init(BPS4800);
48 1 Judge_work_mode(); //先判别是否要设置本机地址
49 1 /*启动狗*/
50 1 WDTRST = 0x1e;
51 1 WDTRST = 0xe1;
52 1
53 1 EA = 1;
54 1 TR2 = 1;
55 1 TR0 = 1;
C51 COMPILER V7.06 MAIN 06/15/2005 16:56:55 PAGE 2
56 1 main_step = 1;
57 1 while(1)
58 1 {
59 2
60 2
61 2 if(TF0 == 1)
62 2 {
63 3 TF0 = 0 ;
64 3 TH0 = TM20MS_H ;
65 3 TL0 = TM20MS_L ;
66 3 watch_dog_time = 0; //主循环10MS清0一次
67 3 Diva_sts_hd();
68 3 Write_flash_hd(); //管理flash写的状态
69 3 Key_hd();
70 3 Led_hd();
71 3 // Trm_hd();
72 3 Message_hd();
73 3 Backup_hd();
74 3 switch(main_step)
75 3 {
76 4 case 1:
77 4
78 4 Key_prc();
79 4 main_step++;
80 4 break;
81 4 case 2:
82 4
83 4 Disp_prc();
84 4 main_step++;
85 4 break;
86 4 case 3:
87 4 Backup_prc();
88 4 main_step++;
89 4 break;
90 4 case 4:
91 4 Led_prc();
92 4 main_step++;
93 4 break;
94 4 case 5:
95 4
96 4 main_step = 1;
97 4 break;
98 4 default:
99 4 main_step = 1;
100 4 break;
101 4 }
102 3 }
103 2 }
104 1 }
105
106
107 /************************************************/
108 /************************************************/
109 void Cpu_init(void)
110 {
111 1 DISP_CTR_PORT = 1;
112 1 LED_CTR = 1; //led off
113 1 EA = 0 ; //disable all interrupt
114 1 /* timer0 20ms no interrupt */
115 1 // TMOD = 0x01 ;
116 1 IE = 0x00 ;
117 1 TR0 = 0 ; // disable timer
C51 COMPILER V7.06 MAIN 06/15/2005 16:56:55 PAGE 3
118 1 TR1 = 0 ;
119 1 TMOD = 0x01 ;
120 1 TH0 = TM20MS_H ;
121 1 TL0 = TM20MS_L ;
122 1 Timer2_init();
123 1 return;
124 1 }
125
126
127
128 /************************************************/
129 /************************************************/
130 /* 下列函数用于判断当前话机的工作状态*/
131 void Diva_sts_hd(void)
132 {
133 1
134 1 DIVA_STATUS_PORT = 1;
135 1 now_port_F = DIVA_STATUS_PORT ; //读端口状态
136 1
137 1 if(now_port_F == 0) //话机处于呼叫打开状态时
138 1 {
139 2 if(pre_port_F == 1) //刚呼叫
140 2 {
141 3 pre_port_F = now_port_F ;
142 3
143 3 if(read_mes_F == 1) //如果正在看信息
144 3 {
145 4 // MES_SW = SW_OFF; //关闭信息通道
146 4 // mes_sw_F = 0;
147 4 CALL_SW = SW_OFF;
148 4 sw_delay = TM60MS; //等待信息通道继电器切换完成时间
149 4 }
150 3 else
151 3 {
152 4 call_disp_F = 1 ; //现在话机正处于呼叫状态
153 4 CALL_SW = SW_OFF;
154 4 }
155 3 }
156 2 else if(call_disp_F == 0)
157 2 {
158 3 if(sw_delay != 0)
159 3 sw_delay--;
160 3 else
161 3 {
162 4 // CALL_SW = SW_OFF; //恢复到默认状态
163 4 MES_SW = SW_OFF;
164 4 mes_sw_F = 0;
165 4 call_disp_F = 1;
166 4 }
167 3 }
168 2 }
169 1 else if(now_port_F == 1)
170 1 {
171 2 if(pre_port_F == 0) //呼叫结束时
172 2 {
173 3 pre_port_F = now_port_F ;
174 3 call_disp_F = 0;
175 3 if(read_mes_F == 1)
176 3 {
177 4 CALL_SW = SW_ON ;
178 4 sw_delay = TM60MS;
179 4 }
C51 COMPILER V7.06 MAIN 06/15/2005 16:56:55 PAGE 4
180 3 // sw_delay = TM50MS;
181 3 }
182 2 if(read_mes_F == 1 ) //只有在待机状态时才能去阅读信息,此时
183 2 { //需要把二个继电器全部切换
184 3 if(sw_delay!=0)
185 3 sw_delay--; //等待呼叫通道切换到空闲状态
186 3 // else if(MES_SW == SW_OFF) //呼叫通道切换已完成,而信息通道还没切换过来则
187 3 else if(mes_sw_F == 0)
188 3 {
189 4 MES_SW = SW_ON;
190 4 mes_sw_F = 1;
191 4 DISP_CTR_PORT = DISP_ON; //话机CFP = 0;
192 4 sw_delay=TM800MS;
193 4 }
194 3 else //
195 3 DISP_CTR_PORT = DISP_OFF; //话机CFP不须一直维持0
196 3 }
197 2 else //不在阅读状态下
198 2 {
199 3 if(sw_delay!=0) //如果30S不按键,要关断话机必须把+19V电断掉0.5S
200 3 sw_delay--; //才有可能关闭话机,以防止别家正在呼叫时CALL+19V还有,关不断
201 3 else //空闲状态时切换到正常的呼叫通道中
202 3 CALL_SW = SW_OFF;
203 3 }
204 2 }
205 1
206 1 }
207
208
209 /********************************************/
210 /*本函数用于判别是否要处于设置地址的工作状态*/
211 /********************************************/
212 void Judge_work_mode(void)
213 {
214 1 unsigned char status_cnt=10;
215 1 CALL_SW = 1; //为读,先置1
216 1 while(status_cnt == 10)
217 1 {
218 2 if(CALL_SW == 0)
219 2 status_cnt++;
220 2 else
221 2 status_cnt--;
222 2 Delay_10ms();
223 2 CALL_SW = 1; //再读,先置1
224 2 if(CALL_SW == 0)
225 2 status_cnt++;
226 2 else
227 2 status_cnt--;
228 2 }
229 1 if(status_cnt == 12)
230 1 {
231 2 work_F = 1 ; //设置本机地址状态
232 2 main_step = 1;
233 2 TR0 = 1;
234 2 EA = 1;
235 2 while(1)
236 2 {
237 3 if(TF0 == 1)
238 3 {
239 4 TF0 = 0 ;
240 4 TH0 = TM20MS_H ;
241 4 TL0 = TM20MS_L ;
C51 COMPILER V7.06 MAIN 06/15/2005 16:56:55 PAGE 5
242 4 Trm_hd();
243 4 }
244 3 }
245 2 }
246 1 else
247 1 work_F = 0 ;
248 1
249 1 }
250
251 /***************************************************/
252 /***************************************************/
253
254
255 /***************************************************/
256 /* 定时器2用于喂狗 */
257 /***************************************************/
258 void Timer2_hd(void) interrupt 5
259 {
260 1 EA = 0;
261 1 TF2 = 0;
262 1 watch_dog_time++; //中断里5MS累加一次
263 1 if(watch_dog_time <= 100) //如果500ms主程序还没执行过一次的话,就认为出现了死机
264 1 {
265 2 WDTRST = 0x1e;
266 2 WDTRST = 0xe1;
267 2 }
268 1 EA = 1;
269 1 Trm_hd();
270 1 ES = 0;
271 1 if(time_out != 0)
272 1 time_out--;
273 1 ES = 1 ;
274 1 }
275
276 /***************************************************/
277 /***************************************************/
278 void Timer2_init(void)
279 {
280 1
281 1 T2CON = 0x00;
282 1 T2MOD = 0x00;
283 1 RCAP2H = TM4MS_H; //db
284 1 RCAP2L = TM4MS_L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -