【学习笔记】单片机的40个经典实验之25:数字电压表

  一、实验任务

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

  二、电路原理图


  图 1.28.1

  三、系统板上硬件连线

  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 端子上。

  四、程序设计内容

  i. 由于 ADC0809 在进行 A/D 转换时需要有 CLK 信号,而此时的 ADC0809

  的 CLK 是接在 AT89S51 单片机的 P3.3 端口上,也就是要求从 P3.3

  输出 CLK 信号供 ADC0809 使用。因此产生 CLK 信号的方法就得用软

  件来产生了。

  ii. 由于 ADC0809 的参考电压 VREF=VCC,所以转换之后的数据要经过

  数据处理,在数码管上显示出电压值。实际显示的电压值

  (D/256*VREF)

  五、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,

  0x6d,0x7d,0x07,0x7f,0x6f,0x00};

  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

  sbit

  sbit

  sbit

  ST=P3^0;

  OE=P3^1;

  EOC=P3^2;

  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秒

转载是一种智慧分享是一种美德❀ 

(0)

相关推荐