555定时器应用 测电容 电阻 电感 - 图文

更新时间:2023-03-11 08:38:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

简易电阻、电感和电容的测试仪

摘 要:本系统以MSP430单片机作为控制核心,由555构成多谐振荡电路实现对电阻

和电容的测量,采用电容三点式振荡电路实现对电感的测量。控制继电器实现电阻、电容测量的档位自动切换,使测量精度满足指标要求;为使单片机精确测量待测频率,在电感测量模块中先进行整形和分频,然后测量,以提高测量精度。该系统设计简单,成本低,操作简单,在测量范围内误差很小,经电路仿真分析可达到题目要求的指标。

关键词:555多谐振荡电路,电容三点式振荡,MSP430单片机,继电器

一、系统方案论证

1.1 电阻测量模块方案论证

方案一:伏安法。如图1-1所示,分别用电流表和电压表测出通过电阻的电流和电阻两端的电压,根据公式R=U/I求得电阻。这种测量方法虽然电路简单,但要同时测出两个模拟量,不易实现自动化,而电压表与电流表都存在内阻,测量误差大,精度不高。 Rx A

V

图1-1 伏安法测量原理

方案二:电阻分压法。如图1-2所示,将待测电阻Rx和基准电阻R串联在电路中,由于电阻分压的作用,当串联到电路上的电阻Rx的值不同时其Rx上分的压降也不同。通过测量上Vx便可由公式RX?VXR(VCC?VX) 求得RX。

Vx 图1-2 电阻分压电路 R

Rx

Vcc GND

该方案原理简单,理论上只要参考电阻精确,就可以测量任何阻值的电阻,但实际上由于AD的分辨率有限,当待测电阻很大或是很小时就很难测出Rx上的压降Vx,从而使测量范围缩小,要提高测量范围和精度就需要对电阻分档测试和提高AD的分辨率。这无疑会增加系统的复杂性和成本,所以也不可行。

方案三:RC和555定时器组成的多谐振荡电路。很多仪表都是把较难测量的物理量转变成精度较高且较容易测量的物理量。基于此思路,我们把电阻阻值转换成频率信号,

1 / 23

通过测量输出振荡频率的大小即可求得电阻的大小,如果固定电阻值,该方案硬件电路实现简单,通过选择合适的电容值即可获得适当的频率范围,同时输出波形为TTL电平的方波信号所以不需要再对信号做电平变换,即可直接供数字电路处理,这种处理一方面便于使仪表实现智能化,另一方面也避免了由指针读数引起的误差。

综合比较,基于对精度要求较高,并从测量时操作的简便程度考虑,本设计采用方案三,用RC和555定时器组成的多谐振荡电路来实现要求。

1.2 电容测量模块方案论证

方案一:利用RC充电原理,根据电路原理电容充电的时间常数τ=RC。通过选择适当的参考电容,通过测量充电到一个固定电压时所需的时间即可以测量出相应的电容大小。此方案下测量大电容较准,但在电容容量较小时,电容在极短的时间内就能充满,即充电时间较短,所以很难测准。

方案二:电桥法是另一种经典的方法,如图1-3所示,可利用交流电桥来测量电容。

VC Zx Z1 G Zn Z2 GND

图1-3 直流电桥平衡电路电桥的平衡条件为:

Z1?Zn?ej?(?1??n)?Z2?Zx?ej?(?2??x)

通过调节阻抗Z1、Z2使电桥平衡,这时电表读数是零。根据平衡条件及一些已知的电路参数就可以求出被测参数。用这种测量方法,参数的值还要通过联立方程求解,调节电阻值一般只能手动,电桥平衡的判别亦难以用简单的电路实现。这样,电桥法不易实现自动测量。

方案三:同样利用RC和555定时器组成的多谐振荡电路,通过测量输出振荡频率的大小即可求得电容的大小,如果固定电阻值,该方案硬件电路实现简单,能测出较宽的电容范围,完全满足题目的要求。同时输出波形为TTL电平的方波信号所以不需要再对信号做电平变换。即可直接输入单片机处理。

综合比较,基于对精度要求较高,并从测量时操作的简便程度考虑,本设计采用方案三,用RC和555定时器组成的多谐振荡电路来实现要求。

1.3 电感测量模块方案论证

