从零开始学单片机(五)A/D转化
所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。这里我们用ADC0804做这个试验,下面的图示它的引脚图。
/CS:芯片选择信号。
VREF:辅助参考电压。
/WR:用来启动转换的控制,当/WR自1变为0时,转换器被清除;当/WR回到1时,转换正式启动。
/RD:外部读取转换结果的控制脚输出信号。
/INTR:中断请求信号输出,低电平动。
AGND,DGND:模拟信号以及数字信号接地。
CLK IN,CLK R:时钟输入或接振荡元件(R,C),频率约限制在100KHz~1460KHz。
VIN(+),VIN(-):差动模拟电压输入。输入单端正电压时,VIN(-)接地。
DB0~DB7:8位数字输出。
ADC0804电压输入与数字输出关系如表所示
十六进制 |
二进制码 | 与满刻度的比率 | 相对电应值VREF=2.560伏 | ||
高四位字节 | 低四位字节 | 高四位字节电压 | 低四位字节电压 | ||
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(+)接一个可调电阻,改变阻值能够带来不同的电压,以此作为输入。
写程序前还得看看时序图
不同的电阻值显示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; //数码管,锁存器使能信号,高电平有效 ,数码管输出P0
sbit Led8CS = P2^7; //数码管片选,锁存器使能信号,电平有效,低电平选中
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