基于51单片机的数字电容容值测量仪proteus仿真原理图PCB

这篇具有很好参考价值的文章主要介绍了基于51单片机的数字电容容值测量仪proteus仿真原理图PCB。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能介绍:
0.本系统采用STC89C52作为单片机
1.系统支持15pF~450uF电容测量
2.按键可更改测量量程
3.除了采用LCD1602可以实时显示测量参数,同时具有LED可以显示各个档位
4.该方案电容容值测量原理是基于NE555振荡电路来设计的

原理图:
ne555测电容,51单片机,proteus,单片机
ne555测电容,51单片机,proteus,单片机

PCB:
ne555测电容,51单片机,proteus,单片机

主程序:

#include <reg52.h>
#include "lcd1602.h"
#include "delay.h"

sbit VO = P3^2; // 用于检测P3.2口的值,计算时间。  计时器0的开与断
sbit TR = P3^7; // 产生一个低电平脉冲
                  // 超量程提示灯
sbit BUZZER = P2^0;

sbit RELAY1 = P1^5; // 用于控制继电器,实现档位选择
sbit RELAY2 = P1^6;
sbit RELAY3 = P1^7;

sbit KEY1 = P3^4; // 独立按键部分,用于用户选择量程

sbit LED1 = P2^1; // 量程提示灯
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;

unsigned int tw = 0; // 用于获取定时器的数值

float ftemp = 0; // 用于计算电容值的中间变量

unsigned long int c = 0; // 存放电容值

bit measureFlag = 0;                        // 需要测量时置1,一次测量结束置0
unsigned char R = 1;                        // 表示不同的档位
unsigned char finishFlag = 0;                   // 数据处理结束置1
unsigned char temp[8];                      // 存放电容值的各个位

void Timer0_Init(); // 定时器0  初始化
void Ext1_Init(); // 外部中断1  初始化
void Process(unsigned long int c); // 数据处理函数
void Key_Scan();                   // 键盘扫描函数
void Mode_Select(unsigned char R);   //	量程指示灯函数
void Disp(unsigned char *p);


void main()
{
    BUZZER = 1;      // 超量程蜂鸣器关闭
    TR = 1;
    measureFlag = 0; // 一开始无需测量
    finishFlag = 0;

    Timer0_Init(); // 初始化
    Ext1_Init();
    LCD_Init();
    LCD_DispStr(0, 0, "please press key");
    LCD_DispStr(0, 1, "     to measure ");
    Mode_Select(R);
    while (1)
    {
        if (measureFlag == 1)
        {                // 当需要测量时
            if (VO == 0) // VO == 0时检测计数器的值可能还没开始计数,可能计数结束
            {
                if (TH0 != 0x00 || TL0 != 0x00) // 是计数结束 若有读数,用tw 存下
                {
                    tw = TH0 << 8;
                    tw = tw | TL0;
                    TH0 = 0x00; // 一次结束,计时器清零
                    TL0 = 0x00;
                    measureFlag = 0; // 需要再次测量时,measureFlag置1.避免tw的值被更//改   即不需要测量时,一直保持
                    EX1 = 1;         // 开外部中断1
                }
                else // 反之,证明没有计数,无电容,默认值tw置0
                {
                    tw = 0;
                }
            }

            ftemp = tw / 1.0; // 计算电容值   根据公式 tw = 1.0 * R * C

            c = (unsigned long int)(ftemp)*100; //扩大了一百倍   便于后续程序
                                                //取两位小数点
            Process(c);                         // 调用数据处理函数,根据不同的R值进行处理
        }
        DelayMs(10);
        if (finishFlag == 1) // 数据处理结束   每次处理结束,证明需要更新显示的数据
        {
            
            if (tw >= 50000 || BUZZER == 0) // 量程超出
            {
                LCD_DispStr(0, 0, " range is higher");
                LCD_DispStr(0, 1, "                ");
                BUZZER = 0;
            }
            else if (tw <= 100 && BUZZER == 1) //量程太低
            {
                LCD_DispStr(0, 0, " range is lower ");
                LCD_DispStr(0, 1, "                ");
                BUZZER = 0;
            }
            else
            {
                LCD_DispStr(0, 0, "The value of Cap");
                Disp(temp);
            }
            finishFlag = 0;
        }
        
        Key_Scan();
    }
}

