多路采集液晶数字电压表.docx

上传人:b****3 文档编号:24917198 上传时间:2023-06-02 格式:DOCX 页数:17 大小:133.41KB
下载 相关 举报
多路采集液晶数字电压表.docx_第1页
第1页 / 共17页
多路采集液晶数字电压表.docx_第2页
第2页 / 共17页
多路采集液晶数字电压表.docx_第3页
第3页 / 共17页
多路采集液晶数字电压表.docx_第4页
第4页 / 共17页
多路采集液晶数字电压表.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

多路采集液晶数字电压表.docx

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

多路采集液晶数字电压表.docx

多路采集液晶数字电压表

学号:

0965121003

杭州师范大学

钱江学院

单片机实训

题目

多路采集数字电压表(软件)

分院

钱江学院

专业

电子信息

班级

电子091

姓名

褚富华

指导教师

孙亚萍

 

2012

10

09

 

第一章引言

数字电压表的基本工作原理是利用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.001V。

 

第二章仿真软件介绍

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)和项目文件。

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

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

 

第三章电路原理图、程序流程图

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

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

图3.1系统软件框图

3.1主程序设计

图3.2主程序流程图

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

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

3.2A/D转换程序

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

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

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

程序流程图如图3.3所示。

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

3.3LCD显示程序设计

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

图3.4LCD显示程序流程图

3.4LCD初始化

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

图3.5LCD初始化流程图

第四章系统的软件实现

LCD1602的驱动程序

#include

#defineucharunsignedchar

sbitRS=P2^0;

sbitRW=P2^1;

sbitE=P2^2;

//延时程序

voiddelayms(ucharms)

{

uchari;

while(ms--)

for(i=0;i<250;i++);

}

//忙检程序(读状态)

ucharbusy_check()

{

ucharLCD_status;

RS=0;//寄存器选择

RW=1;//读状态寄存器

E=1;//开始读

delayms

(1);

LCD_status=P0;

E=0;

returnLCD_status;

}

//写LCD命令

voidwrite_LCD_command(ucharcommand)

{

while((busy_check()&0x80)==0X80);//忙等待,等待忙碌标志位BF(D7)=0

RS=0;//选择命令寄存器

RW=0;//写

E=0;

P0=command;

E=1;

delayms

(1);

E=0;

}

//发送数据(写数据)

voidwrite_LCD_data(uchardat)

{

while((busy_check()&0x80)==0X80);//忙等待,等待忙碌标志位BF(D7)=0

RS=1;//选择数据存储器

RW=0;//写

E=0;

P0=dat;

E=1;

delayms

(1);

E=0;

}

//LCD初始化

voidinitialize_LCD()

{

write_LCD_command(0x38);//DL=1:

8位,N=1:

双行显示,F=0:

5*7点阵字符

delayms

(1);

write_LCD_command(0x01);//清屏

delayms

(1);

write_LCD_command(0x06);//字符进入模式,屏幕不动,字符后移

delayms

(1);

write_LCD_command(0x0c);//显示屏开,光标不显示不闪烁

delayms

(1);

}

//显示字符串函数

voidshow_string(ucharx,uchary,uchar*s)

{

uchari=0;

//设置显示起始位置

if(y==0)write_LCD_command(0x80|x);//首行第一个地址0x80,

if(y==1)write_LCD_command(0xc0|x);//第二行第一个地址0x80+0x40,即从0XC0开始

//输出字符串

for(i=0;i<16;i++)

{

write_LCD_data(s[i]);

}

}

主程序

/*1~5和26~28(IN0~IN7):

8路模拟量输入端。

8、14、15和17~21:

8位数字量输出端。

 

22(ALE):

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

 

6(START):

A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

7(EOC):

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

 

9(OE):

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

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

10(CLK):

时钟脉冲输入端。

要求时钟频率不高于640KHZ。

 

11(Vcc):

主电源输入端。

12(VREF(+))和16(VREF(-)):

参考电压输入端   

13(GND):

地。

  

23~25(ADD_A,ADD_B,ADD_C):

3位地址输入线,用于选通8路模拟输入中的一路*/

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitCLK=P2^4;

sbitST=P2^5;

sbitEOC=P2^7;

sbitOE=P1^7;

