学习笔记 从零开始学单片机(5) A/D转化

 

所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。这里我们用ADC0804做这个试验,下面的图示它的引脚图。

ylt

 

/CS:芯片选择信号。

VREF:辅助参考电压。

 

/WR:用来启动转换的控制,当/WR1变为0时,转换器被清除;当/WR回到1时,转换正式启动。

/RD:外部读取转换结果的控制脚输出信号。

/INTR:中断请求信号输出,低电平动。

AGNDDGND:模拟信号以及数字信号接地。

CLK INCLK R:时钟输入或接振荡元件(RC),频率约限制在100KHz~1460KHz。

VIN+),VIN-):差动模拟电压输入。输入单端正电压时,VIN-)接地。

DB0~DB78位数字输出。

 

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

 

接下来看看实验电路的原理图

 

11

 

片选CS接P2.4,RD接P3.7,WR接P3.6,为了简单起见INTR没有使用它

AD芯片的VIN(+)接一个可调电阻,改变阻值能够带来不同的电压,以此作为输入。

 

写程序前还得看看时序图

 

1

 额

不同的电阻值显示0-255不同大小的值,延时时间略长,有点闪烁

 

#include <reg52.h>
#include <intrins.h>

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<times; 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);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值