proteus仿真 C51与ADC0809数模转换:万用表(电压、电流、电阻)数码管显示

本实验采用AT89S51单片机芯片配合ADC0809模/数转换芯片构成一个简易的数字多用表。

proteus仿真图:

 

1)ADC0809内部逻辑结构:

 2)图中多路模拟开关可选通8路模拟通道,允许8路模拟量分时输入,并共用一个A/D转换器进行转换。地址锁存与译码电路完成对A、B、C三个地址位进行锁存与译码,如表所示。

ADC0809通道选择表

C(ADDC)

B(ADDB)

A(ADDA)

选择的通道

0

0

0

IN0

0

0

1

IN1

0

1

0

IN2

0

1

1

IN3

1

0

0

IN4

1

0

1

IN5

1

1

0

IN6

1

1

1

IN7

3)上仿真结果图

一、电压的测量

 电压转化显示主要代码(注释项为不同数码管位数对于的ADC转换公式,按需删减):

void Display_Result(uchar d_1)
{
	   //int d=d_1*500.0/255.0;
	   //d= ((5.0/255) * d_1) * 100;
	   //d=d_1;
       P2=0xf7;  //1111 0111       
	   P0=0x3e;  //0101 1011	
       DelayMS(5);	
       P2=0xfb;  //1111 1011	
       P0=DSY_CODE[d%10];	
       DelayMS(5);	
       P2=0xfd;  //1111 1101	
       P0=DSY_CODE[d%100/10];	
       DelayMS(5);	
       P2=0xfe;  //1111 1110
       P0=DSY_CODE[d/100]|0x80;			
       DelayMS(5);
}

 二、电流的测量

 电流转化显示主要代码(注释项为不同数码管位数对于的ADC转换公式,按需删减):

void Display_Result_2(uchar e_1)
{
	   //int e=e_1*1.0/255*200;
	   //int e=(e_1*100.0/255.0)*5/p/0.1;
       P2=0xf7;  //1111 0111       
	   P0=0x77;  //0101 1011	
       DelayMS(5);	
       P2=0xfb;  //1111 1011	
       P0=DSY_CODE[e%10];	
       DelayMS(5);	
       P2=0xfd;  //1111 1101	
       P0=DSY_CODE[e%100/10]|0x80;	
       DelayMS(5);	
       P2=0xfe;  //1111 1110
       P0=0x3f|0x80;  //0101 1011
       P0=DSY_CODE[e/100];			
       DelayMS(5);
}

三、电阻的测量

电阻转化显示主要代码(注释项为不同数码管位数对于的ADC转换公式,按需删减):

void Display_Result_3(uchar f_1)
{
       //int f_2=f_1 *1.0/255*500;
       //int f_3=(150*f_2)/(500-f_2);
       //int f=f_3*100/3;
	   //int f=f_1*1.0/255*100;
       P2=0xf7;  //1111 0111       
	   P0=0x75;  //0101 1011	
       DelayMS(5);	
       P2=0xfb;  //1111 1011	
       P0=DSY_CODE[f%10];	
       DelayMS(5);	
       P2=0xfd;  //1111 1101	
       P0=DSY_CODE[f%100/10];	
       DelayMS(5);	
       P2=0xfe;  //1111 1110
       P0=DSY_CODE[f/100]|0x80;			
       DelayMS(5);
}

:本文章只提供ADC转换公式及整体思路,完整工程已打包,如需直接使用可查阅:

proteus仿真80C52+ADC0809(测电压电流电阻)工程仿真+C代码.rar-嵌入式文档类资源-CSDN下载


  • 8
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,我了解了你的问题。下面是一个C51单片机通过ADC0809八路采集温度并在四位数码管上循环显示的简单代码: ``` #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit CS=P1^0; //ADC0809片选控制端 sbit CLK=P1^1; //ADC0809时钟控制端 sbit INTR=P1^2; //ADC0809转换完成中断输出端 sbit DOUT=P1^3; //ADC0809数据输出端 sbit DIG1=P2^4; //第一位数码管 sbit DIG2=P2^5; //第二位数码管 sbit DIG3=P2^6; //第三位数码管 sbit DIG4=P2^7; //第四位数码管 uchar code seg[]={ //数码管段码表 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x00 }; void delay(uint i){ //延时函数 while(i--); } void display(uchar dat){ //数码管显示函数 uchar i; DIG1=0;DIG2=0;DIG3=0;DIG4=0; //清除所有数码管 for(i=0;i<4;i++){ switch(i){ //选择要显示的数码管 case 0:DIG1=1;break; case 1:DIG2=1;break; case 2:DIG3=1;break; case 3:DIG4=1;break; } P0=seg[dat%10]; //选择要显示的数字 dat/=10; delay(10); //延时10ms } } void ADC0809(){ //ADC0809采集函数 uchar i,adval; for(i=0;i<8;i++){ CS=0; //片选ADC0809 CLK=0; //清零时钟线 _nop_(); //空操作 _nop_(); _nop_(); CLK=1; //置高时钟线 adval<<=1; //左移一位 if(DOUT==1)adval|=0x01; //读取数据 CS=1; //取消片选ADC0809 } display(adval); //显示采集的温度值 } void main(){ while(1){ ADC0809(); //采集温度并显示 } } ``` 这个代码中,我们通过C51单片机控制ADC0809芯片进行八路采集,然后将采集到的温度值通过四位数码管循环显示。其中,采集函数使用了8个时钟周期来完成一次采集,每个时钟周期为12us,因此采集频率为1.25kHz。数码管显示函数每次延时10ms,因此数码管的刷新频率为100Hz,可以保证显示的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二仙桥保安队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值