毕业设计---简易自动电阻测试仪

简易自动电阻测试仪

摘 要

本设计根据题目要求制作一台简易自动电阻测试仪,能够测量100Ω、1k Ω、10k Ω、10M Ω四档不同的量程,并实现其中前三档的自动量程转换功能,同时自动显示小数点和单位。基于这些要求,经过讨论,决定利用555多谐振荡电路将电阻参数转化为频率,频率f 是单片机很容易处理的数字量,一方面测量精度高,另一方面便于使仪表实现自动化,而且单片机构成的应用系统有较大的可靠性。通过输入单片机AT89C51控制继电器控制被测RC 振荡电路频率的自动选择,输入输出控制采用键盘输入控制电路、LCD12864显示系统和报警控制电路组成,能很好的实现各个要求。单片机具有可编程性,硬件的功能描述可完全在软件上实现,另一方面便于使仪表实现自动化,设计时间短,成本低,可靠性高。

关键字:AT89C51单片机 555多谐振荡电路 继电器 自动量程转换

Abstract

The design on the basis of the subject demand produced a simple automatic resistance tester, capable of measuring 100 Omega Omega, 1K, 10K, 10M Omega Omega four profile at different range, and realizes the automatic conversion range before the third, while automatically display a decimal point and unit. Based on these requirements, after discussion, decided to use the 555 multivibrator circuit resistance parameters are transformed into frequency, frequency of F SCM is easily handled the digital quantity, a high measuring precision, on the other hand, so easy to realize automation of instrumentation, and chip microprocessor application system has higher reliability. Through the input of single-chip AT89C51 control relay to control the tested RC oscillating circuit frequency automatic selection, input / output control using the keyboard input control circuit, LCD12864 display system and an alarm control circuit, can achieve a very good all. Microcontroller having programmable, hardware description of the function can be completely realized in software, on the other hand, so easy to realize automation of instrumentation, short design time, low cost, high reliability.

Keywords : single chip AT89C51 555 multivibrator circuit relay automatic range switching

目 录

一、选题背景 .................................................................................. - 1 -

二、方案论证 .................................................................................. - 1 -

2.1方案论证与比较 ........................................................................ - 1 -

2.2设计思路 .............................................................................. - 2 -

2.2.1 总体方案组成和说明 .................................................................. - 2 -

2.2.2 组成部分及说明 ...................................................................... - 2 -

三、设计实现 .................................................................................. - 5 -

3.1 测量电路设计 ......................................................................... - 5 -

3.2 通道选择电路设计 ..................................................................... - 5 -

3.3 控制电路设计 ......................................................................... - 6 -

3.4 显示电路 ............................................................................. - 8 -

3.5 软件设计 ............................................................................. - 8 -

四、测试及结果分析 ............................................................................ - 9 -

4.1 测试方法及使用的仪器 ................................................................. - 9 -

4.2 指标测试和测试结果 ................................................................... - 9 -

五、结论 ...................................................................................... - 9 -

六、致谢 ...................................................................................... - 9 - 参考文献 ..................................................................................... - 10 - 附录 ......................................................................................... - 10 - 附录1: 主要元器件清单 ................................................................... - 10 - 附录2:程序清单 ......................................................................... - 11 - 附录3:实物图 ........................................................................... - 22 -

一、选题背景

现代电子产品正以前所未有的速度,向着多功能化、体积最小化、功耗最低化的方向发展。本次设计出具有四档量程的简易自动电阻测试仪,量程分别为100Ω、1k Ω、10k Ω、10M Ω四档,难点在于小电阻的测量精度。测量时电阻值为3位数字显示(最大显示数必须为999),能自动显示小数点和2字单位,如98.7欧姆,并实现前三档的自动量程转换。

在本设计中我们着重介绍一种把电子元件的参数R 转换成频率信号f ,然后采用单片机控制后,再通过程序处理运算求出R ,最后应用LCD12864显示的方法。量程自动转换原理分别是RC 振荡电路和LM555多谐振荡器,这样就能够把待测电阻转换为频率,而频率f 是单片机很容易处理的数字量。

目前市面上测量电子元器件参数R 的仪表种类较多,方法和优缺点也各有不同。一般的测量方法都存在计算复杂,不易实现自动测量而且很难实现智能化等缺点。将电阻参数转化为频率,这样处理一方面使测量精度提高了,另一方面也便于使仪表实现智能化,并能很好的实现各个要求。

二、方案论证

2.1方案论证与比较

方案一:最基本的就是根据 R 的定义式来测量。在如图2-4中,分别用电流表和电压表测出通过电阻的电流和通过电阻的电压,根据公式R=U/I求得电阻。这种方法要测出两个模拟量,不易实现自动化。而指针式万用表欧姆档是把被测电阻与电流一一对应,由此就可以读出被测电阻的阻值,如图2-5

所示。这种测量方法的精度变化大,若需要较高的精度,必须要较多的量程,电路复杂。

图2-1 定义法测电阻 图2-2 万用表测电阻

方案二:把电阻转换成频率信号 f ,转换的原理分别是 RC 振荡电路和555 电路,单片机根据所选通道,向模拟开关送两路地址信号,取得振荡频率,作为单片机的时钟源,通过计数则可以计算出被测频率,再通过该频率,通过公式计算出各个电阻参数。然后根据所测频率判断是否转换量程,或者是把数据处理后,把电阻的值送显示部分显示出相应的参数值,利用编程实现量程自动转换。

总结:通过精确度以及方便使用的角度考虑, 方案二的方法更好。

2.2设计思路

2.2.1 总体方案组成和说明

本系统的电路设计方框图如图2-2所示,它由四部分组成: ① 控制部分主芯片采用单片机AT89C51;②测量部分主要是采用利用RC 振荡电路和555振荡电路实现将被测电阻转换为频率;③通道选择部分主要是通过51单片机I/O接口控制继电器来自动选择被测频率的档位;④ 显示部分是通过LCD12864、二极管指示灯及按键选择测量电路。

图2-3系统设计框图

2.2.2 组成部分及说明

第一,控制部分

(1)分析说明:本设计以单片机为核心,采用AT89C51单片机,利用其管脚特殊的功能以及具备的中断系统,延时程序来控制换挡,以及12864液晶屏的显示等等功能。

(2)原理图

图2-4单片机最小系统

第二,测量部分

(1)计算分析:RC 振荡电路时利用555振荡电路实现被测电阻的频率,通过51单片机的I/O接口的自动识别量程,来实现自动测量。

2)原理图

图2-5 LM555振荡电路

第三,通道选择部分

(1)分析说明:本设计通过单片机控制来控制继电器的自动选择,继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

2)原理图

图2-6 继电器自动选择

第四,显示部分

(1)分析说明:使用12864液晶显示屏, 具有画面效果好,分辨率高,抗干扰能力强等特点,可以显示4行字,符合本次设计任务的要求。

2)原理图

图2-7 12864显示

三、设计实现

3.1 测量电路设计

根据题目要求,采用555多谐振荡电路,将电阻量转换为相应的频率信号值。考虑到单片机对频率的灵敏度,具体的讲就是单片机对10HZ~10KHZ的频率计数精度最高。所以要选用合理的电阻和电容大小,同时又要考虑到不能使电阻的功率过大。所以首先要确定对应档位时适合的频率,然后在确定电阻或电容值,从而算出4个电阻和电容的值以及对应频率范围。

电阻的测量采用“脉冲计数法”,如下图所示由555电路构成的多谐振荡电路,通过计算振荡输出的频率来计算被测电阻的大小。 555接成多谐振荡器的形式,其振荡周期为:T=t1+t2=(ln2)(R1+Rx)*C1+(ln2)

Rx*C1,得出:

即,求出Rx

表3-1 振荡测量电路对应量程参数

档位

0~100Ω

100Ω~1KΩ

1K Ω~10KΩ

10K Ω~10MΩ 电阻R1 R1=200Ω R2=15KΩ R3=20KΩ R4=10MΩ 电容C1 C1=4.7uF C2=10nF C3=10nF C4=4.7pF 频率范围 766~1543HZ 8487~9492HZ 3606~6568HZ 10930~16387

HZ

3.2 通道选择电路设计

利用实现测量CD4052类别的转换,CD4052是差分4通道数字控制模拟开关器件,有A0和A1两个二进制控制输入端和INH 输入,具有低导通阻抗和很低的截止电流。

表3-2 CD4052真值表

INHIBIT

1 B 0 0 1 1 x A 0 1 1 1 x 0x,0y 1x,1y 2x,2y 3x,3y None

该电路通过CD4052双向模拟开关控制量程的自动切换,直到进入适当的量程为止。电路流程图如下:

图3-3量程自动转换流程图

注:实际测试时由于CD4052出现问题,我们改用继电器实现量程转换,但原理相同。

3.3 控制电路设计

本设计使用单片机为核心部件,来控制换挡以及显示。

以下是单片机管脚说明:

VCC :供电电压。

GND :接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址

“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。

P3口也可作为AT89S52的一些特殊功能口,如表1所示:

表1 P3特殊功能口

P3口引脚

P3.0

P3.1

P3.2

P3.3

P3.4

P3.5

P3.6

P3.7

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时, ALE只有在执行MOVX ,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP )。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

第二功能 RXD (串行口输入) TXD (串行口输出) INT0(外部中断0输入) INT1(外部中断1输入) T0(定时器0外部脉冲输入) T1(定时器1外部脉冲输入) WR (外部数据存储器写脉冲输出) RD (外部数据存储器读脉冲输出)

XTAL2:来自反向振荡器的输出。 3.4 显示电路

系统的显示部分采用OCM12864液晶显示模块。

3.5 软件设计 系统通过频率来控制量程自动切换,并根据RC 振荡频率公式换算成对应的电阻,然后再控制显示模块输出。

图3-2 程序设计流程图

四、测试及结果分析

4.1 测试方法及使用的仪器

测量方法:采用555多谐振荡电路,将电阻量转换为相应的频率信号值。再利用单片机及有关程序对范围的选择,显示侧量出数值。

测试使用的仪器设备:数字万用表、示波器。

4.2 指标测试和测试结果

表4.1.2 测试结果对照分析表

测量值 23Ω 768Ω 5614Ω 8978K Ω

实际值 14Ω 231Ω 5501Ω 8870K Ω

五、结论

本设计实现了一种利用51单片机实现的简易电阻测试仪,基于单片机和量程自动切换电路的控制系统,能够根据待测电阻的大小实现适当频率的控制,再分别采样频率,通过程序计算待测电阻Rx 并在12864液晶上显示。并且测量的数据结果较稳定。设计过程中出现问题有以下:

1. 在测量振荡电路中电阻和电容值时,由于单片机对10HZ~10KHZ的频率计数精度最高。所以要选用合理的电阻和电容大小。同时又要考虑到不能使电阻的功率过大,这样给我们计算带来了很多的麻烦。

2. 我们接收到频率较高,所以通过电路很难控制精确度,产生的误差比较大。 3.CD4052是差分4通道数字控制模拟开关器件,有A0和A1两个二进制控制输入端和INH 输入,具有低导通阻抗和很低的截止电流。但是其频率较高不能自动换挡,最终我们选择了继电器来显示代替CD4052来自动换挡的功能。

