STC1256xxAD 系列 MCU 的 A/D 轉(zhuǎn)換程序
//ADCDEMO_56xx程序演示STC1256xxAD系列MCU的A/D轉(zhuǎn)換功能。時鐘18.432MHz
//轉(zhuǎn)換結(jié)果以16進制形式輸出到串行口,可以用串行口調(diào)試程序觀察輸出結(jié)果。
//---------------------------------------------------------------------
#include"STC12C5620AD.H"
//---------------------------------------------------------------------
typedefunsignedcharINT8U;
typedefunsignedintINT16U;
//---------------------------------------------------------------------
//以下選擇ADC轉(zhuǎn)換速率,只能選擇其中一種
//SPEED1SPEED0A/D轉(zhuǎn)換所需時間
#defineAD_SPEED0x60//0110,000011270個時鐘周期轉(zhuǎn)換一次,
//CPU工作頻率27MHz時,
//A/D轉(zhuǎn)換速度約100KHz
//#defineAD_SPEED0x40//0100,000010540個時鐘周期轉(zhuǎn)換一次
//#defineAD_SPEED0x20//0010,000001810個時鐘周期轉(zhuǎn)換一次
//#defineAD_SPEED0x00//0000,0000001080個時鐘周期轉(zhuǎn)換一次
//---------------------------------------------------------------------
voidinitiate_RS232(void);//串口初始化
voidSend_Byte(INT8Uone_byte);//發(fā)送一個字節(jié)
INT16Uget_AD_result(INT8Uchannel);
voiddelay(INT8Udelay_time);//延時函數(shù)
//---------------------------------------------------------------------
voidmain()
{
INT16UADC_10bit;
initiate_RS232();//波特率=9600
ADC_CONTR|=0x80;//1000,0000打開A/D轉(zhuǎn)換電源
while(1)
{
Send_Byte(0xAA);
Send_Byte(0xAA);
ADC_10bit=get_AD_result(2);//P1.2為A/D當(dāng)前通道
Send_Byte(ADC_10bit>>8);//發(fā)送高8位測量結(jié)果
delay(0x1);
ADC_10bit=get_AD_result(3);//P1.3為A/D當(dāng)前通道,測量并發(fā)送結(jié)果
Send_Byte(ADC_10bit>>8);//發(fā)送高8位測量結(jié)果
delay(0x30);//延時
}
}
//---------------------------------------------------------------------
voiddelay(INT8Udelay_time)//延時函數(shù)
{
INT16Un;
while(delay_time--)
{
n=6000;
while(--n);
}
}
//---------------------------------------------------------------------
voidinitiate_RS232(void)//串口初始化
{
ES=0;//禁止串口中斷
TMOD=0x20;//設(shè)置T1為波特率發(fā)生器
SCON=0x50;//0101,00008位數(shù)據(jù)位,無奇偶校驗
TH1=0xFB;//18.432MHz晶振,波特率=9600
TL1=0xFB;
RI=0;
TR1=1;
ES=1;//允許串口中斷
}
//---------------------------------------------------------------------
voidSend_Byte(INT8Uone_byte)//發(fā)送一個字節(jié)
{
TI=0;//清零串口發(fā)送中斷標(biāo)志
SBUF=one_byte;
while(!TI);
TI=0;//清零串口發(fā)送中斷標(biāo)志
}
//---------------------------------------------------------------------
INT16Uget_AD_result(INT8Uchannel)
{
ADC_DATA=0;
channel&=0x07;//0000,0111清0高5位
ADC_CONTR=AD_SPEED;
ADC_CONTR=0xE0;//1110,0000清ADC_FLAG,ADC_START位和低3位
ADC_CONTR|=channel;//選擇A/D當(dāng)前通道
delay(1);//使輸入電壓達到穩(wěn)定
ADC_CONTR|=0x08;//0000,1000令A(yù)DCS=1,啟動A/D轉(zhuǎn)換,
while(1)//等待A/D轉(zhuǎn)換結(jié)束
{
if(ADC_CONTR&0x10)//0001,0000測試A/D轉(zhuǎn)換結(jié)束否
{break;}
}
ADC_CONTR&=0xE7;//1111,0111清ADC_FLAG位,關(guān)閉A/D轉(zhuǎn)換,
return(ADC_DATA<<8|ADC_LOW2);//返回A/D10位轉(zhuǎn)換結(jié)果
}