数字电压表单片机设计.docx

上传人:b****4 文档编号:24636186 上传时间:2023-05-29 格式:DOCX 页数:24 大小:251.60KB
下载 相关 举报
数字电压表单片机设计.docx_第1页
第1页 / 共24页
数字电压表单片机设计.docx_第2页
第2页 / 共24页
数字电压表单片机设计.docx_第3页
第3页 / 共24页
数字电压表单片机设计.docx_第4页
第4页 / 共24页
数字电压表单片机设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数字电压表单片机设计.docx

《数字电压表单片机设计.docx》由会员分享,可在线阅读,更多相关《数字电压表单片机设计.docx(24页珍藏版)》请在冰豆网上搜索。

数字电压表单片机设计.docx

数字电压表单片机设计

1引言

数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。

较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。

电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器

(A/D)。

数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。

一般说来,A/D转换的方式可分为两类:

积分式和逐次逼近式。

积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。

根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。

逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。

斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。

在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。

本设计以AT89C51单片机为核心,以逐次比较型A/D转换器ADC0808、液晶显示器LCD1602为主体,构造了一款简易的数字电压表,能够测量1路0~5V直流电压,最小分辨率0.02V。

2仿真软件介绍

2.1仿真软件简介

2.1.1Proteus6Professional

ISIS6Professiona软件是它不仅具有其它EDA工具软件的仿真

功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发使用的科技工作者的青睐。

它从原理图布图、代码调试到单片机和外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

ISIS6Professiona软件具有的功能:

原理布图;PCB自动或人工布线;SPICE电路仿真。

2.1.2KeiluVision2

Keil提供了包括C编译器、宏汇编

、连接器、库管理和一个功能强大仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

KeilC51集成开发环境主要由菜单栏、工具栏、源文件编辑窗口、工程窗口和输出窗口五部分组成。

工具栏为一组快捷工具图标,主要包括基本文件工具栏、建造工具栏和调试工具栏,基本文件工具栏包括新建、打开、拷贝、粘贴等基本操作。

建造工具栏主要包括文件编译、目标文件编译连接、所有目标文件编译连接、目标选项和一个目标选择窗口。

调试工具栏位于最后,主要包括一些仿真调试源程序的基本操作,如单步、复位、全速运行等。

在工具栏下面,默认有三个窗口。

左边的工程窗口包含一个工程的目标(target)、组(group)和项目文件。

右边为源文件编辑窗口,编辑窗口实质上就是一个文件编辑器,我们可以在这里对源文件进行编辑、修改、粘贴等。

下边的为输出窗口,源文件编译之后的结果显示在输出窗口中,会出现通过或错误(包括错误类型及行号)的提示。

3硬件设计

3.1单片机控制模块设计

单片机控制模块的作用是为控制各单元电路的运行并完成数据的换算或处理,主要由单片机、时钟电路、复位电路组成。

3.1.1时钟电路

单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL1和XYAL2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器

对振荡频率

有微调作用,通常取(30±10)pF石英晶体选择6MHz或12MHz都可以。

时钟电路如图1所示。

图1系统时钟电路图2系统复位电路

3.1.2复位电路

单片机的RST管脚为主机提供了一个外部复位信号输入口。

复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。

单片机的复位方式可由手动复位方式完成。

复位电路如图2所示。

3.2逐次逼近式A/D转换模块设计

逐次逼近型A/D转换器属于直接型A/D转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。

主要由比较器、环形分配器

、控制门、寄存器和D/A转换器组成。

3.2.1ADC0808简介

1.ADC0808引脚功能

图3引脚图

IN0~IN7:

8路模拟量输入。

A、B、C:

3位地址输入,2个地址输入端的不同组合选择八路模拟量输入。

ALE:

地址锁存启动信号,在ALE的上升沿,将A、B、C上的通道地址锁存到内部的地址锁存器。

D0~D7:

八位数据输出线,A/D转换结果由这8根线传送给单片机。

OE:

允许输出信号。

当OE=1时,即为高电平,允许输出锁存器输出数据。

START:

启动信号输入端,START为正脉冲,其上升沿清除ADC0808的内部的各寄存器,其下降沿启动A/D开始转换。

EOC:

转换完成信号,当EOC上升为高电平时,表明内部A/D转换已完成。

2.ADC0808内部结构图

逐次逼近型A/D转换器ADC0808由八路模拟开关、地址锁存和译码器、比较器、D/A转换器、寄存器、控制电路和三态输出锁存器等组成。

其内部结构如图4所示。

图4ADC0808内部结构

