历史上的今天

今天是:2024年09月15日(星期日)

2020年09月15日 | 51单片机制作电容电感测表

发布者:水墨人生 来源: 51hei关键字:51单片机  电容电感测表 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include "reg52.h"

#include "intrins.h"

//-------宏定义---------

#define u8 unsigned char

#define u16 unsigned int

#define u32 unsigned long

#define Cref 2200      //基准电容值(单位pF)

#define LCD_DATA P0    //LCD数据口(8位)

//-------I/O定义--------

sbit LCD_BUSY = P0^7; //LCD忙信号

sbit LCD_RS   = P1^0; //数据/命令选择(数据=1,命令=0)

sbit LCD_RW   = P1^1; //读/写选择(写=0,读=1)

sbit LCD_EN   = P1^2; //使能信号

sbit K1_F_LC   = P1^3; //F/LC测量选择按钮(自锁),([抬起]=0测LC,[按下]=1测F)

sbit K2_L_C    = P1^4; //L/C测量选择按钮(自锁)([抬起]=0测C,[按下]=1测L)

sbit K3_Eb_Es  = P1^6; //电解量程选择按钮(自锁),([抬起]=0低量程,[按下]=1高量程)

sbit K4_FLC_EC = P3^6; //FLC或EC(电解电容)测量选择按钮(无锁)(每按一次,翻转一次)

sbit K5_Calib  = P3^7; //手工校正(清零)按钮(无锁)(消除寄生电容值)

sbit Dischg    = P1^5; //测量电解电容时的充放电控制端口(=0放电,=1充电)

//-------全局变量定义--------

bit  FLC_EC_Flag;  //测量标志(=0测FLC,=1测电解电容)

u8   Measure_Flag; //测量标志(=1测电容,=2测电感,=3测频率,=4测小电解,=5测大电解)

u8   Lref;         //基准电感值(单位uH)(原作没有)

u16  T0_times;     //T0中断计数预设值(每50ms一次),测F=20次(1s),测LC=10次(0.5s)

u16  Timer0_Num;   //T0计数

u16  Timer1_Num;   //T1计数

u32  Frequency0;   //频率0(未接被测元件时的频率)

u32  Frequency1;   //频率1(接入被测元件时的频率)

u32  Cx;           //被测电容

u32  Lx;           //被测电感

u32  ECx_H;        //被测电解电容(大)

u32  ECx_L;        //被测电解电容(小)

//------x的n次方------------

u32 power(u8 x,u8 n)

{

    u8 i;

    u32 j = 1;

    if(n == 0)

    {

        return 1;

    }

    else

    {

        for(i=0; i        {

            j *= x;

        }

        return j;

    }

}

//----延时n毫秒(12M晶振,12T模式,一个指令周期=1us)---

//----1ms=(跳转等3个指令周期+两个空指令)*200----

void Delay_ms(u8 n)

{

    u8 i,j;

    for(i=0; i    {

        for(j=0; j<200; j++)

        {

            _nop_();

            _nop_();

        }

    }

}

//------LCD1602读忙标志位------

void Check_busy(void)

{

    do

    {

        LCD_EN=0;

        LCD_RS=0;

        LCD_RW=1;

        LCD_DATA=0xFF;

        LCD_EN=1;

    }

    while(LCD_BUSY==1);

    LCD_EN=0;

}

//------LCD1602写指令------

void Write_Command(u8 cmd)

{

    Check_busy();

    LCD_RS=0;

    LCD_RW=0;

    LCD_DATA=cmd;

    LCD_EN=0;

    LCD_EN=1;

    LCD_EN=0;

}

//------LCD1602写数据------

void Write_Data(u8 dat)

{

    Check_busy();

    LCD_RS=1;

    LCD_RW=0;

    LCD_DATA=dat;

    LCD_EN=0;  //机器周期小于1us时,须加延时

    LCD_EN=1;

    LCD_EN=0;

}

//-----LCD1602写字符串------

//---x=列(0~15); y=行(0,1)

//---从指定的位置开始写,直到超出屏幕显示

void LCD_Write_String(u8 y,u8 x,u8 *Data)

{

    if(y==0)      //第一行

    {

        if(x<16)

        {

            Write_Command(0x80+x);  //0x80 + 第一行起始地址

            for(; x<16&&*Data!=''; x++)   //''字符串结束标志

            {

                Write_Data(*(Data++));

            }

        }

    }

    if(y==1)      //第二行

    {

        if(x<16)

        {

            Write_Command(0xc0+x);          //0xc0 + 第二行起始地址

            for(; x<16&&*Data!=''; x++)   //''字符串结束标志

            {

                Write_Data(*(Data++));

            }

        }

    }

}

//------LCD1602写长整型数据------

//x=列(0~15); y=行(0,1);截取长整型后length个数字显示在指定位置(全显示length=10)

//注意此函数不支持换行,起始列+length>15时后面的显示不出来,仅能单行显示

void LCD_Write_Long(u8 y,u8 x,u8 length,u32 Data)

{

    u8 i,k;

    if(length>10)

    {

        length = 10;

    }

    if(length<10)

    {

        Data = Data%power(10,length);

    }

    if(y==0)     //第一行

    {

        Write_Command(0x80+x);      //0x80 + 第一行起始地址

        for(i=0; i        {

            k = (u8)(Data/power(10,length-1-i));

            Data = Data%power(10,length-1-i);

            Write_Data(k+0x30);

        }

    }

    if(y==1)     //第二行

    {

        Write_Command(0xc0+x);      //0xc0 + 第二行起始地址

        for(i=0; i        {

            k = (u8)(Data/power(10,length-1-i));

            Data = Data%power(10,length-1-i);

            Write_Data(k+0x30);

        }

    }

}

//------LCD1602写长整型数据,可以指定小数点后位数-------

//x=列(0~15); y=行(0,1);截取长整型后length个数字显示在指定位置(全显示length=10)

//注意此函数不支持换行,起始列+length>15时后面的显示不出来,仅能单行显示

//pot:小数点后显示几个数字 例:1234567 pot=2时显示为12345.67

void LCD_Write_LongPoint(u8 y,u8 x,u8 length,u8 pot,u32 Data)

{

    u8 i,j,k;

    if(length>10)

    {

        length = 10;

    }

    if(length<10)

    {

        Data = Data%power(10,length);

    }

    if(y==0)    //第一行

    {

        j=0;

        Write_Command(0x80+x);      //0x80 + 第一行起始地址

        for(i=0; i<=length; i++)

        {

            if(i==(length-pot))

            {

                Write_Data(0x2e);   //小数点

                Write_Command(0x80+x+i+1);

            }

            else

            {

                k = (u8)(Data/power(10,length-1-j));

                Data = Data%power(10,length-1-j);

                Write_Data(k+0x30);

                j++;

            }

        }

    }

    if(y==1)    //第二行

    {

        j=0;

        Write_Command(0xc0+x);      //0xc0 + 第二行起始地址

        for(i=0; i<=length; i++)

        {

            if(i==(length-pot))

            {

                Write_Data(0x2e);   //小数点

                Write_Command(0xc0+x+i+1);

            }

            else

            {

                k = (u8)(Data/power(10,length-1-j));

                Data = Data%power(10,length-1-j);

                Write_Data(k+0x30);

                j++;

            }

        }

    }

}

//------LCD1602清屏---------

void LCD_Clear(void)

{

    Write_Command(0x01);

}

//------LCD1602初始化-----

void LCD1602_Init(void)

{

    Delay_ms(15);

    Write_Command(0x38);   //16x2显示,8位数据

    Write_Command(0x0c);   //开显示

    Write_Command(0x06);   //AC自动加1,字符依次向后写

    LCD_Clear();

}

//------判断测量类型-------

void Get_Measure_Flag(void)

{

    if(FLC_EC_Flag==0)    //测FLC按键选择标志位

    {

        if(K1_F_LC==1)

        {

            Measure_Flag = 3;   //测频率

            T0_times = 20;  //T0定时1s

        }

        else

        {

            if(K2_L_C==0)

            {

                Measure_Flag = 1; //测电容

            }

            else

            {

                Measure_Flag = 2;

            }

            T0_times = 10;  //T0定时0.5s

        }

    }

    else

    {

        TR0 = 0;        //关闭测频率(含LC)功能

        ET0 = 0;

        if(K3_Eb_Es==0)

        {

            Measure_Flag = 4;  //测小电解

[1] [2] [3]
关键字:51单片机  电容电感测表 引用地址:51单片机制作电容电感测表

上一篇:51单片机电容测量电路+程序设计
下一篇:H桥逆变,带死区的SPWM单片机程序

推荐阅读

   9月13日至15日,第十届天翼智能生态博览会在广州举行,OPPO助理副总裁、中国大陆市场营销负责人沈义人先生出席并发表了OPPO对5G的新观点。此次博览会中5G成为了绝对主题,中国电信董事长杨杰发表《拥抱智能新时代,共创5G新生态》的主题演讲,而中国电信也在博览会中正式启动了“Hello 5G”的行动计划。此外,中国电信还计划在“第十届天翼智能生态...
  现在生活在大都市的人们大多数都有或多或少的睡眠问题,有些是因为工作压力大,精神高度紧张,存在难以入眠、深度睡眠时间不够长;有些是因为环境污染问题,会打鼾、经常憋醒,甚至影响家人睡眠。不管是哪种情况,都是为我们的健康敲醒了警钟。能发现这些问题还好说,有人只是觉得身体疲惫,睡了一宿也没有休息过来,这种时候按医生的说法,我们就改进...
据外媒报道,美国NeoPhotonics公司宣布推出全新可调谐、高功率FMCW(frequency-modulated continuous-wave,调频连续波)激光模块和高功率半导体光放大器(semiconductor optical amplifier ,SOA)芯片。该公司主要开发硅光子学和基于先进混合光子集成电路的激光器、模块和子系统,以用于带宽密集型高速通信网络。推出的全新组件都经过优化,可实现远...

史海拾趣

问答坊 | AI 解惑

写好C语言,漂亮的宏定义很重要

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2, ...…

查看全部问答∨

在pb里面添加了usb鼠标,光电鼠标能亮,但是不能移动。。。

我用的是WinCE 4.2,如下操作Core OS -> Display based devices -> Core OS Services -> USB Host Support -> USB Human Input Device (HID) Class Driver添加了usb鼠标的驱动,重新定制平台,生成镜像,烧到板子里重启后,光电鼠标能亮,但 ...…

查看全部问答∨

U盘分区之困

不知道发这个版是否合适?如有发错版请提示我 最近新买了一个U盘,联想B210i,这个U盘出厂时就被分为两个区,其中一个是CDFS格式。此CDFS分区会被系统认为是光驱,然后自启动一个程序,超恶心 我试意删除或者格式化此CDFS分区,但是.... ===== ...…

查看全部问答∨

Cyclone II 锁相环

Cyclone II 锁相环使用的一点提醒:         外部输入的系统时钟必须大于15MHZ, 系统才能起作用!…

查看全部问答∨

J-Link怎么这么容易出毛病啊?

                                 三天两头的刷,烦死了。里面那个Atmel的芯片也太垃圾了吧,怎么没人改成STM32啊?…

查看全部问答∨

UCC29002咋实现1:2均流呢

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 悲剧啊 !!!!!!!!  …

查看全部问答∨

免费送出 DSP 2812 开发板 PCB空板

本帖最后由 ddllxxrr 于 2016-1-7 16:59 编辑 …

查看全部问答∨

关于5509a的串行二次引导程序

本人通过在串行SPI EEPROM的模式下实现了bootloader,但是加载速度比较慢,看了很多文档后决定进行二次加载,网上资料一般都是并行方式的二次加载,而且都是通过汇编程序实现,有哪位大侠做过串行EEPROM的二次加载,求帮助!!…

查看全部问答∨

关于MSP430F249中的UART1模块

我在学习MSP430F249,使用IAR For MSP430 v5.3,仿真环境Proteus7.9,在使用UART0时可以正常好收发数据,但是在使用UART1的时候,就不知道为什么不行了,下面是详细的代码,麻烦各位帮忙看一下看有什么问题?#include \"io430.h\"// #include \"UAR ...…

查看全部问答∨

对LED照明的缺点你知道多少?

replyreload += \',\' + 1374973;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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