我用的最小系统,接了个光敏电阻,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); } }
谢谢! 
|