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

mac2022-06-30  83

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;    //u1sbit 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     }

 }

 

 

 

 

转载于:https://www.cnblogs.com/proteus/archive/2011/10/27/2227080.html

相关资源:ADC0804与单片机的模数转换程序(附仿真图)
最新回复(0)