利用51单片机测量电容量

发布者:EuphoricVoyage最新更新时间:2018-05-07 来源: eefocus关键字:51单片机  测量电容量 手机看文章 扫描二维码
随时随地手机看文章

/*
在博文“时基电路 555 的应用”中,做而论道介绍了使用555构成多谐振荡器,并利用该电路测量电容器容量的方法。
通过合理设计电路,可以使得脉冲周期的 ms 数,等于电容器容量的 uF 数。
详细内容可见:http://hi.baidu.com/do_sermon/item/fa8586d8f91de910e0f46f91


使用示波器观察 ms 数,远远不如使用单片机直观方便。
下面介绍一个利用单片机测量周期的方法,测量上述电路中电容器的电容量。


大家都知道,51 单片机的外部中断,可以设定为下降沿触发。

当第一次下降沿来临时,在中断程序中,启动定时器的计时;在第二次下降沿来临时,再停止定时器。
这样一来,计时器所统计的数值,就代表了脉冲的周期。

定时器在计时方式下,是针对机器周期计数,在晶振为 12MHz 时,计时的结果将在 0~65536us 范围内。
以 ms 为单位,就是:00.000 ~ 65.535,也就是:00.000 ~ 65.535 uF。

直接用显示器把这个数字显示出来,这就是测量电容的结果。


如果电容器的容量,超出了这范围,可以显示超量程的信息,提示使用者换用不同的档位,就是换用不同的电阻。

使用单片机测量电容的仿真电路如下:

利用51单片机测量电容量 - 非著名博主 - 电子信息角落
图片连接:http://xiangce.baidu.com/picture/detail/2776d1bacedd2e7b086f49f008d859e9f24b9b6b


超量程的提示显示如下:

利用51单片机测量电容量 - 非著名博主 - 电子信息角落
图片连接:http://xiangce.baidu.com/picture/detail/045f76180831956a08cc9ea432e7bcbcc6776579


单片机的程序如下:
*/
#include "reg51.h"
#include "intrins.h"

#define LCD_IO P0

sbit RS = P2^0;      //1602写地址
sbit RW = P2^1;      //1602写数据
sbit EN = P2^2;      //1602工作使能

sbit RST_5 = P3^0;   //555芯片工作控制
sbit K_STA = P3^1;   //开始测量的按键

unsigned char a[16] = "Measure Capac...";
//Measure Capacitance
unsigned char b[16] = " C: 00.000 uF   ";
unsigned int Cap;
bit  Flg;

