⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 ARM7 LPC2103的ADC驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**
**                                   北天星国际有限公司
**                                 http://www.po-star.com
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**文件名称:ADC.C
**功能:对输入的模拟信号进行10位AD转换,送高8位转换结果到串口打印。
        转动电位器R31可以看见结果随着输入电压的变化发生变化。
**说明:将JP9短接。电位器逆时针转分压变小,AD值也变小,直到0X00;
        顺时针转分压变大,AD值变大,直到0XFF.
***********************************************************************************/

#include "..\inc\config.h"
#define UART_BPS 9600

/******************************延时***************************************/
void Delay(U32 dly)
{
  U32 i;
  for(;dly>0;dly--)
    for(i=0;i<50000;i++);
}

/**********************串口0初始化****************************************/
void UART0_Init ()		
{
   U16 Fdiv;

   U0LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16)/ UART_BPS;           // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;	
   U0LCR = 0x03;
}

/**********************向串口0一发送个字节的数据****************************************/
void UART0_SendByte ( U8 data)
{
  U0THR = data;			          // 发送数据
  while( (U0LSR&0x40)==0 );	          // 等待数据发送完毕
}

/***************************向串口0发送字符串*********************************/
void  UART0_PutString(char *str)
{
  while(*str !='\0')
  {
    UART0_SendByte(*str++);
  }
}
/*************************PLL设置************************************************/
void PLL_Init(void)
{
  /* 设置系统各部分时钟 */
	   PLLCON = 1;
	#if ((Fcclk / 4) / Fpclk) == 1
		VPBDIV = 0;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 2
		VPBDIV = 2;
	#endif
	#if ((Fcclk / 4) / Fpclk) == 4
		VPBDIV = 1;
	#endif
	#if (Fcco / Fcclk) == 2
		PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
	#endif
	#if (Fcco / Fcclk) == 4
		PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
	#endif
	#if (Fcco / Fcclk) == 8
		PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
	#endif
	#if (Fcco / Fcclk) == 16
		PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
	#endif
		PLLFEED = 0xaa;
		PLLFEED = 0x55;
		while((PLLSTAT & (1 << 10)) == 0);
		PLLCON = 3;
		PLLFEED = 0xaa;
		PLLFEED = 0x55;	
}
/**********************主函数****************************************/
void main(void)
{
  U32 ADC_Data;
  const U32 ADC_CR=
        ( 1 << 0 ) | 				// SEL = 1 ,选择通道0
	( ( Fpclk / 1000000 - 1 ) << 8 ) |  	// CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
	( 0 << 16 ) | 				// BURST = 0 ,软件控制转换操作
	( 2 << 17 ) |  				// CLKS = 0 ,使用11clock转换
	( 1 << 21 ) |  				// PDN = 1 , 正常工作模式(非掉电转换模式)
	( 0 << 22 ) |  				// TEST1:0 = 00 ,正常工作模式(非测试模式)
	( 1<< 24 ) |  				// START=1,启动转换
        ( 0 << 27 );
  PINSEL0=0x00000005;
  PINSEL1=(3<<12)|0x00;
  PLL_Init();
  UART0_Init();
  UART0_PutString(" \nAD Convert\n\r");

  while(1)
  {
    AD0CR = ADC_CR;
    do{}while((AD0GDR&0x80000000)==0);

    ADC_Data=AD0DR0;
    AD0DR0=ADC_Data;
    ADC_Data=(ADC_Data>>6)&0x3ff;               //得到二进制结果 ,10bits
    ADC_Data>>=2;                               //只要八位准备输出;
    UART0_SendByte(ADC_Data&0xff);
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -