哪位高手帮我看看,STC12c5410ad,为什么AD采集结果老是00
[复制链接]
STC12c5410ad,为什么AD采集结果老是0。
#include "reg51.h" #include "intrins.h" #include "164.h" #include "math.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define uchar unsigned char /*Declare SFR associated with the ADC */ sfr ADC_CONTR = 0xC5; //ADC control register sfr ADC_DATA = 0xC6; //ADC high 8-bit result register sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register sfr P1M0 = 0x91; //P1 mode control register0 sfr P1M1 = 0x92; //P1 mode control register1
/*Define ADC operation const for ADC_CONTR*/ #define ADC_POWER 0x80 //ADC power control bit #define ADC_FLAG 0x10 //ADC complete flag #define ADC_START 0x08 //ADC start control bit #define ADC_SPEEDLL 0x00 //420 clocks #define ADC_SPEEDL 0x20 //280 clocks #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks void InitADC(); BYTE GetADCResult(BYTE ch); void delay(WORD n); void display(); sbit sw=P1^5; sbit gw=P1^4; float AD_temp; char shu; uchar a,b; void main() { sw=0; gw=0; InitADC(); AD_temp=GetADCResult(0xe3); AD_temp*=10; a=(int)AD_temp%10; b=(int)AD_temp/10; while (1) { display(); } }
Get ADC result ----------------------------*/ BYTE GetADCResult(BYTE ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while ((ADC_CONTR & ADC_FLAG)!=0);//Wait complete flag ADC_CONTR &= ~ADC_FLAG; //Close ADC return ADC_DATA; //Return ADC result }
Initial ADC sfr ----------------------------*/ void InitADC() { P1M0 = P1M1 = 0x08; //Set all P1 as Open-Drain mode ADC_DATA = 0; //Clear previous result ADC_CONTR = ADC_POWER | ADC_SPEEDH; delay(2); //ADC power-on and delay }
Software delay function ----------------------------*/ void delay(WORD n) { WORD x;
while (n--) { x = 5000; while (x--); } } void display() { gw=1; sendbyte(a); delay(1); gw=0; sw=1; sendbyte(b); delay(1); sw=0; }
说明几点:
1.AD转换是使用内部晶振,P1.3做AD检查电压口。
2.请帮我看看蓝色部分程序。
3.是不是晶振用得不对,还是程序结构有问题。
4.我用直接赋值试过,显示电路可以显示所赋值结果。
|