基于单片机的数字多用表设计说明Word文档格式.docx

上传人:b****7 文档编号:22305336 上传时间:2023-02-03 格式:DOCX 页数:28 大小:360.17KB
下载 相关 举报
基于单片机的数字多用表设计说明Word文档格式.docx_第1页
第1页 / 共28页
基于单片机的数字多用表设计说明Word文档格式.docx_第2页
第2页 / 共28页
基于单片机的数字多用表设计说明Word文档格式.docx_第3页
第3页 / 共28页
基于单片机的数字多用表设计说明Word文档格式.docx_第4页
第4页 / 共28页
基于单片机的数字多用表设计说明Word文档格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

基于单片机的数字多用表设计说明Word文档格式.docx

《基于单片机的数字多用表设计说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字多用表设计说明Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。

基于单片机的数字多用表设计说明Word文档格式.docx

(3)转换开关

转换开关的作用是用来选择各种不同的测量线路,以满足不同种类和不同量程的测量要求。

转换开关一般有多个,分别标有不同的档位和量程。

第二章数字多用表硬件电路的总体设计

2.1数字多用表的硬件系统设计框架图

如下图2.1所示,本多用表由以下几部分功能组成,复位电路、震荡电路、ADC输入、被测量显示、超限报警、ADC使能控制。

复位电路用来清零,进行下一次的测量;

震荡电路用来消除一些外来干扰,使电路工作更加稳定;

ADC输入则是将输入量进行AD转换;

测量显示就是显示测量的数值;

超限报警部分则是用作当测量量超出量程围时发出警报,以便提醒用户更改大量程;

ADC使能控制则用来对输入量进行控制,允许输入或者不允许。

图2.1总体电路设计原理图

2.2硬件电路设计方案与选用芯片介绍

2.2.1设计方案

用单片机STC89C52与ADC0809设计一个数字多用表,配合分流电阻、分压电阻可以测量交、直流电压值,直流电流,四位数码显示。

并且有超出量程的情况发生时,蜂鸣器发声报警。

2.2.2STC89C52芯片功能特性描述

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。

它具有以下标准功能:

8k字节Flash,512字节RAM,32位I/O接口,看门狗定时器,置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。

图2-2-2STC89C52RS引脚图

STC89C52RS各引脚功能:

VCC(40引脚):

电源电压VSS(20引脚):

接地

P0端口(P0.0~P0.7,39~32引脚):

P0口是一个漏极开路的8位双向I/O口。

作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。

P1端口(P1.0~P1.7,1~8引脚):

P1口是一个带部上拉电阻的8位双向I/O口。

在对FlashROM编程和程序校验时,P1接收低8位地址。

此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见表2-2-2:

表2-2-2

引脚号

功能特性

P1.0

T2(定时器/计数器2外部计数输入),时钟输出

P1.1

T2EX(定时器/计数器2捕获/重装触发和方向控制)

P2端口(P2.0~P2.7,21~28引脚):

P2口是一个带部上拉电阻的8位双向I/O端口。

在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P3端口(P3.0~P3.7,10~17引脚):

P3是一个带部上拉电阻的8位双向I/O端口。

在对FlashROM编程或程序校验时,P3还接收一些控制信号。

P3口除作为一般I/O口外,还有其他一些复用功能,见表2-2-3:

表2-2-3

复用功能

P3.0

RXD(串行输入口)

P3.1

TXD(串行输出口)

P3.2

(外部中断0)

P3.3

(外部中断1)

P3.4

T0(定时器0的外部输入)

P3.5

T1(定时器1的外部输入)

P3.6

(外部数据存储器写选通)

P3.7

(外部数据存储器读选通)

注:

单片机最小系统包括时钟电路,复位电路,电源电路。

其原理图如下:

2.2.3数码管显示器的结构与其工作原理

(1)数码管结构

数码管的外形结构如图2-2-3所示

图2-2-3数码管显示器原理图

(2)LED数码管分类

按其部结构可分为共阴型和共阳型;

导通时正向压降一般为1.5~2V,额定电流为10mA,最大电流为40mA。

(3)数码管工作原理

共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。

通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。

当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。

根据发光字段的不同组合可显示出各种数字或字符。

此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源与额定段导通电流来确定相应的限流电阻。

共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。

通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。

当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。

数码管显示数字见图2-2-4

图2-2-4数码管显示数字对照图

2.2.4A/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.转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)。

 

  4.单个+5V电源供电。

  5.模拟输入电压围0~+5V,不需零点和满刻度校准。

  6.工作温度围为-40~+85摄氏度。

7.低功耗,约15mW。

(2)部结构:

ADC0809是CMOS单片型逐次逼近式A/D转换器,部结构如右图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。

(3)外部特性(引脚功能):

ADC0809芯片有28条引脚,采用双列直插式封装,如左图所示。

下面说明各引脚功能。

IN0~IN7:

8路模拟量输入端。

2-1~2-8:

8位数字量输出端。

ADDA、ADDB、ADDC:

3位地址输入线,用于选通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位地址,并使ALE=1,将地址存入地址锁存器中。

此地址经译码选通8路模拟输入之一到比较器。

START上升沿将逐次逼近寄存器复位。

下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。

直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。

当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

  转换数据的传送A/D转换后得到的数据应与时传送给单片机进行处理。

数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。

为此可采用下述三种方式。

  1.定时传送方式

  对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。

例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。

可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。

  2.查询方式

A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。

因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。

  3.中断方式

 把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。

不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。

首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。

2.2.5各模块直接引脚连接方法

a)把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口连接。

