嵌入式||ADC程序设计(4)

一、实验目的:

学习利用LPC2138的ADC通道来采集外部的电压值,掌握LPC2138中ADC的配置与使用。

二、实验设备:

预装了keil及proteus的PC机。

三、实验内容

LPC2138有4路10位AD,两个控制寄存器,通过AD对外部电压进行AD采样,然后利用SPI接口对采样回来的数据进行显示,并将转换结果通过UART发给上位机进行显示。

首先设置需要显示的数组,使用PINSEL0、PINSEL1寄存器设置串口0的连接端口,使用IO0DIR设置74HC595的控制口,初始化串口0,使用U0LCR、U0DLM、U0DLL、U0LCR寄存器设置波特率,初始化SPI接口,设置SPI的时钟分频、接口模式。

其次对ADC模块进行设置,通过移位设置寄存器ADCR选择通道0,设置转换时钟,利用软件进行转换操作,使用时钟转换,工作模式为非掉电转换模式、非测试模式、直接启动ADC转换,使用引脚下降沿触发ADC转换,读取ADC结果,并清除DONE标志位,切换通道并进行第一次转换,等待转换结束,然后再次启动转换,读取ADC的结果,从串口中输出结果,分别输出个位、十位、百位、千位数据。

电路原理图如下图所示:

四、实验步骤:

  1. 任务一:使用keil编辑程序,生成hex文件,打开DSN文件,把hex文件加入到微控制器中,观察显示的数值是否符合实验要求。
  2. 任务二:改变滑动电阻的值改变电压,观察显示数值是否有变化
  3. 实验要求:
  4. 根据实验任务要求,编写源程序;
  5. 上机调试程序。

六.实验结果

#include "config.h"
#define  HC595_CS       (1<<29)      /* P0.29口为74HC595的片选 */
#define  UART_BPS	9600		     /* 定义通讯波特率 */
/****************************************************************************
* 名称:Delayms()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  Delayms(uint32  dly)
{
   uint32  i;
   for(; dly>0; dly--)
   for(i=0; i<50000; i++);
}
#define S0SPCR           (*((volatile unsigned char *) 0xE0020000))      /* no in lpc210x*/
#define S0SPSR           (*((volatile unsigned char *) 0xE0020004))      /* no in lpc210x*/
#define S0SPDR           (*((volatile unsigned char *) 0xE0020008))      /* no in lpc210x*/
#define S0SPCCR          (*((volatile unsigned char *) 0xE002000C))      /* no in lpc210x*/
/****************************************************************************
* 名称:UART0_Init()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  UART0_Init(void)
{
   uint16  Fdiv;

   U0LCR = 0x83;		             // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;           // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;						
   U0LCR = 0x03;
}
				
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{

  U0THR = data;				     // 发送数据
  while( (U0LSR&0x40)==0 );	             // 等待数据发送完毕
}

/****************************************************************************
* 名称:ISendStr()
* 功能:向PC机发送字串,以便显示。
* 入口参数:str      要发送的字符串,字串以'\0'结束
* 出口参数:无
****************************************************************************/
void  ISendStr(char *str)
{  while(1)
   {  if(*str=='\0') break;                  // 若为'\0',则退出
      UART0_SendByte(*str++);                // 发送显示数据
   }
}
#if 1
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  MSpiIni(void)
{
   S0SPCCR = 0x52;			     // 设置SPI时钟分频
   S0SPCR = 0x20;		             // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}

/****************************************************************************
* 名称:MSendData()
* 功能:向SPI总线发送数据。
* 入口参数:data        待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
uint8  MSendData(uint8 data)
{
   uint8 temp = S0SPDR;

   IO0CLR = HC595_CS;			        // 片选

   S0SPDR = data;
   while( 0==(S0SPSR&0x80) );		        // 等待SPIF置位,即等待数据发送完毕

   IO0SET = HC595_CS;
   return(S0SPDR);
}
#endif

/* 此表为0--F的字模 */
uint8 const DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                             0x88,0x83,0xC6,0xA1,0x86,0x8E
	                   };	

/****************************************************************************
* 名称:main()
* 功能:进行通道1电压ADC转换,并把结果转换成电压值,然后发送到串口,并用LED进行显示。
* 说明:在CONFIG.H文件中包含stdio.h。
****************************************************************************/
 int main(void)
{
   uint32  ADC_Data;
   char    str[20];
   PINSEL0 = 0x00001505;            			 // 设置P0.0、P0.1连接到UART0的TXD、RXD
   PINSEL1 = 0x01000000;		        	 // 设置P0.28连接到AIN1
   IO0DIR = HC595_CS;				         // 设置HC595_CS控制口为输出
   UART0_Init();					 // 初始化UART0
   MSpiIni();                                            // 初始化SPI接口

   /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
   ADCR = (1 << 1)                    |		 // 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转换)
   Delayms(10);								
   ADC_Data = ADDR;					 // 读取ADC结果,并清除DONE标志位

   while(1)
   {
      ADCR = (ADCR&0xFFFFFF00)|0x02|(1 << 24);	 // 切换通道并进行第一次转换
      while( (ADDR&0x80000000)==0 );			 // 等待转换结束
      ADCR = ADCR | (1 << 24);			 // 再次启运转换
      while( (ADDR&0x80000000)==0 );
      ADC_Data = ADDR;					 // 读取ADC结果
      ADC_Data = (ADC_Data>>6) & 0x3FF;
      ADC_Data = ADC_Data * 3300;
      ADC_Data = ADC_Data / 1024;
      sprintf(str, "VIN1=%4dmV \r\n", ADC_Data);
      ISendStr(str);                                     // 从串口中输出结果
      MSendData(~DISP_TAB[ADC_Data % 10]);	         //  发送显示数据个位
      MSendData(~DISP_TAB[ADC_Data % 100 / 10]);	         //  发送显示数据十位
      MSendData(~DISP_TAB[ADC_Data % 1000 / 100]);	 //  发送显示数据百位
      MSendData(~DISP_TAB[ADC_Data / 1000 % 10]);	 //  发送显示数据千位
      Delayms(200);

	  }
}

相关推荐

  1. 嵌入硬件】ADC(模数转换器)

    2024-07-15 14:14:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 14:14:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 14:14:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 14:14:04       58 阅读
  4. Python语言-面向对象

    2024-07-15 14:14:04       69 阅读

热门阅读

  1. 【并发编程】CPU & IO 密集型

    2024-07-15 14:14:04       17 阅读
  2. python中逻辑运算符and 和 or 的优先级问题。

    2024-07-15 14:14:04       21 阅读
  3. Android 中处理 RGB24 格式数据

    2024-07-15 14:14:04       24 阅读
  4. Teamhelper现已兼容20余款主流AR硬件

    2024-07-15 14:14:04       19 阅读
  5. Spring MVC-07

    2024-07-15 14:14:04       22 阅读
  6. KeyCode键盘按键码表

    2024-07-15 14:14:04       25 阅读
  7. Buffer模块(nodejs)

    2024-07-15 14:14:04       22 阅读
  8. XML 编辑器:功能、选择与使用技巧

    2024-07-15 14:14:04       21 阅读
  9. 代码随想录算法训练营Day69|自我总结

    2024-07-15 14:14:04       31 阅读
  10. 数据库隔离级别RC,什么场景会有间隙锁?

    2024-07-15 14:14:04       26 阅读
  11. 深度学习-2-TensorFlow和PyTorch深度学习框架的选择

    2024-07-15 14:14:04       19 阅读
  12. DangerWind-RPC-framework---六、负载均衡

    2024-07-15 14:14:04       20 阅读