3.2.2A/D转换电路设计

集成摸数转换芯片ADC0808实现的A/D转换电路如图5所示,被测信号由ADC0808模拟输入端输入,完成A/D转换后送入单片机,经相应处理后送出显示。

图5ADC0808和单片机的连接

3.3显示模块设计

3.3.1LCD显示模块

LCD显示器分为字段显示和字符显示两种。

其中字段显示和LED显示相似,只要送对应的信号到相应的管脚就能显示。

字符显示是根据需要显示基本字符。

本设计采用的是字符型显示。

系统中采用LCD1602作为显示器件输出信息。

和传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机使用设计中最常用的显示器件了。

LCD1602可以显示2行16个汉字。

3.3.2LCD1602的引脚功能

LCD1602模块的引脚如图6所示,其引脚功能如下:

RS:

数据和指令选择控制端,RS=0命令状态;RS=1数据。

R/W:

读写控制线,R/W=0写操作;R/W=1读操作。

A:

背光控制正电源,K:

背光控制地。

E:

数据读写操作控制位,E线向LCD模块发送一个脉冲,LCD模块和单片机间将进行一次数据交换。

DB0~DB7:

数据线,可以用8位连接,也可以只用高4位连接,节约单片机资源。

VDD:

电源端,VEE:

亮度控制端(1-5V),VSS:

接地端。

图6LCD1602模块

3.3.3LCD1602的显示操作

1.四种基本操作

LCD有四种基本操作,具体如表1所示。

表1LCD和单片机之间有四种基本操作

RS

R/W

操作

0

0

写命令操作(初始化,光标定位等)

0

1

读状态操作(读忙标志位)

1

0

写数据操作(要显示内容)

1

1

读数据操作(可以把显示存储区中的数据反读出来)

(1)读状态字:

执行读状态字操作,如表3-1满足RS=0,R/W=1。

根据管脚功能,当为有效电平时,状态命令字可从LCD模块传输到数据总线。

同时可以保持一段时间,从而实现读状态字的功能。

读状态字流程如图7所示。

图7读入状态字流程图

(2)命令字

表2所示为命令字,其主要介绍了指令名称、控制信号及控制代码。

其指令名称是指要实现的功能;控制代号是采用的十六进制的数值表示的。

1)清零操作是指输入某命令字后即能将整个屏幕显示的内容全部清除;

2)归home位:

将光标送到初始位;其中的*号为任意,高低电平均可;

3)输入方式:

设光标移动方向并指定整体显示,是否移动。

I/D=0:

减量方式,S=1:

移位方式,S=0:

不移位;

4)显示状态:

D指设置整体显示开关;C指设置光标显示开关;B指设置光标的字符闪耀;

5)光标画面滚动:

R/L指右移或左移;S/C指移动总体或光标;

6)功能设置:

DL接口数位,L指显示行数,F显示字型;如DL=1:

8位=0,4位N=1:

2行=0:

1行,G=1:

5×10=0:

5×7(点阵);

7)CGRAM地址设制:

相当于一个数据库,可以在其中选择所需要的符号;

8)DDRAM地址设制:

显示定位;

9)读BF和AC:

B为最高位忙的标志,F为标志位;

10)写数据:

将数据按要求写入到对应的单元;

11)读数据:

读相应单元内的数据;

表2命令字

指令名称

控制信号

控制代码

RS

RW

D7

D6

D5

D4

D3

D2

D1

D0

清屏

0

0

0

0

0

0

0

0

0

1

归HOME位

0

0

0

0

0

0

0

0

1

*

输入方式设制

0

0

0

0

0

0

0

1

I/D

S

显示状态设制

0

0

0

0

0

0

1

D

C

B

无标画面滚动

0

0

0

0

0

1

S/C

RL

*

*

功能设置

0

0

0

0

1

DL

N

F

*

*

CGRAM地址设制

0

0

0

1

A5

A4

A3

A2

A1

A0

DDRAM地址设制

0

0

1

A6

A5

A4

A3

A2

A1

A0

读BF和AC

0

1

BF

AC6

AC5

AC4

AC3

AC2

AC1

AC0

写数据

1

0

数据

读数据

1

1

数据

(3)写命令字

由表2可知当RS=0,R/W=0时,才可以通过单片机或用户指令把数据写到LCD模块,此时就对LCD进行调制。

可采用查询方式:

先读入状态字,再判断忙标志位,最后写命令字。

图8所示为写命令字的流程图。

图8写命令字流程图

1)定义光标位置

显示数据的某位,就是把显示数据写在相应的DDRAM地址中,DDRAM地址占7位。

