文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>LPC2124 AD转换

LPC2124 AD转换

时间:2009-06-09  来源:creatory

  //LPC2124启动文件Startup.s: ; 启动文件,初始化C程序的运行环境,然后进入C程序代码。
 IMPORT    |Image$$RO$$Limit|
 IMPORT    |Image$$RW$$Base|
 IMPORT    |Image$$ZI$$Base|
 IMPORT    |Image$$ZI$$Limit|
 IMPORT    main      ; 声明C程序中的Main()函数
    CODE32 ; 声明32位ARM指令
    AREA    init,CODE,READONLY ; 声明代码段Start
 ENTRY ; 标识程序入口
Reset
 LDR       SP,=0x40003F00     ; 设置堆栈指针
 ; 初始化C程序的运行环境
 LDR       R0,=|Image$$RO$$Limit|
 LDR       R1,=|Image$$RW$$Base|   
 LDR       R3,=|Image$$ZI$$Base|   
 CMP       R0,R1
 BEQ       LOOP1
LOOP0  
 CMP       R1,R3;如果RW区不为空,将加载域的RW数据COPY到运行域     
 LDRCC     R2,[R0],#4    
 STRCC     R2,[R1],#4
 BCC       LOOP0
LOOP1  
 LDR       R1,=|Image$$ZI$$Limit|
 MOV       R2,#0
LOOP2  
 CMP       R3,R1;如果ZI区不为空,将ZI区域初始化为0
 STRCC     R2,[R3],#4
 BCC       LOOP2
 B      main ;跳转到c语言入口 Jump to the entry point of C program
 END
  //特殊寄存器定义文件lpc2124.h: #define ADCR            (*((volatile unsigned long *) 0xE0034000))      #define ADDR            (*((volatile unsigned long *) 0xE0034004))      //LM016L液晶显示模块文件lcd.h void ChkBusy()
{
 IO0DIR=0x700;
 while(1)
 {
  IO0CLR=rs;
  IO0SET=rw;
  IO0SET=en;
  if(!(IO0PIN & busy))break;
  IO0CLR=en;
 }
 IO0DIR=0x7ff;
}
void WC_Lcd(unsigned char dat)
{
 ChkBusy();
 IO0CLR=rs;  //全部清零
 IO0CLR=rw;
 IO0CLR=0xff;  //先清零
 IO0SET=dat;  //再送数
 IO0SET=en;
 IO0CLR=en;
}
void WD_Lcd(char dat) 
{
 ChkBusy();
 IO0SET=rs;
 IO0CLR=rw;
 IO0CLR=0xff;  //先清零
 IO0SET=dat;  //再送数
 IO0SET=en;
 IO0CLR=en;
}
void lcd_init(void)
{
 WC_Lcd(0x01); //显示模式设置,开始要求每次检测忙信号
 WC_Lcd(0x38); //关闭显示
 WC_Lcd(0x0f); //显示清屏
 WC_Lcd(0x06); // 显示光标移动设置
 WC_Lcd(0x0C); // 显示开及光标设置
}
void DispChar(unsigned char X, unsigned char Y, char DData)
  {
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; //算出指令码
 WC_Lcd(X); //这里不检测忙信号,发送地址码
 WD_Lcd(DData);
}
void DispString(unsigned char X, unsigned char Y, char *DData)
  {
 unsigned char StrLen;
 StrLen = 0;
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 while(DData[StrLen]!='\0') //若到达字串尾则退出
 {
   if (X <= 0xF) //X坐标应小于0xF
   {
     DispChar(X, Y, DData[StrLen]); //显示单个字符
  StrLen++;
  X++;
   }
 }
  }
int strlen(char s[])
{
int i=0;
while(s[i]!='\0')
i++;
return i;
}
//主程序文件main.c: void  DelayNS(uint32  dly)

    uint32  i;
    for(; dly>0; dly--)
    {
        for(i=0; i<5000; i++);
    }
}
int  main(void)

    uint32  ADC_Data;
     char str[16];
    lcd_init();
 IO0DIR=0x7ff;  //设置为输出
 IO0CLR=0x7ff;
    PINSEL1 = 0x01400000;      // 设置P0.27、P0.28连接到AIN0、AIN1
  
    /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
    ADCR =1                     |  // SEL = 1 ,选择通道0
           ((Fpclk / 1000000 ) << 8) |   // CLKDIV = Fpclk / 1000000 ,即转换时钟为1MHz
           (0 << 16)                    |  // BURST = 0 ,软件控制转换操作
           (0 << 17)                    |   // CLKS = 0 ,使用11clock转换
           (1 << 21)                    |   // PDN = 1 , 正常工作模式(非掉电转换模式)
           (0 << 22)                    |   // TEST1:0 = 00 ,正常工作模式(非测试模式)
           (1 << 24)                   ;       // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
    DelayNS(10);        
    ADC_Data = ADDR;       // 读取ADC结果,并清除DONE标志位
  
       while(1)
    { 
        ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24); // 设置通道1,并进行第一次转换
        while( (ADDR&0x80000000)==0 );             // 等待转换结束
        ADCR = ADCR | (1 << 24);     // 再次启运转换
        while( (ADDR&0x80000000)==0 );              // 等待转换结束
        ADC_Data = ADDR;       // 读取ADC结果
        ADC_Data = (ADC_Data>>6) & 0x3FF;           // 提取AD转换值
        ADC_Data = (ADC_Data * 3300)/1024;                 // 数值转换
      
        sprintf(str, "VIN1=%4dmV", ADC_Data);         
        DispString(0,0,str);
        DelayNS(1);
        ADCR = (ADCR&0x00FFFF00)|0x02|(1 << 24); // 设置通道2,并进行第一次转换
        while( (ADDR&0x80000000)==0 );       // 等待转换结束
        ADCR = ADCR | (1 << 24);     // 再次启运转换
        while( (ADDR&0x80000000)==0 );              // 等待转换结束
        ADC_Data = ADDR;       // 读取ADC结果
        ADC_Data = (ADC_Data>>6) & 0x3FF;           // 提取AD转换值
        ADC_Data = ADC_Data * 3300/1024;                 // 数值转换
      
        sprintf(str, "VIN2=%4dmV", ADC_Data);         
        DispString(0,1,str);
     DelayNS(1);
    }
  }
  
相关阅读 更多 +
排行榜 更多 +
飞艇大战

飞艇大战

飞行射击 下载
三维空间战斗机

三维空间战斗机

飞行射击 下载
战斗机教练

战斗机教练

飞行射击 下载