4、在实验过程中时常有捉襟见肘的感觉,一方面是理论不足,很多好的方案,好的思想由于理论的匮乏,无法理解,也不能使用,在以后的学习过程中理论的学习始终是重点;还有就是程序的问题,由于编程水平跟不上,加上思路也不清晰,导致程序的编写存在很大的问题,好的思想,无法在程序中展现出来,这也是以后需要加强的地方。

六、致谢

在做毕业设计的这段时间里,我学会了很多知识,同学之间的团结互助,老师孜孜不倦的教导,使我们感受了老师们认真负责的态度,毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。

参考文献

1. 高吉祥,黄智伟,丁文霞. 数字电子技术[M]. 北京:电子工业出版社,2003年,第

1版

2. 邹其洪 黄智伟 高嵩. 电工电子实验与计算机仿真[M].北京:电子工业出版社,2003

年,第1版

3. 张友汉. 电子线路设计应用手册[M].福建:福建科学技术出版社.2000.7第一版. 4. 黄智伟. 电子电路计算机仿真设计[M]. 北京:电子工业出版社,2004年第1版

附录

附录1: 主要元器件清单

单元电路

5V 电源电路

元器件 变压器 整流桥 电解电容 电解电容 元片电容 三极管 三极管 电阻 发光二极管

型号及大小 220V 2W10 2200UF 2200UF 104 7805 7905 510Ω

数量 1个 2个 2个 2个 4个 1个 1个 2个 2个

插针

继电器 943-1C-SDS 三极管 C8050 多路选 电阻 1K 择继电器 二极管 插针 芯片 AT89C51 晶振 11.0592MHZ

电容 22PF 单片机 电容 10 UF 最小系统

按钮开关 SW-PB 电阻 10K Ω 电阻 1K Ω 插针

LM555 555振荡电路

电阻 RC 振荡电路 未知电阻

附录2:程序清单

/*12864子程序*/

#include #include #include #include

#define uchar unsigned char

#define uint unsigned int //宏定义

/*12864接口定义*/

sbit LCD_RS = P2^0; //1:输入数据 ;0:输入命令sbit LCD_RW = P2^1; //1:读数据 0:写数据 sbit LCD_EN = P2^2; //LCM使能端

#define LCD_DATA P1 //12864总线端口

/*LCD功能初始化指令*/

若干 8个 8个 8个 8个 若干 1个 1个 2个 1个 1个 1个 1个 若干 1个 4个 4个

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC 值为00H #define AC_INIT 0x02 //将AC 设置为00H 。且游标移到原点位置 #define CURSE_ADD 0x06 //设定游标移动方向(默认游标右移) #define FUN_MODE 0x30 //工作模式:8位基本指令集 #define DISPLAY_ON 0x0c //显示开, 显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC ,范围为:00H~3FH #define SET_DD_AC 0x80

/*汉字地址表*/

