本帖最后由 luoshuwen 于 2012-5-23 20:52 编辑
我用的最小系统,接了个光敏电阻,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);
}
}
谢谢! |