我是靠谱客的博主 眯眯眼宝贝,最近开发中收集的这篇文章主要介绍51单片机:用ADC0832做模数转换,测量电压大小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的博客)

最后

以上就是眯眯眼宝贝为你收集整理的51单片机:用ADC0832做模数转换,测量电压大小51单片机:用ADC0832做模数转换,测量外界电压大小的全部内容,希望文章能够帮你解决51单片机:用ADC0832做模数转换,测量电压大小51单片机:用ADC0832做模数转换,测量外界电压大小所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部