51單片機學(xué)習(xí)筆記:利用ADC0804模數(shù)轉(zhuǎn)換器采集電壓
電位器調(diào)節(jié)待檢測電壓值,在數(shù)碼管上顯示出來,
代碼大多從書上搬過來的,書上例5.3.1要求前3個數(shù)碼管顯示AD轉(zhuǎn)換后的8位數(shù)字量(即0~255)
我這里讓前4個數(shù)碼管顯示具體電壓值,比如1.352
C代碼
#include
#include"MY51.H"
voidinitSMG()//數(shù)碼管初始化信息
{
//上電時,都為高電平
P0=0xff;
wela=open;
P0=0xff;
wela=lock;
P0=0;
dula=open;
P0=0;
dula=lock;
}
voidADC0804_csToLow()//cs置低電平
{
wela=open;//打開鎖存器
P0=0x7f;//鎖存器最高位送0,也就是CSAD置0
wela=lock;
}
voidADC0804_startConvert()//P3.6口是wr,由高到底,再拉高后,ad開始轉(zhuǎn)換
{
adwr=high;//雖然原本就是高的,但我們要養(yǎng)成好習(xí)慣,該是什么就是什么
_nop_();
adwr=low;//wr置低后,過小會后AD內(nèi)部開始執(zhí)行轉(zhuǎn)換,轉(zhuǎn)換完成后INTR自動置低觸發(fā)中斷
_nop_();
adwr=high;
//由于我們用的不是150pF電容,而是104pF,所以轉(zhuǎn)換比較慢,在調(diào)用本函數(shù)后最好延時10毫秒以上
}
uint8ADC0804_readResult()//讀轉(zhuǎn)換結(jié)果
{
uint8result=0;
//延時一會兒,轉(zhuǎn)換就完成了,由于我們將INTR和CS都拉低了,直接操作RD后就可以讀了
P1=0xff;//防止由于轉(zhuǎn)換未完成原因引起的誤讀
adrd=high;
_nop_();
adrd=low;//rd置低電平后數(shù)據(jù)總線P1口得到數(shù)據(jù),并由led顯示現(xiàn)象
_nop_();
result=P1;
adrd=high;
//讀完以后,如果ad芯片不用了,就把cs拉高,注銷片選
returnresult;
}
voidshow(uint8value)//基準電壓是2.5V為了計算方便擴大到2500
{
uint16temp=value*(2500/255.0);//擴大到4位整數(shù),小數(shù)點另外附加顯示
uint8oneWela,twoWela,threeWela,fourWela;//oneWela是最左邊的數(shù)碼管
oneWela=temp/1000;
twoWela=temp%1000/100;
threeWela=temp%100/10;
fourWela=temp%10;
displaySMG(oneWela,twoWela,threeWela,fourWela,dark,dark,dotTable[1]);//最左邊的數(shù)碼管顯示小數(shù)點
}
voidmain()
{
uchari=0;
ucharadTemp=0;
initSMG();//數(shù)碼管數(shù)據(jù)初始化
ADC0804_csToLow();//cs置低
while(1)
{
ADC0804_startConvert();//開始將電壓數(shù)據(jù)轉(zhuǎn)換成數(shù)字信號
for(i=5;i>0;i--)//主要是延時一段時間,讓ad完成轉(zhuǎn)換
{
delayms(1);
show(adTemp);//延時的時候,數(shù)碼管繼續(xù)動態(tài)顯示
}
adTemp=ADC0804_readResult();//讀取數(shù)據(jù)
show(adTemp);
}
}
C代碼
#ifndef_MY51_H_
#define_MY51_H_
#include
#include
typedefintint16;
typedefintINT16;
typedefunsignedintuint16;
typedefunsignedintUINT16;
typedefunsignedshortuint;
typedefunsignedshortUINT;
typedefunsignedshortword;
typedefunsignedshortWORD;
typedefunsignedlonguint32;
typedefunsignedlongUINT32;
typedefunsignedlongDWORD;
typedefunsignedlongdword;
typedefsignedlongint32;
typedefsignedlongINT32;
typedeffloatfloat32;
typedefdoubledouble64;
typedefsignedcharint8;
typedefsignedcharINT8;
typedefunsignedcharbyte;
typedefunsignedcharBYTE;//WINDOWS的windef.h里面是這么定義的
typedefunsignedcharuchar;
typedefunsignedcharUCHAR;
typedefunsignedcharUINT8;
typedefunsignedcharuint8;
typedefunsignedcharBOOL;//windows中定義BOOL為int
typedefunsignedcharbool;//bool是c++的內(nèi)置類型
#defineTRUE1
#definetrue1
#defineFALSE0
#definefalse0
#defineopen1//open和close用于標志打開和關(guān)閉狀態(tài)
#defineOPEN1
#defineclose0
#defineCLOSE0
#definelock0
#definestart1
#defineSTART1
#definestop0
#defineSTOP0
#definekeyDown0
#definekeyUp1
#definegnd0//接地
#defineGND0//接地
#definehigh1//高電平
#definelow0//低電平
#defineyes1
#defineYES1
#defineno0
#defineNO0
sbitdula=P2^6;//段選鎖存器控制控制筆段
sbitwela=P2^7;//位選鎖存器控制控制位置
#defineledP1//燈總線控制
sbitled0=P1^0;//8個led燈,陰極送低電平點亮
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitled4=P1^4;
sbitled5=P1^5;
sbitled6=P1^6;
sbit led7=P1^7;