1、(3)转换开关转换开关的作用是用来选择各种不同的测量线路,以满足不同种类和不同量程的测量要求。转换开关一般有多个,分别标有不同的档位和量程。第二章 数字多用表硬件电路的总体设计2.1数字多用表的硬件系统设计框架图如下图2.1所示,本多用表由以下几部分功能组成,复位电路、震荡电路、ADC输入、被测量显示、超限报警、ADC使能控制。复位电路用来清零,进行下一次的测量;震荡电路用来消除一些外来干扰,使电路工作更加稳定;ADC输入则是将输入量进行AD转换;测量显示就是显示测量的数值;超限报警部分则是用作当测量量超出量程围时发出警报,以便提醒用户更改大量程;ADC使能控制则用来对输入量进行控制,允许输入
2、或者不允许。 图2.1 总体电路设计原理图2.2硬件电路设计方案与选用芯片介绍2.2.1 设计方案用单片机STC89C52与ADC0809设计一个数字多用表,配合分流电阻、分压电阻可以测量交、直流电压值,直流电流,四位数码显示。并且有超出量程的情况发生时,蜂鸣器发声报警。2.2.2 STC89C52芯片功能特性描述STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。 它具有以下标准功能: 8k字节Flash,51
3、2字节RAM, 32 位I/O 接口,看门狗定时器,置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。图2-2-2STC89C52RS引脚图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位
4、地址。此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见表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编程或程序校验时,P
5、3还接收一些控制信号。P3口除作为一般I/O口外,还有其他一些复用功能,见表2-2-3:表2-2-3复用功能P3.0RXD(串行输入口)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数码管分类按其部结构可分为共阴型和共阳型;导通时正向压降一
6、般为1.52V,额定电流为10mA,最大电流为40mA。(3)数码管工作原理共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源与额定段导通电流来确定相应的限流电阻。共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根
7、据发光字段的不同组合可显示出各种数字或字符。数码管显示数字见图2-2-4图2-2-4 数码管显示数字对照图2.2.4 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(时钟为640kH
8、z时),130s(时钟为500kHz时)。 4.单个+5V电源供电。5.模拟输入电压围0+5V,不需零点和满刻度校准。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位地址输入线,用于
9、选通8路模拟输入中的一路 ALE:地址锁存允许信号,输入,高电平有效。START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。REF(+)、REF(-):基准电压。Vcc:电源,单一+5V。GND:地。(4)ADC0809的工作过程:首先输入3位地址,
10、并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。转换数据的传送 A/D转换后得到的数据应与时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。1.定时传送方式 对于一种A/D转换器来说,转换时间作为一项技术指标
11、是已知的和固定的。例如ADC0809转换时间为128s,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。2.查询方式 A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。3.中断方式 把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数
12、据送上数据总线,供单片机接受。2.2.5 各模块直接引脚连接方法 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端子用导
13、线相连接。 g) 把“模数转换模块”区域中的A2A1A0端子用导线连接到GND端子上。 h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。 i) 把“单片机系统”区域中的P0.0P0.7用8芯排线连接到“模数转换模块” 区域中的D0D7端子上。第三章 数字多用表的软件设计3.1系统总流程图 根据上述,我们选择单片机与A/D转换芯片结合的方法实现本设计。使用的基本元器件是:STC89C52单片机,AD0809模数转换芯片,数码管显示器,开关,电容,电阻,晶振,标准电源等等。图3.1系统总流程图3.2物理量采集处理流程 图3.2物理量采集处理流程3.3
14、电压测量过程流程图 图3.3电压测量流程图3.4电流的测量过程流程图 图3.4电流测量流程图3.5 各模板仿真与源程序3.5.1 仿真图 分流电阻电路 触发器74LS74 ADC0809转换电路 分压电阻电路 报警电路3.5.2 源程序#include intrins.hsbit LCD_RS=P10; /RS寄存器选择;高电平选数据;低电平选指令;sbit LCD_RW=P11; /读写信号线;高电平读操作;低电平写操作;sbit LCD_E=P12; /E使能端sbit ST=P13; /START输入 ;AD转换启动信号,高电平有效。sbit EOC=P14; /输出; AD转换结束信号
15、,/当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 uchar unsigned char#define uint unsi
16、gned 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 char DData);/显示一个字符void DisplayLis
17、tChar(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 net = theunsigned char num5;unsigned
18、 char shu=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39; /0 1 2 3 4 5 6 7 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-5000)%256; TR1=1; TR0=1; Delay5Ms();
19、 ST=1; ALE=0; Delay400Ms(); /启动等待,等LCD进入工作状态 LCDInit(); /LCD初始化 while(1) unsigned char j; DisplayListChar(0, 0, uctech);/显示第0行/ DisplayListChar(0, 1, num); /显示第1行 ReadDataLCD(); /测试用句无意义 j=ReadADC(); zhuan(j); /void writenumber(uchar *q)/ Delay400Ms;/ for()/ WriteCommandLCD(0xc0,0); WriteDataLCD(num
20、2);/ uchar ReadADC() /ADC读取函数 uchar a; /复位ALE=1; /? _nop_(); /OE=0; /ST=1; /01;上升沿ADC0809所有寄存器清零 /ST=0; / 当AD转换结束时, /此端输出一个高电平(转换期间一直为低电平)。 while(EOC=0) / AD转换结束信号,输出, /OE下降沿。A/D开始转换,期间ST保持低电平 /OE=1; /OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。 /OE1,输出转换得到的数据; /OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 OE=1; getdata=P0;
21、a=getdata; /i=getdata; 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(uchat a,uchar *q) ReadStatusLCD(); /检测忙 LCD_Data =q; /写数据void WriteDataLCD(unsigned char WDLCD) LCD_Data = WDLCD; LCD_RS
22、 = 1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 /延时 /不加延时通不过PROTEUS仿真 LCD_E = 1;void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCD(); /根据需要检测忙 LCD_Data = WCLCD;LCD_RS = 0;unsigned char ReadDataLCD(void) LCD_RW = 1; return(LCD_Data);unsigned char ReadStatusLCD(void) LCD_Data = 0xFF; LCD_RS = 0; while (LCD_Data & Busy); /检测忙信号void LCDInit(void) /LCD初始化 LCD_Data = 0; WriteCommandLCD(0x38,0); /三次显示模式设置,不检测忙信号 WriteCommandLCD(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x08,1); /关闭显示 WriteCommandLCD(0x01,1)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1