SetDDRAMaddress命令如表3所示。

光标定位,写入一个显示字符后,DDRAM地址会自动加1或减1,加或减由输入方式设置。

表3SetDDRAMaddress命令

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

0

0

1

AC6

AC5

AC4

AC3

AC2

AC1

AC0

第1行DDRAM地址和第2行DDRAM地址并不连续,如表3-4所示。

表4DDRAM地址

row

1

2

3

4

5

14

15

16

line1

80H

81H

82H

83H

84H

8dH

8eH

8fH

line2

0c0H

0c1H

0c2H

0c3H

0c4H

0cdH

0ceH

0cfH

2)LCD初始化

从通电开始延时,先经过判忙后再进行功能设置,过一段时间后可以设制显示状态(如设制行、位或阵列)再经过延时清屏后才可以设置输入方式,具体实现过程如图9所示。

图9LCD初始化流程图

2.LCD显示程序设计

LCD显示程序的设计一般先要确定LCD的初始化、光标定位、确定显示字符后,显示流程如图10显示。

图10LCD显示程序流程图

4系统软件设计

根据需要,可将系统软件按照功能划分为4个模块,分别是主程序模块、A/D转换模块、液晶显示模块、中断服务程序模块(改变显示的小数点位置),各模块的功能关系如图11所示。

编写系统软件时,可首先编写各模块的底层驱动程序,而后是系统联机调试,编写上层主程序。

图11系统软件框图

4.1主程序设计

图12主程序流程图

主程序主要负责初始化工作:

设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶实时显示等,其流程图如图12所示。

4.2A/D转换程序

A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。

当系统设置好后,单片机扫描转换结束管脚P2.6的输入电平状态,当输入为高电平则转换完成,将转换的数值转换并显示输出。

若输入为低电平,则继续扫描。

程序流程图如图13所示。

图13A/D转换程序流程图

程序如下:

#defineSTARTP3_4//ATART,ALE接口。

0->1->0:

启动AD转换。

#defineEOCP3_3//转换完毕由0变1.

#defineOUTPORTP2//AD转换函数,返回转换结果。

unsignedintuiADTransform()

{

unsignedintuiResult;

START=1;//启动AD转换。

START=0;

while(EOC==0);//等待转换结束。

uiResult=OUTPORT;//出入转换结果。

uiResult=(100*uiResult)/51;//处理运算结果。

returnuiResult;}

5系统仿真

首先采用KeilμVision编译器进行源程序编译及仿真调试,调试好程序后将目标文件导入Proteus进行软件调试。

在ProteusISIS编辑窗口中单击开始仿真按钮,4位LED数码管显示相应的电压值。

调试结果如图14所示。

图14仿真结果图

6结论

本设计以AT89C51单片机为控制核心,通过集成摸数转换芯片ADC0808将被测信号转换成数字信号,经单片机内部程序处理后,由液晶显示器LCD1602显示测量结果。

仿真测试表明,系统性能良好,测量读数稳定易读、更新速度合理,直流电压测量范围为0.00~5.00V,最小分辨率为0.02V,满足任务书指标要求。

但是,该系统也存在一定程度的不足,例如:

1、输入电压易发生干扰不稳定,且驱动能力可能存在不足,需在被测信号的输入端加上一部分驱动电路,比如将量程转换电路改成带放大能力的自动量程转换电路,将幅值较小的信号经适当放大后再测量,可显著提高精度;

2、输出量可用平均值算法来改善,使测量准确度更高。

3、若能将测量的电压值实时保存,使用时将更方便。

4、ADC0808可实现对8个通道的输入信号轮流转换,本设计仅仅使用了其中一个通道,造成了较大的资源浪费。

若能对电路稍加改进,实现对多路信号的轮流测量并自动保存相应结果,其使用价值将会更大。

参考文献

[1]徐爱钧.智能化测量控制仪表原理[M].北京:

北京航空航天大学出版社,2004

[2]吴金戌,沈庆阳,郭庭吉.8051单片机实践和使用[M].北京:

清华大学出版社,2002

[3]黄智伟.全国大学生电子设计竞赛训练教程[M].北京:

电子工业出版社,2004

[4]汪德彪.MCS-51单片机原理及接口技术[M].第1版.北京:

电子工业出版社,2003

附录

源程序:

#include"includes.h"

#defineTIME0H0x3C

#defineTIME0L0xB0//全局变量

unsignedcharuc_Clock=0;//定时器0中断计数

bitb_DATransform=0;//把电压显示在LCD上

voidvShowVoltage(unsignedintuiNumber)

