我用的最小系统,接了个光敏电阻,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);
}
}
谢谢!
谢谢!老师不吝赐教!!!
STK mcu
QQ:1123803079
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |