從零開始學(xué)單片機(jī)(五)A/D轉(zhuǎn)化
掃描二維碼
隨時(shí)隨地手機(jī)看文章
所謂A/D轉(zhuǎn)換器就是模擬/數(shù)字轉(zhuǎn)換器(Analog to Digital Converter 簡稱ADC)是將輸入的模擬信號轉(zhuǎn)換成為數(shù)字信號。這里我們用ADC0804做這個(gè)試驗(yàn),下面的圖示它的引腳圖。
/CS:芯片選擇信號。
VREF:輔助參考電壓。
/WR:用來啟動(dòng)轉(zhuǎn)換的控制,當(dāng)/WR自1變?yōu)?時(shí),轉(zhuǎn)換器被清除;當(dāng)/WR回到1時(shí),轉(zhuǎn)換正式啟動(dòng)。
/RD:外部讀取轉(zhuǎn)換結(jié)果的控制腳輸出信號。
/INTR:中斷請求信號輸出,低電平動(dòng)。
AGND,DGND:模擬信號以及數(shù)字信號接地。
CLK IN,CLK R:時(shí)鐘輸入或接振蕩元件(R,C),頻率約限制在100KHz~1460KHz。
VIN(+),VIN(-):差動(dòng)模擬電壓輸入。輸入單端正電壓時(shí),VIN(-)接地。
DB0~DB7:8位數(shù)字輸出。
ADC0804電壓輸入與數(shù)字輸出關(guān)系如表所示
十六進(jìn)制 |
二進(jìn)制碼 |
與滿刻度的比率 |
相對電應(yīng)值VREF=2.560伏 |
||
高四位字節(jié) |
低四位字節(jié) |
高四位字節(jié)電壓 |
低四位字節(jié)電壓 |
||
F |
1111 |
15/16 |
15/256 |
4.800 |
0.300 |
E |
1110 |
14/16 |
14/256 |
4.480 |
0.280 |
D |
1101 |
13/16 |
13/256 |
4.160 |
0.260 |
C |
1100 |
12/16 |
12/256 |
3.840 |
0.240 |
B |
1011 |
11/16 |
11/256 |
3.520 |
0.220 |
A |
1010 |
10/16 |
10/256 |
3.200 |
0.200 |
9 |
1001 |
9/16 |
9/256 |
2.880 |
0.180 |
8 |
1000 |
8/16 |
8/256 |
2.560 |
0.160 |
7 |
0111 |
7/16 |
7/256 |
2.240 |
0.140 |
6 |
0110 |
6/16 |
6/256 |
1.920 |
0.120 |
5 |
0101 |
5/16 |
5/256 |
1.600 |
0.100 |
4 |
0100 |
4/16 |
4/256 |
1.280 |
0.080 |
3 |
0011 |
3/16 |
3/256 |
0.960 |
0.060 |
2 |
0010 |
2/16 |
2/256 |
0.640 |
0.040 |
1 |
0001 |
1/16 |
1/256 |
0.320 |
0.020 |
0 |
0000 |
|
|
0 |
0 |
接下來看看實(shí)驗(yàn)電路的原理圖
片選CS接P2.4,RD接P3.7,WR接P3.6,為了簡單起見INTR沒有使用它
AD芯片的VIN(+)接一個(gè)可調(diào)電阻,改變阻值能夠帶來不同的電壓,以此作為輸入。
寫程序前還得看看時(shí)序圖
不同的電阻值顯示0-255不同大小的值,延時(shí)時(shí)間略長,有點(diǎn)閃爍
#include
#include
sbit ADCS = P2^4; //ADC0804片選信號,低電平有效
sbit ADWR = P3^6; //ADC0804寫信號,低電平有效
sbit ADRD = P3^7; //ADC0804讀信號,低電平有效
unsigned char code_table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0
};
sbit Led8En = P2^6; //數(shù)碼管,鎖存器使能信號,高電平有效 ,數(shù)碼管輸出P0
sbit Led8CS = P2^7; //數(shù)碼管片選,鎖存器使能信號,電平有效,低電平選中
void delay(unsigned int times);
void dlight(unsigned char i, unsigned char number, unsigned int duration);
void ADC0804();
void main()
{
while(1)
{
ADC0804();
delay(100);
}
}
void delay(unsigned int times)
{
unsigned int i,j;
for (i=0; i
for (j=0; j<125; j++)
_nop_();
}
void ADC0804()
{
unsigned char temp;
ADCS = 0;
ADWR = 0;
delay(1);
ADWR = 1;
ADCS = 1;
delay(10);
ADCS = 0;
ADRD = 0;
_nop_();
temp = P1;
ADRD = 1;
ADCS = 1;
dlight(0xEE,code_table[temp % 10],1);
dlight(0xDD,code_table[temp / 100],1);
dlight(0xBB,code_table[(temp/10 )% 10],1);
}
void dlight(unsigned char cs, unsigned char display, unsigned int duration)
{
Led8CS = 1;
P0=cs; //片選
Led8CS = 0;
Led8En = 1;
P0=display; //. a b c d e f g, 高電平亮
Led8En = 0;
delay(duration);
}