方案一:采用电桥法测量电感。将待测电感和已知标准电阻电容组成电桥,通过单片机控制调节电阻参数使电桥平衡,电感的大小由电阻和电桥的本征频率求得,该方案测量精准,同时可以测量电容和电阻的大小,但其电路复杂,实现起来较为困难。

2 / 23

方案二:用555定时器和被测电感利用电感储能以及充放原理构成多谐振荡器,通过测频率值确定被测电感的值。该方案电路结构简单,输出波形为TTL电平的方波信号,简单分频后可获得较为理想的测试频率范围,方便单片机精确测量。

方案三:采用LC配合三极管组成三点式振荡电路,通过测输出频率大小的方法来实现对电感值测量。该方案成本最低,但其输出波形为正弦波,需要将其波形整形后才能交给处理器处理,成本稍微高了。

综合比较,基于方案二的设计误差太大,最终采用了方案三。

1.4 频率测量方案论证

方案一:直接测频法。该测量方法是把被测频率信号经过脉冲形成电路,计数器计数被测信号的脉冲周数,从而通过计算频率的公式得到被测信号的频率。此方案对低频信号的测量精度不是很高,对于高频信号的测量也不是很准确,只在一定范围的频率内才能测得比较准确的数值。因此只适用于一定范围内的频率测量。

方案二:测周期法。该测量方法是通过测量被测信号的周期来计算频率。被测信号经脉冲形成电路变成方波通过单片机的计数器计数,再根据计算公式即可获得被测信号的频率。该方案对低频信号的测量比较准确,但对于高频信号,测量误差较大,故只适合低频信号的测量。

在比较两种方案之后,决定采用第一种方案来进行频率的测量。

1.5 系统方案概述

量程切换 F1 MSP430 单 片 机 电阻谐振式测量 量程切换 F2 DIP 开 关 频率 电容谐振式测量 数 字 显示 电感三点式测量 整形电路 分频电路 F3

图1-4 系统设计总框图

系统设计总框图如图1-4所示,本设计将电阻、电容和电感测量模块产生的不同频率的方波信号经整形和分频电路分别送至通道选择模块,根据测试的元件类型,单片机

3 / 23

通过按键的输入选择相应的测试电路,并自动检测出待测元件的值所对应的频率范围,控制继电器实现对元件测量的自动换挡。同时单片机通过一定的计算后,在液晶显示屏上显示出元件的类型和测量值。

二、理论分析与计算

2.1 电阻测量的分析与计算

电阻测量原理图如图2-1所示,是由555定时器和R1、R2、C1组成的多谐振荡电路。电路振荡产生的频率由R1、Rx、C1确定。

R1 Rx

Vout

C1

图2-1 电阻电容测量原理图

电容C1的充电所需的时间,即脉冲维持时间: 放电所用时间,即脉冲低电平时间: 所以脉冲周期时间为: tt1?(R1?Rx)C1ln2

t2?RxC1ln2

?t1?t2?ln2?C1(R1?2Rx)

1

ln2?C1(R1?2Rx)故输出脉冲频率为: f?所以只要已知R1、RX、C1中的其中两项的参数再通过单片机测出振荡频率的大小就可以计算出剩下第三项的参数。本设计中通过固定R1和C1的参数将待测量的电阻作为R2接入电路中的方法来测量电阻。

为使振荡频率保持在10-20kHz这一段单片机计数的高精度范围内,需选择合适的C1和R1的值,同时不能使电阻功耗太大。所以我们设计了两路电路,

第一个量程选择R1?500?,C1?1uF;

第二个量程选择R2?18K?,C2?1nF; 这样,

在第一个量程中,若

Rx?100?时(下限)

f?1?2.06kHzln2?C1(R1?2Rx); 1?72kHzln2?C2(R2?2Rx)。

在第二个量程中,若

4 / 23

Rx?10M?时(上限)

f?

因为RC振荡的稳定度可达1/1000,单片机测频率最多误差一个脉冲,所以由单片机测频率值引起的误差在百分之一以下。

量程自动转换原理:单片机在第一个频率的记录中发现频率过小,即通过继电器转换量程。再测频率,求Rx的值。

1 误差分析 : ?R2?2Rx?

ln2C2?f?f?C? ?2?Rx??

ln2C2?f?fln2C2?C2?f? 因为

?RxRx?ff?Rx?f?C2??R2/2?RxfC2