sbitADD_A=P1^0;//AD0808的输入控制引脚

sbitADD_B=P1^1;

sbitADD_C=P1^2;

sbitS0=P1^3;

sbitS1=P1^4;

uchar*display1="Wellcometouse!

";

uchar*display2="Author:

chufuhua";

uchar*display3="CurrentVoltage";

uchar*display4="Vis0.000V";

ucharAD_data,zs,x1,x2,x3,X4;

ucharT0num=0;

bitsim=1;

//函数声明

voiddelayms(uchar);

voidwrite_LCD_command(uchar);

voidwrite_LCD_data(uchar);

voidinitialize_LCD();

voidshow_string(uchar,uchar,uchar);

//启动AD转换程序

voidAD_convert()

{

ST=0;

CLK=0;

delayms

(1);

ST=1;

CLK=1;

delayms

(1);

ST=0;

CLK=0;

while(EOC==0)

{

CLK=1;

delayms

(1);

CLK=0;

delayms

(1);

}

OE=1;

AD_data=P3;

OE=0;

}

voidchange()

{

doublevalue;

uintxs;

value=AD_data*0.0196078;//电压值

zs=(uchar)value;//整数

xs=(uint)((value-zs)*1000);//小数

x3=xs%10;//小数第3位

x2=xs/10%10;//小数第2位

x1=xs/100;//小数第1位

}

voidwrite_sfm(ucharadd,uchardat)//转字符串函数

{

write_LCD_command(0x80+0x40+add);

write_LCD_data(0x30+dat);

}

voidtimer0()interrupt1

{

TH0=(65536-50000)/256;//定时50ms

TL0=(65536-50000)%256;

T0num++;

if(T0num==20)//50ms*20=1s进行一次转换

{

T0num=0;

sim=1;

}

}

voidmain()

{

initialize_LCD();//初始化LCD

show_string(0,0,*display1);//显示"Wellcometouse!

"

show_string(0,1,*display2);//显示"Author:

chufuhua"

delayms(250);

delayms(250);

delayms(250);

show_string(0,0,*display3);//显示"CurrentVoltage"

show_string(0,1,*display4);//显示"Vis0.000V"

delayms(250);

delayms(250);

delayms(250);

TMOD=0x01;//定时器0工作方式1

TH0=(65536-50000)/256;//定时50ms

TL0=(65536-50000)%256;

EA=1;//开总中断

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

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

while

(1)

{

if(S0==0&&S1==0)

{//路径选择由开关S0,S1设置

ADD_A=0;

ADD_B=0;

ADD_C=0;

X4=0;

}

elseif(S0==0&&S1==1)

{

ADD_A=1;

ADD_B=0;

ADD_C=0;

X4=1;

}

elseif(S0==1&&S1==0)

{

ADD_A=0;

ADD_B=1;

ADD_C=0;

X4=2;

}

else

{

ADD_A=1;

ADD_B=1;

ADD_C=0;

X4=3;

}

write_sfm(9,zs);

write_sfm(11,x1);

write_sfm(12,x2);

write_sfm(13,x3);

write_sfm(3,X4);

 

if(sim==1)

{

AD_convert();

change();

sim=0;

}

}

}

第五章系统调试

当按键S0=1,S0=0是AD0808的IN3模拟输入端选通(S0,S1控制AD0808的地址输入线,地址输入线控制AD0808的模拟输入端口1N0~IN7),当前电压值进入AD0808将模拟信号转换成数字信号经过OUT端输出,单片机的P3口将数据接收然后转换成LCD1602的显示码,通过LCD1602液晶屏幕进行显示。

如图5.1所示。

液晶屏幕显示当前流通的电压值。

图5.2所示是选通的IN0时的当前电压。

图5.1IN3系统调试图

图5.2IN0系统调试图

第六章实训总结

通过两星期的紧张工作,最后完成了我的设计任务。

通过课程设计,发现自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。

同时也体会到设计课的重要性和目的性所在。

本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。

它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。

希望学校以后多安排一些类似的实践环节,让同学们学以致用。

在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。

在应用keil的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。

 

参考文献

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

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

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

清华大学出版社,2002

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

电子工业出版社,2004

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

电子工业出版社,2003

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

当前位置:首页 > 初中教育 > 科学

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

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