📄 new0.lst
字号:
C51 COMPILER V7.50 NEW0 04/01/2008 17:24:27 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE NEW0
OBJECT MODULE PLACED IN new0.OBJ
COMPILER INVOKED BY: I:\Keil\C51\BIN\C51.EXE new0.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //加定时器已完成 现在的采样频率为32Hz
2 //主体部分已经完成,Ka已经计算正确,给P2端口赋值能正确显示,但通过Ka给P2传递
3 //增益时,P2输出亦正确,调整PI算法已调整,振级表是使用自己编写的一个,P0输出
4 //正确了(实施办法是将P0赋值位置提前就解决了)
5 #include<stdio.h>
6 #include<aduc842.h>
7 #include<math.h>
8
9 #define KP 0.5//暂定Kp=5
10 #define KI 0.5//暂定Ki=5
11
12 sfr templ=0x86;
13 sfr temph=0x85;
14
15 void DELAY(int length);
16 void adc_chan(int chan);// 选择通道
17 void adc_ini();
18 void adc_start();
19 void config();
20 void uart_ini();
21 void dac_ini();
22 void port_ini();
23 //void TIC_ini();
24 //void TIC_start();
25 void readval();//读取AD转换值并转为10进制数子函数
26 void pi();//PI算法子程序
27 //float Lookuptab(unsigned char voltab);//查表子程序
28
29 int K;
30 int Kout1=0;//将Ka1值进行翻转准备输出到P0口
31 int Kout2=0;//将Ka2值进行翻转准备输出到P2口
32
33 int xdata num1[8];//用作暂时存储Ka1值以便今后进行翻转方便
34 //int xdata num2[8];//用作暂时存储Ka2值以便今后进行翻转方便
35 int xdata i;
36 int Ka1,Ka2;
37 int tempval;
38 float code Table[6]={1.0,2.0,3.0,4.0,5.0,6.0};//自己暂定的振级表,可以根据实际值修改
39 float UDA;//UDA为DAC0输出
40 float UIK=0;//UI的初值设为0
41 float xdata MK;//该值为采样的电压值
42 float RK;
43 float EK;
44 float UPK;
45 float UK;
46 //int xdata level1;
47 //int xdata level2;
48
49
50 void adc_int() interrupt 6 //ADC转换完,进入中断
51 {
52 1 I2CCON=0x0C8;//灯灭
53 1 DELAY(2000);
54 1 I2CCON=0x048;//灯亮
55 1 temph=ADCDATAH;
C51 COMPILER V7.50 NEW0 04/01/2008 17:24:27 PAGE 2
56 1 templ=ADCDATAL;//转换值暂存到temp中
57 1 ADCI = 0;//可要可不要,如果不进入ADC中断,则须用户手动清零
58 1 return;
59 1 }
60
61
62
63 void adc_chan(int chan)
64 {
65 1 ADCCON2 = chan;
66 1 }
67
68
69
70 void adc_ini()
71 {
72 1 ADCCON1 = 0x02C; // 暂停AD
73 1 EA = 0; // 中断不使能
74 1 EADC = 0; // ADC中断不使能
75 1
76 1 }
77
78 void adc_start()
79 {
80 1 ADCCON1 = 0x0AC; // 启动AD,使用内部参考电压
81 1 EA = 1; // 中断使能
82 1 EADC = 1; // ADC中断使能
83 1 }
84
85 void config()
86 {
87 1 CFG842 = 0x41; //暂定
88 1 PLLCON = 0x03; //工作频率=2.097152 MHz
89 1
90 1
91 1 }
92
93 void uart_ini() //串口初始化
94 {
95 1 T3CON = 0x083;
96 1 T3FD = 0x02D;
97 1 SCON = 0x052;
98 1 }
99
100 void dac_ini()
101 {
102 1 DACCON = 0x0D;//DAC0 12位异步 0-Cref=5v
103 1 //DACCON = 0x2D;//DAC0 12位异步 0-Vdd
104 1 }
105
106 void port_ini()//根据需要设置AD7520增益值
107 {
108 1 P0&=0x00;
109 1 P2&=0x00;
110 1 //P2|=0x64;//0110,0100
111 1 //P2|=0xC4;//1110,0101
112 1 }
113
114
115
116 void readval()
117 {
C51 COMPILER V7.50 NEW0 04/01/2008 17:24:27 PAGE 3
118 1
119 1 tempval=(int)temph*256;//强制转换为整形数
120 1 tempval+=(int)templ;//此时计算的是十进制的AD结果,比如若temph:templ=03ff,则对应于1023
121 1
122 1 }
123
124 /*float Lookuptab(unsigned char voltab)
125 {
126 return Table[voltab];
127 }
128 */
129 /*void pi()
130 {
131
132
133 //UDA=5;//UDA为方便计算设置的一个变量
134 //UK=UDA;//调试时先可直接把Uk=5v来计算,等到完成后在应用下面的PI算法
135 DELAY(500);
136 if(level2 == 0) {RK=Lookuptab(0);}
137 else if(level2 == 1) {RK=Lookuptab(1);}
138 else if(level2 == 2) {RK=Lookuptab(2);}
139 else if(level2 == 3) {RK=Lookuptab(3);}
140 else if(level2 == 4) {RK=Lookuptab(4);}
141 else {RK=Lookuptab(5);}//这段程序目的是查表确定振动的给定参考值以便与采集来的数据比
-较
142
143 EK=RK-MK2;
144 UPK=KP*EK;
145 UIK=KI*EK+UIK;
146 UK=UPK+UIK;
147 K=(UK/UDA*1024);//现将()内表达式的值取整,此值处理后即为送往AD7520的增益值,
148
149 Ka2=K>>2;//因为电路板上低两位已拉高,所以只需要高8位
150 Ka2=0x00;
151 //Ka&=0x00FF;//只用了低八位
152 //Ka = 0x0064;//为测试方便
153 MK1 = MK2;
154 level1 = level2;
155 }
156 */
157
158
159 void main(void)//主程序开始
160 {
161 1 DELAY(100);
162 1 config();
163 1 adc_ini();
164 1 adc_chan(0);
165 1 uart_ini();
166 1 dac_ini();
167 1
168 1 port_ini();//p0和p2的初始化
169 1 printf("P0=%02BX\n",P0);
170 1
171 1 //DELAY(2000);
172 1 //TIC_ini();
173 1 //DELAY(2000);
174 1 //P0&=0x00;//如果要调整P0口增益值,则打开此句
175 1 //DELAY(2000);
176 1 //P0|=0xFF;//第一级AD7520增益先设为不放大,即放大倍数为(1023/1024)
177 1 //DELAY(2000);
178 1 //printf("P0=%02BX\n",P0);
C51 COMPILER V7.50 NEW0 04/01/2008 17:24:27 PAGE 4
179 1 //printf("UIK=%f\n",UIK);
180 1 DAC0H=0x07;
181 1 DAC0L=0xFF;//AC0输出恒值2.5v
182 1 //i=0;
183 1 //adc_start();
184 1 //SCONV = 1; //启动AD转换
185 1 /////////////////初始化
186 1 for (i=0;i<8;i++)
187 1 {
188 2 num1[i] = 1;
189 2 }
190 1 MK=1.1;//初始设定值为1.1v
191 1 Ka1=0xFF;//初始化p0口的值
192 1 Ka2=0xFF;//初始化p2口的值
193 1 //Ka = 0x0064;//0110,0100 用于测试用,并不是实际值
194 1
195 1 //////////////////////////////初始化完成
196 1
197 1 while(1){ //连续进行AD转换
198 2
199 2 adc_start();
200 2 SCONV = 1; //开始一次转换
201 2 DELAY(1000); //调延迟,等待转换完毕
202 2 if (ADCI == 0) //中断处理完毕标志,进行输出
203 2 {
204 3 printf("temph=%02BX,templ=%02BX\n",temph,templ);//串口输出转换值
205 3 //printf("UIK=%f\n",UIK);
206 3
207 3 readval();
208 3 DELAY(500);
209 3 MK=(float)tempval*5/4096;//必须强制转换为浮点数,否则结果不对
210 3 //MK=2.5;
211 3
212 3 if(0<=MK&MK<=1) { Ka1=0x2A;}//Ka1的值未确定,暂时以0x00代替
213 3 else if(1<MK&MK<=2) { Ka1=0x55;}
214 3 else if(2<MK&MK<=3) { Ka1=0x80;}
215 3 else if(3<MK&MK<=4) { Ka1=0xAB;}
216 3 else if(4<MK&MK<=5) { Ka1=0xD5;}
217 3 else { Ka1=0xFF;}//这段程序目的是查表确定振动的给定参考值以便与采集来的数据比较
218 3
219 3
220 3 printf("MK=%f\n",MK);
221 3 //printf("RK=%f\n",RK);
222 3 //printf("EK=%f\n",EK);
223 3 //printf("UPK=%f\n",UPK);
224 3 //printf("UIK=%f\n",UIK);
225 3 //printf("UK=%f\n",UK);
226 3 //printf("K=%04X\n",K);
227 3 printf("Ka1=%04X\n",Ka1);
228 3
229 3 /////将Ka值进行翻转并输出到P0口
230 3 //方法一
231 3
232 3 num1[0]=Ka1&0x01;
233 3 num1[1]=Ka1&0x02;
234 3 num1[2]=Ka1&0x04;
235 3 num1[3]=Ka1&0x08;
236 3 num1[4]=Ka1&0x10;
237 3 num1[5]=Ka1&0x20;
238 3 num1[6]=Ka1&0x40;
239 3 num1[7]=Ka1&0x80;
240 3
C51 COMPILER V7.50 NEW0 04/01/2008 17:24:27 PAGE 5
241 3 for (i=0;i<8;i++)
242 3 {
243 4 if (num1[i]==pow(2,i))
244 4 num1[i]=1;
245 4 else num1[i]=0;
246 4 }
247 3 Kout1 = 0;
248 3 for (i=0;i<8;i++)
249 3 {
250 4
251 4 Kout1 +=pow(2,(7-i))*num1[i];
252 4 }
253 3 P0 = Kout1; //本应该为此句,再次利用下句做以简单替代用于测试
254 3 Kout2 = Ka2;
255 3 P2 = Kout2;
256 3
257 3
258 3 //P2|=Ka;//正式给端口赋值,产生AD7520增益
259 3 //P2^=Ka;//正式给端口赋值,产生AD7520增益
260 3 DELAY(500);
261 3 printf("P2=%02BX\n",P2);//显示P2口置位是否正确
262 3 printf("P0=%02BX\n",P0);
263 3 printf("num1[0]=%d\n",num1[0]);
264 3 printf("num1[1]=%d\n",num1[1]);
265 3 printf("num1[2]=%d\n",num1[2]);
266 3 printf("num1[3]=%d\n",num1[3]);
267 3 printf("num1[4]=%d\n",num1[4]);
268 3 printf("num1[5]=%d\n",num1[5]);
269 3 printf("num1[6]=%d\n",num1[6]);
270 3 printf("num1[7]=%d\n\n",num1[7]);
271 3 DELAY(1000);
272 3
273 3
274 3 }
275 2 }
276 1 }
277
278 void DELAY(int length)//延迟函数
279 {
280 1 while (length >=0)
281 1 length--;
282 1 }
283
284
285
286
287
288
289
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1459 ----
CONSTANT SIZE = 183 ----
XDATA SIZE = 22 ----
PDATA SIZE = ---- ----
DATA SIZE = 36 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -