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

2023-11-04

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的博客)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机:用ADC0832做模数转换,测量电压大小 的相关文章

随机推荐

  • 抖音小程序怎么赚钱,都有哪些变现玩法技巧。

    流量 钱 在抖音小程序变现这个项目中不一定成立 A 第一个视频爆了100多万观看 连怼了一次爆到900万 照理说 那么大的曝光率 挂小程序应该赚很多钱 答 没有多少收益 为什么 因为A发的视频内容和挂的小程序不相关 爆的是搞笑的视频 而挂的
  • pikachu xss攻击模块 信息安全 xss漏洞 详细分析

    XSS攻击 跨站脚本漏洞测试流程 反射型xss get 反射型xss post 存储型xss 实例 xss钓鱼 DOM型xss Dom型xss x Xss盲打 Xss之过滤 Xss之htmlspecialchars Xss之href输出 X
  • 第四节:论文种类分类-学习笔记

    任务说明 学习主题 论文分类 数据建模任务 利用已有数据建模 对新论文进行类别分类 学习内容 使用论文标题完成类别分类 学习成果 学会文本分类的基本方法 TF IDF等 数据处理步骤 在原始arxiv论文中论文都有对应的类别 而论文类别是作
  • Python读取文本文件到数组

    支持的格式有txt dat csv mat等 读入的数据存为float类型 可以自定义数据之间的间隔符 可以自定义列数cols import numpy as np import linecache import os filename d
  • MinIO verify 接口敏感信息泄露漏洞分析(CVE-2023-28432)

    MinIO verify 接口敏感信息泄露漏洞 简介 漏洞描述 MinIO 是一种开源的对象存储服务 它兼容 Amazon S3 API 可以在私有云或公有云中使用 MinIO 是一种高性能 高可用性的分布式存储系统 它可以存储大量数据 并
  • 【转载】Java中将InputStream读取为String, 各种方法的性能对比

    Java中将InputStream读取为String 各种方法的性能对比 原文地址 http www cnblogs com milton p 6366916 html 如下 一共存在11种实现方式及其对应的性能测试结果 1 使用IOUti
  • 在wpf中利用异步lambda编程,模拟数据库连接,防止界面假死

    参考 图解C 第20章异步编程第五节程序 解决在wpf中连接数据库 界面假死问题 public partial class MainWindow Window private bool isConnected false public Ma
  • 山洪灾害监测预警系统解决方案

    一 方案背景 近几年我国频繁发生山洪灾害现象 造成大量的人员伤亡 使得洪涝灾害死亡总人数呈上升趋势 群死群伤事件时有发生 为了提高山洪灾害监测预警能力 加强灾害发生时的快速反应能力 我司研发出了山洪灾害监测预警系统设备 它具有技术先进 功能
  • 职工管理系统_201026(思路详解版-第四步修改职工)

    12 修改职工 功能描述 能够按照职工的编号对职工信息进行修改并保存 12 1 修改职工函数声明 在workerManager h中添加成员函数 void Mod Emp 修改职工 void Mod Emp 12 2 修改职工函数实现 在w
  • 使用PAM保障开发运营安全

    硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞 以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施 构成巨大的数据被盗风险 什么是PAM 特权访问管理 PAM 是指一组 IT 安全管理原则 可帮助
  • Markdown 技能树(2):段落及强调

    Markdown 技能树 2 段落及强调 在 Markdown 中 段落是由一个以上相连接的行句组成 而一个以上的空行则会切分出不同的段落 一般的段落不需要用空白或换行缩排 空行的定义是显示上看起来像是空行 便会被视为空行 比如 若某一行只
  • 再谈Linux epoll惊群问题的原因和解决方案

    转自 https blog csdn net dog250 article details 80837278 缘起 近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了
  • linux批量修改文件编码格式(包含子目录)

    背景 项目工程文件编码格式有utf 8 也有gb2312 在通过Source Insight 4 0打开文件只能设置一种默认编码格式UTF 8 Windows ANSI GB2312 不能自动识别文件本身的编码格式 这就导致总有一部分文件打
  • 【转载】爬虫篇:获取数据——urllib库的基础知识(总结)

    注 本文章大部分代码的案例节选于 Python3网络爬虫开发实战 第2版 一 发出请求 1 urlopen方法 Python版本 3 6 coding utf 8 urlopen 方法的API urllib request urlopen
  • 深度解析shell脚本的命令的原理之cp

    cp 是 Unix 或 Linux 中的一个基本命令 用于复制文件或目录 以下是对这个命令的深度解析 基本操作 cp 命令的基本操作是将一个或多个源文件或目录复制到一个目标文件或目录 它通过读取源文件的内容 并将这些内容写入到目标文件来完成
  • 利用Caffe创建自己的lmdb数据集

    用Caffe进行模型训练时 除了用现有的公开数据集 如MNIST CIFAR等 有时候我们还需要创建自己的数据集进行训练 本篇博客讲的就是如何利用Caffe中的模块创建自己lmdb数据集 数据集准备 我们需要自己准备好带类别标签的图片数据
  • 架构设计(数据层)

    架构设计 数据层 关系数据库 关系数据库 需要事先定义表 读写数据时 表中字段不可动态变更 表中的每个行记录代表一个关系 1 海贼王 20 2 瓜田李下 20 表与表之间也可建立关联关系 一对一 一对多 多对一 多对多 关系型数据库进行读写
  • uboot 中内存测试,内存检测方法

    DDR内存子系统常见硬件错误及Uboot中检测流程 在 U Boot中 Denx U Boot的开发商 针对常见的DDR内存故障进行了严格的检测处理 下图描述了该检测处理过程的三个步骤 检测数据线 地址线和DDR物理存储部件 主要涉及这三个
  • 给大家介绍几个好的软件包下载网站

    RPM SEARCH http rpm pbone net PKG SEARCH http pkgs org 两个都非常的好
  • 51单片机:用ADC0832做模数转换,测量电压大小

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