📄 ad.lst
字号:
188 1 // 12MHz / 1
189 1 RSTSRC = 0x04; // enable missing clock detector
190 1 }
191
192 //-----------------------------------------------------------------------------
193 // PORT_Init
194 //-----------------------------------------------------------------------------
195 //
196 // Return Value: None
197 // Parameters: None
198 //
199 // Configure the Crossbar and GPIO ports.
200 // P0.4 - UART TX (push-pull)
201 // P0.5 - UART RX
202 // P2.4 - ADC0 analog input
203 // P2.2 - LED (push-pull)
204 //
205 //-----------------------------------------------------------------------------
206
207 void PORT_Init (void)
208 {
209 1 XBR0 = 0x01; // Enable UART0
210 1 XBR1 = 0x40; // Enable crossbar and weak pull-ups
211 1 P0MDOUT |= 0x10; // Set TX pin to push-pull
212 1 P2MDOUT |= 0x04; // enable LED as a push-pull output
213 1 P2MDIN &= ~0x10; // set P2.2 as an analog input
214 1 }
215
216 //-----------------------------------------------------------------------------
217 // Timer2_Init
218 //-----------------------------------------------------------------------------
219 //
220 // Return Value: None
221 // Parameters: None
222 //
223 // Configure Timer2 to 16-bit auto-reload and generate an interrupt at 100uS
224 // intervals. Timer 2 overflow automatically triggers ADC0 conversion.
225 //
226 //-----------------------------------------------------------------------------
227
228 void Timer2_Init (void)
229 {
230 1 TMR2CN = 0x00; // Stop Timer2; Clear TF2;
231 1 // use SYSCLK as timebase, 16-bit
232 1 // auto-reload
233 1 CKCON |= 0x10; // select SYSCLK for timer 2 source
234 1 TMR2RL = 65535 - (SYSCLK / 10000); // init reload value for 10uS
235 1 TMR2 = 0xffff; // set to reload immediately
236 1 TR2 = 1; // start Timer2
237 1 }
238
239 //-----------------------------------------------------------------------------
240 // ADC0_Init
241 //-----------------------------------------------------------------------------
C51 COMPILER V8.16 AD 11/12/2008 21:50:52 PAGE 5
242 //
243 // Return Value: None
244 // Parameters: None
245 //
246 // Configures ADC0 to make single-ended analog measurements on pin P2.4
247 //
248 //-----------------------------------------------------------------------------
249
250 void ADC0_Init (void)
251 {
252 1
253 1 AD0EN = 0; // ADC0 disabled, normal tracking,
254 1 // conversion triggered on TMR2 overflow
255 1
256 1 REF0CN = 0x03; // Enable on-chip VREF and buffer
257 1
258 1 AMX0P |= 0x1e; // ADC0 positive input = P2.4
259 1 AMX0N |= 0x1F; // ADC0 negative input = GND
260 1 // i.e., single ended mode
261 1
262 1 ADC0CF = ((SYSCLK/3000000)-1)<<3; // set SAR clock to 3MHz
263 1
264 1 ADC0CF |= 0x00; // right-justify results
265 1
266 1 //EIE1 |= 0x08; // enable ADC0 conversion complete int.
267 1
268 1 //AD0EN = 1; // enable ADC0
269 1 }
270
271 void ADC0_Conver(void)
272 {
273 1 AD0EN = 1; // enable ADC0
274 1 if(!AD0INT);
275 1 }
276 //-----------------------------------------------------------------------------
277 // UART0_Init
278 //-----------------------------------------------------------------------------
279 //
280 // Return Value: None
281 // Parameters: None
282 //
283 // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
284 //
285 //-----------------------------------------------------------------------------
286
287 void UART0_Init (void)
288 {
289 1 SCON0 = 0x10; // SCON0: 8-bit variable bit rate
290 1 // level of STOP bit is ignored
291 1 // RX enabled
292 1 // ninth bits are zeros
293 1 // clear RI0 and TI0 bits
294 1 if (SYSCLK/BAUDRATE/2/256 < 1) {
295 2 TH1 = -(SYSCLK/BAUDRATE/2);
296 2 CKCON |= 0x08; // T1M = 1; SCA1:0 = xx
297 2 } else if (SYSCLK/BAUDRATE/2/256 < 4) {
298 2 TH1 = -(SYSCLK/BAUDRATE/2/4);
299 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
300 2 CKCON |= 0x01;
301 2 } else if (SYSCLK/BAUDRATE/2/256 < 12) {
302 2 TH1 = -(SYSCLK/BAUDRATE/2/12);
303 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
C51 COMPILER V8.16 AD 11/12/2008 21:50:52 PAGE 6
304 2 } else if (SYSCLK/BAUDRATE/2/256 < 48) {
305 2 TH1 = -(SYSCLK/BAUDRATE/2/48);
306 2 CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
307 2 CKCON |= 0x02;
308 2 } else {
309 2 while (1); // Error. Unsupported baud rate
310 2 }
311 1
312 1 TL1 = TH1; // init Timer1
313 1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
314 1 TMOD |= 0x20;
315 1 TR1 = 1; // START Timer1
316 1 TI0 = 1; // Indicate TX0 ready
317 1 }
318
319 //-----------------------------------------------------------------------------
320 // Interrupt Service Routines
321 //-----------------------------------------------------------------------------
322
323 //-----------------------------------------------------------------------------
324 // ADC0_ISR
325 //-----------------------------------------------------------------------------
326 //
327 // This ISR averages 2048 samples then prints the result to the terminal. The
328 // ISR is called after each ADC conversion which is triggered by Timer2.
329 //
330 //-----------------------------------------------------------------------------
331 void ADC0_ISR (void) interrupt 10
332 {
333 1
334 1 static unsigned long accumulator = 0; // accumulator for averaging
335 1 static unsigned int measurements = 2048; // measurement counter
336 1 unsigned long result=0;
337 1 unsigned long mV; // measured voltage in mV
338 1
339 1 AD0INT = 0; // clear ADC0 conv. complete flag
340 1
341 1 accumulator += ADC0;
342 1 measurements--;
343 1
344 1 if(measurements == 0)
345 1 {
346 2 measurements = 2048;
347 2 result = accumulator / 2048;
348 2 accumulator=0;
349 2
350 2 // The 10-bit ADC value is averaged across 2048 measurements.
351 2 // The measured voltage applied to P1.4 is then:
352 2 //
353 2 // Vref (mV)
354 2 // measurement (mV) = --------------- * result (bits)
355 2 // (2^10)-1 (bits)
356 2
357 2 mV = result * 2440 / 1023;
358 2 printf("P2.4 voltage: %ld mV\n",mV);
359 2 }
360 1
361 1 LED = ~LED;
362 1 }
363
364
365 //-----------------------------------------------------------------------------
C51 COMPILER V8.16 AD 11/12/2008 21:50:52 PAGE 7
366 // End Of File
367 //-----------------------------------------------------------------------------
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 301 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 4
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 + -