位置:51电子网 » 技术资料 » 单 片 机

单片机AT89S51与ADC0809设计一个数字电压表

发布时间:2008/8/14 0:00:00 访问次数:605

  1. 实验任务

  利用单片机at89s51与adc0809设计一个数字电压表,能够测量0-5v之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

  2. 电路原理图

   

  3. 系统板上硬件连线

  a) 把“单片机系统”区域中的p1.0-p1.7与“动态数码显示”区域中的abcdefgh端口用8芯排线连接。

  b) 把“单片机系统”区域中的p2.0-p2.7与“动态数码显示”区域中的s1s2s3s4s5s6s7s8端口用8芯排线连接。

  c) 把“单片机系统”区域中的p3.0与“模数转换模块”区域中的st端子用导线相连接。

  d) 把“单片机系统”区域中的p3.1与“模数转换模块”区域中的oe端子用导线相连接。

  e) 把“单片机系统”区域中的p3.2与“模数转换模块”区域中的eoc端子用导线相连接。

  f) 把“单片机系统”区域中的p3.3与“模数转换模块”区域中的clk端子用导线相连接。

  g) 把“模数转换模块”区域中的a2a1a0端子用导线连接到“电源模块”区域中的gnd端子上。

  h) 把“模数转换模块”区域中的in0端子用导线连接到“三路可调电压模块”区域中的vr1端子上。

  i) 把“单片机系统”区域中的p0.0-p0.7用8芯排线连接到“模数转换模块”区域中的d0d1d2d3d4d5d6d7端子上。

  4. 程序设计内容

  由于adc0809在进行a/d转换时需要有clk信号,而此时的adc0809的clk是接在at89s51单片机的p3.3端口上,也就是要求从p3.3输出clk信号供adc0809使用。因此产生clk信号的方法就得用软件来产生了;由于adc0809的参考电压vref=vcc,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (d/256*vref)

  5. 汇编源程序

  6. c语言源程序

  #include <at89x52.h>

  unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

  0xef,0xdf,0xbf,0x7f};

  unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

  unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};

  unsigned char dispcount;

  unsigned char getdata;

  unsigned int temp;

  unsigned char i;

sbit st=p3^0;

sbit oe=p3^1;

sbit eoc=p3^2;

sbit clk=p3^3;

void main(void)

{

st=0;

oe=0;

et0=1;

et1=1;

ea=1;

tmod=0x12;

th0=216;

tl0=216;

th1=(65536-4000)/256;

tl1=(65536-4000)%256;

tr1=1;

tr0=1;

st=1;

st=0;

while(1)

{

if(eoc==1)

{

oe=1;

getdata=p0;

oe=0;

temp=getdata*235;

temp=temp/128;

i=5;

dispbuf[0]=10;

dispbuf[1]=10;

dispbuf[2]=10;

dispbuf[3]=10;

dispbuf[4]=10;

dispbuf[5]=0;

dispbuf[6]=0;

dispbuf[7]=0;

while(temp/10)


  {


  dispbuf[i]=temp%10;


  temp=temp/10;


  i++;


  }


  dispbuf[i]=temp;


  st=1;


  st=0;


  }


  }


  }


  void t0(void) interrupt 1 using 0


  {


  clk=~clk;


  }


  void t1(void) interrupt 3 using 0


  {


  th1=(65536-4000)/256;


  tl1=(65536-4000)%256;


  p1=dispcode[dispbuf[dispcount]];


  p2=dispbitcode[dispcount];


  if(dispcount==7)


  {


  p1=p1 | 0x80;


  }


  dispcount++;


  if(dispcount==8)


  {


  dispcount=0;


  }


  }



  1. 实验任务

  利用单片机at89s51与adc0809设计一个数字电压表,能够测量0-5v之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

  2. 电路原理图

   

  3. 系统板上硬件连线

  a) 把“单片机系统”区域中的p1.0-p1.7与“动态数码显示”区域中的abcdefgh端口用8芯排线连接。

  b) 把“单片机系统”区域中的p2.0-p2.7与“动态数码显示”区域中的s1s2s3s4s5s6s7s8端口用8芯排线连接。

  c) 把“单片机系统”区域中的p3.0与“模数转换模块”区域中的st端子用导线相连接。

  d) 把“单片机系统”区域中的p3.1与“模数转换模块”区域中的oe端子用导线相连接。

  e) 把“单片机系统”区域中的p3.2与“模数转换模块”区域中的eoc端子用导线相连接。

  f) 把“单片机系统”区域中的p3.3与“模数转换模块”区域中的clk端子用导线相连接。

  g) 把“模数转换模块”区域中的a2a1a0端子用导线连接到“电源模块”区域中的gnd端子上。

  h) 把“模数转换模块”区域中的in0端子用导线连接到“三路可调电压模块”区域中的vr1端子上。

  i) 把“单片机系统”区域中的p0.0-p0.7用8芯排线连接到“模数转换模块”区域中的d0d1d2d3d4d5d6d7端子上。

  4. 程序设计内容

  由于adc0809在进行a/d转换时需要有clk信号,而此时的adc0809的clk是接在at89s51单片机的p3.3端口上,也就是要求从p3.3输出clk信号供adc0809使用。因此产生clk信号的方法就得用软件来产生了;由于adc0809的参考电压vref=vcc,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (d/256*vref)

  5. 汇编源程序

  6. c语言源程序

  #include <at89x52.h>

  unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

  0xef,0xdf,0xbf,0x7f};

  unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

  unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};

  unsigned char dispcount;

  unsigned char getdata;

  unsigned int temp;

  unsigned char i;

sbit st=p3^0;

sbit oe=p3^1;

sbit eoc=p3^2;

sbit clk=p3^3;

void main(void)

{

st=0;

oe=0;

et0=1;

et1=1;

ea=1;

tmod=0x12;

th0=216;

tl0=216;

th1=(65536-4000)/256;

tl1=(65536-4000)%256;

tr1=1;

tr0=1;

st=1;

st=0;

while(1)

{

if(eoc==1)

{

oe=1;

getdata=p0;

oe=0;

temp=getdata*235;

temp=temp/128;

i=5;

dispbuf[0]=10;

dispbuf[1]=10;

dispbuf[2]=10;

dispbuf[3]=10;

dispbuf[4]=10;

dispbuf[5]=0;

dispbuf[6]=0;

dispbuf[7]=0;

while(temp/10)


  {


  dispbuf[i]=temp%10;


  temp=temp/10;


  i++;


  }


  dispbuf[i]=temp;


  st=1;


  st=0;


  }


  }


  }


  void t0(void) interrupt 1 using 0


  {


  clk=~clk;


  }


  void t1(void) interrupt 3 using 0


  {


  th1=(65536-4000)/256;


  tl1=(65536-4000)%256;


  p1=dispcode[dispbuf[dispcount]];


  p2=dispbitcode[dispcount];


  if(dispcount==7)


  {


  p1=p1 | 0x80;


  }


  dispcount++;


  if(dispcount==8)


  {


  dispcount=0;


  }


  }



相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!