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
|