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

发布者:Yuexiang最新更新时间:2020-04-21 来源: eefocus关键字:51单片机  ADC0832  模数转换  量电压 手机看文章 扫描二维码
随时随地手机看文章

问题要求

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


代码编写:

//----------------------------------------------------------

//       用ADC0832测量电压,并将测量值显示在数码管上

//----------------------------------------------------------

#include

#include

#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; 

}


电路设计图:

在这里插入图片描述

仿真结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关键字:51单片机  ADC0832  模数转换  量电压 引用地址:51单片机:用ADC0832做模数转换,测量电压大小

上一篇:#51单片机#A/D模数转换的初步认识和主要指标
下一篇:模数转换器ADC

推荐阅读最新更新时间:2024-11-13 12:49

51单片机定时器T0的使用1-中断法
/********************************************** 方法1:延时法 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 波特率:9600 描述:T0用于定时,方式1,定时时间50ms,中断方式,定时时间到,TF1=1,利用模拟串口发送字符0x67 **********************************************/ #include reg52.h #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #de
[单片机]
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C80<font color='red'>51单片机</font>和FPGA实现导纳测量仪的系统设计
#51单片机# UART串口通信的基本应用、模块介绍和串口程序
UART串口通信的基本应用 通信的三种基本类型: 单工通信:值允许一方向另一方传送星系,另一方不能回传信息。例:电视遥控器、收音机广播 半双工通信:数据可在双方之间相互传播,但同一时刻只能一方传给另一方。例:对讲机 全双工通信:发送数据的同时也可接收数据,两者同步进行。例:电话 UART模块介绍 通常情况下,我们关心的是通信的结果而非过程。51单片机内部存在UART模块,可自动接收数据,接收完毕,会发出通知信号。要使用这个模块,需要配置对应的具有特殊功能的寄存器。 51单片机的UART串口结构由串行口控制寄存器SCON、发送和接收电路三部分构成。 先来了解串口控制寄存器SCON SCON——串行控制寄存
[单片机]
#<font color='red'>51单片机</font># UART串口通信的基本应用、模块介绍和串口程序
51单片机RAM数据存储区学习笔记
1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。 在keil中,可选择small,compact,large三种方式存储数据变量: 在keil中可以用“Target Options”来配置这一项: 2.片内数据存储区 (1) 工作寄存器区 工作寄存器区位于片内数据存储器中的
[单片机]
<font color='red'>51单片机</font>RAM数据存储区学习笔记
51单片机常用SFR(特殊功能寄存器)的功能及作用介绍
1、ACC:累加亿达器,常常用A表示。这亿达是个什么东西,可不能亿达从名字上理解,它是一亿达做加法的东西,为什么亿达加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,能    1、ACC:累加器,常常用A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,能发现,所有的运算类指令都离不开它。 2、B:一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。 单片机 3
[单片机]
51单片机数码管详解
一.数码管基础知识 LED数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点 。LED数码管根据LED的接法不同,分为共阳和共阴两类 。 1.共阳极数码管 指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制,如图a所示。 2.共阴极数码管 指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制,如图b所示。 二.静态数码管(以共阳极为例) 1.原理分析 LED 发光二极管的正极共同接在VCC上,这里以单片机P1口为例,当P1口对应引脚为0(即低电平)时数码
[单片机]
对MCS-51单片机定时器和计数器区别的理解
在51单片机的学习过程中,我们经常会发现中断、计数器/定时器、串口是学习单片机的难点,对于初学者来说,这几部分的内容很难理解。但是我个人觉得这几部分内容是单片机学习的重点,如果在一个学期的课堂学习或者自学中没有理解这几部分内容,那就等于还没有掌握51单片机,那更谈不上单片机的开发了,我们都知道在成品的单片机项目中,有很多是以这几部分为理论基础的,万年历是以定时器为主的,报警器是以中断为主的,联机通讯是以串口为主的。 在这几部分内容中,计数器/定时器对于初学者说很容易搞混淆,下面我将对这方面的内容结合自己的学习经验谈几点看法。 计数器和定时器的本质是相同的,他们都是对单片机中产生的脉冲进行计数,只不过计数器是单片机外部触发的脉冲,定
[单片机]
51单片机——I2C总线驱动程序
为方便移植,采用多文件工程的方式。 void Delay10us()//延时10us { unsigned char a,b; for(b=1;b 0;b--) for(a=2;a 0;a--); } 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 void I2cStart()//为方便与其他函数衔接,起始之后SDA和SCL都为0,虽然这与I2C总线空闲状态不符,但并不影响程序运行 { SDA=1; Delay10us(); SCL=1; Delay10us();//建立时间是SDA保持时间 4.7us SDA=0; Delay10us();//保持时间是 4us SCL=0;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved