51单片机:用ADC0832做模数转换,测量电压大小

51单片机:用ADC0832做模数转换,测量外界电压大小

问题要求

利用51单片机,外加一个ADC0832模数转换器,设计一个可以实时测量电压的电路。测量电压的范围是0-5V(允许误差),要求测出的电压用数码管实时显示,精确到小数点后两位。

代码编写:

//----------------------------------------------------------
//       用ADC0832测量电压,并将测量值显示在数码管上
//----------------------------------------------------------
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int 
uchar Get_AD_Result();   //模数转换结果
void ET0_init();         //定时器0中断
void RT1_init();          //定时器1中断


//ADC0832引脚定义
sbit CS   = P1^0;
sbit CLK  = P1^1;
sbit DIDO = P1^2;

//数码管位选
sbit qian = P2^4;	  
sbit bai  = P2^5;
sbit shi  = P2^6;
sbit ge   = P2^7;

//数码管位选
unsigned char date[4];
//共阴极七段数码
unsigned char code tb[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				          0x7f,0x6f,0x77,0x7c,0x39,0x5e,
						  0x79,0x71,0x00,0X80};



//------------------------------
//            主函数
//-------------------------------
void main()			
{  
   ET0_init();    //定时器0初始化
   RT1_init();    //定时器1初始化
   ET0  = 1;
   TR0  = 1;
   ET1  = 1;
   TR1  = 1;
   EA   = 1;     //打开总中断
   CLK = 0;      //ADC0832初始化
   CS   = 1;   
   while(1);

}

//---------------------------------
//            定时器0中断
//---------------------------------
void ET0_INT() interrupt 1   
{	
    static uchar i;
    
	TH0  = (65536-2000)/256; // 重装初值
    TL0  = (65536-2000)%256;

	P2 |= 0xf0;  //消影
	switch(i)	 //位选,选择点亮的数码管,
	{
	    case(0):
		  P0 = date[0];qian = 0;break;//显示千位
	    case(1):
		  P0 = date[1];bai  = 0;break;//显示百位
	    case(2):
		  P0 = date[2];shi  = 0;break;//显示十位
		case(3):
		  P0 = date[3];ge   = 0;break;//显示个位		
  }

	i++;
    if(i==4)
	   {
		  i=0;
	   }

}

//---------------------------------------------
//        定时器T1中断服务程序
//---------------------------------------------
void ET1_INT() interrupt 3   
{
 // float L = 500.0/256.0;
  uint vt;
  uchar AD;

  TH1  = (65536-2000)/256; // 重装初值
  TL1  = (65536-2000)%256;
  
  AD = Get_AD_Result();
  vt = (500.0/256.0)*AD; //测量电压值
 
  date[0] =tb[vt/1000];
  date[1] =tb[vt/100%10]|0x80; //点亮小数点
  date[2] =tb[vt/10%10];
  date[3] =tb[vt%10];
}

//------------------------------
//     获取AD转换结果(0通道)
//------------------------------
uchar Get_AD_Result()         //包含11个CLK下降沿      
{
    uchar i, dat;
    CS = 1;              //ADC0832未工作时,CS端为高电平,此时芯片禁用
    _nop_;               //对于延时很短的,要求在us级的,采用“_nop_”函数      
    CLK =1;                  
    CS = 0;
    DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
    DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二个下降沿 
    DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三个下降沿,发送1,0选择通道cho
    DIDO = 1;                                //释放总线
    for(i = 0; i < 8; i++)                  //第4个下降沿到第11个下降沿
    {
        CLK = 0;                           //clk处于下降沿,每一个下降沿DO端输入下一个
        _nop_;                              //对于延时很短的,要求在us级的,采用_nop_函数      
        if(DIDO) dat |= 0x01;              // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
        CLK = 1; _nop_;                      //clk处于上升沿
        dat <<= 1;                          //数据左移
    }
    return (dat);
    CS = 1;                                  //ADC0832停止工作
}

//------------------------------
//定时器0初始化
//------------------------------
void ET0_init()             
{
	TMOD &= 0xf0;			//定时器0
    TMOD |= 0x01;
    TH0  = (65536-2000)/256; //2ms溢出
    TL0  = (65536-2000)%256; 
}

