📄 adc1_temp.lst
字号:
C51 COMPILER V7.50 ADC1_TEMP 12/05/2005 13:53:36 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE ADC1_TEMP
OBJECT MODULE PLACED IN ADC1_TEMP.OBJ
COMPILER INVOKED BY: C:\KEIL750\C51\BIN\C51.EXE ADC1_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 NCDdata[3]={0x30,0x30,0x30};
55 unsigned char result;
C51 COMPILER V7.50 ADC1_TEMP 12/05/2005 13:53:36 PAGE 2
56 unsigned char *lcdpoint; //指向 lcddata数组的指针
57 unsigned char lcd_data_count; //要显示的数据个数
58
59 void main (void) {
60 1 unsigned int temperature,x;
61 1 unsigned char data1;
62 1
63 1 WDTCN = 0xde; // disable watchdog timer
64 1 WDTCN = 0xad;
65 1
66 1 SYSCLK_Init (); // initialize oscillator
67 1 PORT_Init (); // initialize crossbar and GPIO
68 1 UART0_Init (); // initialize UART0
69 1 Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
70 1 // sample rate
71 1
72 1 ADC1_Init (); // init ADC
73 1
74 1 AD0EN = 1; // enable ADC
75 1
76 1 EA = 1;
77 1 while(result==0); //等于0,侧等待
78 1 while (1) {
79 2 EA = 0; // 关中断
80 2 temperature = result;
81 2 temperature&=0x00ff;
82 2 //LCD显示数据处理
83 2
84 2 NCDdata[0]=result/100+0x30;
85 2 NCDdata[1]=(result%100)/10+0x30;
86 2 NCDdata[2]=(result%100)%10+0x30;
87 2 EA = 1; //开中断
88 2 //转换为实际温度数据
89 2 printf ("Temperature is %u\n", temperature);//把温度数据通过串口发送至PC机
90 2
91 2 LCD_Init(); //LCD初始化
92 2 P2 = 0xA0; //准备送数据
93 2 lcdpoint=&NCDdata; //取地址
94 2 for(lcd_data_count=3;lcd_data_count>0;lcd_data_count--)
95 2 {
96 3 data1=*lcdpoint; //读出数据
97 3 P3 = data1; //写数据到端口
98 3 P2 = 0X20;
99 3 P2 = 0XA0; //控制LCD
100 3 lcdpoint++;
101 3 for(x=0;x<0x5000;x++);
102 3 }
103 2 for(data1=0;data1<50;data1++)
104 2 {
105 3 for(x=0;x<0xffff;x++)
106 3 {_nop_();}
107 3 }
108 2 }
109 1 }
110
111 //-----------------------------------------------------------------------------
112 // SYSCLK配置
113 //-----------------------------------------------------------------------------
114 // 配置系统时钟使用外部晶振22.1184MHz
115 void SYSCLK_Init (void)
116 {
117 1 int i; // delay counter
C51 COMPILER V7.50 ADC1_TEMP 12/05/2005 13:53:36 PAGE 3
118 1
119 1 OSCXCN = 0x67; // start external oscillator with
120 1 // 22.1184MHz crystal
121 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
122 1
123 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
124 1
125 1 OSCICN = 0x88; // select external oscillator as SYSCLK
126 1 // source and enable missing clock
127 1 // detector
128 1 }
129
130 //-----------------------------------------------------------------------------
131 // PORT配置
132 //-----------------------------------------------------------------------------
133 void PORT_Init (void)
134 {
135 1 XBR0 = 0x04; // Enable UART0
136 1 XBR1 = 0x00;
137 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
138 1 P1MDIN = 0xFE;
139 1 P0MDOUT |= 0x01; // enable TX0 as a push-pull output
140 1 P2MDOUT = 0xe0; // P2口设为推挽方式
141 1 P3MDOUT = 0xff; // P2口设为推挽方式
142 1 }
143
144 //-----------------------------------------------------------------------------
145 // UART0配置
146 //-----------------------------------------------------------------------------
147 // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
148 void UART0_Init (void)
149 {
150 1 SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
151 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
152 1 TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
153 1 TR1 = 1; // start Timer1
154 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
155 1 PCON |= 0x80; // SMOD00 = 1
156 1 TI0 = 1; // Indicate TX0 ready
157 1 }
158
159 //-----------------------------------------------------------------------------
160 // ADC0配置,T3定时启动ADC
161 //-----------------------------------------------------------------------------
162 void ADC1_Init (void)
163 {
164 1 ADC1CN = 0x82; // ADC0 T3定时采样
165 1 REF0CN = 0x07; // 启用内部基准源
166 1 AMX1SL = AMX0SL_AIN; // 选择采样输入源
167 1 ADC1CF = 0xB1; // PGA gain = 1,1MHz转换频率
168 1 EIE2 |= 0x08; // 启用 ADC 中断
169 1 }
170
171 //-----------------------------------------------------------------------------
172 // Timer3配置,T3定时启动ADC
173 //-----------------------------------------------------------------------------
174 void Timer3_Init (int counts)
175 {
176 1 TMR3CN = 0x02;
177 1 TMR3RL = -counts;
178 1 TMR3 = 0xffff;
179 1 EIE2 &= ~0x01;
C51 COMPILER V7.50 ADC1_TEMP 12/05/2005 13:53:36 PAGE 4
180 1 TMR3CN |= 0x04;
181 1 }
182
183 //-----------------------------------------------------------------------------
184 // ADC0采样中断
185 //-----------------------------------------------------------------------------
186 void ADC0_ISR (void) interrupt 17
187 {
188 1 static unsigned int_dec=INT_DEC;
189 1 static int accumulator=0L;
190 1
191 1 ADC1CN &= ~0x20; // 清 ADC 中断标志位
192 1
193 1
194 1 accumulator += ADC1; // 累加ADC采样数据
195 1 int_dec--; // 指针减1
196 1
197 1 if (int_dec == 0) { // 累加完了吗?
198 2 int_dec = INT_DEC; // 指针复位
199 2 result = accumulator>>8;
200 2 accumulator = 0; // 累加和变量清0
201 2 }
202 1 }
203 //LCD初始化
204 void LCD_Init(void)
205 {unsigned long x;
206 1 P2 = 0X80;
207 1 for(x=0;x<1000;x++);
208 1 //P7 = 0x30; /*一行显示*/
209 1 P3 = 0x38; /*两行显示*/
210 1 P2 = 0X00;//0x08;
211 1 P2 = 0X80;//0x09;
212 1 for(x=0;x<1000;x++);
213 1 P3 = 0x0e;
214 1 P2 = 0x00;
215 1 P2 = 0x80;
216 1 for(x=0;x<1000;x++);
217 1 P3= 0x06;
218 1 P2 = 0x00;
219 1 P2 = 0x80;
220 1 for(x=0;x<5000;x++);
221 1 P3 = 0x01;
222 1 P2 = 0x00;
223 1 P2 = 0x80;
224 1 for(x=0;x<5000;x++);
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 677 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 7
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 + -