從零開始學單片機(五)A/D轉(zhuǎn)化
所謂A/D轉(zhuǎn)換器就是模擬/數(shù)字轉(zhuǎn)換器(Analog to Digital Converter 簡稱ADC)是將輸入的模擬信號轉(zhuǎn)換成為數(shù)字信號。這里我們用ADC0804做這個試驗,下面的圖示它的引腳圖。
/CS:芯片選擇信號。
VREF:輔助參考電壓。
/WR:用來啟動轉(zhuǎn)換的控制,當/WR自1變?yōu)?時,轉(zhuǎn)換器被清除;當/WR回到1時,轉(zhuǎn)換正式啟動。
/RD:外部讀取轉(zhuǎn)換結果的控制腳輸出信號。
/INTR:中斷請求信號輸出,低電平動。
AGND,DGND:模擬信號以及數(shù)字信號接地。
CLK IN,CLK R:時鐘輸入或接振蕩元件(R,C),頻率約限制在100KHz~1460KHz。
VIN(+),VIN(-):差動模擬電壓輸入。輸入單端正電壓時,VIN(-)接地。
DB0~DB7:8位數(shù)字輸出。
ADC0804電壓輸入與數(shù)字輸出關系如表所示
十六進制 |
二進制碼 | 與滿刻度的比率 | 相對電應值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 |
接下來看看實驗電路的原理圖
片選CS接P2.4,RD接P3.7,WR接P3.6,為了簡單起見INTR沒有使用它
AD芯片的VIN(+)接一個可調(diào)電阻,改變阻值能夠帶來不同的電壓,以此作為輸入。
寫程序前還得看看時序圖
不同的電阻值顯示0-255不同大小的值,延時時間略長,有點閃爍
#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);
}
編輯:admin 最后修改時間:2018-05-19