--电感电容测量仪器的设计论文--终极版
本科毕业论文(设计)
(2014届)
电感电容测量仪器的设计
院 系 电子信息工程学院
专 业姓 名 韩永奇
指导教师 陆俊峰 陈兵兵
高 工 助 教
2014年4
月
摘 要
近年来,电子行业的飞速发展,用户大多数使用万用表来测量一些元件参数或者电路中的电压电流。但是万用表却有一定的局限性,它只能测量有限种类的元器件的参数,却不能测量电感电容这部分元器件。所以制作一种简便的电容电感测量仪显得尤为重要,方便用户测量电路中需要用到的电容及电感的具体值。
在测量电感电容值时, 传统的测量大都采用交流电桥法和谐振法,然后通过磁性指针刻度读数,然而这些方法读数不够直观准确。通过改进,结合LRC 振荡电路原理, 结合以STC89C52单片机为控制核心,搭配必要的外围电路对电阻、电容和电感参数进行测量。基本原理是将电阻阻值、电容容值、电感感值的变化均转换成方波脉冲频率的变化,通过单片机做运算,计算出待测元件的各个参数并通过1602液晶屏显示出来。通过按键选择被测元件类型,测量时,只需将待测元件引脚放在测试仪的输入端即可。实验结果表明,该系统性能稳定,精度高。
关键词:STC89C52单片机;电阻测量;电容测量;电感测量
Abstract
In recent years, the rapid development of the electronics industry, most users use a multimeter to measure the parameters of some components or the circuit voltage and current. However, there are some limitations multimeter, it can only measure the parameters of limited types of components, but not in this part of the inductance and capacitance measurement components. So making a simple capacitance and inductance measuring instrument is particularly important, user-specific value measurement circuits need to use capacitors and inductors.
When measuring the inductance and capacitance values,mostly using traditional measurement method and AC bridge resonant method. However, these methods usually scale reading, reading is not intuitive. By improving, based on the principle of LC oscillator circuit, combined with STC89C52 microcontroller core, with the necessary peripheral circuit resistance, capacitance and inductance parameters were measured. The basic principle is that the resistor, capacitor capacitance changes the inductance values are converted to a square wave pulse frequency changes by the microcontroller to do arithmetic to calculate the various parameters of the DUT and through 1602 LCD screen display. By button to select the type of test elements, measurement, simply put the DUT pin to the input of the tester. Experimental results show that the system performance, stability, high accuracy.
Keywords: STC89C52 SCM; Resistance measurement; Capacitance measurement; Inductance measurement
目 录
摘 要 ............................................................................................................. I ABSTRACT .................................................................................................. II 目 录 .......................................................................................................... III
1 绪论 ............................................................................................................ 1
2 电路方案的设计 ........................................................................................ 1
2.1电阻测量方案 ............................................................................................. 1
2.2电容测量方案 ............................................................................................. 2
2.3电感测量方案 ............................................................................................. 2
3 核心元器件介绍 ........................................................................................ 3
3.1 NE555的介绍 . ............................................................................................ 3
3.2 NE5532的介绍 . .......................................................................................... 5
3.3 STC89C52的介绍 ...................................................................................... 6
3.4 1602液晶的介绍 ........................................................................................ 7
4 单元电路设计 .......................................................................................... 10
4.1 电阻测量电路的设计 .............................................................................. 10
4.2 电容测量电路的设计 .............................................................................. 11
4.3 电感测量电路的设计 .............................................................................. 11
4.4 电阻、电容、电感显示电路的设计 . ..................................................... 12
5 程序设计 .................................................................................................. 13
5.1 中断程序流程图 ...................................................................................... 13
5.2 主程序流程图 .......................................................................................... 14
6 设计结果 .................................................................................................. 14
6.1系统测试 ................................................................................................... 14
6.2系统总结 ................................................................................................... 16
心得体会 ...................................................................................................... 17
参考文献 ...................................................................................................... 18
附 件 .......................................................................................................... 19
1 绪论
我们生活在一个科学技术比较发达的现代化社会,而在现代化学习、实验、生产过程当中,往往都要对某一个元器件的具体参数进行测量,经常要对很多电感和电容进行测量, 这就要用很多仪器和仪表,在这之中万用表以其简单易用,功耗低等优点被大多数人所选择使用。然而万用表却有很多局限性,比如不能测量电容,有时对电感也有不能用的时候,所以制作一个简单易用的电感电容测量仪是很有必要的。
如今国内很多生产厂家都致力于新型电感、电容测量仪器的研究,都向着高精度、低功耗的方向不断努力,他们使用的原理就是利用LRC 振荡电路把电感、电容的数据转化为电压或者频率信号,再通过频率检测用单片机进行运算二得到的,这种方法简单高效,精度高,具有很好的研究前景。
2 电路方案的设计
电阻、电容、电感的设计采用分块设计的方法,先对电阻的测量模块进行设计,再对电容测量模块实际,最后在对相对比较复杂的电感测量设计,电阻电容测量都采用555定时器构成振荡电路的方法,电感测量是采用电容三点式振荡电路的方法。
2.1电阻测量方案
电阻测量采用用555定时器构成单稳态电路。把待测电阻连入下面(图2-1)所示的555定时器,构成单稳态电路,通过单片机读取其所产生脉冲波形的频率,然后通过公式计算得到电阻的阻值的方法[1]。
图2-1 555定时器构成单稳态的电阻测量电路图
由电路图可以知道频率的计算公式为:
f =1 ln 2*(R 1+2R x ) *C
(2-1)
化简得出:
11R x =*(-R 1) 2ln 2*f *C (2-2)
由于使用单稳态电路通过单片机处理,其精确度高。
2.2电容测量方案
电容的测量与电阻测量相似,也是利用555构成单稳态电路(如图2-2),待测电容是电路中的C x ,再用单片机处理”OUT ”输出的信号的频率,通过公式换算得到电容值。由单稳态电路的特性知:
f =1 ln 2*(R 1+2R 2) *C x
1 3ln 2*f *R 1(2-3) 在这里如果设R 1=R2,可以得出: C x =(2-4)
电容测量电路如下图所示:
图2-2 555定时器构成单稳态的电容测量电路图
上述方案从对测量精度要求而言,还是比较符合要求的,由于是通过单片机读取转化,精确度会明显的提高。
2.3电感测量方案
对于电感的测量是利用电容三点式正弦波震荡原理的方案(如图2-3)。
图2-3 电容三点式正弦波震荡电路图
由于振荡电路频率为:
f =1 C 1*C 22π*L x C 1+C 2(2-5)
可化简得到电感值:
L x =1 (2πf ) 212
C 1+C 2(2-6)
上述方案从计算公式可知,只需要通过单片机处理频率信号即可得到待测电感值,对测量精度要求而言,还是比较符合要求的,由于是通过单片机读取转化,精确度会明显的提高[2]。
3 核心元器件介绍
要设计出比较精确的仪器,元件的选择相当重要,选错了元器件,电感电容的测量的测量值可能与真实值相差很大,对设计来说就失去了意义,对调试工作也带来了巨大的困难,所以,设计之前一定要选对元器件,本设计使用的主要元器件有NE555定时器、NE5532运算放大器、STC89C51单片机、1602液晶显示器,以及一些电阻电容的元件。下面对主要元器件进行简单介绍。
3.1 NE555的介绍
NE555芯片是集成了555定时器的芯片,它刚开始是用来做定时器使用的,或者是555时基电路,后来经过多方面的开发,除了具有定时功能以外,也开发出可以用于调节温度、压力、光照、速度等各种控制与检测,还可以组成单稳态、双稳态、脉冲震荡与调制电路,用于脉冲调制、电源变换、频率变换、交流信号源等[3]。由于其具有使用方便、可靠、价
合肥师范学院
2014届本科毕业论文(设计)
格低廉而被广泛应用于各种电子产品中之中。555集成电路内部集成了几十个元器件,有触发器、比较器、分压器、缓冲器等模拟电路和数字电路的混合体[4]。
图3-1 555集成电路内部结构图
引脚图如下:
图3-2 555引脚图
555集成电路是8脚封装,双列直插型。NE555引脚功能如下:
Pin 1-GND (接地)-通常被连接到电路共同接地。
Pin 2-Trigger(触发点) -这个脚位是触发NE555使其启动它的时间周期,又称触发端,是下比较器的输入。触发信号上缘电压须大于2/3 VCC,下缘须低于1/3 VCC 。
Pin 3-Output (输出) -输出端(V O ),它有0和1两种状态,由输入端所加电平决定,当时间周期开始555的输出输出脚位,移至比电源电压少1.7伏的高电位。周期的结束输出回到0伏左右的低电位。于高电位时的最大输出电流大约0.2A 。
Pin 4-Reset (重置)-一个低逻辑电位送至该脚位时会重置定时器且使输出回落到一个低电位,加上低电平时可使输出为低电平[5]。它通常被接到电源或不用连接。
Pin 5-Control voltage (控制) -控制电压端(V C ),准许由外部电压控制触发和闸限电压,可用它控制改变上下触发电平值。当计时器经营在振荡或稳定的运作方式下, 这个输入可以用来改变或调整输出的频率值。
Pin 6-Threshold (重置锁定) - 又称阈值端(TH ),是上比较器的输入;重置锁定并能使输出呈低电平。当此接脚的电压从1/3 VCC电压以下移至2/3 VCC以上时启动这个动作。
Pin 7-Discharge (放电端DIS ),它是内部放电管的输出,有悬空和接地两种状态,也是
由输入端的状态决定这个接脚和主要的输出接脚有相同的电流输出能力,当输出为ON 时为LOW ,对地为低阻抗,当输出为OFF 时为HIGH ,对地为高阻抗。
Pin 8-Vcc (V +) -这是555个计时器IC 的正电源电压端。供应电压的范围是+4.5伏特(最小值) 至+16伏特(最大值) 。
由如(图3-3)(a )是典型555构成的多谐振荡器如图所示,(b )是输出波形
(a) (b)
图3-3 555定时器构成多谐振荡器
接通电源之后,电源VDD 通过R1和R2对电容C 充电,当U c
3.2 NE5532的介绍
NE5532是高性能低噪声双运算放大器(双运放)集成电路。与很多标准运放相比较,它具有更好的噪声性能,优良的输出驱动能力及相当高的小信号和电源带宽,电源电压范围大等特点。因此很适合应用在高品质和专业音响设备、仪器、控制电路及电话通道放大器。在上世纪九十年代初的音响界被发烧友们誉为“运放之皇”,至今仍是很多音响发烧友手中必备的运放之一。所以用它来对电容三点式正弦波震荡电路放大能取得非常高的精确度[7]。
NE5532技术特点:
•电压范围:±3V-±20V
•输入噪声电压:5nV/√Hz(典型值)
•直流 电压增益:50000
•交流电压增益:2200-10KHZ
•小信号带宽:10MHZ
•功率带宽: 140KHZ
•转换速率: 9V/μs
•单位增益补偿
图3-4 NE5532引脚图
3.3 STC89C52的介绍
STC89C52是STC 公司生产的一种低耗能、性能高的CMOS8位微控制器,具有8K 的系统可编程Flash 存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的特性。在单芯片上,拥有灵巧的8 位CPU 和在系统的可编程Flash ,使得STC89C52为众多嵌入式控制应用提供高灵活、高效率的解决方案。 具有以下标准功能: 内置4KBEEPROM ,有MAX810复位电路,3个16 位定时器/计数器,4个外部中断,8k 字节Flash ,32 位I/O 口线,512字节RAM , 看门狗定时器,一个7向量4级中断结构,全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。最高运作频率35MHz ,12T/6T可选[8]。
STC89C52RC 单片机特性:
8K 字节程序存储空间;512字节数据存储空间;内带2K 字节EEPROM 存储空间; 可直接载;AT89S52单片机:8K 字节程序存储空间;256字节数据存储空间;自带2KB 的EEPROM 存储空间;
一、STC 单片机的优点(如表3-1):
表3-1 STC单片机特点
二、STC89C52单片机最小系统原理图(如图3-5):
图3-5 STC89C52单片机最小系统
3.4 1602液晶的介绍
本设计使用的1602液晶为5V 电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII 字符集字库,只有并行接口,无串行接口[9]。
1602与单片机接口(如图3-6):
图3-6 图1602与单片机接口
接口说明: Pin-1-VSS 电源地 Pin-2-VDD 电源正极
Pin-3-VQ 液晶显器对比度调节 Pin-4-RS 数据/命令选择输入(H/L) Pin-5-R/W读写选择端(H/L) Pin-6-E 使能信号 Pin-7-D0数据接口 Pin-8-D1数据接口 Pin-9-D2数据接口 Pin-10-D3数据接口 Pin-11-D4数据接口 Pin-12-D5数据接口 Pin-13-D6数据接口 Pin-14-D 7数据接口 Pin-15-BLA 背光灯电源正极 Pin-16-BLK 背光灯电源负极 基本操作时序:
读状态 输入:RS=L,R/W=H,E=H 读数据 输入:RS=H,R/W=H,E=H
输出:D0~D7=状态字 输出:无
输出:无
写指令 输入:RS=L,R/W=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据 写数据 输入:RS=H,R/W=L,D0~D7=指令码,E=高脉冲
4 单元电路设计
系统的总体设计思路是被测电阻和电容通过555定时器构成多谐振荡电路,频率输入单片机,被测电感构成电容三点式振荡电路,通过分屏电路把频率送入单片机,通过按键选择电路选择要处理的频率,并把频率通过单片机处理,运算出相应的数值,再用1062显示出来。系统方框图(如图4-1):
图4-1 系统方框图
4.1 电阻测量电路的设计
电阻测量是吧待测电阻与555定时器构成多谐振荡电路如图4-2所示,其中定时器的
OUT 端吧频率信号传送到单片机的P1^2口,C2的一端连接单片机P1^5,如下图4-2所示:
图4-2 555定时器测电阻
P1^5接一独立按键,当其按下时,NE555的3引脚输出方波,3脚与P1^2相接,可通过程序测出其频率,进而求出R x 的值,显示在1602液晶屏上。
电容C1的充电所需的时间,即脉冲维持时间:
t 1=(R 1+R x ) C 1ln 2
(2-7)
放电所用时间,即脉冲低电平时间:
所以脉冲周期时间为:
故输出脉冲频率为:
t 2=R x C 1ln 2
(2-8)
t =t 1+t 2=ln 2⨯C 1(R 1+2R x )
1
ln 2⨯C 1(R 1+2R x )
1000000
-150(Ω )
ln 2*0. 2*f
(2-9)
f =
得到待测电阻:
(2-10)
R x =
(2-11)
4.2 电容测量电路的设计
电容测量是吧待测电容与555定时器构成多谐振荡电路如图4-2所示,其中定时器的
OUT 端吧频率信号传送到单片机的P1^3口,C X 的一端连接单片机P1^6,如下图4-3所示:
图4-3 555定时器测电容
P1^6接一独立按键,当其按下时,NE555的3引脚输出方波,3脚与P1^3相接,可通过程序测出其频率,进而求出C x 的值,显示在1602液晶屏上。
由2.1的分析知其振荡周期为:
f =
(2-12)
得出:
1(l n 2) ⨯C x ⋅(R 1+2R 2) (2-13) [1**********]00
(pF ) (2-14)
3ln 2*f *510000
化简得: C x =
4.3 电感测量电路的设计
电感的测量与电阻电容的测量方法不同,它是把被测电感构成电容三点式振荡电路的
方法,再用运算放大器NE5532对频率信号进行放大,把放大的信号传入单片机的P1^4处理。测量电路如图4-4所示。
图4-4 电容三点式振荡电路测电感
由于电容三点式震荡电路产生的信号较小,所以先加一级单管放大,在跟比较器将正弦波转化成方波。P1^4接一独立按键,当其按下时,运放输出口输出方波,该口与P1^3相接,可通过程序测出其频率,进而求出L x 的值,显示在1602液晶屏上。
L x =
112
4πf
C 1+C 2
2
2
=
[1**********]00
π2*0. 2*f 2
(2-15)
但由此公式算出的电感值约为实际值的一半,故将0.2改为0.1。故公式如下:
L x =
[1**********]00
(uH )
π2*0. 1*f 2
(2-16)
4.4 电阻、电容、电感显示电路的设计
显示电路的显示器是采用LCD1802液晶显示,其低功耗,工作稳定,与单片机的P3端相连接,用+5V电源单独供电,用电位器可以调节显示的对比度,以便于更好的读数据。电路如图4-5所示。
图4-5 显示电路
该电路采用1602液晶显示,耗能低,显示数值范围较大,工作相对比较稳定,读数方便快捷。
5 程序设计
由于采用单片机测量频率和处理相关运算,其涉及到浮点数的运算,如果采用汇编语言来编写浮点数的运算,工作量将会非常的复杂繁重因而采用C51来编写程序,使得浮点数编写的程序量大大的简化,并且整个程序的结构采用标准函数模块模式,使程序结构清晰简单。
5.1 中断程序流程图
中断程序的流程中断循环的方式,首先从按键中断入口开始,判断按键的键值,进入选择档界面,根据档位键值变化,选择要测量的电阻、电容、电感档,最后判断要显示的主界面示数。流程图如下图5-1所示。
图5-1 中断程序流程图
一个完整的程序设计需要结合电路图中的芯片引脚的连线,并通过各个引脚的功能来具体说明该模块在电路中的作用。此外,对于硬件的初始化,向硬件中读写数据等在操作中都是至关重要的一步。
5.2 主程序流程图
主程序流程是先通过按键对单片机时钟和端口进行初始化,再对定时器进行初始化,
液晶初始化显示开机界面,再转入上面所设计的开机总中断,结束之后进入低功耗模式,具体流程如图5-2所示。
图5-2 主程序流程图
一个完整的程序设计需要结合电路图中的芯片引脚的连线,并通过各个引脚的功能来具体说明该模块在电路中的作用。此外,对于硬件的初始化,向硬件中读写数据等在操作中都是至关重要的一步。
6 设计结果
实物设计出来之后还要对系统进行测试、调解,以便能得到比较合理精确的测量结果。另外也要对产生的误差进行分析,计算出相对误差和绝对误差,以便对系统设计进行总结。
6.1系统测试
1. 测试原理:在系统设计中,以STC89C52单片机为核心的电阻、电容、电感测试仪,将电阻,电容,电感,使用对应的振荡电路转化为电压实现各个参数的测量。其中100HZ/1MHZ/10MHZ的正弦波是采用NE555芯片产生的,将模拟电压信号送入AD 采样,通过AD 把模拟信号转换为数字信号,再把数字信号送入STC89C52单片机处理。以Protues 为仿真平台,使用C 语言编写了系统应用软件;包括主显示模块、电阻测试、控制模块模
块、电容测试模块和电感测试模块。
2. 测试方法:在测试时将被测参数通过本系统测量出来的示值与参数标称值进行对比,得到本系统的测量精度。
3. 测试仪器:示波器,万用表。
4. 测试结果:通过按键操作,实现测量类型和量程的选择,根据测量结果对设计进一步进行校正和对实现功能的可靠性的确认。
图6-1 电容测量演示
测试结果如下:
(1)电阻测试数据如表6-1所示。
表6-1电阻测试数据
(2)表 6-2电容测试数据
(3)表 6-3电感测试数据
5. 测试分析:
根据以上的测试结果表明,本系统完成了文章开始所提出设计内容和功能。本测量仪的测量范围较宽, 并且达到了很好的精度, 相对误差小于1 %。
在实际测量中,由于测试环境,测试仪器,测试方法等都对测试值有一定的影响,都会导致测量结果或多或少地偏离被测量的真值。为了减小本设计中误差的大小,主要利用修正的方法来减小本测试仪的测量误差。所谓2修正的方法就是在测量前或测量过程中,求取某类系统误差的修正值。在测量的数据处理过程中选取合适的修正值很关键,修正值的获得有三种途径。第一种途径是从相关资料中查取;第二种途径是通过理论推导求取;第三种途径是通过实验求取。
本测试修正值选取主要通过实验求取,对影响测量读数的各种影响因素,如温度、湿度、电源电压等变化引起的系统误差。通过对相同被测参数的多次测量结果和不同被测参数的多次测量选取平均值,最后确定被测参数公式的常数K 值,从而达到减小本设计系统误差的目的。由于振荡电路外围器件由电容电阻分立元件搭接而成,所以由振荡电路产生的被测参数对应的频率有一定的误差,所以只能通过多次实验测量,选取合适的修正值来尽可能的减少本测试系统的误差。
6.2系统总结
本系统采用单片机和LRC 振荡电路结合的方式实现了一个简易数字式电阻、电容和电感测量仪,到达了系统基本要求。本仪器利用单片机技术实现了电感电容测量的智能化设计, 而且系统性能稳定, 测量精度较高, 相对误差小于1 % ,操作简单, 具有较强的实用性。
当然本系统还存在着许多需要改进的地方,比如还可以继续提高测量的精度和加大测量的范围。因为是采用单片机实现的,利用其可以编程的特性,使测量的值结合一些数据处理方式使测量更加接近真实值。
心得体会
这次毕业设计的论文和设计是我这大学期间干的最有意义的事之一。从最初的选题,开题到写论文直到完成论文。其间,查找资料,老师指导,与同学交流,反复修改论文,每一个过程都是对自己能力的一次检验和充实。通过这次实践,我了解了简易电阻、电容和电感测试仪的用途及工作原理,熟悉了其的设计步骤,锻炼了设计实践能力,培养了自己独立设计能力。这次课程设计收获很多,比如学会了查找相关资料相关标准,分析数据,提高了自己的制作能力。这么一次锻炼可以学到书本里许多学不到的知识,坚韧、独立、思考等。但是课程设计也暴露出自己专业基础的很多不足之处。比如缺乏综合应用专业知识的能力,对材料的不了解等等。由于能力有限,未能做到准确测量电阻、电容和电感,某些测量结果误差,测量范围较小,感到有点儿遗憾。这次实践是对自己模电所学的一次大检阅,使我明白自己知识还很不全面。本设计是在老师的精心指导和鼓励下完成的。在此,谨向老师和帮助我的同学表示衷心的感谢!此外,我还要感谢在我的论文中所有被援引过的文献的作者们,他们是我的知识之源。
最后,再次向所有给予我帮助和鼓励的同学和老师致以最诚挚的谢意!
参考文献
[1] 陈尚松. 电子测量与仪器[M].北京:电子工业出版社, 2005.
[2] 黄智伟. 全国大学生电子设计[M].2版. 北京:北京航空航天大学出版社, 2011. [3] 阎石. 数字电子技术基础(第5 版)[M].北京:高等教育出版社, 2006. [4] 铃木雅臣. 晶体管电路设计[M]. 北京:科学出版社, 2012.
[5] 聂典,丁伟. Multisim 10计算机仿真[M].北京:电子工业出版社, 2009. [6] 华成英, 童诗白. 模拟电子技术基础(第4 版)[M].北京:高等教育出版社, 2006. [7] 陈尚松, 雷加, 郭庆. 电子测量与仪器[M].北京:电子工业出版社, 2005. [8] 牛百齐. 基于单片机的电容测量仪设计[J].仪器仪表用户, 2005,12(4):29-30. [9] 郭天祥主编. 51单片机C 语言教程[M]. 北京:电子工业出版社, 2009.
附 件
附件1:电路图和
PCB
附件3:程序代码
#include
#include"intrins.h"//库函数 #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define PI 3.1415926
uchar code table1[8]="Welcome!"; uchar table2[16]="f(Hz)="; uchar table3[16]="R(Ohm)="; uchar table4[16]="C(pF)="; uchar table5[16]="L(uH)=";
uchar num,a=0,th0,tl0; uint C,L; ulong f,R;
sbit lcden=P2^2; //液晶使能端 sbit lcdrs=P2^0; //液晶数据命令选择端 sbit RW=P2^1;//1602写地址 sbit key_R=P1^5; //测量电阻按键 sbit key_C=P1^6; //测量电容按键 sbit key_L=P1^7; //测量电感按键
sbit R_out=P1^2; //测量电阻信号输入 sbit C_out=P1^3; //测量电容信号输入 sbit L_out=P1^4; //测量电感信号输入
//声明子函数
void delayms(uint xms); //延时函数 void write_com(uchar com); //液晶写命令函数 void write_data(uchar date); //液晶写数据函数 void led_init(); //液晶初始化函数 void t_init(); //定时器0初始化函数 void keyscan(); //键盘检测函数(确定被测元件为电阻、电容或电感) void display_f(ulong f); //频率显示函数 void display_R(ulong R); //电阻显示函数 void display_C(uint C); //电容显示函数 void display_L(uint L); //电感显示函数
//主函数 void main() { RW=0; led_init(); t_init(); keyscan();
write_com(0x0c);//开显示,不开光标 a=2; while(1)
{ display_f(f); switch(a) { case 1:R=(ulong)(5000000.0/0.6931472/f-150+0.5);display_R(R);display_f(f);break; case 2:C=(int)(100000000.0/153/0.6931472/f+0.5);display_C(C);break; case 3:L=(int)([1**********]00.0/0.1/PI/PI/f/f+0.5);display_L(L);display_f(f);break; } } }
//中断函数
void T0_count() interrupt 1 {
switch(a) {
case 1:while(R_out); while(!R_out); TH0=0; TL0=0; while(R_out); while(!R_out); th0=TH0; tl0=TL0; TR0=0; break;
case 2:while(C_out); while(!C_out);
TH0=0; TL0=0; while(C_out); while(!C_out); th0=TH0; tl0=TL0; TR0=0; break; case 3:while(L_out); while(!L_out); TH0=0; TL0=0; while(L_out); while(!L_out); th0=TH0; tl0=TL0; TR0=0; break; }
f=4969260/5/(th0*256+tl0); }
//延时函数
void delayms(uint xms) {
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--); }
//液晶写命令函数
void write_com(uchar com) {
delayms(2);
lcdrs=0; P0=com;
lcden=1; _nop_(); _nop_(); _nop_(); _nop_(); lcden=0; }
//液晶写数据函数
void write_data(uchar date) {delayms(2); lcdrs=1; lcden=1; P0=date; lcden=1; _nop_(); _nop_(); _nop_();
_nop_();
lcden=0; }
//液晶初始化函数 void led_init() { delayms(15);
write_com(0x38); //设置16×2显示,5×7点阵,8位数据接口 delayms(5); write_com(0x38); delayms(5); write_com(0x01); delayms(5);
write_com(0x08); delayms(5);
write_com(0x0C); }
//定时器0初始化函数 void t_init() {
TMOD=0x01; //设置定时器0工作方式1(M1M0=0x0001) TH0=0; //装初值 TL0=0; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 }
//键盘检测函数(确定被测元件为电阻、电容或电感) void keyscan() {
if(key_R==0) { delayms(10); if(key_R==0) a=1; } else
if(key_C==0) { delayms(10); if(key_C==0) a=2; } else
if(key_L==0) { delayms(10); if(key_L==0) a=3; } else
while(key_R&&key_C&&key_L); }
//频率显示函数
void display_f(ulong f) {
uchar count=0; ulong f0; f0=f; while(f) { f=f/10; count++; }
for(num=5+count;num>5;num--) {
table2[num]=f0%10+48; f0=f0/10; }
write_com(0x80);
for(num=0;num
//电阻显示函数
void display_R(ulong R) {
uchar count=0; ulong R0; R0=R; while(R) { R=R/10; count++; }
for(num=6+count;num>6;num--) {
table3[num]=R0%10+48; R0=R0/10; }
write_com(0x80+0x40);
for(num=0;num
//电容显示函数
void display_C(uint C) {
uchar count=0; uint C0; C0=C;
//按键按下时退出死循环
while(C) { C=C/10; count++; }
for(num=5+count;num>5;num--) {
table4[num]=C0%10+48; C0=C0/10; }
write_com(0x80+0x40);
for(num=0;num
//电感显示函数
void display_L(uint L) {
uchar count=0; uint L0; L0=L; while(L) { L=L/10; count++; }
for(num=5+count;num>5;num--) {
table5[num]=L0%10+48; L0=L0/10; }
write_com(0x80+0x40);
for(num=0;num