stc 8位ADC轉換實驗程序
程序名: 8位ADC轉換實驗程序
編寫時間: 2010年3月24日
硬件支持: STC12C2052AD 使用ADC功能 外部晶體12MHz
接口說明:
修改日志:
1-
/*********************************************************************************************
說明:
PC串口端設置 [ 4800,8,無,1,無 ]
將ADC讀出的數(shù)值通過串口以十六進制方式顯示。
/*********************************************************************************************/
#include //單片機頭文件
#include //51基本運算(包括_nop_空函數(shù))
/*********************************************************************************************
函數(shù)名:毫秒級CPU延時函數(shù)
調 用:DELAY_MS (?);
參 數(shù):1~65535(參數(shù)不可為0)
返回值:無
結 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函數(shù)名:UART串口初始化函數(shù)
調 用:UART_init();
參 數(shù):無
返回值:無
結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
備 注:振蕩晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
/**********************************************************************************************/
void UART_init (void){
//EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
//ES = 1; //允許UART串口的中斷
TMOD = 0x20; //定時器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
TH1 = 0xF3; //定時器初值高8位設置
TL1 = 0xF3; //定時器初值低8位設置
PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
TR1 = 1; //定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:UART串口發(fā)送函數(shù)
調 用:UART_T (?);
參 數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
返回值:無
結 果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認發(fā)送完成后退出
備 注:
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
while(TI == 0); //檢查發(fā)送中斷標志位
TI = 0; //令發(fā)送中斷標志位為0(軟件清零)
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:8位A/D轉換初始化函數(shù)
調 用:Read (?);
參 數(shù):輸入的端口(0000 0XXX 其中XXX是設置輸入端口號,可用十進制0~7表示,0表示P1.0,7表示P1.7)
返回值:無
結 果:開啟ADC功能并設置ADC的輸入端口
備 注:適用于STC12C2052AD系列單片機(必須使用STC12C2052AD.h頭文件)
/**********************************************************************************************/
void Read_init (unsigned char CHA){
unsigned char AD_FIN=0; //存儲A/D轉換標志
CHA &= 0x07; //選擇ADC的8個接口中的一個(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC轉換的速度(0XX0 0000 其中XX控制速度,請根據(jù)數(shù)據(jù)手冊設置)
_nop_();
ADC_CONTR |= CHA; //選擇A/D當前通道
_nop_();
ADC_CONTR |= 0x80; //啟動A/D電源
DELAY_MS(1); //使輸入電壓達到穩(wěn)定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:8位A/D轉換函數(shù)
調 用:? = Read ();
參 數(shù):無
返回值:8位的ADC數(shù)據(jù)
結 果:讀出指定ADC接口的A/D轉換值,并返回數(shù)值
備 注:適用于STC12C2052AD系列單片機(必須使用STC12C2052AD.h頭文件)
/**********************************************************************************************/
unsigned char Read (void){
unsigned char AD_FIN=0; //存儲A/D轉換標志
ADC_CONTR |= 0x08; //啟動A/D轉換(0000 1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0){ //等待A/D轉換結束
AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉換結束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 關閉A/D轉換,
return (ADC_DATA); //返回A/D轉換結果(8位)
}
/**********************************************************************************************/
/*********************************************************************************************
函數(shù)名:主函數(shù)
調 用:無
參 數(shù):無
返回值:無
結 果:程序開始處,無限循環(huán)
備 注:
/**********************************************************************************************/
void main (void){
unsigned char R;
UART_init();//串口初始程序
Read_init(0);//ADC初始化
P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道時須同時將對應的IO接口修改為高阻輸入。
P1M1 = 0x00; //P1.7~.0:0000 0000(強推)
while(1){
R = Read ();
UART_T (R); //串口小秘書,將ADC讀出值送入串口顯示
}
}/**********************************************************************************************/
/*************************************************************
* 杜洋工作室 www.DoYoung.net
/*************************************************************/
評論