//*************延时1ms*******************
void Delay1ms(unsigned int mm)
{
    unsigned int i;
    for(; mm > 0; mm--)  for(i = 100; i > 0; i--);
}
//*************LCD 延时******************
void LCD_delay(void)   
{
    char i;
    for (i = 10; i > 0; i--); 
}
//*************检查忙否******************
void Checkstates()
{
    RS = 0; RW = 1;
    while(LCD_IO & 0x80) {
      EN = 0; LCD_delay();
      EN = 1; LCD_delay();
    };
    EN = 0;
}
//*************向写LCD命令***************
void wcomd(unsigned char cmd)
{
    Checkstates();
    RS = 0; RW = 0;
    LCD_IO = cmd; LCD_delay(); 
    EN = 1; LCD_delay(); EN = 0;
}
//*************向写LCD数据***************
void wdata(unsigned char dat)
{
    Checkstates();
    RS = 1; RW = 0;
    LCD_IO = dat; LCD_delay(); 
    EN = 1; LCD_delay(); EN = 0;
}
//*************初始化LCD*****************
void LCD_INIT()
{
    Delay1ms(5);
    wcomd(0x38);  Delay1ms(10);//功能设置
    wcomd(0x01);  Delay1ms(1); //清屏
    wcomd(0x08);  Delay1ms(1); //关显示
    wcomd(0x0c);  Delay1ms(1); //开显示,不开光标
}
//*************LCD显示*******************
void Display(void) //显示
{
    unsigned char i;
    wcomd(0x80);  Delay1ms(5); //显示第一行
    for(i = 0; i < 16; i++)  wdata(a[i]); 
    wcomd(0xc0);  Delay1ms(5); //显示第二行
    for(i = 0; i < 16; i++)  wdata(b[i]);
}
//-------------------------------------------------
void main()
{
    RST_5 = 0;        //关闭555
    LCD_INIT();
    Display();        //显示

    TMOD = 0x01;      //T0定时方式1
    TH0 = 0x00;       //初始值为零
    TL0 = 0x00;
    IT0 = 1;          //下降沿触发中断
    IE = 0x03;        //开放局部中断

    while(1)  {
      while(!K_STA)   { //当测量键被按下
        RST_5 = 1;      //启动555
        Flg = 0;
        Delay1ms(100);  //稍稍延时, 让555稳定工作
        EA = 1;         //开总中断
        while (EA == 1);//等待测量完毕, 下面进行数据处理
//因为硬件设计合理, 所以数据很简单, 无需复杂处理, 分离出过大过小的即可
        if(Cap < 1000)  { //计数值小于100, 显示small, 提示换量程
           b[4] = 't'; b[5] = 'o'; b[6] = 'o'; b[7] = ' '; b[8] = 's'; b[9] = 'm';
          b[10] = 'a';b[11] = 'l';b[12] = 'l';b[13] = '.';b[14] = ' ';b[15] = ' ';
        }
        else if(Cap > 60000)  { //大于60000, 显示large, 提示量程
           b[4] = 't'; b[5] = 'o'; b[6] = 'o'; b[7] = ' '; b[8] = 'l'; b[9] = 'a';
          b[10] = 'r';b[11] = 'g';b[12] = 'e';b[13] = '.';b[14] = ' ';b[15] = ' ';
        }
        else {
          b[4] = '0' + Cap / 10000 % 10;
          b[5] = '0' + Cap / 1000 % 10;
          b[6] = '.';
          b[7] = '0' + Cap / 100 % 10;
          b[8] = '0' + Cap / 10 % 10;
          b[9] = '0' + Cap % 10;
          b[10] = ' ';b[11] = 'u';b[12] = 'F';b[13] = ' ';b[14] = ' ';b[15] = ' ';
        }
        Display();      //显示
        while(!K_STA);  //等待按键释放
    } }
}
//-------------------------------------------------
void X0_INT(void) interrupt 0 //控制计时的启动、停止
{
    Flg = ~Flg;
    if(Flg)  TR0 = 1;   //开始计时
    else  {
      TR0 = 0;          //停止计时
      EA = 0;           //关闭中断
      RST_5 = 0;        //关闭555
      Cap = TH0 * 256 + TL0; //取出机器周期数
      TH0 = 0x00;       //恢复T0初值
      TL0 = 0x00;
    }
}
//-------------------------------------------------
void T0_INT(void) interrupt 1 //测量超时
{
    EA = 0;             //关闭中断
    RST_5 = 0;          //关闭555
    TR0 = 0;            //停止定时
    TH0 = 0x00;         //恢复T0初值
    TL0 = 0x00;
    Cap = 65535;        //超出值
    Flg = 0;
}
//-------------------------------------------------


关键字:51单片机  测量电容量 引用地址:利用51单片机测量电容量

上一篇:DS18B20 与数字温度计
下一篇:利用51单片机统计脉冲个数,即时输出显示

推荐阅读最新更新时间:2024-03-16 16:02