void Timer0_Init() // 定时器0  初始化
{
    TMOD = 0x09; // gate置1,方式1,16位计时,定时器由P3.2控制开断
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Ext1_Init() // 外部中断1  初始化
{
    EA = 1;
    IT1 = 1; // 下降沿触发
    EX1 = 1;
}

void Timer0_Interrupt() interrupt 1 // 定时器0中断  用于超量程提示
{
    BUZZER = 0;
}

void Ext1_Interrupt() interrupt 2 // 外部中断1  启动测量按键按下,用于产生低脉冲,启动555定时器
{
    unsigned char a;
    TR = 1; // tr端一个负脉冲
    a = 1;
    while (--a)
        ;
    TR = 0;
    a = 20;
    while (--a)
        ;
    TR = 1;          // tr端负脉冲结束	   大约40us的负脉冲
    measureFlag = 1; // 表示需要测量
    BUZZER = 1;      // 关闭先前的超量程提示
    EX1 = 0;         // 暂时关闭外部中断,一次测量结束,再开放外部中断
}

void Disp(unsigned char *p) // 显示数据
{
	unsigned char i;
	LCD_LocateXY(3, 1);
	for (i = 0; i < 6; i++)
	{
		if (4 == i)
		{
			LCD_WriteData(0x2e);
		}
		LCD_WriteData('0' + (*p));
		p++;
	}
}

void Process(unsigned long int c)
{
    if (R == 1) // 10M	 的电阻		   量程10pf ~ 5000pf
    {
        c = c / 10;
        LCD_LocateXY(10, 1);
        LCD_WriteData(' ');
        LCD_WriteData('p');
        LCD_WriteData('f');
        LCD_WriteData(' ');
        LCD_WriteData(' ');
    }
    if (R == 2) // 100k 的电阻	       量程5nf~ 500nf
    {
        c = c / 100;
        LCD_LocateXY(10, 1);
        LCD_WriteData(' ');
        LCD_WriteData('n');
        LCD_WriteData('f');
        LCD_WriteData(' ');
        LCD_WriteData(' ');
    }
    if (R == 3) // 1k欧姆 的电阻		   量程0.5uf ~ 50uf
    {
        c = c / 1000; // 扩大了一百倍 单位  c = tw/500   uf
        LCD_LocateXY(10, 1);
        LCD_WriteData(' ');
        LCD_WriteData('u');
        LCD_WriteData('f');
        LCD_WriteData(' ');
        LCD_WriteData(' ');
    }
    if (R == 4) // 100欧姆 的电阻		   量程50uf ~ 500uf
    {
        c = c / 100; // 扩大了一百倍 单位  c = tw/500   uf
        LCD_LocateXY(10, 1);
        LCD_WriteData(' ');
        LCD_WriteData('u');
        LCD_WriteData('f');
        LCD_WriteData(' ');
        LCD_WriteData(' ');
    }
    temp[0] = c / 100000;     // 千位
    temp[1] = c / 10000 % 10; // 百位
    temp[2] = c / 1000 % 10;  // 十位
    temp[3] = c / 100 % 10;   // 个位
    temp[4] = c / 10 % 10;
    temp[5] = c % 10;
    finishFlag = 1;
}
void Key_Scan()
{
    if (KEY1 == 0)
    {
        DelayMs(10);
        if (KEY1 == 0) //  b3按下
        {
            while (KEY1 == 0)
                ;

            if (R == 4)
            {
                R = 0;
            }
            R++;
            Mode_Select(R);

            BUZZER = 1;
            LCD_DispStr(0, 0, "please press key");
            LCD_DispStr(0, 1, "     to measure ");
        }
    }
}
void Mode_Select(unsigned char R)
{
    if (1 == R)
    {
        LED1 = 1;
        LED2 = 1;
        LED3 = 1;
        LED4 = 0;
        RELAY1 = 0;
        RELAY2 = 0;
        RELAY3 = 0;
    }
    if (2 == R)
    {
        LED1 = 1;
        LED2 = 1;
        LED3 = 0;
        LED4 = 1;
        RELAY1 = 1;
        RELAY2 = 1;
        RELAY3 = 0;
    }
    if (3 == R)
    {
        LED1 = 1;
        LED2 = 0;
        LED3 = 1;
        LED4 = 1;
        RELAY1 = 0;
        RELAY2 = 0;
        RELAY3 = 1;
    }
    if (4 == R)
    {
        LED1 = 0;
        LED2 = 1;
        LED3 = 1;
        LED4 = 1;
        RELAY1 = 0;
        RELAY2 = 1;
        RELAY3 = 1;
    }
}

仿真演示视频:
https://www.bilibili.com/video/BV1jd4y1M7Dy/

实物演示视频:
https://www.bilibili.com/video/BV1fP41137BD/文章来源地址https://www.toymoban.com/news/detail-662584.html

到了这里,关于基于51单片机的数字电容容值测量仪proteus仿真原理图PCB的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于51单片机的555定时器测电容proteus仿真

    一、555定时器构成多谐振荡器 由555定时器构成的多谐振荡器如下图所示,   工作原理:电路没有稳态,只有两个暂稳态,也不需要外加触发信号,利用电源VCC通过R1和R2向电容器C充电,使Uc逐渐升高,升到2VCC/3时,Uo跳变到低电平,放电端D导通,这时,电容器C通过电阻R2和

    2024年02月06日
    浏览(52)
  • 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

    (代码+仿真+设计报告+讲解) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0018 本课程设计用MPX4115传感器来检测压力参数,ADC0832进行模数转换后,利用单片机AT89C52进行数据处理后,用四个八段数码管显示压力值。压力测量的量程在15.3KPA~114.9KPA,

    2024年02月08日
    浏览(44)
  • 【基于51单片机的数字钟】

    掌握单片机 C 语言判断语句、分支语句以及子程序调用等编程知识 此程序调试时间方式为先暂停再调时,故有调秒的功能。 (1) 实现正确稳定地显示小时(两位数)、分钟(两位数)、秒钟(两位数),同时数 码管应无闪烁问题 (2) 通过按键分别实现时、分、秒信息的调整,方便用户

    2024年02月11日
    浏览(52)
  • 基于51单片机的数字时钟设计

    目录 一、总体概述 1、计时控制方案 2、主控制器模块 3、显示电路模块 4、调试按键模块 5、电源模块 6、闹钟声光报警模块 二、系统总体结构 1.电路图 三、系统的硬件设计与实现 1、电源电路 2、显示电路 3、单片机基本电路 4、按键电路 四、功能测试及结果分析 五、程序附

    2024年02月07日
    浏览(47)
  • 基于51单片机的数字电子钟

    目录 摘  要 1.课程设计任务 1.1课程设计题目 1.2设计的要求  2.设计总体方案 2.1初步设计方案 2.2芯片的选型 2.2.1时钟芯片的选择 2.2.2温度传感器的选择 2.2.3显示电路的选择 2.2.4输入按键的选择 2.2.5控制电路芯片的选择 2.3总体方案 3.单元模块设计 3.1显示模块 3.2按键模块 3.3蜂

    2024年02月12日
    浏览(53)
  • 基于51单片机的数字温度计【开源】

    (1)温度实时显示(LCD2864) (2)温度上限下线调节 (3)万年历功能 (4)超温报警 (5)年月日时分秒可调节 (6)温度测量精度0.0625℃ (7)节日自动判定 STC89c52,DS18B20,DS1302,按键模块。LCD12864 main.c LCD12864.c ( 主要一些延时和LCD12864的驱动) LCD12864.h (主要一些函数的声

    2024年02月10日
    浏览(53)
  • 基于51单片机的数字电压表设计

    简介 1、数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示。而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编码等几部分组成。因此AD转换是此次设计的核心元件。输入

    2024年02月05日
    浏览(49)
  • 毕设--基于51单片机数字电压表的设计

    注:本毕设资源可在微信公众号:“Kevin的学习站” 中获取! 3.1、基本功能 利用51单片机作为主控芯片,模拟量输入范围直流0v-5v。模拟量经A/D(ADC0809)模数转换芯片,把模拟量转换为数字量输入到单片机的P0口,再由单片机控制LCD1602液晶显示模拟量输入的电压值。 3.2、主

    2023年04月08日
    浏览(52)
  • 基于单片机的一种风速测量仪的设计与制作

    收藏和点赞,您的关注是我创作的动力     风速、风向的测量在气象预报、环境监测、风力发电、航空航天等领域中有着重要意义。随着传感器技术、微处理器技术和网络通信技术的发展,相比传统的人工观测,数字化、智能化的气象仪器在观测精度、速度和稳定性等方

    2024年01月17日
    浏览(48)
  • 基于51单片机数字频率计的设计与实现

    目录 第一章 系统原理与总体设计 1.1系统组成 1.2系统原理 1.3测量原理 1.4频率测量与总体设计 第二章 硬件电路设计 2.1硬件电路框图 2.2数字频率计原理图 2.3硬件电路设计 第三章 软件程序设计 3.1程序流程图 3.2显示电路程序设计 3.3 定时器初始化程序设计 3.4中断控制程序设计

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包