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