目录
一、实验目的以及要求
(1)掌握A/D转换与单片机接口的方法;
(2)了解A/D芯片0809转换性能及编程方法;
(3)通过实验了解单片机如何进行数据采集。
二、实验原理
三、实验内容
利用实验系统上的0809做A/D转换器,实验系统上的电位器提供模拟量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。
1、用双头线将可调电压区的VOUT接至ADC0809模数转换区的IN0,可调电压区的VIN接至电源+5V,ADC0809模数转换区的CS4接至系统接口区的8000H端口,ADC0809模数转换区的WR接至系统接口区的/IOWR端口,ADC0809模数转换去的RD接至系统接口区的/IORD,ADC0809模数转换区的ADDA、ADDB、ADDC接至GND,CLK接至单脉冲与时钟区的500K,用8芯线将数据总线JX0接至ADC0809模数转换区的JX6;
2、运行程序HW09.ASM,数码管上显示0809.XX,后二位显示当前采集的电压转换的数字量,调节可调电压,该二位将随着电压变化而相应变化,变化范围为00至FF。
四、实验代码
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define com8155 XBYTE[0xff20] //8155控制口地址
#define pa8155 XBYTE[0xff21] //8155,PA口,控制LED数码管字位口
#define pb8155 XBYTE[0xff22] //8155,PB口,控制LED数码管字形口
#define ad0809 XBYTE[0x8000] //ADC0809片选地址
//*********************************************
//MON51必须用到的
code unsigned char stop[3] _at_ 0x3b;
//*********************************************
void delay(unsigned int i) //延时程序
{
unsigned int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
void main(void)
{ uchar idata disbuf[6]={0,8,0,9,5,5}; //六位LED数码管显示缓冲区数组,并赋初值
uchar code table[20]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF,0x0C,0x89,0xDE}; //数码管段选码
com8155=0x43; //8155控制字设置
while(1)
{uchar x,y=0x20,m,n,t=0x0f; //x=6,表示6位数码管,y表示数码管位选码
y=~y; // 位码取反 y=1101 1111 使Y的选择低电位有效(指定数码管y的值,选择哪个哪个置零,最前面补两个1)
ad0809=0x00; //adc0809选择0通道采样
delay(1);
m=ad0809; //取出采样值,然后将16进制的采样值拆送送到显示缓冲区数组中,m取高四位的十六进制值(disbuf[5]),n取低四位的十六进制值(disbuf[4])
n=m;
m=m&t;
n=n>>4;
disbuf[5]=n;
disbuf[4]=m;
for(x=0;x<6;x++) //6个数码管LED分别进行显示
{pb8155=table[disbuf[x]]; //将字形码(即要显示的数据)传送给pb8155
pa8155=y; //送字位码(即哪个数码管被选中)传送给pa8155
delay(2);
y=_cror_(y,1); //将y进行一位,直接助于字位码的选择赋值
}
}
}