ADC

综述

STC12C5A60S2具有10位ADC,8通道。

ADC转换结构图

涉及寄存器

P1ASF

ADC_CONTR

例子

AD.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef __AD_H
#define __AD_H


#include <reg52.h>
#include <intrins.h>

sfr P1ASF = 0x9d;
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_LOW2 = 0xbe;
sfr AUXR1 =0xa2;


#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60


void delay1ms(void);
void delay1s(void);
void AD_Init();
void AD_Get();

#endif

AD.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <AD.h>

void delay1ms(void)
{
unsigned char a,b;
for(b=21;b>0;b--)
for(a=130;a>0;a--);
_nop_();
}

void delay1s(void)
{
unsigned char a,b,c;
for(c=217;c>0;c--)
for(b=171;b>0;b--)
for(a=73;a>0;a--);
}

void AD_Init()
{
P1ASF = 0x01; //enbale P10 Analog

ADC_RES = 0; //clear previous result


ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START;

delay1ms();


IE =0xa0; //enable EADC interrupt
}

void AD_Get()
{
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START; //Start ADC Tran
_nop_(); //need some delay
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

}

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <main.h>

sfr AUXR = 0x8e;

#define TIMS (256- (11059200L/32/9600))

unsigned int adValue;
unsigned char temp;



void UART1_Init()
{
EA = 1;
ES = 1;

TR1 = 1;

TMOD = 0x20;

TH1 = TL1 = TIMS ;

SCON = 0x50;

AUXR = 0x40;

}


void sendData (unsigned char dat)
{
while(!TI);
TI = 0;
SBUF = dat;
}


void main()
{
UART1_Init();
SBUF = 0x66;
AD_Init();
while(1)
{
AD_Get();
delay1s();
adValue = ((int)(temp*100)/255)*5;
sendData(adValue/100);
sendData(adValue/10%10);
sendData(adValue%10);

}
}




void AD_Tran_Interrupt() interrupt 5
{
ADC_CONTR &=!ADC_FLAG ; //clear ADC interrupt flag

temp = ADC_RES;

}


main.h

1
2
3
4
5
6
7
8
9
10
#ifndef __MAIN_H
#define __MAIN_H

#include <reg52.h>
#include <AD.h>


#endif