历史上的今天
返回首页

历史上的今天

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

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

2020-09-15 来源:51hei

单片机源程序如下:

#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;  //测小电解

推荐阅读

史海拾趣

广东爱晟电子(exsense)公司的发展小趣事

为了进一步扩大市场份额,爱晟电子制定了国际化发展战略。公司积极参加国际电子展会和论坛,与国际同行进行交流合作。同时,公司还加大了对海外市场的拓展力度,产品出口到欧美、东南亚等多个国家和地区。这些举措使得爱晟电子在国际市场上获得了更多的认可和机会。

ADI(亚德诺半导体)公司的发展小趣事

随着业务的不断拓展,爱晟电子意识到品质是品牌的核心。公司引进了先进的生产设备和管理体系,严格按照ISO9001质量体系运作,确保产品质量的稳定性和可靠性。同时,公司还加强了对原材料的质量控制,与国内外优质供应商建立了长期稳定的合作关系。这些举措使得爱晟电子的产品在市场上赢得了良好的口碑,品牌影响力逐渐增强。

胜利(VICTOR)公司的发展小趣事

随着产品的不断升级和市场的扩大,胜利公司开始将目光投向国际市场。1980年代,VICTOR品牌成功进入欧美市场,凭借优质的产品和合理的价格,迅速赢得了消费者的认可。公司还积极参加国际赛事,通过赞助等方式提升品牌知名度。

High Energy Corp公司的发展小趣事

随着产品的不断升级和市场的扩大,胜利公司开始将目光投向国际市场。1980年代,VICTOR品牌成功进入欧美市场,凭借优质的产品和合理的价格,迅速赢得了消费者的认可。公司还积极参加国际赛事,通过赞助等方式提升品牌知名度。

CONTRINEX公司的发展小趣事

除了上述重要事件外,Contrinex还一直致力于产品创新和技术研发。多年来,公司不断推出新型传感器产品,如防磁防焊型电感式传感器、扩展型纤细型安全光幕等,以满足不同客户的需求。同时,Contrinex还积极与OEM和系统集成商合作,共同开发定制化解决方案,为客户提供更加全面和专业的服务。

这些故事只是Contrinex在电子行业发展历程中的一部分。作为一个不断追求卓越和创新的企业,Contrinex将继续致力于为客户提供高品质、高精度的传感器产品和解决方案,推动电子行业的持续发展。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

问答坊 | AI 解惑

STM32 中断与嵌套NVIC 快速入门。

TM32 中断与嵌套NVIC 快速入门。 我也是靠看这本书才弄懂的: Cortex-M3 权威指南 Joseph Yiu 著 宋岩 译 其实很简单。 //CM3 有 最多240个中断(通常外部中断写作IRQs),就是 软件上说的 IRQ CHANAELx(中断通道号x) 每个中断有自己的可编 ...…

查看全部问答>

请好心人帮忙下载一下软件,然后发我! 万分谢谢.

http://www.96qd.com/driver/softdown.asp?softid=166173 请哪位好心人帮我下载这个驱动程序,之后压缩打包后发我一下, 万分谢谢! 我的email: hkds2008@163.com 在线等!…

查看全部问答>

如何对第二代身份证的内部信息进行过读写

请问各位大虾,有没有人对第二代身份证的内部信息进行过读写,或者进行二次开发,如何读写,有没有什么相关的设备。…

查看全部问答>

【我给xilinx资源中心做贡献】Xilinx Spartan-3E开发板相关资源

概述 Spartan-3E初学者电路板向工业上基于Spartan-3E电路设计平台提供了最受欢迎最超值的产品。板载的50万门Spartan 3E FPGA可以构建32位RISC处理器和DDR接口。开发板上拥有的Xilinx Platform Flash、USB和JTAG并 ...…

查看全部问答>

急请教,这是哪个公司的产品!谢谢

最近在弄气敏型烟雾监测装置,手里面有一个传感器元件,性能测试不错,但是不知道是哪个厂家的产品,只能从产品上面看到企业logo。 急求各位大侠,哪个知道是哪个公司的产品吗?…

查看全部问答>

MSP430F149内部资源(一)

一、上电复位 POR 和 上电清除 PUC 二、低功耗控制 但系统时钟发生器基本功能建立之后,CPU内的状态寄存器SR中的SCG1、SCG2、OscOff、CpuOff是低功耗的重要控制位; 系统工作模式一共有6种,1种活动模式和5种低功耗模式; 可以通过设置控制位使 ...…

查看全部问答>

430 IO 数字量

430的IO都是数字量类型的管脚,如果电流经模数转换后的数字量可不可以1个输出接一个IO口呢,在程序里循环扫描这几个IO口,来获得这个数字量,不知道这个想法是否可行,不行的话,麻烦讲解一下 …

查看全部问答>

晒WEBENCH设计的过程+500流明LED设计

本帖最后由 游乐场 于 2014-7-16 21:51 编辑 普通的白炽灯要有500流明的光通量大概需要60W,而500流明的LED大概在5W到20W左右,每一盏LED都比白炽灯更加节能。现在用WEBENCH设计一款500流明光通量的LED。第一步  在LED设计框选择输入设 ...…

查看全部问答>

一点点小分享

偶尔看到群里各种没法编译,我觉得要上阵必须要磨好枪,不过我最近很忙,没什么时间学习瑞萨,只能靠挤时间来完成。 我的版本是2.02的,也能完成大家所要求的大部分操作。在此再次说明一下,单纯使用光碟里面的程序是不能完成下载程序的,就是说使 ...…

查看全部问答>

求个STM32编译MDK 或 IAR。

求个STM32编译MDK 或 IAR。 …

查看全部问答>