相当小,在11000左右,远小于仪表所需要的精度,可忽略。这样,

?C2C2的精度取决于,即电容的稳定性。电路中采用了稳定性良好的独石电

容,理论上说,只要

?C2C2小于1100,所测电阻的精度亦能在1100以下。由于单片机

程序中采用了多位数的浮点运算,计算精度可远高于1100。

2.2电容测量的分析与计算

电容测量的原理图也如图2-1,同样由555电路构成的多谐振荡电路,通过计算振荡输出的频率来计算被测电容的大小。

由2.1的分析知其振荡周期为: 得出:f?

11 ,即: Cx?

(ln2)?Cx?(R1?2R2)(ln2)?fx?(R1?2R2)为使频率在单片机高精度测量范围内,我们同样设计了两路电路,取值分别为:第

R?470k?,R4?470k?;

一量程:R1?1k?,R2?10M?;第二量程:3这样的取值使电容档的测量范围很宽,同样可通过继电器转换量程。 误差分析:

同Rx的测量,有已知

?Cx?f?R1??, CxfR1?R1R1亦

?ff能满足1100以下的精度,而精密的金属膜电阻其阻值的变化

能满足1100左右的精度。这样,电容的精度也可以做得很高。

2.3 电感测量的分析与计算

电感的测量是采用电容三点式振荡电路来实现的。三点式振荡电路是指:LC回路

5 / 23

中与发射极相连的两个电抗元件必须是同性质的,另外一个电抗元件必须为异性质的,而与发射级相连的两个电抗元件同为电容式的三点式振荡电路,其振荡频率为: fx?12?LC1

4????fx?fx?C 即:Lx?如图3-3所示, C1和C2分别采用100nF和1uF的独石电容,其电容值远大于晶体管的极间电容,可以把极间电容忽略,则C?(C1?C2)/(C1?C2)?0.09uF

单片机的高精度测量范围有限,因此在测电感这一档时,只能分频后送单片机计数。 误差分析:?Lx?1

4????fx?fx?C?????L?L?f?C?????2?L??f???C?????22????f?C?2?2fC??4?2fC2?????

?

由此可见,因为上讲,只要

?CC?L2?f?C??LfC ?ff?LL相当小,

小于1100,

的精度主要取决于电容值的稳定性,从理论

?LL也就能达到相当的水平。一般而言,电容的稳定

性,特别是像独石电容一类性能比较好的电容,样误差精度就能保持在?5100以内。

?CC能满足小于5100的要求,这

三、硬件电路设计

3.1 测量电阻电路的设计

电阻的测量分为两个量程:第一个量程,f??30Hz,开关S1和S3闭合;

第二个量程,f?30Hz,开关S2和S4闭合。

电路图如图3-1所示:

6 / 23

图3-1 电阻测量电路图

3.2 测量电容电路的设计

电容的测量同样设计了两路电路,取值分别为: 第一量程:10pF?Cx?1000pF,开关S2和S4闭合; 第二量程:1000pF?Cx?100000pF,开关S1和S3闭合;

电路图如图3-2所示:

图3-2 电容测量电路图

3.3 测量电感电路的设计

因为电感测量模块产生的信号是正弦信号,所以必须先整形成方波,又由理论分析可知电路的输出频率很高,所以也要对输出的信号分频,单片机才能处理。

7 / 23

3.3.1 电感测量电路

图3-3 电感测量电路

3.3.2 整形电路

图3-4 整形电路

3.3.3 分频电路

8 / 23

图3-5 10分频电路

3.4继电器的设计

电阻与电容的测量电路中均需要自动换挡,我们采用继电器来实现。继电器是一种电子控制器件,通常应用于自动控制电路中。当测量电路中所测频率过低时,单片机就会控制继电器转换量程。

如图3-6所示为继电器的原理图,其中,二极管是对其有保护作用,三极管有放大电流的作用。在具体电路中,继电器是1伏和3伏换挡,通过单片机来实现其自动化。

图3-6 继电器原理图

3.5 按键部分

通道的选择可以通过MSP430单片机上面的键盘控制。通道选择见表3-1 .

表3-1 按键通道选择 按键 对应测试项 KEY1 KEY2 KEY5 KEY6 测试R 测试C 测试L 返回 9 / 23

四、 程序设计

开始 时钟、液晶屏、键盘初始化 扫描键盘获得键值Check_Key 1 电阻测量 2电容测量 3电感测量 0 转换量程 f>=30Hz 0 转换量程 C<=1nF 分频 1 高量程 低量程 高量程 1 低量程 计算参数并又液晶屏输出 计算参数并又液晶屏输出 计算参数并又液晶屏输出 液晶显示

图4-1 主程序流程图

该系统以MSP430作为控制平台,其主程序流程如图4-1所示。程序开始先对系统初始化,然后由键盘输入测试项目(如:1电阻测量;2 电容测量;3 电感测量),然后采集信号频率,在测量电阻和测量电容时要通过对信号频率进行分析来转换电路(量程转换),再将从新采集的信号频率进行计算,得到待测器件的参数,并由液晶屏输出参数。测量完成之后系统返回到初始化的状态。

10 / 23

图4-2 按键程序流程图

图4-3 频率测量流程图

五、系统测试与结果分析

5.1 测试使用的仪器设备

测试使用的仪器设备如表4.1所示。

表4-1 测试使用的仪器设备 序号 名称、型号、规格 数量 1 RLC电桥测量仪 1 2 数字示波器 1 5.2 测试方法

备注 测量精度高 查看输出波形 根据设计搭好好电路通过拨码选择给个部分模块供电,再测量前用电桥测量仪测出所需测量电阻电容与电感的实际值,再根据单片机提示选择所需测量器件。然后待控制器自动检测和自动换挡完成约1~3s即会在LCD上显示出相应元件的类型和测量值,此时读出测量结果与实际值作比较,计算出其测量误差。

5.3 测试数据

5.3.1电阻测量数据

表4-2 电阻测量数据

标称值电桥测仪器测误 差 标称值电桥测仪器测误 差 11 / 23

(Ω) 11 100 900 16k 量(Ω) 量(Ω) 11.1 99 989 16K 12 95.4 972.6 16.1k (%) 8.10 3.63 1.65 0.62 (Ω) 量(Ω) 量(Ω) 100K 510K 2.2M 9M 100.4k 102.9k 511k 511.8k (%) 2.49 0.15 1.14 5.88 2.192M 2.217M 8.9M 8.376M 5.3.2电容测量数据

表4-3 电容测量数据

标称值 (F) 10p 100p 1n 电桥测量(F) 10p 100p 0.98n 仪器测量(F) 10.5p 102p 0.94n 误 差 (%) 5.00 2.00 4.08 标称值 电桥测(F) 4.7n 33n 100n 量(F) 4.9n 35n 101n 仪器测量(F) 5.1n 36.3n 105.5n 误 差 (%) 4.08 3.71 4.45 5.3.3电感测量数据

表4-4 电感测量数据

标称值(H) 30u 100u 330u 电桥测量(H) 31.1u 100.9u 339.8u 仪器测量(H) 30.85u 102.7u 340.6u 误 差 (%) 0.80 1.78 0.23 标称值电桥测仪器测误 差 (%) 2.05 2.45 3.89 (H) 量(H) 量(H) 1m 3.2m 15m 1.02m 3.298m 15.4m 0.999m 3.217m 16m 5.4测试结果分析

电阻模块的测量结果显示在基本测量范围内误差均小于5%,而在拓展范围误差偏大。

电容模块的测量结果显示所有测量的误差均在5%以内。

电感模块的测量结果显示可以测量的范围内误差均小于5%,但拓展指标没有做到,10uH的电感已经测量不出来。

12 / 23

六、小结

本次课题设计系统的基本原理是电阻、电容、电感与测量电路构成各自的震荡电路,产生的相应频率的脉冲方波,将该频率数据采集输入到单片机,利用电路中其他器件已知的参数,单片机对频率进行运算,可以算出待测元件的各个参数并显示在1602液晶屏幕上。系统使用按键选择被测元件类型,由于不同的电容、电阻、电感值的大小对应的谐振频率不同,通过测量振荡电路发出的频率计算出相应的电阻、电容和电感的值。该系统设计简单,成本低,性能基本符合题目要求指标,在测量范围内测量误差很小,且操作简单,人机界面友好。

通过这个仪表的设计,我们体会到了细心、认真的重要性,更深深的认识到软件和硬件相结合的重要性,学到了很多。在最终的测量过程中,发现基本指标都可达到,拓展指标只有一个模块达到,这就告诉我们,以后不管做什么题目,不能只是达到基本要求就放心了,而应该以最高的要求定位,这才能在竞赛中存在优势。

参考文献

[1] 高吉祥.全国大学生电子设计竞赛培训系列教程.北京:电子工业出版社,2007. [2] 杨欣,王玉凤,刘湘黔等.电子设计从零开始.北京:清华大学出版社,2010. [3] 李桂安.电子技术实验及课程设计.南京:东南大学出版社,2008.

[4] 申忠如,郭福田,丁晖.现代测试技术与系统设计.西安:西安交通大学出版社,2006.2.

[5] 付晓光.单片机原理与使用技术.北京:清华大学出版社,2008.

[6] 童诗白,华成英.模拟电子技术基础.北京:北京航空航天大学出版社,2002

[7] 申忠如,申淼,谭亚丽.MCS-51单片机原理及系统设计.西安:西安交通大学出版社,2008.

[8] 阎石.数字电子技术基础.北京:高等教育出版社,2005.

[9]张毅刚.MCS-51单片机应用系统.哈尔滨:哈尔滨工业大学出版社,1997 [10] 曹磊.MSP430单片机C程序设计与实践.北京:北京航天航空大学出版社,2007.

附录一:系统程序

主程序:

#include \#define TIMER 32768 typedef unsigned char uchar; typedef unsigned int uint;

13 / 23

//引用外部变量的声明

extern unsigned int key_val; //key_val 键值 extern unsigned char key_Flag; //key_Flag 标志

unsigned long Cap_Tar=0,cap_first=0,cap_last=0,pulse=0,time=0,Value,Lf,F; double R=0,CZ,L,f; unsigned char flag=0;

/***********时钟设置************/ void Init_clk() {

unsigned char i; do {

IFG1 &= ~OFIFG; // 清除振荡器失效标志 for(i = 0Xff;i > 0;i--); // 稳定时间 }

while((IFG1 & OFIFG) != 0); // 如果振荡器失效标志存在 BCSCTL2 |=SELM_2+SELS; // SMCLK = LFXT2CLK }

/*********捕获设置**********/ void Init_cap() {

P1DIR&=~BIT3;//P1.3输入 P1SEL|=BIT3;//p1.3复用为TA2

TACCTL2=CM_2+SCS+CCIS_0+CAP+CCIE;//下降沿捕获+同步捕获+CCIxA(P1.3)++捕获中断使捕获模式能 CCR0=TIMER;

TACTL=TASSEL_1+MC_1+TAIE+TACLR;//时钟源ACLK+增计数模式+TAIFG中断请求使能 }

//timer_B设置。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 void Init_TB() {

P1DIR=0xfe;

P1SEL|=BIT0; //闸门法测频输入口为P1.0 TBCCTL0 = CCIE; //使能CCR0中断

TBCCR0 = 1023; //设定周期0.25S

TBCTL = TBSSEL_1 + ID_3 + MC_1; //定时器b的时钟源选择ACLK,增计数模式 CCTL0=CCIE;

TACTL = TASSEL_0+MC_2; //外部引脚TACLK信号+连续计数模式

14 / 23

TAR=0; }

//‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’ /****************显示界面********************/ const uchar hang1[] = {\测量:\const uchar hang2[] = {\电阻请按:1\const uchar hang3[] = {\电容请按:2\const uchar hang4[] = {\电感请按:5\

/***************测量界面********************/ const uchar hang5[] = {\电阻测量: \const uchar hang6[] = {\ \const uchar hang7[] = {\退出测量请按: 6 \const uchar hang8[] = {\电容测量: \const uchar hang9[] = {\ \const uchar hang10[] = {\电感测量: \const uchar hang11[] = {\ uH\//const uchar hang22[] = {\ Ω\ const uchar hang17[] = {\ KΩ\

const uchar hang_f[] = {\ Hz\const uchar hang_99[] = {\

/***************************主函数*************************/ void main( void ) {

//int p=0; int K;

// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; Init_clk(); //初始化时钟 Ini_Lcd(); //初始化液晶

Init_Keypad(); //初始化键盘端口c huanying(); P6DIR=0xff; P6OUT=0x00; while(1) {

Ini_Lcd(); P6OUT=0x00;

Disp_HZ(0x80,hang1,7); Disp_HZ(0x90,hang2,5); Disp_HZ(0x88,hang3,5); Disp_HZ(0x98,hang4,5);

15 / 23

Key_Event(); Check_Key(); if(key_Flag==1) {

key_Flag=0; K=key_val; }

/**********电阻计算**********/ if(K==1) {

int i=0;

P6OUT=0x40;

Init_cap(); //初始化CAP

TBCCTL0 =~ CCIE; //关闭CCR0中断 Ini_Lcd();

double Rc=0,RA=0; Disp_HZ(0x80,hang5,8); Disp_HZ(0x90,hang_f,8); Disp_HZ(0x88,hang6,8); Disp_HZ(0x98,hang7,8); _EINT(); //打开中断 while(1) {

Key_Event(); Check_Key(); if(key_Flag==1) {

key_Flag=0; K=key_val; }

while(flag) {

_DINT();

flag=0; //清楚捕捉标志 f=pulse; if(f>26) {

const uchar hang22[] = {\ Ω\ f=f*100;

Value=(unsigned long)(f); Disp_ShuZhi(0x92,Value); f=f/100;

P6OUT=0x40; Rc=1;RA=500;

16 / 23

R=1.4427/((Rc*1e-6)*f)-RA; R=R/2;

if(R<30){R=R-R*0.30;} if(30

Value=(unsigned long)(R); Disp_ShuZhi(0x8A,Value); Disp_HZ(0x8E,hang22,2);

Init_cap(); //初始化CAP _EINT(); }

else {

P6OUT=0x48;

Init_cap(); //初始化CAP

TBCCTL0 =~ CCIE; //关闭CCR0中断 _EINT(); while(1) {

Key_Event(); Check_Key(); if(key_Flag==1) {

key_Flag=0; K=key_val; }

//Init_cap(); //初始化CAP

TBCCTL0 =~ CCIE; //关闭CCR0中断 _EINT(); while(flag) {

delay_1ms(1000); _DINT();

flag=0; //清楚捕捉标志 f=pulse;

if(f>2400){i=1;} f=f*100;

Value=(unsigned long)(f); Disp_ShuZhi(0x92,Value); f=f/100;

Rc=0.01;RA=20000;

const uchar hang22[] = {\ R=1.4427/((Rc*1e-6)*f)-RA; R=R/1000;

17 / 23

R=R/2;

if(254500){R=R-R*0.06;} R=R*100;

Value=(unsigned long)(R); Disp_ShuZhi(0x8A,Value); Disp_HZ(0x8E,hang22,2);

Init_cap(); //初始化CAP _EINT();

delay_1ms(1000); //else {i=1;f=0;break;} if(K==6) break; }

if(K==6) break;

if(i==1) {i=0;f=0;break;} } } }

if(K==6){_DINT();f=0;pulse=0;Value=0;TAR=0; break;} } }

/*************电容计算************/ else if(K==2) {

int i=0;

P6OUT=0x80;

Init_cap(); //初始化CAP

TBCCTL0 =~ CCIE; //关闭CCR0中断 Ini_Lcd();

double R1=0,R2=0;

Disp_HZ(0x80,hang8,8); Disp_HZ(0x90,hang_f,8); Disp_HZ(0x88,hang9,8); Disp_HZ(0x98,hang7,8); _EINT(); //打开中断 while(1) {

if(i==0){P6OUT=0x80;} Key_Event(); Check_Key(); if(key_Flag==1)

18 / 23

{

key_Flag=0; K=key_val; }

TBCCTL0 =~ CCIE; //关闭CCR0中断 _EINT(); while(flag) {

_DINT();

flag=0; //清楚捕捉标志 f=pulse; f=f*100;

Value=(unsigned long)(f); Disp_ShuZhi(0x92,Value); f=f/100;

R1=1000;R2=1000000;

const uchar hang23[] = {\ CZ=1.4427/((R1+2*R2)*f*1e-6); CZ=CZ*1e+6; _EINT(); if(CZ>950) {

i=1;

P6OUT=0x84; _DINT();

flag=0; //清楚捕捉标志 f=pulse; f=f*100;

Value=(unsigned long)(f); Disp_ShuZhi(0x92,Value); f=f/100;

R1=465500;R2=461000;

const uchar hang23[] = {\ CZ=1.4427/((R1+2*R2)*f*1e-6); CZ=CZ*1e+3;

if(1.540){CZ=CZ-CZ*0.07;} CZ=CZ*100;

Value=(unsigned long)(CZ); Disp_ShuZhi(0x8A,Value); Disp_HZ(0x8F,hang23,1);

Init_cap(); //初始化CAP _EINT(); }

19 / 23

else {

i=0;

//if(CZ<65){CZ=CZ-18;} if(65

CZ=CZ*100;

Value=(unsigned long)(CZ); Disp_ShuZhi(0x8A,Value); Disp_HZ(0x8F,hang23,1);

Init_cap(); //初始化CAP _EINT(); } }

if(K==6){_DINT();f=0;pulse=0;Value=0;TAR=0; break;} } }

/*************电感计算************/ else if(K==5) {

P6OUT=0xC0;

Init_cap(); //初始化CAP

TBCCTL0 =~ CCIE; //关闭CCR0中断 Ini_Lcd();

double LC=9.090909; Disp_HZ(0x80,hang10,8); Disp_HZ(0x90,hang_f,8);

Disp_HZ(0x88,hang11,8); Disp_HZ(0x98,hang7,8); _EINT(); //打开中断 while(1) { Key_Event(); Check_Key(); if(key_Flag==1) {

key_Flag=0; K=key_val; }

const uchar hang_mH[] = {\ _EINT(); //打开中断 while(flag) {

_DINT();

20 / 23

flag=0; //清楚捕捉标志 f=pulse; f=f*100;

Value=(unsigned long)(f); Disp_ShuZhi(0x92,Value); f=f/100;

L=0.02535/(LC*f*f); L=L*1e+12;

//if(L<80){L=L-L*0.04;}

if(80

Value=(unsigned long)(L); Disp_ShuZhi(0x8A,Value); Init_cap(); //初始化CAP _EINT(); }

if(K==6){_DINT();f=0;pulse=0;Value=0;TAR=0;break;} } } } }

采频程序

#pragma vector=TIMERA1_VECTOR __interrupt void TimerA1_ISR(void) {

switch(TAIV) {

case 2:break; case 4: {

Cap_Tar++; break; }

case 10: {

pulse=Cap_Tar-1; Cap_Tar=0; flag=1; break; }

21 / 23

} }

键盘扫描、获得键值程序

void Check_Key(void) {

uchar row ,col,tmp1,tmp2;

tmp1 = 0x80;

for(row = 0;row < 2;row++) //行扫描 {

P1OUT = 0xc0; //P1.4~P1.7输出全1

P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0 tmp1 >>=1;

if ((P1IN & 0x03) < 0x03) //是否P1IN的P1.0~P1.3中有一位为0 {

tmp2 = 0x01; // tmp2用于检测出那一位为0 for(col = 0;col < 2;col++) // 列检测 {

if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是 {

key_val = key_Map[row * 4 + col]; // 获取键值 // return; // 退出循环 }

tmp2 <<= 1; // tmp2右移1位 } } } }

液晶显示程序

void Write_Data(uchar dat) {

#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入 #define LCD_DataOut P4DIR=0xff //数据口方向设置为输出 #define LCD2MCU_Data P4IN #define MCU2LCD_Data P4OUT

#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出 #define LCD_RS_H P3OUT|=BIT0 //P3.0输出高

#define LCD_RS_L P3OUT&=~BIT0 //P3.0输出低电平 #define LCD_RW_H P3OUT|=BIT1 //P3.1输出高 #define LCD_RW_L P3OUT&=~BIT1 //P3.1输出低 #define LCD_EN_H P3OUT|=BIT2 //P3.2输出高 #define LCD_EN_L P3OUT&=~BIT2 //P3.2输出低

22 / 23

uchar lcdtemp = 0; LCD_RS_L; LCD_RW_H; LCD_DataIn;

do //判忙 {

LCD_EN_H; _NOP(); lcdtemp = LCD2MCU_Data; LCD_EN_L; }

while(lcdtemp & 0x80); LCD_DataOut; LCD_RS_H; LCD_RW_L;

MCU2LCD_Data = dat; LCD_EN_H; _NOP(); LCD_EN_L; }

23 / 23

本文来源:https://www.bwwdw.com/article/leww.html

Top