Zigbee基础实验之ADC

/*******************************************************************************
*
*功能描述:通过ADC采样, 实现五向开关操作LED等亮灭
*          演示时,上左下右分别使一个LED亮
*          按中间 4个LED一起亮
*
*作者:Rfstorm studio QQ群:51109148
*
*时间:2010-12-7
*
********************************************************************************/
#include 


typedef signed   char   int8;
typedef unsigned char   uint8;

typedef signed   short  int16;
typedef unsigned short  uint16;

typedef signed   long   int32;
typedef unsigned long   uint32;

#define uint unsigned int
#define uchar unsigned char

// macro will also start the conversion.
#define st(x)      x //do { x } while (__LINE__ == -1)
#define ADC_SINGLE_CONVERSION(settings) st( ADCCON3 = (settings); )

//D1~D4
#define D1 P1_0	//定义LED1为P10口控制
#define D2 P1_1	//定义LED2为P11口控制
#define D3 P1_4	//定义LED3为P14口控制
#define D4 P0_1	//定义LED4为P01口控制

// Input channel:
#define ADC_AIN0            0x00     // single ended P0_0
#define ADC_AIN1            0x01     // single ended P0_1
#define ADC_AIN2            0x02     // single ended P0_2
#define ADC_AIN3            0x03     // single ended P0_3
#define ADC_AIN4            0x04     // single ended P0_4
#define ADC_AIN5            0x05     // single ended P0_5
#define ADC_AIN6            0x06     // single ended P0_6
#define ADC_AIN7            0x07     // single ended P0_7
#define ADC_GND             0x0C     // Ground
#define ADC_TEMP_SENS       0x0E     // on-chip temperature sensor
#define ADC_VDD_3           0x0F     // (vdd/3)

// Macro for setting/clearing a channel as input of the ADC
#define ADC_ENABLE_CHANNEL(ch)   ADCCFG |=  (0x01 << ch)
#define ADC_DISABLE_CHANNEL(ch)  ADCCFG &= ~(0x01 << ch)


int16 adcSampleSingle(uint reference, uint resolution, uint channel);
void Initial(void);

/****************************
//初始化程序
***************************/
void Initial(void)
{
	P1SEL &= ~0x13;//GPIO
        P1DIR |= 0X13;//OUTPUT
        P0SEL &= ~0x02;//GPIO
        P0DIR |= 0x02;//OUTPUT

        D1 = 0;
        D2 = 0;	
        D3 = 0;
        D4 = 0;   
}
/*****************************************
//主函数
*****************************************/
void main( )
{
        int16 aa;
        int MOVE=0;
        
        APCFG |= 0X40;//配置P0.6为ADC INPUT//APCFG :模拟外设I/O 配置
        //configured the 4LED
        P1SEL &= ~0x13;//GPIO
        P1DIR |= 0X13;//OUTPUT
        P0SEL &= ~0x02;//GPIO
        P0DIR |= 0X02;//OUTPUT
        P2SEL &= ~0x01;//GPIO
        P2DIR &= ~0X01;//INPUT
        
        Initial();
        
        while(1)
        {
              aa=adcSampleSingle(0x80,0x00,ADC_AIN6);
              MOVE = P2_0;
              if(MOVE == 1)
              {
                MOVE = 0;
                if(aa<0x2000)
                {
                  D1=1;
                  D2=0;
                  D3=0;
                  D4=0;
                }
                if(aa>0x2000)
                  if(aa<0x4000)
                  {
                    D1=0;
                    D2=1;
                    D3=0;
                    D4=0;
                  }
                if(aa>0x4000)
                  if(aa<0x4a00)
                  {
                    D1=0;
                    D2=0;
                    D3=1;
                    D4=0;
                  }
                if(aa>0x4a00)
                  if(aa<0x4f00)
                  {
                    D1=0;
                    D2=0;
                    D3=0;
                    D4=1;
                  }
                if(aa>0x4f00)
                {
                  D1=1;
                  D2=1;
                  D3=1;
                  D4=1;
                }
              }
        }

}

int16 adcSampleSingle(uint reference, uint resolution, uint channel)
{
        int value;
    
        ADC_ENABLE_CHANNEL(channel);
    
        ADCIF = 0;
        ADC_SINGLE_CONVERSION(reference | resolution | channel);
        while(!ADCIF);
        //等待转化结束    
        value  = (ADCH << 8) & 0xff00;
        value |= ADCL;
    
        ADC_DISABLE_CHANNEL(channel);
        return value;
}

代码分析:

1、#define st(x)      do { x } while (__LINE__ == -1)

__LINE__ 是个宏,它代表当前代码在源文件的行号,它是大于0的,所以__LINE__ == -1 等同于0,化简为:
#define st(x)      do { x } while (0)

2,do {} while (0)通常用于宏中, 为的是避免如下情况:

#define st(x) x

那么我们在调用 if (0) st(a = b; b = c;) 时会被解释成

if(0)
    a = b;
b = c;

可见 if 只对a = b;起作用。
2、

单个通道选择。选择写ADCCON3 触发的单个转换所在的通道号码。
当单个转换完成,该位自动清除。
0000: AIN0
0001: AIN1
0010: AIN2
0011: AIN3
0100: AIN4
0101: AIN5
0110: AIN6
0111: AIN7
1000: AIN0-AIN1
1001: AIN2-AIN3
1010: AIN4-AIN5
1011: AIN6-AIN7
1100: GND
1101: 正电压参考
1110: 温度传感器
1111: VDD/3
3、什么是 ADC模块的转换分辨率?

分辨率是指ADC能够分辨量化的最小信号的能力。
分辨率用二进制位数表示。
例如对一个10位的ADC,其所能分辨的最小量化电平为参考电平(满量程)的2的10次方分之一。也就是说分辨率越高,就能把满量程里的电平分出更多的份数(10bit就是把满量程分成了2^10份),得到的转换结果就越精确,得到的数字信号再用DAC转换回去就越接近原输入的模拟值。

4、

ADCIF : ADC中断标志。ADC中断发生时设为1且CPU指向中断向量例程时清除。
0: 无中断未决
1: 中断未决
5、

SFR寄存器:特殊功能寄存器(SFR)

6、

ADC_SINGLE_CONVERSION(reference | resolution | channel);即ADCCON3 = (reference | resolution | channel);

其中ADCCON3 (0xB6)–ADC 控制3

ADCCON3[7:6]表示参考电压,ADCCON3[5:4]抽取率,ADCCON3[3:0]单个通道选择,详见手册。

10: AVDD5 引脚  00: 64 抽取率(7 位ENOB)  0110: AIN6

aa=?以及后面的判断不懂!

你可能感兴趣的:(Zigbee)