《基于单片机的数字多用表设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的数字多用表设计.doc(30页珍藏版)》请在三一办公上搜索。
1、基于单片机的数字多用表设计摘 要 本次设计采用单片机芯片STC89C52与ADC0809设计一个数字多用表,能够测量交、直流电压值,直流电流,四位数码显示,但要求使用的元器件数目最少。为使系统更加稳定,使系统的整体精度得以保障,本电路使用了ADC0809数据转换芯片,单片机系统设计采用STC89C52作为主控芯片,配以RC上电复位电路和震荡电路,程序每执行周期耗时缩到最短,这样保证了系统的实时性。关键词:数字多用表 STC89C52单片机 AD转换与控制目录第一章 绪 论11.1数字多用表设计背景11.1.1数字多用表的设计目的和意义11.2 数字多用表的设计依据11.3数字多用表设计任务及要
2、求11.4数字多用表简介2第二章 数字多用表硬件电路的总体设计22.1数字多用表的硬件系统设计框架图22.2硬件电路设计方案及选用芯片介绍32.2.1 设计方案32.2.2 STC89C52芯片功能特性描述32.2.3数码管显示器的结构及其工作原理62.2.4 A/D转换电路的设计72.2.5 各模块直接引脚连接方法10第三章 数字多用表的软件设计113.1系统总流程图113.2物理量采集处理流程123.3电压测量过程流程图133.4电流的测量过程流程图143.5 各模板仿真及源程序153.5.1 仿真图163.5.2 源程序163.6 器件清单25第四章 总结254.1 分析总结254.2
3、心得体会26参考文献26第一章 绪 论数字多用表亦称数字万用表,简称DMM(Digtial Multimeter)。它是采用数字化测量技术,把连续的模拟量转换成不连续的、离散的数字形式并加以显示的仪表。传统的指针式多用表功能单精度低,不能满足数字化时代的需求,采用单片的数字多用表,精度高、抗干扰能力强,可扩展尾强、集成方便,目前,由各种单片机芯片构成的数字电多用表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,显示出强大的生命力。1.1数字多用表设计背景 1.1.1数字多用表的设计目的和意义数字多用表是当前电子、电工、仪器、仪表和测量领域大量使用的一种基本测量,已被
4、广泛应用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。随着时代科技的进步,数字多用表的功能越来越强大,把电量及非电量的测量技术提高到崭新水平。在电子产品的生产设计中,多用表是一种最常见的工具。多用表是采用电路实现对电压,电阻,电流的测量以及显示的测量装置,广泛用于电子产品设计生产过程中,已成为一种不可少的工具。随着数字技术的发展,多用表的数字化给人们生产学习带来了极大的便利,首先,由于采用集成式数字芯片,使得数字多用表的精度大为提高;其次,数字化显示可以给人更直观的信息,缩短了生产时间,提高了生产效率。因此,研究数字式多用表扩大其应用,有着非常现实的意义。1
5、.2 数字多用表的设计依据 根据数字多用表的原理,结合以下的设计要求:设计一个数字多用表,能够测量交、直流电压值,直流电流。实现多级量程的直流电压测量,实现多级量程的交流电压测量,实现多级量程的直流电流测量实现多级量程的电阻测量。由此设想出以下的解决方法,即数字多用表的系统由分流电阻、分压电阻、电容测试芯片电路、51单片机最小系统、显示部分、报警部分、AD转换和控制部分组成。为使系统更加稳定,使系统整体精度得以保障。1.3数字多用表设计任务及要求本设计重点要解决的问题是对不同量程的各种测量内容的转换,还有就是各部分电路组合成一个完整的数字多用表,而难点解决的问题就是程序的设计,要保正其可行性从
6、而保证设计的正确性。1.4数字多用表简介数字多用表是电子测试领域最基本的工具,也是一种使用广泛的测试仪器。多用表又叫多用表、三用表(A,V,也即电流,电压,电阻三用)、复用表、万能表,一般多用表可测量直流电流、直流电压、交流电压、电阻等量,有的还可以测交流电流、电容量、电感量,温度及半导体的一些参数。数字多用表,作为现代化的多用途电子测量仪器,主要用于物理、电气、电子等测量领域。数字式多用表的特点:数字式多用表显示直观,测量速度比指针表快,误差也比指针表小,保护电路设计也比指针表要更好,但无法测量快速变化的信号,工作时必须要使用电池。数字式多用表的构成也分为三部分:(1)表头数字式多用表的表头
7、由A/D转换器,译码设备,以及显示器组成,其性能指标主要取决于A/D转换器的位数,A/D转换器的位数越高,测量的精度就越高。(2)测量线路测量线路是用来把各种被测量转换到适合表头测量的电压信号的电路,它由电阻、半导体元件及电池组成。 它能将各种不同的被测量(如电流、电压、电阻等)、不同的量程,经过一系列的处理(如整流、分流、分压等)统一变成一定量限的微小电压信号送入表头进行测量。(3)转换开关转换开关的作用是用来选择各种不同的测量线路,以满足不同种类和不同量程的测量要求。转换开关一般有多个,分别标有不同的档位和量程。第二章 数字多用表硬件电路的总体设计2.1数字多用表的硬件系统设计框架图如下图
8、2.1所示,本多用表由以下几部分功能组成,复位电路、震荡电路、ADC输入、被测量显示、超限报警、ADC使能控制。复位电路用来清零,进行下一次的测量;震荡电路用来消除一些外来干扰,使电路工作更加稳定;ADC输入则是将输入量进行AD转换;测量显示就是显示测量的数值;超限报警部分则是用作当测量量超出量程范围时发出警报,以便提醒用户更改大量程;ADC使能控制则用来对输入量进行控制,允许输入或者不允许。复位电路震荡电路ADC输入被测量显示超限报警ADC使能控制89C52 图2.1 总体电路设计原理图2.2硬件电路设计方案及选用芯片介绍 2.2.1 设计方案用单片机STC89C52与ADC0809设计一个
9、数字多用表,配合分流电阻、分压电阻可以测量交、直流电压值,直流电流,四位数码显示。并且有超出量程的情况发生时,蜂鸣器发声报警。 2.2.2 STC89C52芯片功能特性描述 STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。 它具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 接口,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2
10、级中断结构,全双工串行口。 图2-2-2 STC89C52RS引脚图STC89C52RS各引脚功能:VCC(40引脚):电源电压 VSS(20引脚):接地P0端口(P0.0P0.7,3932引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。P1端口(P1.0P1.7,18引脚):P1口是一个带内部上拉电阻的8位双向I/O口。在对Flash ROM编程和程序校验时,P1接收低8位地址。此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2E
11、X),具体参见表2-2-2:表2-2-2引脚号功能特性P1.0T2(定时器/计数器2外部计数输入),时钟输出P1.1T2EX(定时器/计数器2捕获/重装触发和方向控制)P2端口(P2.0P2.7,2128引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。 在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。P3端口(P3.0P3.7,1017引脚):P3是一个带内部上拉电阻的8位双向I/O端口。在对Flash ROM编程或程序校验时,P3还接收一些控制信号。P3口除作为一般I/O口外,还有其他一些复用功能,见表2-2-3:表2-2-3引脚号复用功能P3.0RXD(
12、串行输入口)P3.1TXD(串行输出口)P3.2(外部中断0)P3.3(外部中断1)P3.4T0(定时器0的外部输入)P3.5T1(定时器1的外部输入)P3.6(外部数据存储器写选通)P3.7(外部数据存储器读选通)注:单片机最小系统包括时钟电路,复位电路,电源电路。其原理图如下: 2.2.3数码管显示器的结构及其工作原理(1)数码管结构数码管的外形结构如图2-2-3所示图2-2-3 数码管显示器原理图(2) LED数码管分类按其内部结构可分为共阴型和共阳型;导通时正向压降一般为1.52V,额定电流为10mA,最大电流为40mA。 (3)数码管工作原理共阳极数码管的8个发光二极管的阳极(二极管
13、正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。数码管显示数字见图2-2-4图2-2-4 数码管显示数字对照图2.2.4
14、A/D转换电路的设计ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。是目前国内应用最广泛的8位通用A/D芯片。 此模块主要由模数转换器ADC0809和双D型正沿触发器74LS74(带预置和清除端)组成。(1)主要特性:1.8路输入通道,8位A/D转换器,即分辨率为8位。 2.具有转换起停控制端。 3.转换时间为100s(时钟为640kHz时),130s(时钟为500kHz时)。 4.单个+5V电源供电。5.模拟输入电压范围0+5V,不需零点和满
15、刻度校准。 6.工作温度范围为-40+85摄氏度。7.低功耗,约15mW。 (2)内部结构:ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如右图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。 (3)外部特性(引脚功能):ADC0809芯片有28条引脚,采用双列直插式封装,如左图所示。下面说明各引脚功能。 IN0IN7:8路模拟量输入端。 2-12-8:8位数字量输出端。 ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路 ALE:地址锁存允许信号,输入,高电平有效。 START: A/
16、D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一+5V。 GND:地。 (4)ADC0809的工作过程:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到
17、比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。 转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。 1.定时传送方式 对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128s,相当于6MHz
18、的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。 2.查询方式 A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。 3.中断方式 把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。2.2.5 各模块直接引脚连接方法
19、a) 把“单片机系统”区域中的P1.0P1.7与“动态数码显示”区域中的ABCDEFGH端口连接。 b) 把“单片机系统”区域中的P2.0P2.7与“动态数码显示”区域中的S1S8端口连接。 c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。 d) 把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。 e) 把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。f) 把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。 g) 把“模数转换模块”区域中的A2A1A0端子用导线
20、连接到GND端子上。 h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。 i) 把“单片机系统”区域中的P0.0P0.7用8芯排线连接到“模数转换模块” 区域中的D0D7端子上。 第三章 数字多用表的软件设计3.1系统总流程图 根据上述,我们选择单片机与A/D转换芯片结合的方法实现本设计。使用的基本元器件是:STC89C52单片机,AD0809模数转换芯片,数码管显示器,开关,电容,电阻,晶振,标准电源等等。开始系统初始化LED初始化P3.1=1?使能A/D转换单片机接收数据P3.2=1?转换结果送LED显示超限否?结束报警YNYNYN图3.1系统
21、总流程图3.2物理量采集处理流程 图3.2物理量采集处理流程3.3电压测量过程流程图 图3.3电压测量流程图3.4电流的测量过程流程图 图3.4电流测量流程图3.5 各模板仿真及源程序 3.5.1 仿真图 分流电阻电路 触发器74LS74 ADC0809转换电路 分压电阻电路 报警电路3.5.2 源程序#include #include sbit LCD_RS=P10; /RS寄存器选择;高电平选数据;低电平选指令;sbit LCD_RW=P11; /读写信号线;高电平读操作;低电平写操作;sbit LCD_E=P12; /E使能端sbit ST=P13; /START输入 ;AD转换启动信号
22、,高电平有效。sbit EOC=P14; /输出; AD转换结束信号, /当AD转换结束时,此端输出一个高电平(转换期间一直为低电平)。sbit OE=P15; /输入,数据输出允许信号,高电平有效。当AD转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。sbit ALE=P16; /地址锁存允许信号,输入,高电平有效。sbit CLK=P33; /时钟脉冲输入端。/*sbit A; /地址选择sbit B ;sbit C;*/#define LCD_Data P2 /液晶数据D7-D0#define Busy 0x80 /用于检测LCD状态字中的Busy标识#define uc
23、har unsigned char#define uint unsigned intvoid WriteDataLCD(unsigned char WDLCD);/写数据void WriteCommandLCD(unsigned char WCLCD,BuysC);/写指令unsigned char ReadDataLCD(void);/读数据unsigned char ReadStatusLCD(void);/读状态void LCDInit(void);/LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned
24、char DData);/显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/显示一串字符void Delay5Ms(void);void Delay400Ms(void);void read();/读取待测数据uchar ReadADC(); /ADC读取函数void writenumber();void zhuan(uchar i);unsigned char code uctech = The DC voltage : ;unsigned char code ne
25、t = the;unsigned char num5;unsigned char shu=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39; /0 1 23 4 5 67 8 9unsigned char getdata;void main(void) ST=0; OE=0; ET0=1; /计时器/计数器中断允许控制位;=1允许定时,计数器中断 ET1=1; EA=1; /中断允许总控制位 TMOD=0x12; /定时器控制寄存器 TH0=216; TL0=216; / TH1=(65536-5000)/256; / TL1=(65536-5
26、000)%256; TR1=1; TR0=1; Delay5Ms(); ST=1; ST=0; ALE=0; Delay400Ms(); /启动等待,等LCD进入工作状态 LCDInit(); /LCD初始化 Delay400Ms(); /启动等待,等LCD进入工作状态while(1) unsigned char j; DisplayListChar(0, 0, uctech);/显示第0行/ DisplayListChar(0, 1, num); /显示第1行 ReadDataLCD(); /测试用句无意义j=ReadADC();zhuan(j); /void writenumber(uch
27、ar *q)/Delay400Ms; /for()/WriteCommandLCD(0xc0,0);WriteDataLCD(num2);/ uchar ReadADC() /ADC读取函数 uchar a; ST=0; Delay5Ms(); ST=1; /复位 ALE=1; /? _nop_(); ST=0; ALE=0; /OE=0; /ST=1; /01;上升沿ADC0809所有寄存器清零 /ST=0; / 当AD转换结束时, /此端输出一个高电平(转换期间一直为低电平)。 while(EOC=0) / AD转换结束信号,输出, /ST=0; /OE下降沿。A/D开始转换,期间ST保持
28、低电平 /OE=1; /OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。 /OE1,输出转换得到的数据; /OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 OE=1;getdata=P0;a=getdata; /i=getdata;OE=0; return(a);void zhuan(uchar k) k=k*196; /k=k/256; num0=shuk/10000; k=k%10000; num1=shuk/1000; k=k%1000; num2=shuk/100; k=k%100; num3=shuk/10; /*void writenumber(uch
29、at a,uchar *q)ReadStatusLCD(); /检测忙LCD_Data =q; /写数据void WriteDataLCD(unsigned char WDLCD) ReadStatusLCD(); /检测忙 LCD_Data = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 LCD_E = 0; /延时 Delay5Ms(); /不加延时通不过PROTEUS仿真 LCD_E = 1;/写指令void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC为0
30、时忽略忙检测 if (BuysC) ReadStatusLCD(); /根据需要检测忙 LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; /读数据unsigned char ReadDataLCD(void) LCD_RS = 1; LCD_RW = 1; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; return(LCD_Data);/读状态unsigned char ReadStatusLCD(void) LCD_Data
31、= 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; while (LCD_Data & Busy); /检测忙信号 return(LCD_Data);void LCDInit(void) /LCD初始化 LCD_Data = 0; WriteCommandLCD(0x38,0); /三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); Write
32、CommandLCD(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x08,1); /关闭显示 WriteCommandLCD(0x01,1); /显示清屏 WriteCommandLCD(0x06,1); / 显示光标移动设置 WriteCommandLCD(0x0C,1); / 显示开及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) Y &= 0x01; X &= 0x0F; /限制X不能大于15,Y不能大于1
33、if (Y) X |= 0x40; /当要显示第二行时地址码+0x40; X |= 0x80; / 算出指令码 WriteCommandLCD(X, 0); /这里不检测忙信号,发送地址码 WriteDataLCD(DData);/按指定位置显示一串字符/指向数组的指针:int a10; int *p; p=&a0,p指向a0,是因为将a0的地址赋给了pvoid DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) unsigned char ListLength; ListLength = 0
34、; Y=Y&0x01; /行标志符号,第0行,或者第1行; X=X&0x0F; /限制X不能大于15,0-15显示16个字符 while (ListLength=0x0F) /若到达字串尾则退出 if (X=0x0F) /X坐标应小于0xF DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+; X+; /5ms延时void Delay5Ms(void) unsigned int TempCyc = 5552; while(TempCyc-);/400ms延时void Delay400Ms(void) unsigned char
35、TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7269; while(TempCycB-); ;void t0(void) interrupt 1 using 0 /定时器0 中断服务 CLK=CLK; 3.6 器件清单元器件数量数值作用备注发光二极管125mm红,黄,绿各4只电压表普通电阻1090K分压电阻同上普通电阻109K分压电阻同上普通电阻101K分压电阻同上表笔 2同上ADC0809芯片(带IC座)1数模转换同上74LS74芯片(带IC座)1寄存器同上自锁开关3量程选择同上四位共阴数码管1显示同上万能板2同上C1110uF电解电容(复位)同上C2,C3230pF振荡瓷片电容同上J112MHz晶振同上IC11STC89C52单片机芯片同上R21510LED限流电阻同上活动IC座(40脚)1同上电源(+5V)1交流变直流变压器同上杜邦线若干R1110k复位电阻最小系统D015mm红色发光二极管同上第四章 总结4.1 分析总结4.2 心得体会参考文献鞠剑平,陈朝大.单片机应用技术教程.华中科技大学出版社.2012.9刘剑,刘奇穗.51单片机开发与应用基础教程(c语言版).中国电力出版社.2011.10胡宴如.模拟电子技术基础.高等教育出版社.2004年第1版