#include <STC12C5A60S2.H>
#include "intrins.h"
//ADC_CONTR bit:
#define ADC_POWER 0x80 //adc 启动
#define ADC_FLAG 0x10 //adc转换完成标志
#define ADC_START 0x08 //adc开始标志
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
#define FOSC 11059200L
#define BAUD 9600
void Delay10us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void InitUart()
{
SCON=0x50;
TMOD=0x20;
TH1=TL1=-(FOSC/12/32/BAUD);
TR1=1;
TI=1;
}
void SendData(unsigned char dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void InitADC()
{
P1ASF = 0xFF;
AUXR1 |= 1<<2; //1:ADC_RES<<8+ADC_RESL
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay10us();
}
unsigned char GetADCResult(unsigned char ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return ADC_RES;
}
void main()
{
unsigned char ch = 0;
InitUart();
InitADC();
while(1)
{
//SendData(ch);
SendData(GetADCResult(ch));
SendData(ADC_RESL);
//ch++;
if(ch==8) ch=0;
Delay500ms();
Delay500ms();
Delay500ms();
Delay500ms();
}
}
万用表测得VCC电压为4.59V,把P1.0和3V3短接,上位机收到数据位0x02DD,即733。
根据公式733*4590/1024=3285mV,测试正常。