📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 01/01/2006 16:24:02 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
stmt level source
1 #include <reg52.h>
2 #define MsgLen 11
3 sfr WDTC = 0x8f;//看门狗寄存器定义
4 sfr XICON = 0xc0;//外部中断控制寄存器定义
5 sbit EX2 = XICON^2;//外部中断2使能位定义
6 sbit EX3 = XICON^6;//外部中断3使能位定义
7 unsigned char MSGBuf[MsgLen];//接收缓冲区
8 unsigned char RcvBuf;//接收寄存器
9 unsigned int Timer10Min= 0 ;//10分钟超时计数器
10 bit HasRcv=0;//接收标志
11 bit SendOver=0;//发送标志
12 bit T0out=0;//10分钟超时标志
13 bit Timer0Flag=0;//定时器0溢出标志
14 code unsigned char PowerOnREQ[] = {//开机命令数据包
15 0x56,0x07,0x81,0x01,0xfe,0xdd,0x95,0xb0,0xb0,0xaf,0x04};
16 code unsigned char PowerOnCMP[] = {//开机成功数据包
17 0x56,0x07,0x82,0xfe,0x01,0x7b,0x39,0xd0,0x0c,0x6e,0x03};
18 code unsigned char PowerOffREQ[] = {//关机命令数据包
19 0x56,0x07,0x83,0x01,0xfe,0xb3,0x41,0x34,0xb3,0xba,0x03};
20 code unsigned char PowerOffCMP[] = {//关机成功数据包
21 0x56,0x07,0x84,0xfe,0x01,0xc9,0x45,0x5d,0x08,0x53,0x03};
22 code unsigned char PowerError[] = {//出错信息数据包
23 0x56,0x07,0x85,0xfe,0x01,0xfe,0x2f,0x9f,0x09,0xb6,0x03};
24 sbit nPCTL = P1^0;//电源控制位,低有效
25 sbit nPOn1 = P2^0;//电源监测位1,低有效
26 sbit nPOn2 = P2^1;//电源监测位2,低有效
27
28
29 void InitCom(unsigned int BaudRate)//串口初始化
30 {
31 1 unsigned char THTL;
32 1 switch (BaudRate)
33 1 {
34 2 case 300: THTL = 64; break; //波特率300
35 2 case 600: THTL = 160; break; //600
36 2 case 1200: THTL = 208; break; //1200
37 2 case 2400: THTL = 243; break; //2400
38 2 case 4800: THTL = 244; break; //4800
39 2 case 9600: THTL = 250; break; //9600
40 2 case 19200: THTL = 253; break; //19200
41 2 case 57600: THTL = 255; break; //57600
42 2 default: THTL = 208;
43 2 }
44 1 SCON = 0x50; //串口方式1,允许接收
45 1 TMOD = 0x21; //定时器1定时方式2, 定时器0定时方式1
46 1 TCON = 0x40; //设定时器1开始计数
47 1 TH1 = THTL;
48 1 TL1 = THTL;
49 1 PCON = 0x80; //波特率加倍控制,SMOD位
50 1 RI = 0; //清收发中断标志
51 1 TI = 0;
52 1 TR1 = 1; //启动定时器1
53 1 }
54
55
C51 COMPILER V7.06 MAIN 01/01/2006 16:24:02 PAGE 2
56 void externelINT0() interrupt 0//外部中断0中断服务程序
57 {
58 1 EX0=0;//关中断
59 1 }
60
61 void Timer0Int() interrupt 1//定时器0中断服务程序
62 {
63 1 Timer10Min++;//10分钟超时计数器递增
64 1 Timer0Flag=1;//定时器0溢出标志置位
65 1 if(Timer10Min>10000)//判断超时
66 1 T0out = 1;
67 1 }
68
69 void externelINT1() interrupt 2//外部中断1中断服务程序
70 {
71 1 EX1 = 0;//关中断
72 1 }
73
74 void Timer1Int() interrupt 3//定时器1中断服务程序
75 {
76 1 ET1 = 0;//关中断
77 1 }
78
79 void SerialIO0() interrupt 4 {//串口中断
80 1
81 1 if(RI) {
82 2 RI = 0 ;
83 2 RcvBuf = SBUF;
84 2 HasRcv = 1;
85 2 Timer10Min= 0;
86 2 }
87 1 else
88 1 {
89 2 TI = 0;
90 2 SendOver=1;
91 2 }
92 1 }
93
94 void Timer2Int() interrupt 5 {//定时器2中断服务程序
95 1
96 1 ET2 = 0;//关中断
97 1 }
98
99 void externelINT2() interrupt 6//外部中断2中断服务程序
100 {
101 1 EX2 = 0;//关中断
102 1 }
103
104 void externelINT3() interrupt 7//外部中断3中断服务程序
105 {
106 1 EX3 = 0;//关中断
107 1 }
108
109 /*************FUNCTION**************/
110 /* 11.0592MHz */
111 /* 延时(count)ms */
112 /***********************************/
113 void dmsec(unsigned int count)//延时程序
114 {
115 1 unsigned int i;
116 1 while(count--)
117 1 {
C51 COMPILER V7.06 MAIN 01/01/2006 16:24:02 PAGE 3
118 2 for(i=0;i<125;i++)
119 2 {
120 3 }
121 2 }
122 1 }
123
124 void rcvMsg()//接收数据包
125 {
126 1 unsigned int Num=1;
127 1 unsigned int Timeout=0;
128 1 while(Num<MsgLen && Timeout<3000) {
129 2 if (HasRcv)
130 2 { HasRcv = 0;
131 3 MSGBuf[Num]= RcvBuf;
132 3 Num++;
133 3 }
134 2 Timeout++;
135 2
136 2 }
137 1 WDTC = 0xe5; //喂狗
138 1 }
139
140 void sendMSG(unsigned char MSG[])//发送数据包
141 {
142 1 unsigned int i;
143 1
144 1 for(i = 0 ; i<MsgLen; i++ )
145 1 {
146 2 SBUF = MSG[i];
147 2 while(SendOver==0);
148 2 SendOver=0;
149 2 // dmsec(1);
150 2 }
151 1 WDTC = 0xe5;//喂狗
152 1 }
153
154 unsigned int checkMSG()//校验数据包
155 {
156 1 unsigned int i;
157 1 unsigned int flag1;
158 1 unsigned int flag2;
159 1
160 1 for(i = 1 ; i<MsgLen; i++ )
161 1 {
162 2 if (MSGBuf[i] != PowerOnREQ[i] )
163 2 { flag1= 0;
164 3 break;
165 3 }
166 2 flag1 = 1;
167 2 }
168 1 for(i = 1 ; i<MsgLen; i++ )
169 1 {
170 2 if (MSGBuf[i] != PowerOffREQ[i] )
171 2 { flag2= 0;
172 3 break;
173 3 }
174 2 flag2 = 2;
175 2 }
176 1 //WDTC = 0xe5;
177 1 return(flag1 + flag2) ;
178 1 }
179
C51 COMPILER V7.06 MAIN 01/01/2006 16:24:02 PAGE 4
180 void main() {
181 1 WDTC = 0xe5;//看门狗寄存器赋值
182 1 IE = 0x00;
183 1 XICON = 0x00;//关闭外部中断
184 1 InitCom(19200);
185 1 ES = 1;//使能串口中断
186 1 ET0 = 1;//定时器0溢出中断使能
187 1 TR0 = 1;//激活定时器0
188 1 EA =1;//中断允许
189 1 nPCTL =1;
190 1 P2 = 0xff;
191 1 HasRcv =0;
192 1 SendOver=0;
193 1 Timer10Min= 0;
194 1 T0out= 0;
195 1
196 1 while (1) {
197 2 while (HasRcv == 0){//等待接收
198 3 if (T0out== 1 && nPOn1 == 0 && nPOn2 == 0)//超时断电
199 3 {nPCTL = 1;
200 4 sendMSG(PowerOffCMP);
201 4 }
202 3 if(Timer0Flag) //定时喂狗
203 3 {
204 4 WDTC = 0xe5;
205 4 Timer0Flag = 0;//清定时器0溢出标志
206 4 }
207 3 }
208 2 HasRcv = 0;//清接收标志
209 2 if(RcvBuf == 0x56)//判断信头
210 2 {
211 3 MSGBuf[0]=RcvBuf;//
212 3 rcvMsg();
213 3
214 3 switch( checkMSG() )
215 3 {
216 4 //case 0 : //数据包错误
217 4 //sendMSG(PowerError);
218 4 // break;
219 4 case 1 : if (nPOn1 == 1 && nPOn2 == 1)//响应开机信令
220 4 {nPCTL = 0;
221 5 T0out = 0;
222 5 dmsec(100);
223 5 }
224 4 if (nPOn1 == 0 && nPOn2 == 0) //判成功,发回复信令
225 4 sendMSG(PowerOnCMP);
226 4 else sendMSG(PowerError);
227 4 break;
228 4 case 2 :if (nPOn1 == 0 && nPOn2 == 0) //响应关机信令
229 4 { nPCTL = 1;
230 5 dmsec(100);
231 5 }
232 4 if (nPOn1 == 1 && nPOn2 == 1) //判成功,发回复信令
233 4 sendMSG (PowerOffCMP) ;
234 4 else sendMSG(PowerError);
235 4 break;
236 4 default: ;//sendMSG(PowerError);
237 4 }
238 3 }
239 2
240 2 }
241 1
C51 COMPILER V7.06 MAIN 01/01/2006 16:24:02 PAGE 5
242 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 573 ----
CONSTANT SIZE = 55 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 6
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -