📄 0.lst
字号:
C51 COMPILER V7.20 0 08/20/2007 10:05:09 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE 0
OBJECT MODULE PLACED IN 0.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 0.c ROM(COMPACT) REGFILE(.\power.ORC) BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 /************************************************************************************
2 * Copyright (c) 2007,Hangzhou Fenghe Shiyou Electronics Co.,Ltd
3 * All rights reserved.
4 * name: MAIN.C
5 * applicable component: C8051F350
6 * author: caixinlin
7 * edition: C
8 * amend data: 2007年8月18日
9 * complete data: 2007年月日
10 * 程序运行效果: 浅侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大
11 都控制在3.536-3.746
12 深侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大
13 都控制在3.487-3.556
14 输入波动太大,希望平滑上升或下降。控制速度比较慢
15 解决:电阻率将为50时,电流值超过5V的情况
16 *************************************************************************************/
17 #include "C8051F350.h"
18 #include "STDIO.h"
19 #include "math.h"
20 #include "string.h"
21
22 /*全局常量定义*/
23 #define uchar unsigned char
24 #define uint unsigned int
25 #define ul unsigned long
26 #define a 8
27 #define N 8
28 // #define k 89
29 // #define k_lld 89
30 // #define k_lls 126
31 #define c 300
32 #define b 300
33 #define e_h_area 2440
34 #define e_l_area 6
35 #define i_h_area 2440
36 #define i_l_area 6
37
38 ul data ADC[4];
39 ul data ADt[4];
40 ul data DATA_lld;
41 ul data DATA_lld_out;
42 uchar data X;
43 ul data DATA_lls;
44 ul data DATA_lls_out;
45 uint data ABSA;
46 uint data ABSB;
47
48 bit lab_d; // lld 阈值
49 bit lab_s; // lls 阈值
50 bit XXD; // lld dac current control (1:2.0mA 0:0.25mA)
51 bit XXS; // lls dac current control (1:2.0mA 0:0.25mA)
52
53 void DelayMs(uint n);
54 void SYSCLK_Init (void);
55 void PORT_Init (void); // I/O端口初始化
C51 COMPILER V7.20 0 08/20/2007 10:05:09 PAGE 2
56 void ADC0_Init (void); // ADC0初始化
57 void DAC_Init (void); // DAC初始化
58 void ADC0_Conver (void);
59 void DAC0_Out_mV(uint v);
60 void DAC1_Out_mV(uint v);
61 void t0_ini();
62 void t0_rst();
63
64
65 void DelayMs(uint n) //delay
66 {uint i;
67 1 for(; n > 0; n--)
68 1 {for(i = 400; i > 0; i--);}
69 1 }
70
71 void SysClk_Init(void) // 配置系统时钟
72 {OSCICN = 0x82; // enable intosc SYSCLK=12.25MHZ
73 1 CLKSEL = 0x00; // select intosc as sysclk source
74 1 }
75
76 void System_Init (void) // 配置系统时钟
77 { VDM0CN = 0x81; // enable VDD monitor
78 1 RSTSRC = 0x02; // enable VDD monitor reset sources
79 1 ADC0CN = 0x00; // 单极性 PGA=1
80 1 }
81
82 void PORT_Init (void)
83 { P0MDIN = 0x00; // P0 全部设置为模拟输入P0MDIN= 0xF3;//P0.2 P0.3设置模拟输入
84 1 P1MDIN = 0x03; // P1.6 P1.7设置模拟输入 P1.0 P1.1设置数字输入
85 1 P0MDOUT = 0x00; // P0.4设置输出
86 1 P1MDOUT = 0xC0; // P1.6,P1.7设置为推挽方式(输出)P1MDOUT = 0x30;//P1.4 P1.5设置输出
87 1 P0SKIP = 0x0C; // P0全部跳过 P0SKIP= 0x0C;//跳过P0.2 P0.3
88 1 P1SKIP = 0XC0; // P1.6 P1.7跳过
89 1 XBR0 = 0x00; // UART TX0, RX0 连到端口引脚 P0.4 和 P0.5
90 1 XBR1 = 0x00; // T0连到端口引脚
91 1 }
92
93 //-----------------------------------------------------------------------------
94 // ADC0_Init extVREF Unipolar AIN0.0-AIN0.3
95 //-----------------------------------------------------------------------------
96 // This function initializes the ADC to measure across AIN0.0 and AIN0.3
97 // on the Target Board (Differential measurements, Unipolar codes)
98 void ADC0_Init (void)
99 { //EA=0;
100 1 ADC0MD |= 0x81; // 全内部校准(偏移、斜率)
101 1 while (!AD0CALC); // 等待校准完成
102 1 DelayMs(2);
103 1 REF0CN |= 0x03; // (enable internal vref) 内部振荡器偏压,内部基准偏压 被使能 |:位或
104 1 // 内部振荡器偏压使能位由内部振荡器使能位决定
105 1 ADC0CN = 0x00; // 单极性 PGA=1
106 1 ADC0CF = 0x00; // interrupts upon SINC3 filter output and uses internal VREF ADC0CF:ADC0配置寄存
-器
107 1 // SINC3滤波器 使能内部电压基准(2.5V)
108 1 ADC0CLK= 4; // MDCLK = SYSCLK / (ADC0CLK + 1) MDCLK =2.4576MHZ
109 1 ADC0MD = 0x80; // 使能ADC0 ADC0=空闲模式 可以进行校准或转换
110 1 ADC0MUX= 0x08; // 选择AIN0作为ADC
111 1
112 1 ADC0DECL = 0X50; // set slowest OWR
113 1 ADC0DECH = 0X00; // set slowest OWR
114 1 ADC0STA = 0x00; // 清ADC0状态寄存器
115 1 EIE1 &= ~0x08; // 禁止ADC0中断(查询采样时使用)
116 1 // EA=1;
C51 COMPILER V7.20 0 08/20/2007 10:05:09 PAGE 3
117 1 }
118
119 void DAC_Init(void) // DAC初始化;
120 { REF0CN = 0x03; // 使用内部VREF发生器
121 1 IDA0CN = 0xF3; // 打开DAC0,设置模式 写IDA0触发DAC输出更新 满度输出电流2.0mA
122 1 IDA1CN = 0xF3; // 打开DAC1,设置模式,从VDD吸取的电流与IDA1输出字有关
123 1 }
124
125 void ADC0_Conver (void)
126 { ul temp;
127 1 uchar i,j,n;
128 1 ul voltage;
129 1 for(j=0;j<N;j++)
130 1 { for(i=0;i<4;i++)
131 2 {n = i<<4;
132 3 n &= 0xf0;
133 3 ADC0MUX = 0x08;
134 3 ADC0MUX |= n; // 选择AINx作为ADC
135 3 DelayMs(8);
136 3 AD0INT = 0; // 清除ADC转换完成标志
137 3 ADC0MD = 0x82; // startup conversion
138 3 while (!AD0INT); // wait conversion end
139 3 temp = ADC0H;
140 3 temp = (temp<<8) + ADC0M;
141 3 temp = (temp<<8) + ADC0L;
142 3 voltage = temp* 2450.0/16777215;
143 3 ADC[i] = voltage;
144 3 ADC[i] = (a-1)*ADC[i] +voltage;
145 3 ADC[i] = ADC[i]>>3;
146 3 }
147 2 }
148 1 }
149
150
151 void DAC0_Out_mV(uint v)
152 { float x;
153 1 x = v / 2000.0 * 255;
154 1 v = x;
155 1 if(XXS==1) IDA0CN = 0xF3;
156 1 if(XXS==0) IDA0CN = 0xF0;
157 1 IDA0 = v;
158 1 }
159
160 void DAC1_Out_mV(uint v)
161 { float x;
162 1 x = v / 2000.0 * 255;
163 1 v = x;
164 1 if(XXD==1) IDA1CN = 0xF3;
165 1 if(XXD==0) IDA1CN = 0xF0;
166 1 IDA1 = v;
167 1 }
168
169 void main(void)
170 { DATA_lld=0;
171 1 DATA_lls=0;
172 1 PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
173 1 SysClk_Init(); // 配置系统时钟
174 1 System_Init();
175 1 t0_ini();
176 1 PORT_Init();
177 1
178 1 // P1=0;
C51 COMPILER V7.20 0 08/20/2007 10:05:09 PAGE 4
179 1 DAC_Init();
180 1 EA=0;
181 1 ADC0_Init();
182 1 TF0=0;
183 1 EA=1;
184 1 t0_rst();
185 1
186 1 DATA_lld_out=0;
187 1 DATA_lls_out=0;
188 1 DATA_lld=0;
189 1 DATA_lls=0;
190 1 XXD=1;
191 1 XXS=1;
192 1
193 1 DATA_lls=b;
194 1 DAC0_Out_mV(DATA_lls);
195 1 DATA_lls_out=b;
196 1 DATA_lld=c;
197 1 DAC1_Out_mV(DATA_lld);
198 1 DATA_lld_out=c;
199 1 DelayMs(1); // delay 1ms
200 1
201 1 while(1)
202 1 {
203 2 uchar i;
204 2 EA=0;
205 2 ADC0_Conver(); // ADC conversion
206 2 TF0=0;
207 2 EA=0;
208 2 t0_rst();
209 2 ADC0MD = 0x00; // ADC处于禁止状态
210 2 for(i=0;i<4;i++) // 防止高温时,ADC输出不稳定值
211 2 {if((ADC[i]<(ADt[i]-5))||(ADC[i]>(ADt[i]+5)))
212 3 ADt[i]=ADC[i];}
213 2
214 2 DelayMs(1); // 延时1ms 330us
215 2 // P1=0xff;
216 2 // if((P1&0x03)==0x03)
217 2 t0_rst();
218 2
219 2 // lld control
220 2 if((ADt[0]<=30)&&(ADt[1]<=30))
221 2 DATA_lld=150;
222 2 else
223 2 { if(ADt[0]>ADt[1]) // ed>id low resistance rate
224 3 {ABSA=abs(ADt[0]-1750);
225 4 lab_d=0;
226 4 if(ABSA>=100) DATA_lld=DATA_lld_out*1750/ADt[0];
227 4 }
228 3 if(ADt[0]<=ADt[1]) // ed<id high resistance rate
229 3 {ABSA=abs(ADt[1]-1750);
230 4 lab_d=1;
231 4 if(ABSA>=100) DATA_lld=DATA_lld_out*1750/ADt[1];
232 4 }
233 3 }
234 2
235 2 if(XXD==1)
236 2 {if((XXD==1)&&(DATA_lld<=230))// 2.0MA--0.25MA
237 3 {DATA_lld*=8;
238 4 // x = DATA_lld_out* 255/ 2000.0 ;
239 4 // IDA1CN = 0xF0;
240 4 // IDA1 = x;
C51 COMPILER V7.20 0 08/20/2007 10:05:09 PAGE 5
241 4 XXD=0;
242 4 }
243 3 if((XXD==1)&&(DATA_lld>240))
244 3 {XXD=1;
245 4 // h = DATA_lld_out* 255/ 2000.0 ;
246 4 // IDA1CN = 0xF3;
247 4 // IDA1 = h;
248 4 }
249 3 }
250 2 else
251 2 {if((XXD==0)&&(DATA_lld<=1840))
252 3 {
253 4 // y = DATA_lld_out* 255/ 2000.0 ;
254 4 // IDA1CN = 0xF0;
255 4 // IDA1 = y;
256 4 XXD=0;
257 4 }
258 3 if((XXD==0)&&(DATA_lld>1920)) // 0.25MA--2MA
259 3 {
260 4 DATA_lld/=8;
261 4 // z = DATA_lld_out* 255/ 2000.0 ;
262 4 // IDA1CN = 0xF3;
263 4 // IDA1 = z;
264 4 XXD=1;
265 4 }
266 3 }
267 2
268 2 if(lab_d==1) X=4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -