adc0808仿真原理图与程序代码

adc0808仿真原理图与程序代码,第1张

  51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。

  ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

  那么问题来了,一个用51单片机和ADC0808做的电压采集的proteus仿真原理图和程序你知道吗?

  一个用51单片机和ADC0808做的电压采集的proteus仿真,下面是仿真原理图

  

  源程序代码

  #include《reg51.h》

  #include《intrins.h》

  #include《stdio.h》

  #define uint unsigned int

  #define uchar unsigned char

  sbit CLK=P2^0;

  sbit ST=P2^1;

  sbit EOC=P2^2;

  sbit OE=P2^3;

  sbit ADDA=P2^5;

  sbit ADDB=P2^6;

  sbit ADDC=P2^7;

  sbit X1=P3^4;

  sbit X2=P3^5;

  sbit X3=P3^6;

  sbit P07=P0^7;

  sbit LED=P3^7;

  uint temp;

  uchar getdata;

  uchar b;

  uchar s;

  uchar g;

  uchar code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  void delayus(uchar us){

  uchar i;

  while(us--)

  for(i=0;i《120;i++)

  ;

  }

  void init(){

  TMOD=0x21;

  TH0=(65536-200)/256;

  TL0=(65536-200)%256;

  TH1=0XFD;

  TL1=0XFD;

  PCON=0X00;

  SCON=0X50;

  ES=1;

  ET0=1;

  EA=1;

  TR1=1;

  TR0=1;

  }

  void TImer0()interrupt 1

  { TH0=(65535-200)/256;

  TL0=(65535-200)%256;

  CLK=~CLK;

  }

  void disp(){

  X1=1;

  X2=0;

  X3=0;

  P0=table[b];

  P07=0;

  X1=1;

  X2=0;

  X3=0;

  delayus(5);

  P0=0XFF;

  P0=table[s];

  X1=0;

  X2=1;

  X3=0;

  delayus(5);

  P0=0XFF;

  P0=table[g];

  X1=0;

  X2=0;

  X3=1;

  delayus(5);

  P0=0XFF;

  }

  void adda(uchar z,uchar x,uchar c){

  ADDA=z;

  ADDB=x;

  ADDC=c;

  }

  void send(uchar x){

  EA=0;

  SBUF=x;

  while(TI==0);

  TI=0;

  EA=1;

  }

  void main(){

  P1=0XFF;

  init();

  LED=0;

  P2=0XFF;

  adda(0,0,1);

  while(1){

  ST=0;

  OE=0;

  ST=1;

  ST=0;

  while(EOC==0);

  OE=1;

  getdata=P1;

  send(getdata);

  OE=0;

  temp=getdata*1.0/255*500;

  b=temp/100;

  s=temp/10%10;

  g=temp%10;

  disp();

  }

  }

  void ser()interrupt 4

  {

  if(RI==1){

  RI=0;

  if(SBUF==‘A’){

  LED=~LED;

  }

  }

  }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2705540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-16
下一篇 2022-08-16

发表评论

登录后才能评论

评论列表(0条)

保存