b)把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1-S8端口连接。

c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。

d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。

e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。

f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。

g)把“模数转换模块”区域中的A2A1A0端子用导线连接到GND端子上。

h)把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。

i)把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0-D7端子上。

第三章数字多用表的软件设计

3.1系统总流程图

根据上述,我们选择单片机与A/D转换芯片结合的方法实现本设计。

使用的基本元器件是:

STC89C52单片机,AD0809模数转换芯片,数码管显示器,开关,电容,电阻,晶振,标准电源等等。

图3.1系统总流程图

3.2物理量采集处理流程

图3.2物理量采集处理流程

3.3电压测量过程流程图

图3.3电压测量流程图

3.4电流的测量过程流程图

图3.4电流测量流程图

3.5各模板仿真与源程序

3.5.1仿真图

分流电阻电路

触发器74LS74

ADC0809转换电路

分压电阻电路

报警电路

3.5.2源程序

#include<

reg51.h>

intrins.h>

sbitLCD_RS=P1^0;

//RS寄存器选择;

高电平选数据;

低电平选指令;

sbitLCD_RW=P1^1;

//读写信号线;

高电平读操作;

低电平写操作;

sbitLCD_E=P1^2;

//E使能端

sbitST=P1^3;

//START输入;

A/D转换启动信号,,高电平有效。

sbitEOC=P1^4;

//输出;

A/D转换结束信号,,

//当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

sbitOE=P1^5;

//输入,数据输出允许信号,高电平有效。

当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

sbitALE=P1^6;

//地址锁存允许信号,输入,高电平有效。

sbitCLK=P3^3;

//时钟脉冲输入端。

/***************************************

sbitA;

//地址选择

sbitB;

sbitC;

***************************************/

#defineLCD_DataP2//液晶数据D7-D0

#defineBusy0x80//用于检测LCD状态字中的Busy标识

#defineucharunsignedchar

#defineuintunsignedint

voidWriteDataLCD(unsignedcharWDLCD);

//写数据

voidWriteCommandLCD(unsignedcharWCLCD,BuysC);

//写指令

unsignedcharReadDataLCD(void);

//读数据

unsignedcharReadStatusLCD(void);

//读状态

voidLCDInit(void);

//LCD初始化

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);

//显示一个字符

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);

//显示一串字符

voidDelay5Ms(void);

voidDelay400Ms(void);

voidread();

//读取待测数据

ucharReadADC();

//ADC读取函数

voidwritenumber();

voidzhuan(uchari);

unsignedcharcodeuctech[]={"

TheDCvoltage:

"

};

unsignedcharcodenet[]={"

the"

unsignedcharnum[5];

unsignedcharshu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

//0123456789

unsignedchargetdata;

voidmain(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();

ST=1;

ALE=0;

Delay400Ms();

//启动等待,等LCD进入工作状态

LCDInit();

//LCD初始化

while

(1)

{

unsignedcharj;

DisplayListChar(0,0,uctech);

//显示第0行

//DisplayListChar(0,1,num);

//显示第1行

ReadDataLCD();

//测试用句无意义

j=ReadADC();

zhuan(j);

//voidwritenumber(uchar*q)

//Delay400Ms;

//for()

//{

WriteCommandLCD(0xc0,0);

WriteDataLCD(num[2]);

//}

}

}

ucharReadADC()//ADC读取函数

{

uchara;

//复位

ALE=1;

//?

?

_nop_();

//OE=0;

//ST=1;

//0>

1;

上升沿ADC0809所有寄存器清零

//ST=0;

//当A/D转换结束时,

//此端输出一个高电平(转换期间一直为低电平)。

while(EOC==0)//A/D转换结束信号,输出,

{

//OE下降沿。

A/D开始转换,期间ST保持低电平

//OE=1;

//OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。

//OE=1,输出转换得到的数据;

//OE=0,输出数据线呈高阻状态。

D7-D0为数字量输出线。

OE=1;

getdata=P0;

a=getdata;

//i=getdata;

}

return(a);

voidzhuan(uchark)

k=k*196;

//k=k/256;

num[0]=shu[k/10000];

k=k%10000;

num[1]=shu[k/1000];

k=k%1000;

num[2]=shu[k/100];

k=k%100;

num[3]=shu[k/10];

/*

voidwritenumber(uchata,uchar*q)

ReadStatusLCD();

//检测忙

LCD_Data=q[];

}

//写数据

voidWriteDataLCD(unsignedcharWDLCD)

LCD_Data=WDLCD;

LCD_RS=1;

LCD_RW=0;

LCD_E=0;

//若晶振速度太高可以在这后加小的延时

//延时

//不加延时通不过PROTEUS仿真

LCD_E=1;

voidWriteCommandLCD(unsignedcharWCLCD,BuysC)//BuysC为0时忽略忙检测

if(BuysC)ReadStatusLCD();

//根据需要检测忙

LCD_Data=WCLCD;

LCD_RS=0;

unsignedcharReadDataLCD(void)

LCD_RW=1;

return(LCD_Data);

unsignedcharReadStatusLCD(void)

LCD_Data=0xFF;

LCD_RS=0;

while(LCD_Data&

Busy);

//检测忙信号

voidLCDInit(void)//LCD初始化

LCD_Data=0;

WriteCommandLCD(0x38,0);

//三次显示模式设置,不检测忙信号

WriteCommandLCD(0x38,1);

//显示模式设置,开始要求每次检测忙信号

WriteCommandLCD(0x08,1);

//关闭显示

WriteCommandLCD(0x01,1)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1