8051单片机教程第二课:单片机的内部、外部结构(一)
一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极
[单片机]
80<font color='red'>51单片机</font>教程第二课:单片机的内部、外部结构(一)
80C51单片机的指令系统(三)80C51单片机指令系统
指令字节和指令周期 指令字长有三种: 单字节 RET 双字节 MOV A, #68H 三字节 MOV 30H, 46H 指令周期是指执行一条指令所需要的时间 1机器周期指令 2机器周期指令 4机器周期指令 4.3.1 数据传送指令: 1、内部8位数据传送指令 mov A,#data ;(A) --- #data mov A, data ;(A) --- (data) mov A, @Ri ;(A) --- ((Ri)) i=0,1 mov A,Rn ;(A) --- (Rn) n=0~7 mov Rn,# data;(Rn ) --- #data mov Rn, data ;
[单片机]
80C<font color='red'>51单片机</font>的指令系统(三)80C<font color='red'>51单片机</font>指令系统
51单片机多路测温报警系统(AT89C51、多个DS18B20、LCD1602)
一、简介 此系统主要由AT89C51、多个DS18B20温度模块和LCD1602组成。 大致的原理是多个DS18B20按顺序采集温度到的数据传送给AT89C51的P2.7,最后通过LCD1602显示当前的实时温度,按键可以设置上下限温度,根据温度判断是否需要报警。 二、运行效果图 模拟仿真运行 三、部分代码 /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h unsigned int iTempDataH; unsigned int SetTemp = 30; int SetTemp1 = 1; int num = 0; //ÅжÏæָÁî void
[单片机]
<font color='red'>51单片机</font>多路测温报警系统(AT89C51、多个DS18B20、LCD1602)
关于51单片机晶振的21个问题
一 为什么51单片机爱用11.0592MHZ晶振? 其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。 其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.
[单片机]
51单片机I/O端口的结构和工作原理
1.概述 单片机的I/O端口是输入信号和输出信号的通道。8051单片机有P0、P1、P2、P3四组I/O 端口,每组端口有8个引脚。 2.P0端口 2.1 概述 P0端口有P0.0~P0.7共8个引脚,这些引脚除了可用作输入引脚和输出引脚外,在外接存储器时,还可用作地址/数据总线引脚。P0端口每个引脚的内部电路结构都相同,其内部电路结构如图1所示。 图1 P0端口的内部电路结构图 2.2 P0端口用作输出端口的工作原理 下面讲解单片机需要从P0.x 引脚输出高电平“1”。如图1所示,单片机内部相关电路通过控制线送出“0(低电平)”到与门的一个输入端和电子开关的控制端,控制线上的“0”一方面使与门
[单片机]
<font color='red'>51单片机</font>I/O端口的结构和工作原理
基于MCS-51单片机的多路呼叫系统设计
随着信息技术的发展与医疗卫生事业的深化改革,国家金卫工程的实施使医院管理信息化的进程大大加快,越来约多的医院认识到,只有通过信息化建设,逐步建立信息化医院和医疗企业,才能支持医院的可持续发展,从而大力提高医院综合效益和运行效益。因此,设计一个支持医院病床呼叫,具有一条线缆传输多路呼叫信息的功能的系统,是非常必要的。 1 多路呼叫系统整体设计方案 该系统利用单片机的双机通信功能,设计出的具有呼叫、显示、应答等功能的多路呼叫系统,就是为满足中小型医院中,医护人员与病人之间能及时准确地进行半双工通信,达到既方便病人又方便医护人员,更利于提高医院护理水平的目的而设计的。该系统适用于新老病房及门诊,且能随时扩充床位及迁移。针对目前整体化护理要
[单片机]
基于MCS-<font color='red'>51单片机</font>的多路呼叫系统设计
51单片机驱动TEA5767调频收音机芯片C程序
完整的源代码下载地址: http://www.51hei.com/bbs/dpj-19294-1.html 下面是程序的主要部分: /*----------- TEA5767 驱动-----------*/ /*------ 外部 晶振 为 12MHz-------*/ /*--------最后修改2011.02.26-------*/ #include STC12C5620AD.H #include IIC.H #include delay.h #include Radio.H #include Channel_Handle.H #define Max_Fre
[单片机]
<font color='red'>51单片机</font>驱动TEA5767调频收音机芯片C程序
以80C51单片机为例讲述单片机如何运行
前言 要想理解单片机是如何运行程序的,首先需要了解单片机的组成。本文以80C51单片机为例,给大家讲一讲程序在单片机中是如何运行的。 单片机的组成 8051单片机的内部硬件结构包括: 中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。 存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。 定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式
[单片机]
以80C<font color='red'>51单片机</font>为例讲述单片机如何运行
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved