📄 main.lst
字号:
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c ROM(COMPACT) OPTIMIZE(9,SPEED) BROWSE MODP2 DEBUG OBJECTEXTEND PREPR
-INT
line level source
1 /* //////////////////////////////////////////////////////////////////////////
2 // main.c - source file for lme2200 AMR
3 //
4 // 家电智能控制统一灯端程序(根据UPLM2200 API协议设定)
5 // Copyright 2006, Leaguer MicroElectronics Co., Ltd
6 // www.leaguerme.com
7 //
8 // 软件修改说明在页底,敬请留意
9 //////////////////////////////////////////////////////////////////////////// */
10 #include <REG922.H>
11
12 #include "timer.h"
13 #include "sart.h"
14 #include "plc.h"
15 #include "wr_flash.h"
16
17
18 #define uint unsigned int
19 #define uchar unsigned char
20
21 /*============================版本号========================================*/
22 #define Version1 0x01 //版本号1
23 #define Version2 0x01 //版本号2
24 /*=============================================================================*/
25
26 #define AMR_OS_C 0 //本协议的控制字在第一位
27 #define AMR_OS_L 5 //本协议的长度值在第五位
28
29 #define S2400 40
30 #define S1200 50
31 #define S600 80
32
33 uchar code ADDR[4];
34 uchar plc_frame[18];
35 uchar code mcu_pc[5]= {0xfe,0xfe,0xfe,0xfe,0x68};
36 uchar code tx_buf[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x1
-1,0x12};
37 uchar code master = 0;
38
39 //bit auto_tx;//上电发送控制 extern
40 //bit auto_tx;//自动控制与PC控制标示
41 //bit Rx_bit; //主机接收控制
42 //bit master_slave; // 主从
43 extern idata uchar amr_frame[]; // AMR frame buffer
44 extern idata uchar wet;
45
46 uchar CRC;//电力网收到CRC的值
47 extern bit timeout_40s;
48 extern bit delay_tx;
49 extern bit packet_recved;
50 extern bit packet_recving;
51 extern bit t1_enable;
52 bit switd_s; //开关确认
53 bit switd_T1; //开关-开标示
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 2
54 bit switd_T2; //开关-关标示
55
56 bit reply; //数据返回
57 bit adss_ok;//本地址正确标示
58 bit public_addr; //公用地址标示
59 bit CRC_switch;//CRC开关
60 bit addr_wr;//写地址标示
61
62 sbit tai = P0^4;// 灯开关控制端
63 sbit switd = P0^5; //双联开关
64
65 void proc_amr_frame(uchar frame[]);
66 void amr_send_frame(uchar buf[]);
67 void return_inf(uchar frame,uchar inf_buf[],uchar dat);
68 void uart_tx_mode(uchar i_buf[]);
69 void rx_return(bit y,uchar R_data[]);
70 int plc_send(uchar frame[]);
71 void return_data();
72 void adss_crc(uchar buf[]);//地址校验
73 void write_addr (bit y,uchar frame[]);//写地址功能
74 void processing_unit(uchar frame[]);//数据接收处理
75 //void w_flsh(uchar dat,uchar dat1);
76
77 /*=============================================================================*/
78 /* 主程序 */
79 /*=============================================================================*/
80 main() {
81 1
82 1 uchar l;
83 1 uchar buf[2];
84 1 P0M1 = 0x80; // 这是为第二版电力载波的小模块,发射部分是安捷伦的810方案 -IO口的定义
85 1 P0M2 = 0x41;
86 1 P1M1 = 0x7c;
87 1 P1M2 = 0x80;
88 1
89 1 Rxok = 0;
90 1 reply = 0;
91 1 adss_ok = 0;
92 1 public_addr = 0;//地址标示清零
93 1 timer0_init(242, 10); // 1ms * 10 = 10ms
94 1 // plc_init(SMOD_SYNC);
95 1 uart_init(); //<--------------串口初始化
96 1 //relay_init();
97 1 wdt_init();//<----------------看门狗初始化
98 1 clr_wdt();
99 1 plc_power_on();
100 1
101 1 for(l = 0;l < 18;l ++)
102 1 plc_frame[l] = 0;
103 1 clr_wdt();
104 1 timeout_40s = 0;
105 1 setup_t2(4000, timeout_t2); //原10S
106 1
107 1 setup_t1(30, disable_t1); //定时LED为300ms
108 1 plc_getframe(plc_frame); //查收8300的数据
109 1
110 1 FLASH_ReadNByte(0x1c00,buf, 2);
111 1 if(buf[0]!= 0){
112 2 write_reg(REG_WR_33, buf[0]);
113 2 write_reg(REG_WR_3c, buf[1]);
114 2 }
115 1 // FLASH_ReadNByte(0x1b05,buf, 2);
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 3
116 1 // master_slave = (bit)buf[0];
117 1
118 1
119 1 while (1) { // the forever loop
120 2
121 2 if (uart_recved()) { // AMR frame recved from meter
122 3 disable_t2();//<-------------------------------关40秒定时
123 3 if (recv_amr_frame()) { //uart_sendblock(amr_frame,4);
124 4 clr_wdt();
125 4 // uart_sendblock(amr_frame, amr_frame[5]+6); //串口送至PC
126 4 proc_amr_frame(amr_frame); //最多26个字节
127 4 clr_wdt();
128 4 }
129 3 }
130 2
131 2 if (packet_recving) {//收到电力线上的数据
132 3 disable_t2();//<-------------------------------关40秒定时
133 3 while (!plc_recved()) { clr_wdt();}// wait until packet is recved
134 3 packet_recving = 0; // reset it
135 3 plc_getframe(plc_frame);// read packet data
136 3 clr_wdt();
137 3 setup_t4(40, timeout_t4);delay_tx = 1; /*-延迟返回初始化-不可小于35*/
138 3 CRC = read_crc(); //取CRC的值
139 3 if (CRC == 0) { // check CRC21
140 4 Rxok = 0; clr_wdt();
141 4 t1_enable = 1;
142 4 adss_crc(plc_frame); //LED定时300ms
143 4 if((adss_ok==1)|| public_addr){;//地址校验)//地址是否对
144 5 //rx_return(1,plc_frame); //数据发入串口
145 5 processing_unit(plc_frame);
146 5 //while(delay_tx)clr_wdt(); /*-延迟返回------*/
147 5 //Rx_Command_Reply(plc_frame[0]);//测试回复控制
148 5 if(reply){
149 6 Remote_Replies(plc_frame);//测试回复
150 6 clr_wdt();
151 6 }
152 5 }}
153 3 if(CRC_switch){ //CRC开关
154 4 rx_return(0,plc_frame); //数据发入串口
155 4 clr_wdt(); /*-延迟返回------*/
156 4 }
157 3 adss_ok = 0;public_addr = 0;//地址标示清零
158 3 setup_t2(4000, timeout_t2); //40S
159 3 }
160 2
161 2 /********************************************************/
162 2 if(switd == !switd_T1){ //switd - on
163 3 switd_T1 = 1;
164 3 if(switd_T1 == switd_T2){
165 4 switd_T2 = 0;
166 4 switd_s = 1; //开关确认
167 4 }
168 3 }
169 2 if(!switd == !switd_T2){ //switd - off
170 3 switd_T2 = 1;
171 3 if(switd_T2 == switd_T1){
172 4 switd_T1 = 0;
173 4 switd_s = 1; //开关确认
174 4 }
175 3 }
176 2 if(switd_s){
177 3 switd_s = 0;
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 4
178 3 addr_wr = ~addr_wr; //写地址
179 3 tai = ~tai; //灯的开关
180 3 }
181 2 /********************************************************/
182 2
183 2 if (timeout_40s)// Auto thres adjustment
184 2 {
185 3 thres_adjust();
186 3 packet_recved = 0; // reset it
187 3 }
188 2
189 2 if(~t1_enable)Rxok = 1;
190 2
191 2 clr_wdt();
192 2 plc_getframe(plc_frame);
193 2 clr_wdt();
194 2 }
195 1 }
196
197 /*=============================================================================*/
198 /*=============================================================================*/
199
200 // Process the received AMR message/cmd from meter
201 /*=============================================================================*/
202
203 void proc_amr_frame(uchar frame[])
204 {
205 1 uchar m_buf[2];
206 1 uchar contror_me;//B7B6 控制字
207 1 uchar command; //B5~B0 命令字
208 1 contror_me = (frame[AMR_OS_C] & 0xc0)>>6; //B7B6 控制字
209 1 command = frame[AMR_OS_C] & 0x3f; //B5~B0 命令字
210 1
211 1 switch (contror_me){
212 2 Rxok = 0;
213 2
214 2 case 0x00:{ uart_tx_mode(frame);}break;//发送到远方模块
215 2
216 2 case 0x01:{//本地设置控制
217 3
218 3 switch (command){
219 4 case 0x01:{if(frame[AMR_OS_L] == 0){m_buf[0] = Version1;m_buf[1] = Version2;return_i
-nf(0x61,m_buf,2);}}break;//读版本号
220 4
221 4 case 0x02:{if(frame[AMR_OS_L] == 0){m_buf[0] = read_reg(REG_RD_F3);return_inf(0x62,m
-_buf,1);}}break;//读速率信息
222 4
223 4 case 0x03:{
224 5 if(frame[AMR_OS_L] == 1){
225 6 switch (frame[AMR_OS_L + 1] ){
226 7
227 7 case 0x01:{ w_flsh(0x01,0x04);}break; //设置速率2400bps
228 7
229 7 case 0x02:{ w_flsh(0x02,0x02);}break; //设置速率1200bps
230 7
231 7 case 0x04:{ w_flsh(0x04,0x01);}break; //设置速率 600bps
232 7 }
233 6 m_buf[0] = read_reg(REG_RD_F3);return_inf(0x62,m_buf,1);}}break;//读速率信息
234 4
235 4 case 0x04:{if(frame[AMR_OS_L] == 0)CRC_switch = 1;}break;//读设置接收数据CRC报出
236 4
237 4 case 0x05:{if(frame[AMR_OS_L] == 0)CRC_switch = 0;}break;//读设置接收数据CRC不报出
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 5
238 4
239 4 case 0x06:{;}break;
240 4
241 4 case 0x07:{;}break;
242 4
243 4 case 0x08:{if(frame[AMR_OS_L] == 0)sync_sendchar(0x7e);}break;
244 4
245 4 case 0x3f:{write_addr (0,frame);}break;
246 4 }
247 3 }break;
248 2
249 2 case 0x02:{ uart_tx_mode(frame);}break;//远程设置控制//发送到远方模块
250 2
251 2 case 0x03:{;}break;
252 2
253 2
254 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -