📄 ad.lst
字号:
C51 COMPILER V7.50 AD 11/08/2005 00:06:18 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN AD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AD.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*------------------------------------------------------------------------------
2 AD8Input.C: MSC 1210 A/D Conversion for 8 single ended channels.
3 Uses 0-5V on inputs AIN0 to AIN7 and AINCOM = 2.5V.
4
5 Copyright 2003 Keil Software, Inc.
6 ------------------------------------------------------------------------------*/
7
8 #include <REG1210.H>
9 #include <stdio.h>
10 #include "bin.h"
11 #include "ad.h"
12 #include "comm.h"
13
14
15 #define LSB 298.0232e-9 /* LSB=5.0/2^24 */
16 #define ALPHA 2664.7 /* derived for some devices */
17 #define alf 117.4532
18
19 #define XTAL 18432000 //6000000 XTAL frequency
20
21 // defines for A/D Converter setup
22 #define A_CLK ((XTAL/1000000)-1) // about 1MHz Analog Clock
23 #define ANA_CLK (XTAL/(A_CLK+1)) // precise Analog Clock
24 #define DECIMATION (ANA_CLK/64/10) // 10 Hz Decimation
25 #define CONV_FREQ (ANA_CLK/64/DECIMATION) // Conversion Frequency
26
27 // defines for conversion to Volts
28 #define fV (0xFFFFFF00UL/5) // Factor for Volts caluculation
29 #define fmV ((fV << 2) / 1000) // Factor for mVolts
30 #define fuV ((fmV << 10) / 1000) // Factor for uVolts
31
32 // Helper structure to read in ADC values
33 union
34 {
35 unsigned char c[4]; // bytes
36 unsigned long l; // unsigned long
37 } res;
38
39
40 unsigned char ad_chan=0;
41
42 float AD8Input(void)
43 {
44 1 unsigned char k, V;
45 1 unsigned int mV, uV;
46 1 // Repeat Conversions Forever
47 1
48 1 // Read Input Volatage
49 1 for (k=0; k<5; k++) // ignore 4 conversions for filter to settle after calibration
50 1 {
51 2 while (!(AIE & 0x20)); // Wait for data ready
52 2 res.c[0] = ADRESH ^ 0x80; // Invert the Most significant bit (only positiv inputs)
53 2 res.c[1] = ADRESM;
54 2 res.c[2] = ADRESL;
55 2 res.c[3] = 0;
C51 COMPILER V7.50 AD 11/08/2005 00:06:18 PAGE 2
56 2 }
57 1
58 1 // printf ("%3bd %7d %3dHz ", chan, (int) DECIMATION, (int) CONV_FREQ);
59 1 // printf ("0x%06lX ", (res2.l >> 8));
60 1
61 1 // Convert Result to Volts
62 1 V = res.l / fV; // Volts part
63 1 res.l %= fV;
64 1 res.l <<= 2;
65 1
66 1 mV = res.l / fmV; // Millivolts part
67 1 res.l %= fmV;
68 1 res.l <<= 10;
69 1
70 1 uV = res.l / fuV; // Microvolts part
71 1 // printf ("%bd.%03d%03d\n", V, mV, uV);
72 1 // printf ("V= %f \n",V + (float)mV/1000 + (float)uV/1000000);
73 1
74 1 // ADMUX = (chan<<4) | 8; // AINP = chan, AINN = AINCOM
75 1 return (V + (float)mV/1000 + (float)uV/1000000);
76 1 }
77
78
79
80
81
82 void AD_INIT(void)
83 {
84 1 CKCON = 0; // 0 MOVX cycle stretch CKCON 时钟控制
85 1 PDCON = 0x14; // PDCON MSC1210 外围模块控制寄存器
86 1
87 1 // Setup ADC
88 1 // ADMUX = 0x08; // (AIN+ = AIN0), (AIN- = AINCOM) Voltage from DAC
89 1 ACLK = A_CLK; // set ACLK factor for about 1MHz
90 1 ADCON0 = 0x30; //B0011_0000; // Vref On, Vref Hi, Buff off, BOD off, PGA
91 1
92 1 ADCON2 = DECIMATION & 0xFF; // LSB of decimation
93 1 ADCON3 =(DECIMATION>>8) & 0x07; // MSB of decimation
94 1 ADCON1 = 0x01; // bipolar, auto, self calibration (offset, gain)
95 1 ADMUX = (ad_chan<<4) | 8; // AINP = chan, AINN = AINCOM
96 1 }
97
98
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 316 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 5
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 + -