大家好!我在学习LPC2103,现学到AD转换了,现发现转换不了,恳求大家帮我一下。我的QQ是909424781
/* 我的第五个ARM程序(不带操作系统的应用程序) 采用ISP方法烧录。 测试ADC功能的,P0.15脚(接LED-极) 转换结果大于设定阀值时点亮LED */
#include "LPC2103.h"
//使用P15脚 #define gled 1<<15
#define Fosc 11059200 #define Fcclk (Fosc * 4) #define Fcco (Fcclk * 4) #define Fpclk (Fcclk / 4) * 1
void DelayNS(unsigned int dly);//延时
void gledonoff(unsigned int cnt);//闪亮LED
int main() {
unsigned int ADC_Data;
//初始化端口P0.22为AN0(AD转换口) PINSEL1|=(0x03<<12);
//初始化端口P15为GPIO输出功能 IODIR|=(1<<15);
//初始化端口P15输出高电平 IOSET|=(1<<15);
//进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) ADCR = (1 << 0) | // SEL = 1 ,选择通道0 ((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz (0 << 16) | // BURST = 0 ,软件控制转换操作 (0 << 17) | // CLKS = 0 ,使用11clock转换 (1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式) (0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式) (1 << 24) | // START = 1 ,直接启动ADC转换 (0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADC_Data = ADGDR; // 读取ADC结果,并清除DONE标志位 while(1) { ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24); // 设置通道1,并进行第一次转换
while((ADGDR&0x80000000)==0); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while((ADGDR&0x80000000)==0); // 等待转换结束
ADC_Data = ADGDR; // 读取ADC结果
ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值
ADC_Data = ADC_Data * 3300/1024; // 数值转换
if (ADC_Data>0) {gledonoff(0x2000);} //大于阀值时闪亮LED } }
void gledonoff(unsigned int cnt) {
unsigned int j;
IOCLR=gled;
for (j=0;j<cnt;j++) ;
IOSET=gled;
for (j=0;j<0x2000;j++) ; }
void DelayNS(unsigned int dly) { unsigned int i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } }
|