|
我說(shuō)的是指用Keil調(diào)試時(shí)可以把此語(yǔ)句while(!(ADC_CONTR&ADC_FLAG));暫時(shí)注釋掉,在實(shí)際應(yīng)用中不可以。
以下是一個(gè)最基本的查詢(xún)方式,用LED顯示ADC結(jié)果的程序,樓主可以試試。輸入電壓0~VCC,顯示結(jié)果為0x00~0xff。
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位結(jié)果
sfr ADC_RESL = 0xBE; //ADC低2位結(jié)果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
/*----------------------------
軟件延時(shí)
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*----------------------------
讀取ADC結(jié)果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4個(gè)NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //返回八位ADC結(jié)果
// return (ADC_RES<<2)|ADC_RESL; //返回十位ADC結(jié)果
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //設(shè)置P1.0口為AD口
ADC_RES = 0; //清除結(jié)果寄存器
// ADC_RESL= 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上電并延時(shí)
}
void main()
{
P1M0 = 0x00; //設(shè)置P1.0高阻輸入
P1M1 = 0x01; //設(shè)置P1.0高阻輸入
InitADC(); //初始化ADC
while (1)
{
P2=~GetADCResult(0); //LED低電平亮顯示ADC 8位結(jié)果
Delay(1000);
}
}
|
|