📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 03/17/2007 13:52:04 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <c8051f020.h>
2 #include <stdio.h>
3 #include "CPU_Init.h"
4 #include "RS485F.h"
5 //#include "ADISR.h"
6
7 void UARTRX_Disp(void);//接收数据处理函数
8 unsigned char Sum_verify(unsigned char verify[],unsigned char ii);//和检验函数
9 unsigned int PASS_Disp(unsigned int DATA[],unsigned char ii);
10
11 unsigned char RX[10];//UART0接收数据存放数组
12 unsigned char TX[10];
13 unsigned int xdata AD_data[8][10]; //AD采集数据存储数组
14 bit ReceiveBit=0; //接收完成标志
15
16 void main(void)
17 {
18 1 WDTCN = 0xde; //关闭看门狗
19 1 WDTCN = 0xad;
20 1 Init_Device();
21 1 TX[0]=0x00;
22 1 TX[1]=0x01;
23 1 TX[2]=0x05;
24 1 ADC0CN = 0xc4;
25 1 TMR3CN |=0x04;//启动定时器3
26 1 EA=1;
27 1 while(1)
28 1 {
29 2 if(ReceiveBit==1)//接收到一帧数据
30 2 {
31 3 ReceiveBit=0; //清除接收完成标志
32 3 /*TX[0]=0x00;
33 3 TX[1]=0x01;
34 3 TX[2]=0x05;
35 3 TX[3]=0x01;
36 3 TX[4]=0x01;
37 3 TX[5]=0x01;
38 3 TX[6]=0x02;
39 3 TX[7]=0x03;
40 3 UART0_TX(TX,8);*/
41 3 UARTRX_Disp();//报文数据处理
42 3 REN0=1;//重新接收使能
43 3 }
44 2
45 2 }
46 1 }
47
48
49 void AD_ISR(void) interrupt 15
50 {
51 1 static unsigned char PASS=0; //通道选择
52 1 static unsigned char i=0; //通道内数据存储切换
53 1 unsigned int ii;
54 1 TMR3CN &=~0x04;//关闭定时器3
55 1 AD_data[PASS++][i] = ADC0;
C51 COMPILER V7.50 MAIN 03/17/2007 13:52:04 PAGE 2
56 1 if(PASS==0x08)
57 1 {
58 2 PASS=0x00;
59 2 i++;
60 2 if(i==0x0A)
61 2 i=0x00;
62 2 }
63 1 AMX0SL=PASS;
64 1 TMR3CN |=0x04;//重新启动定时器3
65 1 }
*** WARNING C280 IN LINE 53 OF MAIN.C: 'ii': unreferenced local variable
66
67
68
69
70
71
72 void UARTRX_Disp(void)
73 {
74 1 unsigned char xdata anew_TX[3]={0x00,0x00,0x00};//要求主机重发指令数组
75 1 unsigned char xdata Verify_data=0;//接收和检验值
76 1 unsigned int Disp_data;
77 1 if(RX[1]==0) //主机要求重发数据
78 1 {
79 2 UART0_TX(TX,8);
80 2 }
81 1 else
82 1 {
83 2 if(RX[1]==1)
84 2 {
85 3 Verify_data=Sum_verify(RX+3,1);//对接收的数据(一字节通道字节数据)进行和校验
86 3 if(Verify_data==RX[4]) //和校验正确,处理AD采集数据并将数据发送给主机
87 3 {
88 4 EIE2 &= ~0x02; //关闭AD中断
89 4 switch(RX[3])
90 4 {
91 5 case 0x00: //发送通道0采集值
92 5 Disp_data=PASS_Disp(AD_data[0],10);
93 5 TX[3]=RX[3];
94 5 TX[4]=Disp_data%100;
95 5 TX[5]=(Disp_data/10)%10;
96 5 TX[6]=Disp_data%10;
97 5 TX[7]=Sum_verify(TX+3,4);
98 5 UART0_TX(TX,8);
99 5 break;
100 5 case 0x01: //发送通道1采集值
101 5 Disp_data=PASS_Disp(AD_data[1],10);
102 5 TX[3]=RX[3];
103 5 TX[4]=Disp_data%100;
104 5 TX[5]=(Disp_data/10)%10;
105 5 TX[6]=Disp_data%10;
106 5 TX[7]=Sum_verify(TX+3,4);
107 5 UART0_TX(TX,8);
108 5 break;
109 5 case 0x02: //发送通道2采集值
110 5 Disp_data=PASS_Disp(AD_data[2],10);
111 5 TX[3]=RX[3];
112 5 TX[4]=Disp_data%100;
113 5 TX[5]=(Disp_data/10)%10;
114 5 TX[6]=Disp_data%10;
115 5 TX[7]=Sum_verify(TX+3,4);
116 5 UART0_TX(TX,8);
C51 COMPILER V7.50 MAIN 03/17/2007 13:52:04 PAGE 3
117 5 break;
118 5 case 0x03: //发送通道3采集值
119 5 Disp_data=PASS_Disp(AD_data[3],10);
120 5 TX[3]=RX[3];
121 5 TX[4]=Disp_data%100;
122 5 TX[5]=(Disp_data/10)%10;
123 5 TX[6]=Disp_data%10;
124 5 TX[7]=Sum_verify(TX+3,4);
125 5 UART0_TX(TX,8);
126 5 break;
127 5 case 0x04: //发送通道4采集值
128 5 Disp_data=PASS_Disp(AD_data[4],10);
129 5 TX[3]=RX[3];
130 5 TX[4]=Disp_data%100;
131 5 TX[5]=(Disp_data/10)%10;
132 5 TX[6]=Disp_data%10;
133 5 TX[7]=Sum_verify(TX+3,4);
134 5 UART0_TX(TX,8);
135 5 break;
136 5 case 0x05: //发送通道5采集值
137 5 Disp_data=PASS_Disp(AD_data[5],10);
138 5 TX[3]=RX[3];
139 5 TX[4]=Disp_data%100;
140 5 TX[5]=(Disp_data/10)%10;
141 5 TX[6]=Disp_data%10;
142 5 TX[7]=Sum_verify(TX+3,4);
143 5 UART0_TX(TX,8);
144 5 break;
145 5 case 0x06: //发送通道6采集值
146 5 Disp_data=PASS_Disp(AD_data[6],10);
147 5 TX[3]=RX[3];
148 5 TX[4]=Disp_data%100;
149 5 TX[5]=(Disp_data/10)%10;
150 5 TX[6]=Disp_data%10;
151 5 TX[7]=Sum_verify(TX+3,4);
152 5 UART0_TX(TX,8);
153 5 break;
154 5 case 0x07: //发送通道7采集值
155 5 Disp_data=PASS_Disp(AD_data[7],10);
156 5 TX[3]=RX[3];
157 5 TX[4]=Disp_data%100;
158 5 TX[5]=(Disp_data/10)%10;
159 5 TX[6]=Disp_data%10;
160 5 TX[7]=Sum_verify(TX+3,4);
161 5 UART0_TX(TX,8);
162 5 break;
163 5 default: //主机发送通道错误
164 5 UART0_TX(anew_TX,3);//要求主机重发
165 5 }
166 4 EIE2 |= 0x02;//重新开启AD中断
167 4 }
168 3 else //和校验错误
169 3 {
170 4 UART0_TX(anew_TX,3);//要求主机重发
171 4 }
172 3 }
173 2 else //命令码错误
174 2 {
175 3 UART0_TX(anew_TX,3);//要求主机重发
176 3 }
177 2 }
178 1 }
C51 COMPILER V7.50 MAIN 03/17/2007 13:52:04 PAGE 4
179
180 //和检验函数
181 unsigned char Sum_verify(unsigned char verify[],unsigned char ii)
182 {
183 1 unsigned char Verify_Sum=0;//和校验值
184 1 unsigned char i;
185 1 for(i=0;i<ii;i++)
186 1 {
187 2 Verify_Sum^=verify[i];
188 2 }
189 1 return(Verify_Sum);
190 1 }
191
192 //数据处理
193 unsigned int PASS_Disp(unsigned int DATA[],unsigned char ii)
194 {
195 1 unsigned int MAX;
196 1 unsigned int MIN;
197 1 unsigned int SUM=0;
198 1 unsigned char i=0;
199 1 MAX=DATA[0];
200 1 MIN=DATA[0];
201 1 for(i=0;i<ii;i++)
202 1 {
203 2 if(DATA[i]>MAX)
204 2 MAX=DATA[i];
205 2 if(DATA[i]<MIN)
206 2 MIN=DATA[i];
207 2 SUM += DATA[i];
208 2 }
209 1 SUM=(SUM-MAX-MIN)>>6;//平均值=(总和-MIN-MAX)/8,参考电压为2.048,
210 1 //AD精度为12位(4096),实际值是测量值的2.5倍
211 1 //实际电压100倍为: (2094*(X)/4096)*2.5/10;
212 1 return(SUM);
213 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 573 ----
CONSTANT SIZE = 3 ----
XDATA SIZE = 160 4
PDATA SIZE = ---- ----
DATA SIZE = 22 16
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -