📄 adc0_temp.lst
字号:
C51 COMPILER V7.50 ADC0_TEMP 12/05/2005 11:58:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE ADC0_TEMP
OBJECT MODULE PLACED IN ADC0_TEMP.OBJ
COMPILER INVOKED BY: C:\KEIL750\C51\BIN\C51.EXE ADC0_TEMP.c DB OE
line level source
1 /***************************************************************
2 功能:实现ADC采样芯片外的模拟电压,通过LCD显示,并通过串口(J13)发送到PC机
3 注:试验时把ADC0的工作基准VREF0(J7_5和J7_6或J7_2和J7_6)和LCD电源跳线(J18_1和J18_2)联接好!
4 作者:ZDP
5 时间:2005-11-30
6 版本:V1.0
7 用外部基准:
8 J7
9 NC 1 2 内部VREF
10 外部VREF 3 4 内部DAC工作基准输入
11 外部VREF 5 6 内部ADC0工作基准输入
12 外部VREF 7---8 内部ADC1工作基准输入
13 或用内部基准:
14 J7
15 NC 1 2- 内部VREF
16 外部VREF 3 4 | 内部DAC工作基准输入
17 外部VREF 5 6 | 内部ADC0工作基准输入
18 外部VREF 7 8- 内部ADC1工作基准输入
19 ***************************************************************/
20 #include <c8051f020.h> // SFR declarations
21 #include <stdio.h>
22 #include <INTRINS.H>
23 //-----------------------------------------------------------------------------
24 // 16-bit SFR Definitions for 'F02x
25 //-----------------------------------------------------------------------------
26
27 sfr16 DP = 0x82; // data pointer
28 sfr16 TMR3RL = 0x92; // Timer3 reload value
29 sfr16 TMR3 = 0x94; // Timer3 counter
30 sfr16 ADC0 = 0xbe; // ADC0 data
31 sfr16 ADC0GT = 0xc4; // ADC0 greater than window
32 sfr16 ADC0LT = 0xc6; // ADC0 less than window
33 sfr16 RCAP2 = 0xca; // Timer2 capture/reload
34 sfr16 T2 = 0xcc; // Timer2
35 sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
36 sfr16 T4 = 0xf4; // Timer4
37 sfr16 DAC0 = 0xd2; // DAC0 data
38 sfr16 DAC1 = 0xd5; // DAC1 data
39
40 #define BAUDRATE 115200 // Baud rate of UART in bps
41 #define SYSCLK 22118400 // SYSCLK frequency in Hz
42 #define SAMPLE_RATE 50000 // Sample frequency in Hz
43 #define INT_DEC 256 // integrate and decimate ratio
44 #define AMX0SL_AIN 8 // 0=AIN0....7=AIN7,8=TEMP
45
46 void SYSCLK_Init (void);
47 void PORT_Init (void);
48 void UART0_Init (void);
49 void ADC1_Init (void);
50 void Timer3_Init (int counts);
51 void ADC1_ISR (void);
52 void LCD_Init(void);
53
54 unsigned char xdata NCDdata[6]={0x30,0x30,0x30,0x2e,0x30,0x30};
55 long result;
C51 COMPILER V7.50 ADC0_TEMP 12/05/2005 11:58:45 PAGE 2
56 unsigned char *lcdpoint; //指向 lcddata数组的指针
57 unsigned char lcd_data_count; //要显示的数据个数
58
59 void main (void) {
60 1 long temperature,x;
61 1 int temp_int, temp_frac;
62 1 char data1;
63 1
64 1 WDTCN = 0xde; // disable watchdog timer
65 1 WDTCN = 0xad;
66 1
67 1 SYSCLK_Init (); // initialize oscillator
68 1 PORT_Init (); // initialize crossbar and GPIO
69 1 UART0_Init (); // initialize UART0
70 1 Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
71 1 // sample rate
72 1
73 1 ADC1_Init (); // init ADC
74 1
75 1 AD0EN = 1; // enable ADC
76 1
77 1 EA = 1;
78 1 while(result==0); //等于0,侧等待
79 1 while (1) {
80 2 EA = 0; // 关中断
81 2 temperature = result;
82 2 EA = 1; //开中断
83 2 //转换为实际温度数据
84 2 temperature = temperature - 42380;
85 2 temperature = (temperature * 100L) / 156;
86 2 temp_int = temperature / 100;
87 2 temp_frac = temperature - (temp_int * 100);
88 2 printf ("Temperature is %+02d.%02d\n", temp_int, temp_frac);//把温度数据通过串口发送至PC机
89 2 //在LCD上显示温度
90 2 //LCD显示数据处理
91 2
92 2 NCDdata[0]=temp_int/100+0x30;NCDdata[1]=(temp_int%100)/10+0x30;NCDdata[2]=(temp_int%100)%10+0x30;
93 2 NCDdata[4]=temp_frac/10+0x30;NCDdata[5]=temp_frac%10+0x30;
94 2
95 2
96 2 LCD_Init(); //LCD初始化
97 2 P2 = 0xA0; //准备送数据
98 2 lcdpoint=&NCDdata; //取地址
99 2 for(lcd_data_count=6;lcd_data_count>0;lcd_data_count--)
100 2 {
101 3 data1=*lcdpoint; //读出数据
102 3 P3 = data1; //写数据到端口
103 3 P2 = 0X20;
104 3 P2 = 0XA0; //控制LCD
105 3 lcdpoint++;
106 3 for(x=0;x<0x5000;x++);
107 3 }
108 2 for(data1=0;data1<0x6;data1++)
109 2 {
110 3 for(x=0;x<0xffff;x++)
111 3 {_nop_();}
112 3 }
113 2 }
114 1 }
115
116 //-----------------------------------------------------------------------------
117 // SYSCLK配置
C51 COMPILER V7.50 ADC0_TEMP 12/05/2005 11:58:45 PAGE 3
118 //-----------------------------------------------------------------------------
119 // 配置系统时钟使用外部晶振22.1184MHz
120 void SYSCLK_Init (void)
121 {
122 1 int i; // delay counter
123 1
124 1 OSCXCN = 0x67; // start external oscillator with
125 1 // 22.1184MHz crystal
126 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
127 1
128 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
129 1
130 1 OSCICN = 0x88; // select external oscillator as SYSCLK
131 1 // source and enable missing clock
132 1 // detector
133 1 }
134
135 //-----------------------------------------------------------------------------
136 // PORT配置
137 //-----------------------------------------------------------------------------
138 void PORT_Init (void)
139 {
140 1 XBR0 = 0x04; // Enable UART0
141 1 XBR1 = 0x00;
142 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
143 1 P1MDIN = 0xFE;
144 1 P0MDOUT |= 0x01; // enable TX0 as a push-pull output
145 1 P2MDOUT = 0xe0; // P2口设为推挽方式
146 1 P3MDOUT = 0xff; // P2口设为推挽方式
147 1 }
148
149 //-----------------------------------------------------------------------------
150 // UART0配置
151 //-----------------------------------------------------------------------------
152 // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
153 void UART0_Init (void)
154 {
155 1 SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
156 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
157 1 TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
158 1 TR1 = 1; // start Timer1
159 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
160 1 PCON |= 0x80; // SMOD00 = 1
161 1 TI0 = 1; // Indicate TX0 ready
162 1 }
163
164 //-----------------------------------------------------------------------------
165 // ADC0配置,T3定时启动ADC
166 //-----------------------------------------------------------------------------
167 void ADC1_Init (void)
168 {
169 1 ADC1CN = 0x82; // ADC0 T3定时采样
170 1 REF0CN = 0x07; // 启用内部基准源
171 1 AMX1SL = AMX0SL_AIN; // 选择采样输入源
172 1 ADC1CF = 0xB1; // PGA gain = 1,1MHz转换频率
173 1 EIE2 |= 0x08; // 启用 ADC 中断
174 1 }
175
176 //-----------------------------------------------------------------------------
177 // Timer3配置,T3定时启动ADC
178 //-----------------------------------------------------------------------------
179 void Timer3_Init (int counts)
C51 COMPILER V7.50 ADC0_TEMP 12/05/2005 11:58:45 PAGE 4
180 {
181 1 TMR3CN = 0x02;
182 1 TMR3RL = -counts;
183 1 TMR3 = 0xffff;
184 1 EIE2 &= ~0x01;
185 1 TMR3CN |= 0x04;
186 1 }
187
188 //-----------------------------------------------------------------------------
189 // ADC0采样中断
190 //-----------------------------------------------------------------------------
191 void ADC0_ISR (void) interrupt 17
192 {
193 1 static unsigned int_dec=INT_DEC;
194 1 static long accumulator=0L;
195 1
196 1 ADC1CN &= ~0x20; // 清 ADC 中断标志位
197 1
198 1
199 1 accumulator += ADC1; // 累加ADC采样数据
200 1 int_dec--; // 指针减1
201 1
202 1 if (int_dec == 0) { // 累加完了吗?
203 2 int_dec = INT_DEC; // 指针复位
204 2 result = accumulator >> 8;
205 2 accumulator = 0L; // 累加和变量清0
206 2 }
207 1 }
208 //LCD初始化
209 void LCD_Init(void)
210 {unsigned long x;
211 1 P2 = 0X80;
212 1 for(x=0;x<1000;x++);
213 1 //P7 = 0x30; /*一行显示*/
214 1 P3 = 0x38; /*两行显示*/
215 1 P2 = 0X00;//0x08;
216 1 P2 = 0X80;//0x09;
217 1 for(x=0;x<1000;x++);
218 1 P3 = 0x0e;
219 1 P2 = 0x00;
220 1 P2 = 0x80;
221 1 for(x=0;x<1000;x++);
222 1 P3= 0x06;
223 1 P2 = 0x00;
224 1 P2 = 0x80;
225 1 for(x=0;x<5000;x++);
226 1 P3 = 0x01;
227 1 P2 = 0x00;
228 1 P2 = 0x80;
229 1 for(x=0;x<5000;x++);
230 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 977 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = 6 ----
PDATA SIZE = ---- ----
DATA SIZE = 14 17
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V7.50 ADC0_TEMP 12/05/2005 11:58:45 PAGE 5
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -