我用的最小系統(tǒng),接了個(gè)光敏電阻,MCU是3.3v的,用ams1117-3.3做電源,p1.0做AD檢測(cè),剛寫入程序,ad還正常,隨著環(huán)境光的變化變化,但是一旦關(guān)機(jī)從新上電,ad的數(shù)值就從f0-ff變化了,就不能正常使用了,最后在電源ams1117后面加了個(gè)1n4148壓降到2.8v左右,ad口只接了104,和1k電阻后懸空從新?lián)Q了塊MCU,從新寫入程序,不斷電數(shù)據(jù)都正常,數(shù)值不斷接近00,在什么都沒有接的情況下,斷電,從新接電后數(shù)據(jù)又變成f0-f8-ff之間變化,來回?fù)Q了7、8個(gè)mcu了,沒找到問題,我用5v的mcu沒有出現(xiàn)這些問題,很穩(wěn)定,為什么3.3的怎么都弄不好,請(qǐng)老師指點(diǎn)指點(diǎn)。
程序:
#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);
}
}
謝謝!
謝謝!老師不吝賜教!!!
STK mcu
QQ:1123803079
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |