STC单片机学习----ADC

来源:互联网 发布:四方软件论坛 编辑:程序博客网 时间:2024/05/20 09:48

今天上午学习了STC单片机的ADC,这里做个笔记,有两点:

1、ADC中断标志位,也就是ADC_CONTR的ADC_FLAG位。当ADC转换完成后,该位置1,若使能了ADC中断,则会进入ADC中断子函数。需要注意的是,ADC中断标志位需要软件清零,不像外总中断,定时器中断,会硬件清零。


2、ADC启动位,也就是ADC_CONTR的ADC_START位,在ADC转换完成后,该位会清零,也就是说,AD转换只进行一次。如果想要连续转换,则要在ADC中断子函数中再次启动ADC。



// 一些宏定义#define GPIO_Pin00x01#define GPIO_Pin10x02#define GPIO_Pin20x04#define GPIO_Pin30x08#define GPIO_Pin40x10#define GPIO_Pin50x20#define GPIO_Pin60x40#define GPIO_Pin70x80#define BIT00x01#define BIT10x02#define BIT20x04#define BIT30x08#define BIT40x10#define BIT50x20#define BIT60x40#define BIT70x80//ADC_CONTR寄存器的一些宏定义#define ADC_POWERBIT7#define ADC_SPEED_90Clock   (BIT6|BIT5)#define ADC_SPEED_180Clock  BIT6#define ADC_SPEED_360Clock  BIT5#define ADC_SPEED_540Clock  0x00#define ADC_FLAGBIT4#define ADC_STARTBIT3

ADC配置函数/* Includes ------------------------------------------------------------------*/#include "STC_NEW_8051.h"#include "STCSystemInit.h"#include "mySTC.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* Globale variables ---------------------------------------------------------*//* Private function prototypes -----------------------------------------------*//* Private functions ---------------------------------------------------------*/// ADC转换结果,全局变量volatile u16 gADCValue = 0;// ADC的配置和初始化void ADC_Configure(void){// 将P1.0配置为高阻输入 P1M1:P1M0 = 1:0P1M1 |= GPIO_Pin0;P1M0 &= ~GPIO_Pin0;// 将P1.0作为模拟功能AD使用P1ASF |= GPIO_Pin0;// ADRJ=0, 10位转换结果高8位放在ADC_RES,低2位放在ADC_RESLAUXR1 &= ~BIT2;// 复位,再配置ADC_CONTR = 0;// 最后那个零,表示从P1.0输入,如果是P1.5,直接改成5即可ADC_CONTR = ADC_POWER | ADC_SPEED_360Clock | ADC_START | 0;// 使能ADC中断,中断标志位在ADC_CONTR配置时已清零了EADC = 1;EA = 1;}void ADC_IRQHandler(void) interrupt IT_ADC{    // 清零ADC中断标志位(该位必须软件清零)    ADC_CONTR &= ~ADC_FLAG;    // 获取ADC转换结果    gADCValue = (ADC_RES << 2) | ADC_RESL;    // 转换结束后ADC_START变为0,若连续转换需要在这里再次启动ADC    ADC_CONTR |= ADC_START;}void ADC_Test(void){u16 temp = gADCValue;USART_SendByte(temp>>8);USART_SendByte((u8)temp);USART_SendByte(ADC_CONTR);gADCValue = 0;}


0 0