uchar code addr_tab[]={ //便于根据汉字坐标求出地址 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置 };

/*n(ms )延时子程序*/

void delayms(uint t) //约延时n (ms ) {

uint i; while(t--) {

for(i=0;i

/*等待12864显示屏忙*/

void WaitBusy(void) //延时一小段时间,等待12864显示屏空闲 {

uchar i=5; while(i--); }

/*写指令代码*/

void Lcd_WriteCmd(uchar cmdcode) {

LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = cmdcode; LCD_EN = 0; }

/*写数据*/

void Lcd_WriteData(uchar dispdata) {

LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = dispdata; LCD_EN = 0; }

/*初始化12864显示屏*/ void Lcd_Init() {

delayms(50);

Lcd_WriteCmd(0x30); //选择基本指令集 delayms(2); WaitBusy();

Lcd_WriteCmd(0x30); //选择8bit 数据流 delayms(2);

Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) delayms(2);

Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H delayms(20); }

/*字符显示*/

void display10(unsigned long m)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(m+0x30); //显示个位; Lcd_WriteData('.');//写入“. ”小数点固定 Lcd_WriteData(0+0x30); //显示百分位

Lcd_WriteData(0+0x30); //显示十分位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display11(unsigned long u)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(u/10+0x30); //分离出十位; Lcd_WriteData(u%10+0x30); //个位 Lcd_WriteData('.');//写入“. ”小数点固定 Lcd_WriteData(u%10/10+0x30); //显示百分位

Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display12(unsigned long v)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(v/100+0x30); //分离出百位; Lcd_WriteData(v%100/10+0x30); //分离出十位;

Lcd_WriteData(v%10+0x30); //分离出个位; Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display13(unsigned long w)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(w/1000+0x30); //分离出千位; Lcd_WriteData('.');//写入“. ”小数点固定! Lcd_WriteData(w%1000/100+0x30); //分离出百位; Lcd_WriteData(w%100%10+0x30); //十位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display14(unsigned long q)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(q/10000+0x30); //分离出万位; Lcd_WriteData(q%10000/1000+0x30); //千位

Lcd_WriteData('.');//写入“. ”小数点固定! Lcd_WriteData(q%1000/100+0x30); //百位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display15(unsigned long p)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(p/100000+0x30); //分离出十万位;

Lcd_WriteData(p%100000/10000+0x30); //分离出万位 Lcd_WriteData(p%10000/1000+0x30); //分离出千位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display16(unsigned long r)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(r/1000000+0x30); //分离出百万位; Lcd_WriteData('.');//写入“. ”小数点固定!

Lcd_WriteData(r%1000000/100000+0x30); //分离出十万位;

Lcd_WriteData(r%100000/10000+0x30); //分离出万位分离出万位; Lcd_WriteCmd(0x9a); //锁定显示位置; }

/*显示汉字*/

void hanzi_Disp(uchar x,uchar y,uchar code *s) //x{

Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 delayms(1); while(*s>0) {

Lcd_WriteData(*s); //写数据 delayms(1); s++; } }

void display1(void) {

hanzi_Disp(0,0,"欢迎使用自动电阻"); hanzi_Disp(1,0,"****测试仪*****"); hanzi_Disp(2,0,"请您开始测量电阻"); }

void display2(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***0~999欧****"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," 欧"); }

void display3(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***1K~9K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display4(void)

、y 为汉字坐标

{

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***10K~99K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display5(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***100K~999K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display6(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"**1M~10M欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," M欧"); }

void display7(void) {

hanzi_Disp(0,0,"****非常抱歉****"); hanzi_Disp(2,0,"所测阻值已经超出"); }

/*主程序*/

#include #include #include #include #include

#define uchar unsigned char

#define uint unsigned int //宏定义 uchar T0count; uint timecount; bit flag; sbit BEEP=P2^3; sbit A1=P0^0; sbit A2=P0^1; sbit A3=P0^2; sbit A4=P0^3; sbit A5=P0^4;

sbit A7=P0^6; sbit A8=P0^7;

/*n(ms )延时子程序*/

void Del(uint t) //约延时n (ms ) {

uint i; while(t--) {

for(i=0;i

/*******************************************************************/ /* 蜂鸣器响一声 */

/*******************************************************************/ void beep() {

unsigned char y ; for (y=0 ;y

Del(60) ;

BEEP=!BEEP ; //BEEP取反 }

BEEP=1 ; //关闭蜂鸣器 Del(40000); }

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

unsigned long x; long double y; long double t;

A1=0; A2=0; A3=0; A4=0; A5=0; A6=0; A7=0; A8=0;

TMOD=0x15;

TL0=0;

TH1=(65536-2000)/256; TL1=(65536-2000)%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1;

Lcd_Init();// 屏幕初始化 display1(); Del(800); while(1) { A1=1; A2=1;

while(flag) {

flag=0;

x=T0count*65536+TH0*256+TL0;

if (x==0) {

y=0;

Lcd_Init();

display2(); display10(y); Del(800);

}

if(x>766&&x

t=2*x*0.0000047; y=1.443/t-100; if(y>0&&y

//beep(); //LED1=0; Lcd_Init(); display2();

display10((int)y); Del(800);

//Lcd_WriteData(0x01);//清屏

if(y>=10&&y

{

//beep();

//LED1=0;

Lcd_Init();

display2();

display11((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=1;

A4=1;

x=T0count*65536+TH0*256+TL0;

}

if(x>8487&&x

{

t=2*x*0.00000001;

y=1.443/t-7500;

if(y>=100&&y

{

Lcd_Init();

//beep();

//LED2=0;

display2();

display12((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=0;

A4=0;

A5=1;

A6=1;

}

if(x>3606&&x

{

t=2*x*0.00000001;

y=1.443/t-10000;

if(y>=1000&&y

{

delayms(20);

Lcd_Init();

//beep();

//LED3=0;

display3();

display13((int)y);

Del(1000);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=0;

A4=0;

A5=0;

A6=0;

A7=1;

A8=1;

x=T0count*65536+TH0*256+TL0; if(x>=16387)

{

Lcd_Init();

display7();

beep();

Del(1000);

}

else

{

t=2*x*0.[1**********]47;

y=1.443/t-5000000;

if(y>=10000&&y

{

Lcd_Init();

//beep();

display4();

display14((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

if(y>=100000&&y

{

Lcd_Init();

//beep();

//LED4=0; display5();

display15((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

if(y>=1000000&&y

Lcd_Init();

//beep();

//LED4=0; display6();

display16((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

}

timecount=0;

T0count=0;

TH0=0;

TL0=0;

TR0=1;

}

}

}

void t0(void) interrupt 1 using 0

{

T0count++;

}

void t1(void) interrupt 3 using 0

{

TL1=(65536-2000)%256; timecount++;

if(timecount==500) {

TR0=0;

timecount=0; flag=1; }

}

附录

3:实物图

简易自动电阻测试仪

摘 要

本设计根据题目要求制作一台简易自动电阻测试仪,能够测量100Ω、1k Ω、10k Ω、10M Ω四档不同的量程,并实现其中前三档的自动量程转换功能,同时自动显示小数点和单位。基于这些要求,经过讨论,决定利用555多谐振荡电路将电阻参数转化为频率,频率f 是单片机很容易处理的数字量,一方面测量精度高,另一方面便于使仪表实现自动化,而且单片机构成的应用系统有较大的可靠性。通过输入单片机AT89C51控制继电器控制被测RC 振荡电路频率的自动选择,输入输出控制采用键盘输入控制电路、LCD12864显示系统和报警控制电路组成,能很好的实现各个要求。单片机具有可编程性,硬件的功能描述可完全在软件上实现,另一方面便于使仪表实现自动化,设计时间短,成本低,可靠性高。

关键字:AT89C51单片机 555多谐振荡电路 继电器 自动量程转换

Abstract

The design on the basis of the subject demand produced a simple automatic resistance tester, capable of measuring 100 Omega Omega, 1K, 10K, 10M Omega Omega four profile at different range, and realizes the automatic conversion range before the third, while automatically display a decimal point and unit. Based on these requirements, after discussion, decided to use the 555 multivibrator circuit resistance parameters are transformed into frequency, frequency of F SCM is easily handled the digital quantity, a high measuring precision, on the other hand, so easy to realize automation of instrumentation, and chip microprocessor application system has higher reliability. Through the input of single-chip AT89C51 control relay to control the tested RC oscillating circuit frequency automatic selection, input / output control using the keyboard input control circuit, LCD12864 display system and an alarm control circuit, can achieve a very good all. Microcontroller having programmable, hardware description of the function can be completely realized in software, on the other hand, so easy to realize automation of instrumentation, short design time, low cost, high reliability.

Keywords : single chip AT89C51 555 multivibrator circuit relay automatic range switching

目 录

一、选题背景 .................................................................................. - 1 -

二、方案论证 .................................................................................. - 1 -

2.1方案论证与比较 ........................................................................ - 1 -

2.2设计思路 .............................................................................. - 2 -

2.2.1 总体方案组成和说明 .................................................................. - 2 -

2.2.2 组成部分及说明 ...................................................................... - 2 -

三、设计实现 .................................................................................. - 5 -

3.1 测量电路设计 ......................................................................... - 5 -

3.2 通道选择电路设计 ..................................................................... - 5 -

3.3 控制电路设计 ......................................................................... - 6 -

3.4 显示电路 ............................................................................. - 8 -

3.5 软件设计 ............................................................................. - 8 -

四、测试及结果分析 ............................................................................ - 9 -

4.1 测试方法及使用的仪器 ................................................................. - 9 -

4.2 指标测试和测试结果 ................................................................... - 9 -

五、结论 ...................................................................................... - 9 -

六、致谢 ...................................................................................... - 9 - 参考文献 ..................................................................................... - 10 - 附录 ......................................................................................... - 10 - 附录1: 主要元器件清单 ................................................................... - 10 - 附录2:程序清单 ......................................................................... - 11 - 附录3:实物图 ........................................................................... - 22 -

一、选题背景

现代电子产品正以前所未有的速度,向着多功能化、体积最小化、功耗最低化的方向发展。本次设计出具有四档量程的简易自动电阻测试仪,量程分别为100Ω、1k Ω、10k Ω、10M Ω四档,难点在于小电阻的测量精度。测量时电阻值为3位数字显示(最大显示数必须为999),能自动显示小数点和2字单位,如98.7欧姆,并实现前三档的自动量程转换。

在本设计中我们着重介绍一种把电子元件的参数R 转换成频率信号f ,然后采用单片机控制后,再通过程序处理运算求出R ,最后应用LCD12864显示的方法。量程自动转换原理分别是RC 振荡电路和LM555多谐振荡器,这样就能够把待测电阻转换为频率,而频率f 是单片机很容易处理的数字量。

目前市面上测量电子元器件参数R 的仪表种类较多,方法和优缺点也各有不同。一般的测量方法都存在计算复杂,不易实现自动测量而且很难实现智能化等缺点。将电阻参数转化为频率,这样处理一方面使测量精度提高了,另一方面也便于使仪表实现智能化,并能很好的实现各个要求。

二、方案论证

2.1方案论证与比较

方案一:最基本的就是根据 R 的定义式来测量。在如图2-4中,分别用电流表和电压表测出通过电阻的电流和通过电阻的电压,根据公式R=U/I求得电阻。这种方法要测出两个模拟量,不易实现自动化。而指针式万用表欧姆档是把被测电阻与电流一一对应,由此就可以读出被测电阻的阻值,如图2-5

所示。这种测量方法的精度变化大,若需要较高的精度,必须要较多的量程,电路复杂。

图2-1 定义法测电阻 图2-2 万用表测电阻

方案二:把电阻转换成频率信号 f ,转换的原理分别是 RC 振荡电路和555 电路,单片机根据所选通道,向模拟开关送两路地址信号,取得振荡频率,作为单片机的时钟源,通过计数则可以计算出被测频率,再通过该频率,通过公式计算出各个电阻参数。然后根据所测频率判断是否转换量程,或者是把数据处理后,把电阻的值送显示部分显示出相应的参数值,利用编程实现量程自动转换。

总结:通过精确度以及方便使用的角度考虑, 方案二的方法更好。

2.2设计思路

2.2.1 总体方案组成和说明

本系统的电路设计方框图如图2-2所示,它由四部分组成: ① 控制部分主芯片采用单片机AT89C51;②测量部分主要是采用利用RC 振荡电路和555振荡电路实现将被测电阻转换为频率;③通道选择部分主要是通过51单片机I/O接口控制继电器来自动选择被测频率的档位;④ 显示部分是通过LCD12864、二极管指示灯及按键选择测量电路。

图2-3系统设计框图

2.2.2 组成部分及说明

第一,控制部分

(1)分析说明:本设计以单片机为核心,采用AT89C51单片机,利用其管脚特殊的功能以及具备的中断系统,延时程序来控制换挡,以及12864液晶屏的显示等等功能。

(2)原理图

图2-4单片机最小系统

第二,测量部分

(1)计算分析:RC 振荡电路时利用555振荡电路实现被测电阻的频率,通过51单片机的I/O接口的自动识别量程,来实现自动测量。

2)原理图

图2-5 LM555振荡电路

第三,通道选择部分

(1)分析说明:本设计通过单片机控制来控制继电器的自动选择,继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

2)原理图

图2-6 继电器自动选择

第四,显示部分

(1)分析说明:使用12864液晶显示屏, 具有画面效果好,分辨率高,抗干扰能力强等特点,可以显示4行字,符合本次设计任务的要求。

2)原理图

图2-7 12864显示

三、设计实现

3.1 测量电路设计

根据题目要求,采用555多谐振荡电路,将电阻量转换为相应的频率信号值。考虑到单片机对频率的灵敏度,具体的讲就是单片机对10HZ~10KHZ的频率计数精度最高。所以要选用合理的电阻和电容大小,同时又要考虑到不能使电阻的功率过大。所以首先要确定对应档位时适合的频率,然后在确定电阻或电容值,从而算出4个电阻和电容的值以及对应频率范围。

电阻的测量采用“脉冲计数法”,如下图所示由555电路构成的多谐振荡电路,通过计算振荡输出的频率来计算被测电阻的大小。 555接成多谐振荡器的形式,其振荡周期为:T=t1+t2=(ln2)(R1+Rx)*C1+(ln2)

Rx*C1,得出:

即,求出Rx

表3-1 振荡测量电路对应量程参数

档位

0~100Ω

100Ω~1KΩ

1K Ω~10KΩ

10K Ω~10MΩ 电阻R1 R1=200Ω R2=15KΩ R3=20KΩ R4=10MΩ 电容C1 C1=4.7uF C2=10nF C3=10nF C4=4.7pF 频率范围 766~1543HZ 8487~9492HZ 3606~6568HZ 10930~16387

HZ

3.2 通道选择电路设计

利用实现测量CD4052类别的转换,CD4052是差分4通道数字控制模拟开关器件,有A0和A1两个二进制控制输入端和INH 输入,具有低导通阻抗和很低的截止电流。

表3-2 CD4052真值表

INHIBIT

1 B 0 0 1 1 x A 0 1 1 1 x 0x,0y 1x,1y 2x,2y 3x,3y None

该电路通过CD4052双向模拟开关控制量程的自动切换,直到进入适当的量程为止。电路流程图如下:

图3-3量程自动转换流程图

注:实际测试时由于CD4052出现问题,我们改用继电器实现量程转换,但原理相同。

3.3 控制电路设计

本设计使用单片机为核心部件,来控制换挡以及显示。

以下是单片机管脚说明:

VCC :供电电压。

GND :接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址

“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。

P3口也可作为AT89S52的一些特殊功能口,如表1所示:

表1 P3特殊功能口

P3口引脚

P3.0

P3.1

P3.2

P3.3

P3.4

P3.5

P3.6

P3.7

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时, ALE只有在执行MOVX ,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP )。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

第二功能 RXD (串行口输入) TXD (串行口输出) INT0(外部中断0输入) INT1(外部中断1输入) T0(定时器0外部脉冲输入) T1(定时器1外部脉冲输入) WR (外部数据存储器写脉冲输出) RD (外部数据存储器读脉冲输出)

XTAL2:来自反向振荡器的输出。 3.4 显示电路

系统的显示部分采用OCM12864液晶显示模块。

3.5 软件设计 系统通过频率来控制量程自动切换,并根据RC 振荡频率公式换算成对应的电阻,然后再控制显示模块输出。

图3-2 程序设计流程图

四、测试及结果分析

4.1 测试方法及使用的仪器

测量方法:采用555多谐振荡电路,将电阻量转换为相应的频率信号值。再利用单片机及有关程序对范围的选择,显示侧量出数值。

测试使用的仪器设备:数字万用表、示波器。

4.2 指标测试和测试结果

表4.1.2 测试结果对照分析表

测量值 23Ω 768Ω 5614Ω 8978K Ω

实际值 14Ω 231Ω 5501Ω 8870K Ω

五、结论

本设计实现了一种利用51单片机实现的简易电阻测试仪,基于单片机和量程自动切换电路的控制系统,能够根据待测电阻的大小实现适当频率的控制,再分别采样频率,通过程序计算待测电阻Rx 并在12864液晶上显示。并且测量的数据结果较稳定。设计过程中出现问题有以下:

1. 在测量振荡电路中电阻和电容值时,由于单片机对10HZ~10KHZ的频率计数精度最高。所以要选用合理的电阻和电容大小。同时又要考虑到不能使电阻的功率过大,这样给我们计算带来了很多的麻烦。

2. 我们接收到频率较高,所以通过电路很难控制精确度,产生的误差比较大。 3.CD4052是差分4通道数字控制模拟开关器件,有A0和A1两个二进制控制输入端和INH 输入,具有低导通阻抗和很低的截止电流。但是其频率较高不能自动换挡,最终我们选择了继电器来显示代替CD4052来自动换挡的功能。

4、在实验过程中时常有捉襟见肘的感觉,一方面是理论不足,很多好的方案,好的思想由于理论的匮乏,无法理解,也不能使用,在以后的学习过程中理论的学习始终是重点;还有就是程序的问题,由于编程水平跟不上,加上思路也不清晰,导致程序的编写存在很大的问题,好的思想,无法在程序中展现出来,这也是以后需要加强的地方。

六、致谢

在做毕业设计的这段时间里,我学会了很多知识,同学之间的团结互助,老师孜孜不倦的教导,使我们感受了老师们认真负责的态度,毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。

参考文献

1. 高吉祥,黄智伟,丁文霞. 数字电子技术[M]. 北京:电子工业出版社,2003年,第

1版

2. 邹其洪 黄智伟 高嵩. 电工电子实验与计算机仿真[M].北京:电子工业出版社,2003

年,第1版

3. 张友汉. 电子线路设计应用手册[M].福建:福建科学技术出版社.2000.7第一版. 4. 黄智伟. 电子电路计算机仿真设计[M]. 北京:电子工业出版社,2004年第1版

附录

附录1: 主要元器件清单

单元电路

5V 电源电路

元器件 变压器 整流桥 电解电容 电解电容 元片电容 三极管 三极管 电阻 发光二极管

型号及大小 220V 2W10 2200UF 2200UF 104 7805 7905 510Ω

数量 1个 2个 2个 2个 4个 1个 1个 2个 2个

插针

继电器 943-1C-SDS 三极管 C8050 多路选 电阻 1K 择继电器 二极管 插针 芯片 AT89C51 晶振 11.0592MHZ

电容 22PF 单片机 电容 10 UF 最小系统

按钮开关 SW-PB 电阻 10K Ω 电阻 1K Ω 插针

LM555 555振荡电路

电阻 RC 振荡电路 未知电阻

附录2:程序清单

/*12864子程序*/

#include #include #include #include

#define uchar unsigned char

#define uint unsigned int //宏定义

/*12864接口定义*/

sbit LCD_RS = P2^0; //1:输入数据 ;0:输入命令sbit LCD_RW = P2^1; //1:读数据 0:写数据 sbit LCD_EN = P2^2; //LCM使能端

#define LCD_DATA P1 //12864总线端口

/*LCD功能初始化指令*/

若干 8个 8个 8个 8个 若干 1个 1个 2个 1个 1个 1个 1个 若干 1个 4个 4个

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC 值为00H #define AC_INIT 0x02 //将AC 设置为00H 。且游标移到原点位置 #define CURSE_ADD 0x06 //设定游标移动方向(默认游标右移) #define FUN_MODE 0x30 //工作模式:8位基本指令集 #define DISPLAY_ON 0x0c //显示开, 显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC ,范围为:00H~3FH #define SET_DD_AC 0x80

/*汉字地址表*/

uchar code addr_tab[]={ //便于根据汉字坐标求出地址 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置 };

/*n(ms )延时子程序*/

void delayms(uint t) //约延时n (ms ) {

uint i; while(t--) {

for(i=0;i

/*等待12864显示屏忙*/

void WaitBusy(void) //延时一小段时间,等待12864显示屏空闲 {

uchar i=5; while(i--); }

/*写指令代码*/

void Lcd_WriteCmd(uchar cmdcode) {

LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = cmdcode; LCD_EN = 0; }

/*写数据*/

void Lcd_WriteData(uchar dispdata) {

LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; WaitBusy();

LCD_DATA = dispdata; LCD_EN = 0; }

/*初始化12864显示屏*/ void Lcd_Init() {

delayms(50);

Lcd_WriteCmd(0x30); //选择基本指令集 delayms(2); WaitBusy();

Lcd_WriteCmd(0x30); //选择8bit 数据流 delayms(2);

Lcd_WriteCmd(0x0c); //开显示(无游标、不反白) delayms(2);

Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H delayms(20); }

/*字符显示*/

void display10(unsigned long m)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(m+0x30); //显示个位; Lcd_WriteData('.');//写入“. ”小数点固定 Lcd_WriteData(0+0x30); //显示百分位

Lcd_WriteData(0+0x30); //显示十分位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display11(unsigned long u)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(u/10+0x30); //分离出十位; Lcd_WriteData(u%10+0x30); //个位 Lcd_WriteData('.');//写入“. ”小数点固定 Lcd_WriteData(u%10/10+0x30); //显示百分位

Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display12(unsigned long v)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(v/100+0x30); //分离出百位; Lcd_WriteData(v%100/10+0x30); //分离出十位;

Lcd_WriteData(v%10+0x30); //分离出个位; Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display13(unsigned long w)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(w/1000+0x30); //分离出千位; Lcd_WriteData('.');//写入“. ”小数点固定! Lcd_WriteData(w%1000/100+0x30); //分离出百位; Lcd_WriteData(w%100%10+0x30); //十位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display14(unsigned long q)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(q/10000+0x30); //分离出万位; Lcd_WriteData(q%10000/1000+0x30); //千位

Lcd_WriteData('.');//写入“. ”小数点固定! Lcd_WriteData(q%1000/100+0x30); //百位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display15(unsigned long p)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(p/100000+0x30); //分离出十万位;

Lcd_WriteData(p%100000/10000+0x30); //分离出万位 Lcd_WriteData(p%10000/1000+0x30); //分离出千位 Lcd_WriteCmd(0x9a); //锁定显示位置; }

void display16(unsigned long r)/*这样写的好处就是能让每一位都能显示,且数据地址指针是自动加一位的*/

{

Lcd_WriteCmd(0x9a);//lcd_pos(2,4); //第四行第四个字节上显示; Lcd_WriteData(r/1000000+0x30); //分离出百万位; Lcd_WriteData('.');//写入“. ”小数点固定!

Lcd_WriteData(r%1000000/100000+0x30); //分离出十万位;

Lcd_WriteData(r%100000/10000+0x30); //分离出万位分离出万位; Lcd_WriteCmd(0x9a); //锁定显示位置; }

/*显示汉字*/

void hanzi_Disp(uchar x,uchar y,uchar code *s) //x{

Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 delayms(1); while(*s>0) {

Lcd_WriteData(*s); //写数据 delayms(1); s++; } }

void display1(void) {

hanzi_Disp(0,0,"欢迎使用自动电阻"); hanzi_Disp(1,0,"****测试仪*****"); hanzi_Disp(2,0,"请您开始测量电阻"); }

void display2(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***0~999欧****"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," 欧"); }

void display3(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***1K~9K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display4(void)

、y 为汉字坐标

{

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***10K~99K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display5(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"***100K~999K欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," K欧"); }

void display6(void) {

hanzi_Disp(0,0,"您所测电阻范围为"); hanzi_Disp(1,0,"**1M~10M欧***"); hanzi_Disp(2,0,"当前测得电阻值为"); hanzi_Disp(3,0," M欧"); }

void display7(void) {

hanzi_Disp(0,0,"****非常抱歉****"); hanzi_Disp(2,0,"所测阻值已经超出"); }

/*主程序*/

#include #include #include #include #include

#define uchar unsigned char

#define uint unsigned int //宏定义 uchar T0count; uint timecount; bit flag; sbit BEEP=P2^3; sbit A1=P0^0; sbit A2=P0^1; sbit A3=P0^2; sbit A4=P0^3; sbit A5=P0^4;

sbit A7=P0^6; sbit A8=P0^7;

/*n(ms )延时子程序*/

void Del(uint t) //约延时n (ms ) {

uint i; while(t--) {

for(i=0;i

/*******************************************************************/ /* 蜂鸣器响一声 */

/*******************************************************************/ void beep() {

unsigned char y ; for (y=0 ;y

Del(60) ;

BEEP=!BEEP ; //BEEP取反 }

BEEP=1 ; //关闭蜂鸣器 Del(40000); }

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

unsigned long x; long double y; long double t;

A1=0; A2=0; A3=0; A4=0; A5=0; A6=0; A7=0; A8=0;

TMOD=0x15;

TL0=0;

TH1=(65536-2000)/256; TL1=(65536-2000)%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1;

Lcd_Init();// 屏幕初始化 display1(); Del(800); while(1) { A1=1; A2=1;

while(flag) {

flag=0;

x=T0count*65536+TH0*256+TL0;

if (x==0) {

y=0;

Lcd_Init();

display2(); display10(y); Del(800);

}

if(x>766&&x

t=2*x*0.0000047; y=1.443/t-100; if(y>0&&y

//beep(); //LED1=0; Lcd_Init(); display2();

display10((int)y); Del(800);

//Lcd_WriteData(0x01);//清屏

if(y>=10&&y

{

//beep();

//LED1=0;

Lcd_Init();

display2();

display11((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=1;

A4=1;

x=T0count*65536+TH0*256+TL0;

}

if(x>8487&&x

{

t=2*x*0.00000001;

y=1.443/t-7500;

if(y>=100&&y

{

Lcd_Init();

//beep();

//LED2=0;

display2();

display12((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=0;

A4=0;

A5=1;

A6=1;

}

if(x>3606&&x

{

t=2*x*0.00000001;

y=1.443/t-10000;

if(y>=1000&&y

{

delayms(20);

Lcd_Init();

//beep();

//LED3=0;

display3();

display13((int)y);

Del(1000);

//Lcd_WriteData(0x01);//清屏 }

}

else

{

A1=0;

A2=0;

A3=0;

A4=0;

A5=0;

A6=0;

A7=1;

A8=1;

x=T0count*65536+TH0*256+TL0; if(x>=16387)

{

Lcd_Init();

display7();

beep();

Del(1000);

}

else

{

t=2*x*0.[1**********]47;

y=1.443/t-5000000;

if(y>=10000&&y

{

Lcd_Init();

//beep();

display4();

display14((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

if(y>=100000&&y

{

Lcd_Init();

//beep();

//LED4=0; display5();

display15((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

if(y>=1000000&&y

Lcd_Init();

//beep();

//LED4=0; display6();

display16((int)y);

Del(800);

//Lcd_WriteData(0x01);//清屏 }

}

}

timecount=0;

T0count=0;

TH0=0;

TL0=0;

TR0=1;

}

}

}

void t0(void) interrupt 1 using 0

{

T0count++;

}

void t1(void) interrupt 3 using 0

{

TL1=(65536-2000)%256; timecount++;

if(timecount==500) {

TR0=0;

timecount=0; flag=1; }

}

附录

3:实物图


相关文章

  • 大学生电子设计竞赛设计报告-简易自动电阻测试仪
  • 简易自动电阻测试仪 (G 题) 设计报告 参赛学校:常州机电职业技术学院 作者:朱化吉 冯海涛 骆翠玲 简易自动电阻测试仪 摘 要 该简易自动电阻测试仪可实现对电阻的自动测试功能,具有自动电阻筛选功能, 并能自动测量和显示电位器阻值随旋转角 ...查看


  • 全国电子设计大赛题目分析
  • 第6章 全国大学生电子设计竞赛题目与 分析 6.1 全国大学生电子设计竞赛简介 6.1.1 总则 1.指导思想与目的 全国大学生电子设计竞赛是教育部倡导的大学生学科竞赛之一,是面向大学生的群众性科技活动,目的在于推动高等学校促进信息与电子类 ...查看


  • 简易电子制作
  • 第五章 简易电子制作 第一节 简易电路图的认识 教学目标: 1.知识与技能:让学生能认识更多的电子元器件以及它们的图形符号,能够识读简单的电路图,知道电路图(线路图)是设计当中的一门技术交流语言. 2.过程与方法:学生通过阅读.观察.动手等 ...查看


  • 毕业生毕业实习计划
  • 第一章 2012届毕业生毕业设计课题 (要求在给定的课题中任选一个课题,完成设计任务.) 一.智能LED照明控制系统设计 1.设计目的和任务 1)设计目的:掌握测控电路的基本构成和调试方法 2)设计任务: ①设计一个光强采集系统,能够实时采 ...查看


  • 2011年全国大学生电子设计竞赛题目
  • 2011年全国大学生电子设计竞赛试题 参赛注意事项 (1)2011年8月31日8:00竞赛正式开始.本科组参赛队只能在[本科组]题目中任选一题: 高职高专组参赛队在[高职高专组]题目中任选一题,也可以选择[本科组]题目. (2)参赛队认真填 ...查看


  • 毕业设计_基于单片机的简易逻辑分析仪
  • 基于单片机的简易逻辑分析仪 目 录 第1节 引 言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1 系统概述„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1.1系统的特点„„„„„„„„„„„„„„„„„ ...查看


  • 基于单片机的简易逻辑分析仪论文(经典)
  • 目 录 第1节 引 言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1 系统概述„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1.1系统的特点„„„„„„„„„„„„„„„„„„„„„„„„4 1.1.2 ...查看


  • 简易函数信号发生器
  • 课程设计任务书 (一)设计目的 1.掌握信号发生器的设计方法和测试技术. 2.了解单片函数发生器IC8038的工作原理和应用. 3.学会安装和调试分立元件与集成电路组成的多级电子电路小系统. (二)设计技术指标与要求 1.设计要求 (1)电 ...查看


  • 简易电子琴课程设计
  • 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 信息工程学院 题 目: 简易电子琴电路的设计仿真与实现 初始条件: 可选元件:集成运算放大器LM324.电阻.电位器.电容若干,直流电源,或自备元器件. 可用仪器:示波器,万用 ...查看


热门内容