{unsignedcharucaNumber[3],ucCount;

if(uiNumber>999)

uiNumber=999;

ucaNumber[0]=uiNumber/100;//把计算数字的每个位存入数组。

ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;

ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];

for(ucCount=0;ucCount<3;ucCount++)

{

vShowOneChar(ucaNumber[ucCount]+48);//从首位到末位逐一输出。

if(ucCount==0)

vShowOneChar('.');

}}

//*********************主函数********************

voidmain()

{

//<<<<<<<<<<<设置定时器0>>>>>>>>>>>>>>>>>

TMOD=0x01;//定时器0,模式1。

TH0=TIME0H;

TL0=TIME0L;

TR0=1;//启动定时器。

ET0=1;//开定时器中断。

EA=1;//开总中断

vdInitialize();

vWriteCMD(0x84);//写入显示起始地址(第二行第一个位置)

vShowChar("Voltage:

");

vWriteCMD(0xC9);

vShowChar("(V)");

while

(1)

{

if(b_DATransform==1)

{

b_DATransform=0;

vWriteCMD(0xC4);

vShowVoltage(uiADTransform());

}

}

}

//<<<<<<<定时器0中断函数>>>>>>>>>>>

voidTime0()interrupt1

{

if(uc_Clock==0)

{

uc_Clock=5;

b_DATransform=1;

}

else

uc_Clock--;

TH0=TIME0H;//恢复定时器0。

TL0=TIME0L;

}

//<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>

#include

#defineSTARTP3_4//ATART,ALE接口。

0->1->0:

启动AD转换。

#defineEOCP3_3//转换完毕由0变1.

#defineOUTPORTP2//AD转换函数,返回转换结果。

*****//转换结果是3位数,小数点在百位和十位之间*****

unsignedintuiADTransform()

{

unsignedintuiResult;

START=1;//启动AD转换。

START=0;

while(EOC==0);//等待转换结束。

uiResult=OUTPORT;//出入转换结果。

uiResult=(100*uiResult)/51;//处理运算结果。

returnuiResult;

}

//********SMC1602驱动程序******************

//<<<<<<<<<<<<头文件及宏定义>>>>>>>>>>

#include"SMC1602.h"

//<<<<<<<<<<<<<<<<把1个命令写入LCD>>>>>>>>>>

voidvWriteCMD(unsignedcharucCommand)

{

vDelay();//先延时。

LCDE=1;//然后把LCD改为写入命令状态。

LCDRS=0;

LCDRW=0;

LCDPORT=ucCommand;//再输出命令。

LCDE=0;//最后执行命令。

}

//<<<<<<<<<<<<<把1个数据写入LCD>>>>>>>>>

voidvWriteData(unsignedcharucData)

{

vDelay();//先延时。

LCDE=1;//然后把LCD改为写入数据状态。

LCDRS=1;

LCDRW=0;

LCDPORT=ucData;//再输出数据。

LCDE=0;//最后显示数据。

}

voidvShowOneChar(unsignedcharucChar)

{

switch(ucChar)

{

case'':

vWriteData(0x20);break;

case'!

':

vWriteData(0x21);break;

case'"':

vWriteData(0x22);break;

case'#':

vWriteData(0x23);break;

case'$':

vWriteData(0x24);break;

case'%':

vWriteData(0x25);break;

case'&':

vWriteData(0x26);break;

case'>':

vWriteData(0x27);break;

case'(':

vWriteData(0x28);break;

case')':

vWriteData(0x29);break;

case'*':

vWriteData(0x20);break;

case'+':

vWriteData(0x2A);break;

case'-':

vWriteData(0x2D);break;

case'/':

vWriteData(0x2F);break;

case'=':

vWriteData(0x3D);break;

case'<':

vWriteData(0x3E);break;

case'?

':

vWriteData(0x3F);break;

case'.':

vWriteData(0x2E);break;

case':

':

vWriteData(0x3A);break;

case'0':

vWriteData(0x30);break;

case'1':

vWriteData(0x31);break;

case'2':

vWriteData(0x32);break;

case'3':

vWriteData(0x33);break;

case'4':

vWriteData(0x34);break;

case'5':

vWriteData(0x35);break;

case'6':

vWriteData(0x36);break;

case'7':

vWriteData(0x37);break;

case'8':

vWriteData(0x38);break;

case'9':

vWriteData(0x39);break;

case'A':

vWriteData(0x41);break;

case'B':

vWriteData(0x42);break;

case'C':

vWr

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

当前位置:首页 > 法律文书 > 调解书

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

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