51proteus仿真:adc0804实现模数转换

51proteus仿真:adc0804实现模数转换

 

系统采集到的信号,几乎都是模拟信号。学习单片机的模拟数字ad转换是必须的。

这个仿真就是利用adc0804把模拟电压转换为数字信号,然后再输出到数码管。

由于最大电压不超过5v,所以数码管显示只有个位,和小数点后面,我只显示小数点后3位,没有四舍五入。

仿真电路图:

 

c程序:

 

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

#define uchar unsigned char

#define uint unsigned int

sbit duan=P3^0;    //u1
sbit wei=P3^1;

sbit ADC_CS=P3^2;
sbit ADC_RD=P3^3;
sbit ADC_WR=P3^4;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
 0x66,0x6d,0x7d,0x07,
 0x7f,0x6f,0x77,0x7c,
 0x39,0x5e,0x79,0x71 };

void delay(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
  for(j=80;j>0;j--);
 }
 
void show6led(float num)
{
unsigned char i;

  P2=0xff;
 P3=0xff;
 i=num;
 duan=1;
 P2=table[i]+0x80;  //显示个位和小数点
 duan=0;
 P2=0xff;   //先关闭led
 wei=1;
 P2=0xfb;             //段选3
 wei=0;
 delay(5);
 
  P2=0xff;
 P3=0xff;
 num=num-i;
 num=num*10;
 i=num;
 duan=1;
 P2=table[i];
 duan=0;
  P2=0xff;
  wei=1;
 P2=0xf7;          //段选4,十分位
 wei=0;
 delay(5);
   P2=0xff;
 P3=0xff;
 num=num-i;
 num=num*10;
 i=num;
 duan=1;
 P2=table[i];
 duan=0;
 P2=0xff;
 wei=1;
 P2=0xef;          //段选5,百分位
 wei=0;
 delay(5);

  P2=0xff;
 P3=0xff;
 num=num-i;
 num=num*10;
 i=num;
 duan=1;
 P2=table[i];
 duan=0;
 P2=0xff;
 wei=1;
 P2=0xdf;          //段选6,千分位
 wei=0;
 delay(5);
 
 
 }

 

void main()
{

uchar val;

 ADC_CS=0;

 
  ADC_WR=1;
  _nop_();
  ADC_WR=0;
  _nop_();
  ADC_WR=1;
  delay(50);
  P1=0xff;
  ADC_RD=1;
 _nop_();
  ADC_RD=0;
  _nop_();
   val=P1;
   ADC_RD=1;
  
  while(1)
  {
   show6led(val*0.02);//adc0832是8位,5v/256=0.02v
  
   }


 }

 

 

 

 

posted @ 2011-10-27 22:20  proteus学习  阅读(5245)  评论(0)    收藏  举报