ADC 之前接触Mega16的时候对ADC已经已经有所了解。
ADC支持14位模数转换,包含一个多路转换器,8个可独立配置的通道、一个参考电压发生器。其特点如下:
1、可选的抽取率(采样频率);
2、8个独立输入通道,可接受单端或差分信号;
3、参考电压可选内部单端、外部单端、外部差分或AVDD5;
4、转换结束可触发中断;
5、转换结束可触发DMA;
6、片上温度传感器输入;
7、电池测量功能;
ADC输入:
1、单端输入:AIN7~AIN0分别对应P0_7~P0_0;
2、差分输入: 由AIN0~AIN1、 AIN2~AIN3、 AIN4~AIN5、 AIN6~AIN7组成,以通道号码12~15表示;
3、片上温度传感器输入:由控制器配置;
4、AVDD5/3输入:连接AVDD5/3引脚,通过AIN7检测外部电源电压;
这里主要运用了单端输入。
实际就是将模拟信号转换成数字信号的东东。
其中有序列转换和单次转换
ADC控制寄存器ADCCON1:
文章图片
判断ADC是否转换结束开启ADC转换…
ADC控制寄存器ADCCON2:
控制序列转换的
文章图片
ADC控制寄存器ADCCON3:
控制单次转换的
文章图片
单次转换只用到ADCCON3,与ADDCON2和ADDCON1无关
写入就启动了。
数据的保存
文章图片
共14位,ADCL的低两位需要注意:
#include
#include
#include "uart.h"
int counter=0;
#define uint unsigned int
#define uchar unsigned char #define LIGHT P0_5//定义P0_5口为光敏入端
#define LED1 P1_0//定义P1_0口为LED1控制端
#define LED2 P1_1//定义P1_1口为LED2控制端/**************************************************
函 数 名: IO_Init
功能描述: LED_IO初始化函数
输入参数: NONE
输出参数: NONE
返 回 值: NONE
***************************************************/
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
//消中断标志,可不清中断标志,硬件自动完成
IRCON = 0x00;
//200次中断LED闪烁一轮
if(counter<2300)//460 1s
counter++;
else
{
ADCCON3 = 0xb5;
//启动AD
counter=0;
} }
/**************************************************
函 数 名: timer3init
功能描述: TIMER3初始化函数
输入参数: NONE
输出参数: NONE
返 回 值: NONE
***************************************************/
void timer3init()
{
P1SEL|=0x08;
PERCFG&=~(1<<5);
//备用位置1
P2SEL|=(1<<5);
//定时器3优先 //T3CCTL0=~(1<<2);
T3CTL |= 0xE0;
//标记频率/128
T3CTL |= 0x04;
//清除计数器
T3CTL |= 0x10;
//启动定时器T3// T3CCTL1 |= 0x40;
//T2的通道1中断使
T3CTL |= 0x08;
//溢出中断使
IEN1 |= 0x08;
//T3中断使能
IEN0 |= 0x80;
//使能所有中断 }
void IO_Init(void)
{
P1DIR |= 0x03;
//P1端口定义为输出
LED1 = 0;
//点亮LED1
LED2 = 0;
//点亮LED2
}
/**************************************************
函 数 名: ADC_Init
功能描述: ADC初始化函数
输入参数: NONE
输出参数: NONE
返 回 值: NONE
***************************************************/
void ADC_Init(void)
{
ADCH = 0x00;
ADCL = 0x00;
//清空ADC数据寄存器
APCFG |= 0x20;
//P0_5端口模拟IO使能
}/**************************************************
函 数 名: Delayms
功能描述: 毫秒延时
输入参数: xms:延时时间,如 i=xms 即延时i毫秒
输出参数: none
返 回 值: none
***************************************************/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;
i>0;
i--)
for(j=587;
j>0;
j--);
}/**************************************************
函 数 名: main
功能描述: LED测试(通用IO的输出使用)
输入参数: NONE
输出参数: NONE
返 回 值: NONE
***************************************************/
void main ( void )
{
uint adc=0;
float num=0;
char data[2];
IO_Init ();
//调用初始化程序
ADC_Init();
uartinit();
clockinit();
timer3init();
Delayms ( 2000 );
//延时2swhile ( 1 )
{
LED1 = ~ LED1;
LED2 = ~ LED2;
if(ADCCON1 & 0x80)//等待转化完成
{
adc = ADCH << 6;
//读取、合并数据
ADCL=ADCL>>2;
adc |= ADCL;
if(adc & 0x8000)//度数不能为负,等同 adc<0
{
adc=0;
}
else
{
adc = adc >> 4;
//12位有效数字
num = adc * 3.3 / 4096;
//换算成电压;
num=num*10;
sprintf(data,"%d",num);
}
}
myprintf(data);
}}
【初步探讨Zigbee之外设ADC】END