我用的最小系統,接了個光敏電阻,MCU是3.3v的,用ams1117-3.3做電源,p1.0做AD檢測,剛寫入程序,ad還正常,隨著環境光的變化變化,但是一旦關機從新上電,ad的數值就從f0-ff變化了,就不能正常使用了,最后在電源ams1117后面加了個1n4148壓降到2.8v左右,ad口只接了104,和1k電阻后懸空從新換了塊MCU,從新寫入程序,不斷電數據都正常,數值不斷接近00,在什么都沒有接的情況下,斷電,從新接電后數據又變成f0-f8-ff之間變化,來回換了7、8個mcu了,沒找到問題,我用5v的mcu沒有出現這些問題,很穩定,為什么3.3的怎么都弄不好,請老師指點指點。 程序:
#include
<REG51.h> //通用89C51頭文件 #include <INTRINS.H>
// #define FOSC 11059200L #define
BAUD 9600 typedef unsigned char BYTE; typedef unsigned
int WORD; sbit LDR = P1^0;
/* Declare SFR associated with
the ADC */ sfr ADC_CONTR = 0XC5; sfr ADC_DATA = 0XC6; sfr
ADC_LOW2 = 0XBE; sfr P1M0 = 0X91; sfr P1M1 =
0X92; /* Define ADC operation const for ADC_CONTR */ #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
/* Millisecond
function */ void MSDELAY(WORD M) { WORD S; while(--M
!=0) { for(S=0; S<125; S++); } } /* Microsecond
function * void USDELAY(WORD U) { while(--U); } /* Initial ADC
sfr */ void INIT_ADC() { P1M0 = 0X01; P1M1 = 0X00; ADC_DATA
= 0; ADC_CONTR = ADC_POWER |ADC_SPEEDLL; MSDELAY(2); } /* Get
ADC result */ BYTE GET_ADC(BYTE CH) { ADC_CONTR = ADC_POWER |
ADC_SPEEDLL | ADC_START |
CH; _nop_(); _nop_(); _nop_(); _nop_(); while
(!(ADC_CONTR & ADC_FLAG)); ADC_CONTR &= ~ADC_FLAG; return
ADC_DATA; } /* Initial UART */ void INIT_UART() { SCON =
0X50; TMOD = 0X20; TH1 = TL1 = -(FOSC/12/32/BAUD); PCON =
0X80; TR1 = 1; ES = 1; EA =1; } /* UART Send one byte
data to PC */ void UART_TX(BYTE dat) { SBUF = dat;
while(!TI); TI = 0; } /* main function */ void main
(void) { INIT_ADC(); INIT_UART(); while(1) {
GET_ADC(0); UART_TX(ADC_DATA);
MSDELAY(400); } }
謝謝! 
|