数字电压表修.docx

上传人:b****5 文档编号:27895489 上传时间:2023-07-06 格式:DOCX 页数:20 大小:991.02KB
下载 相关 举报
数字电压表修.docx_第1页
第1页 / 共20页
数字电压表修.docx_第2页
第2页 / 共20页
数字电压表修.docx_第3页
第3页 / 共20页
数字电压表修.docx_第4页
第4页 / 共20页
数字电压表修.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数字电压表修.docx

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

数字电压表修.docx

数字电压表修

关于直流数字电压表的实验研究

物理与电子工程学院电子信息科学与技术专业2010级

指导教师

摘要:

电压测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,电压的测量也最为普遍,本文是采用ATmega8这块单片机作为直流数字电压表的核心控制元件,并以Proteus7ISIS仿真软件为平台,对外部输入的模拟电压经过ATmega8自带的AD转换为数字量,经过编译和仿真,源程序用C语言编程,通过单片机驱动1602液晶显示屏,最终在液晶屏上显示出测得的电压值。

关键词:

ATmega8;l602液晶屏;Proteus7;CodeVisionAVR;

Abstract:

Voltagemeasuringavastelectronicworkersmustmasterthemeansofmeasurementaccuracyandfunctionalityrequirementsarealsoincreasing,voltagemeasurementisalsothemostcommonpieceofpaperisusingATmega8microcontrollerasthecoreDCdigitalvoltmetercontrolelements,AndProteus7ISISsimulationsoftwareplatform,ExternalanalogvoltageinputcomesthroughATmega8ADconvertedtodigital,Aftercompilationandsimulation,sourcecodewritteninCprogramminglanguage,Single-chipLCDdriverthrough1602,finallydisplaymeasuredvoltagevalueontheLCDscreen.

Keywords:

ATmega8;1602seriesofLCDscreen;Proteus7;CodeVisionAVR;

 

1引言

随着计算机、微电子技术、信息技术高速发展,单片机显得尤为重要,目前51系列单片机以及ATmega系列单片机是主流机型,本文采用的是ATmega8设计的直流数字电压表。

数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表,它广泛用于电子、电工测量、自动化检测等领域。

传统的指针式电压表功能单一、精度低,不能满足现代测量技术的需求而且读数也不放方便,容易产生误差,采用单片机的数字电压表,它的精度高、抗干扰能力强、可靠性高、可扩展性强、重量轻、价格低、还可以与电脑之间进行实时通信等优点;在人们生活当中,相关电器都离不开电压表的使用。

目前数字电压表种类也很多,按数字电压表工原理不同又分为比较式,积分式等,按用途来分为交、直流数字电压表,交直流万用表,直流数字电压表等。

2电压表总体研究

2.1研究构思

现今,随着电子技术的飞速发展,很多地方都会用到数字电压表进行电压测量,如果能利用单片机为核心控制的数字电压表其对各种电路测量,将会大大提高工作的灵活性和智能化。

主要构思,首先是要对直流数字电压表的外部模拟电压进行处理,如切换,降压等,所以就要在输入单片机之前要有一个自动转换及降压的电路。

其次是经过处理的模拟电压接入单片机的A/D通道进行模数转,然后通过编程计算出转换后的电压值。

最后通过对单片机编程控制1602液晶显示屏的管脚,把经过单片机处理好的电压值显示出来。

2.2研究目的

1.实现外输入模拟电压正确测量及自动切换量程的数字电压表。

2.在这过程中还可以进一步学习ATmega8和1602液晶屏使用方法,熟悉C语言编程,及Protel99SE电路设计软件以及仿真软件Proteus使用方法等。

3.通过这次对直流数字电压表的实验研究可以锻炼自己探索和解决问题的能力。

2.3主要实现功能

实现外输入模拟电压的正确测量并能在液晶显示屏上准确显示出来,根据待测电压的不同自动切换量程,小于2V时由(0—2V)档位显示、大于等于2V就切换到(0—20V)档位显示;精度达到小数点后三位,也就是精确到千分位。

3系统概述

3.1系统总体框图

 

3.1电路组成框图

图3-1系统框图

3.2系统工作原理的简单概述

系统电路框图中包括输入电路和采样衰减电路及档位切换电路;A/D转换电路是ATmega8这款单片机内部自带;主要控制器件是ATmega8这块芯片;最后一部分就是采用1602液晶作为显示。

首先是外部模拟电压的输入,进入衰减电路对模拟电压进行衰减,在经过比较器进行比较,实行自动换挡,衰减过后的模拟电压通过单片机内部A/D转换电路把模拟量转换为数字量,然后编程驱动1602液晶显示屏实现出测出的电压值。

4系统硬件电路

4.1输入衰减及自动换挡电路

 

图4-1自动换挡及采样衰减电路

工作原理,当外部模拟电压低于2V时,此时U2:

A这个比较器的同相端的电压等于输入电压,然后在和反相端设定的固定的电压值(2V)进行比较,两个电压进行相减,输出端必定是一个低电平,导致NMOS管的栅极g也为低电平,只有当VGS》VT(开启电压)时NMOS管才导通,一般开启电压为2V左右,所以NMOS管也就没能导通,继电器常闭开关中的线圈没有电流流过,不能将开关吸合,然后电压就不经过滑动变阻器,而是直接通过(RL1)常闭开关到达(U2:

B)电压跟随器的同相端,然后再到输出端送入单片机。

同样的道理,当外部模拟电压高于2V时,U2:

A的同相端的电压等于输入电压,然后在和反相端固定的电压值(2V)进行比较,两个电压进行相减,输出端是一个高电平,NMOS管的栅极g也为高电平,此时VGS》VT(开启电压),NMOS管导通,继电器常闭开关中的线圈就有电流通过,由于线圈产生的电磁场把开关吸合,此时继电器常闭开关断开,然后电压就不经过它,而是直接由滑动变阻器衰减十倍后送达(U2:

B)电压跟随器的同相端,然后再到输出端送入单片机。

[1]

4.2系统基本电路

 

图4-2系统基本电路及内部A/D转换

图中ATmega8自带10位6路的逐次逼近型ADC,它包括一个采样保持电路,以确保在转换过程中输入到ADC的电压保持恒定,它由AVCC引脚单独提供电源。

电路图中9、10脚XTAL1、XTAL2接的是外部晶振,为ATmega8提供稳定的工作频率;20脚AVCC是A/D转换器电源,不使用ADC时,该引脚应直接与VCC连接。

使用ADC时应通过一个低通滤波器与VCC连接;21脚AREF是A/D的模拟基准电压输入引脚;C端口的1脚接了一个复位按钮,4脚接自动换挡及采样衰减电路中比较器U2:

A的输出端,用来读取比较器输出端是高电平还是低电平,从而来编程实现它由哪个档位显示;其中C端口26(ADin)脚接自动换挡及采样衰减电路中电压跟随器U2:

B的输出端。

4.31602液晶显示电路与单片机接口

 

图4-31602液晶显示电路与单片机接口电路

图中1602液晶D0到D7脚分别接单片机D端口的高四位和单片机B端口的低四位,1602液晶显示屏的Vss接地,VDD接电源,VEE是液晶驱动电压,接正电源时对比度最弱,接地时对比度较高,为了避免产生“鬼影”,所以接了一个10K的滑动变阻器到地;其中液晶显示屏RS、R/W、E对应接单片机C端口C0、C1、C2脚。

RS是寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;R/W是读/写信号,高电平读,低电平写;E是片选使能信号,不管是写指令还是写数据时,刚开始都要给它一个高电平然后再延迟一会在给它一个低电平。

1602液晶显示屏能够同时显示16*2即32个字符,也就是两排内容,要在液晶上显示出内容就要对它进行初始化设置,首先设置单片机与液晶相连接的端口,然后要写入指令进行显示模式设置,其次写入指令对显示开/关及其光标设置,为了让液晶屏上能正确显示我们想要的结果,防止出现乱码,然后要写入指令对液晶屏进行清屏处理,最后设置内容显示位置;第一排设置让它显示设计者及设计者的名字,当然它是不能显示汉字的,它属于字符型显示液晶,所以设计者和设计者名字用相应的英文字母代替。

第二排显示的是电压值,经过单片机处理后送入液晶显示时,电压值小于2V时液晶上就显示Volt

(1)及具体值,否则就显示Volt

(2)档及具体电压值。

要求在1602液晶屏上显示出的电压值到小数点后三位,如何显示出电压值的小数点后三位要通过编程来实现,首先是把A/D对外部输入模拟电压进行采样的数据以二级制代码形式存放在ADMUX这个寄存器里面,然后用采样数据的份数乘以转换精(参考电压除210,为了减小误差,需要把5V换算成5000mv),所得乘积就是实际输入的模拟电压(由于量化误差,模拟电压与此时转换电压有较小差异),然后对这个电压值除以10000得到电压的十位数,在对这个电压值对10000求余后在除以1000取出电压的个位数,同样的道理,在对此电压值对1000求余后除以100取出电压的第一位小数,电压值对100求余后除以10取出电压的第二位小数;电压值对10求余取出电压的第三位小数。

5核心元器件介绍

5.1ATmega8简介

ATmega8是ATMEL公司在2002年第一季度推出的一款新型AVR高档单片机。

在AVR家族中,ATmega8是一种非常特殊的单片机,它的芯片内部集成了较大容量的存储器和丰富强大的硬件接口电路,具备AVR高档单片机MEGA系列的全部性能和特点。

它是一款采用低功耗CMOS工艺生产的基于AVRRISC结构的8位单片机。

AVR单片机的核心是将32个工作寄存器和丰富的指令集联结在一起,所有的工作寄存器都与ALU(算术逻辑单元)直接相连;ATmega8还具有8K字节的系统内可编程Flash,512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,10位6路ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及五种可以通过软件进行选择的省电模式。

工作于空闲模式时CPU停止工作,而SRAM、T/C、SPI端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;ADC噪声抑制模式时终止CPU和除了异步定时器与ADC以外所有I/O模块的工作,以降低ADC转换时的开关噪声;ATmega8具有一整套的编程与系统开发工具,包括:

C语言编译器、汇编、程序调试器/软件仿真器及评估板。

[2]

5.21602液晶显示屏

本设计采用1602液晶屏作为被测量电压的显示,1602液晶是工业字符型液晶,能够同时显示16*2即32个字符。

驱动电压为+5V/3.3V,当然每个厂家生产的都有点区别,但都是大同小异。

1602液晶模块内部的字符发生存储器(CGROM)中已经存储了160个不同的点阵字符图形,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文名等,每一个字符都有一个固定的代码,比如大写字母“H”对应的高位代码为0100B,低位代码为1000B,合起来就是01001000B(48H),在使用时直接编写程序按一定的时序驱动即可。

它的特点是显示字迹清楚,价格相对便宜,可选择背光有白光、黄绿光等。

以下是1602液晶的各方面参数:

160接口定义

编号

符号

引脚说明

1

VSS

电源地

2

VDD

电源正极

3

VL

液晶显示偏压信号

4

RS

数据/命令选择端

5

R/W

读/写选择端

6

E

片选使能信号

7-14

D0-D7

数据传输端

15

BLA

背光灯引脚阳极

16

BLK

背光灯引脚阴极

(1)基本操作时序:

读状态:

输入:

RS=L,RW=H,E=H。

输出:

D0-D7为状态字

写指令:

输入:

RS=L,RW=L,D0-D7为指令码,E为高脉冲。

输出:

读数据:

输入:

RS=H,RW=H,E=H。

输出:

D0-D7为数据。

写数据:

输入:

RS=1,RW=0,D0-D7为数据,E为高脉冲。

输出:

显示模式设置:

表1.1指令的说明

指令码

功能

0

0

1

1

1

0

0

0

设置16*2显示,5*7点阵,8位数据口

表1.2显示开/关及光标设置

指令码

功能

0

0

0

0

1

D

C

B

D=1开显示;D=0关显示

C=1显示光标;C=0不显示关标

B=1光标闪烁;B=0光标不显闪烁

0

0

0

0

0

1

N

S

N=1当读写一个字条款后地址指针加一,且光标加一。

N=0当读或写一个字符后地址指针减一,且光标减一。

S=1当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。

S=0当写一个字符,整屏显示不移动。

表1.3数据控制

指令码

功能

80H+地址码(0-27H,40H-67H)

设置数据地址指针

01H

显示清屏:

1.数据指针清零

2.所有显示清零

02H

显示回车:

1.数据指针清零

(2)1602写操作时序:

有效数据

 

图5-21602写数据时序图[3]

6PROTEUS仿真结果

6.1下载HEX文件

首先建立源程序文件,然后选择CodeVisionAVR进行源程序文件的编译。

如果源程序语法有错误,编译系统会给出可能出错的地方,改正后,重新编译,一直到没有错误为止。

最后打开仿真电路图,双击ATmega8把编译好产生的HEX文件下入单片机,如下图:

 

6.1输入电压小于2V仿真结果图

 

图A外部模拟电压为0.5V时

 

图B外部模拟电压为1.98V时

6.2输入电压大于等于2V小于20V仿真结果图

 

图C外部模拟电压为3V时

 

图D外部模拟电压为20V时

7结束语

本论文是在指导老师的精心指导下完成的。

最初对直流数字电压表缺乏了解,对各种设计软件也不够熟悉,也没有头绪,因此在设计过程中遇到了不少难题,但经过老师的提点和同学的帮助在经过自己不懈的努力,最终得以解决,该直流数字电压表的预期功能基本实现。

经过这次的实践经历,我对直流数字电压表的有了更深的认识。

对ATmega8这块单片机,程序设计软件等有了更深的认识。

同时,Proteus为学习单片机提供了很好的条件平台,节约了实际制作中的成本,为学生自学提供了良好的平台。

最后,衷心感谢帮助我的指导老师和同学!

参考文献:

[1]《电子技术基础》康华光编高等教育出版社.

[2]《AVR单片机C语言开发入门与典型实例》朱飞杨平编人民邮电出版社.

[3]《C51单片机高效入门》徐富军徐玮沈建良编机械工业出版社.

[4]《C语言程序设计》谭浩强编清华大学出版社.

[5]《单片机应用文集》何立民编北京航空航天大学出版社.

[6]《单片机原理与应用技术》朱勇陈其乐刘浩编清华大学出版社.

[7]《单片机原理及应用》李建忠编西安电子科技大学出版社.

[8]DingYuanjie,"MonolithicMicrocomputerPrincipleAndApplication"[M].mechanicalindustrypublishinghouseinJanuary,20052ndedition10thprinting.

 

附录1系统原理图

附录2:

程序代码

#include

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

#defineRSPORTC.0

#defineR/WPORTC.1

#defineEPORTC.2

uchartable1[]="Volt():

";//电压(第二行)

uchartable2[]=".";//小数点

uchartable3[]="V";//单位/V

uchartable4[]="Design:

chenTS";

ucharnum2[]="";

ucharGearSign=0;//档位标志,0为0~2V档,1为0~20V档

uintnum;

unsignedlongintnum1=0,H,L;

voidwrite_com(ucharcom)//液晶控制子函数

{

RS=0;

PORTD=com&0xF0;

PORTB=com&0x0F;

delay_us(500);

E=1;

delay_us(500);

E=0;

}

voidwrite_date(uchardate)//液晶控制子函数

{

RS=1;

PORTB=date&0x0F;

PORTD=date&0xF0;

delay_ms

(1);

E=1;

delay_ms

(1);

E=0;

}

voidadc_date()//模数转换子函数

{

num1=0;

ADMUX=0X23;//设置AD模式

ADCSRA=0XE5;//启动AD转换

while(ADCSRA&0X40==1);//判断AD转换是否结束

delay_ms

(1);//延时等待

H=ADCH;//模数转换的高位寄存器的值付给H

H<<=2;//H左移2为,即扩大4倍

L=ADCL;//模数转换的地位寄存器的值付给L

L=L&0XC0;//取出有用信号

L>>=6;//右移8位,即除以64

num1=(H|L);//求和

num1=num1*5000/1024;//算出测得的电压值

GearSign=PIND.2;

if(GearSign)//标志位为1时进行档位换算衰减为10倍

num1*=10;

num2[0]=num1/10000;//取出电压的10数位

num2[1]=(num1%10000)/1000;//取出电压的整数位

num2[2]=(num1%1000)/100;//取出电压的第一位小数

num2[3]=(num1%100)/10;//取出电压的第二位小数

num2[4]=num1%10;//取出电压的第三位小数

}

voidinit()//初始化子函数

{

DDRD=0XFB;//D端口设为输出端

PORTD=0X0B;//D端口清零

DDRB=0XFF;//B端口设为输出端

PORTB=0XF0;//B端口清零

DDRC|=0x07;//C端口PC0、PC1、PC2为输出端,PC3为模拟电压输入端

PORTC=0X00;//C端口清零

write_com(0x38);//显示模式设置

write_com(0x0c);//显示开/关

write_com(0x06);//光标设置

write_com(0x01);//液晶清屏

write_com(0x80);//液晶显示设置为第一排

}

voiddisplay()//液晶显示子函数

{

write_com(0x80+0x45);

GearSign=PIND.2;

if(GearSign)//标志位为1时进行档位换算衰减10倍

write_date('2');

else

write_date('1');

write_com(0x80+0x48);//设置液晶第二排的初始显示地址为从左数第九个地址

write_date(0x30+num2[0]);//在液晶第二排地址显示电压十位数部分

write_date(0x30+num2[1]);//在液晶第二排地址显示电压整数部分

write_date(table2[0]);//在液晶第二排第十个地址显示小数点

write_date(0x30+num2[2]);//在液晶第二排第十二个地址显示第一位小数

write_date(0x30+num2[3]);//在液晶第二排第十三个地址显示第二位小数

write_date(0x30+num2[4]);//在液晶第二排第十三个地址显示第三位小数

write_date(table3[0]);//在液晶第二排第九个地址显示电压的单位

}

voidmain()//主函数

{

init();//初始化

write_com(0x80);//设置液晶在第一行显示

for(num=0;num<16;num++)//显示开发者信息

write_date(table4[num]);

write_com(0x80+0x40);//设置液晶第二行显示

for(num=0;num<9;num++)

write_date(table1[num]);//显示电压

for(num=0;;num++)

{

adc_date();//模数转换子函数

delay_ms

(1);

if(num1>0)

display();//液晶显示子函数

delay_ms

(1);

}

}

 

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

当前位置:首页 > 成人教育 > 远程网络教育

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

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