//---------------------------------
//         定时器1初始化
//-----------------------------------
void RT1_init()   
{
   TMOD &= 0x0f;			 
   TMOD |= 0x10;
   TH1  = (65536-2000)/256; //2ms溢出
   TL1  = (65536-2000)%256; 
}

电路设计图:

在这里插入图片描述

仿真结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(注:ADC0832初始化参考了zhai1997的博客)

  • 45
    点赞
  • 393
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: 51单片机中的ADC0809是一款8位的模数转换器,可以用来实现电压和电流的测量。 首先,对于电压测量,我们可以将待测电压通过一个电阻分压电路降低到ADC0809的工作电压范围内,以避免对转换精度的影响。然后,将分压后的电压连接到ADC0809的输入引脚,并设置好参考电压,通过对输入引脚进行采样和转换,就可以得到电压的数字表示。 对于电流测量,可以通过电阻与待测电流串联连接,将产生的电压信号接到ADC0809的输入引脚。根据欧姆定律,电流和电阻之间的关系为I = V/R,其中I为电流,V为电压,R为电阻。通过测量电阻两端的电压,可以间接得到电流的数字表示。 在使用ADC0809进行测量时,需要设置好相应的工作模式、参考电压和时钟频率等参数,以及进行正确的数据读取操作。读取到的数字信号可以通过相关的计算公式转换为实际的电压或电流值,从而实现电压和电流的测量。 需要注意的是,ADC0809是一个8位的模数转换器,它的分辨率有限,无法达到很高的测量精度。此外,还需要注意电路的稳定性和抗干扰能力,以确保测量结果的准确性和可靠性。 ### 回答2: 51单片机ADC809可以实现电压和电流的测量ADC809是一种12位的模数转换器,它可以将模拟电压信号转换为数字信号。在电压测量方面,我们可以将待测电压接入ADC809的输入引脚,并使用51单片机的程序来读取ADC809输出的数字值。然后,使用合适的公式将数字值转换为实际电压值。具体的转换公式可以根据ADC809的参考电压测量范围来确定。 在电流测量方面,我们可以使用电阻来将电流信号转换为电压信号。将待测电流通过一个适当大小的电阻,形成一个电流电压的转换。然后,将转换后的电压信号接入ADC809的输入引脚,并读取相应的数字值。同样,使用合适的公式将数字值转换为实际电流值。需要注意的是,选择合适的电阻值以确保在转换过程中不会损失太多的电压信号。 为了实现精确的测量,我们需要在51单片机中编写相应的程序来控制ADC809进行模数转换,并将转换后的值进行相应的处理和显示。可以使用串口通信、LCD显示等方式将测量结果输出或显示出来。 总之,通过合理地使用ADC809和51单片机,我们可以轻松实现电压和电流的测量。这种方法可以广泛应用于各种电子设备、仪器和测量系统中,以满足不同应用领域的需求。 ### 回答3: 51单片机adc809是一种常用的模数转换器,适用于电压电流的测量。要实现这一功能,首先需要连接电压和电流传感器到adc809。对于电压测量,可以使用电位器或者电阻分压电路将电压降低到adc809的输入范围内,然后将电压传感器的输出连接到adc809的输入引脚。对于电流测量,可以使用电阻来测量电流并将电阻与adc809连接。 接下来需要配置adc809的工作模式和引脚的输入输出状态,通过编写相应的程序实现。首先,需要设置adc809的模拟输入通道,通常是将adc809的选择器引脚与相应的端口引脚连接,再使用相应的控制引脚对选择器进行控制。然后,需要设置adc809的采样速率和精度,根据实际需求进行配置。接着,需要配置adc809的参考电压源,可以选择内部或者外部参考电压。最后,需要配置adc809的转换模式,可以选择单次转换模式或者连续转换模式。 在程序中,可以使用adc809的相关函数读取adc的转换结果,并将其转换为实际的电压或电流值。为了提高测量的精度和稳定性,可以进行一些必要的校准和滤波。此外,还可以通过串行通信方式将测量结果传送到其他设备或上位机进行进一步的处理和显示。 综上所述,通过合理地连接和配置adc809,并编写相应的程序,就可以实现对电压和电流的测量。通过该测量系统,可以方便地获取电路中的电压电流信息,用于控制和监测电路的正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值