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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

杭州师范大学钱江学院
单片机实训
题目多路采集数字电压表(软件)
分院钱江学院
专业电子信息
班级电子091
姓名褚富华
指导教师孙亚萍
2012 年 1 0 月 0 9 日
目录
第一章引言 (1)
第二章仿真软件介绍 (1)
2.1 仿真软件简介 (1)
2.1.1 Proteus 6 Professional (1)
2.1.2 Keil uVision2 (2)
第三章电路原理图、程序流程图 (2)
3.1主程序设计 (3)
3.2 A/D转换程序 (3)
3.3 LCD显示程序设计 (4)
第四章系统的软件实现 (5)
第五章系统调试 (11)
第六章实训总结 (12)
参考文献 (12)
第一章引言
数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。

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

电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器]1[(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.1 Proteus 6 Professional
ISIS 6 Professiona软件是它不仅具有其它EDA工具软件的仿真]2[功能,还能仿真单片机及外围器件。

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

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

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

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

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

ISIS 6 Professiona软件具有的功能:原理布图;PCB自动或人工布线;SPICE 电路仿真。

2.1.2 Keil uVision2
Keil提供了包括C编译器、宏汇编]3[、连接器、库管理和一个功能强大仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

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

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

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

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

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

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

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

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

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

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

图3.1 系统软件框图
3.1主程序设计
图3.2 主程序流程图
主程序主要负责初始化工作:设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶实时显示等,其流程图如图3.2所示。

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

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

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

程序流程图如图3.3所示。

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

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

图3.5 LCD初始化流程图
第四章系统的软件实现
LCD1602的驱动程序
#include<reg51.h>
#define uchar unsigned char
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
//延时程序
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<250;i++);
}
//忙检程序(读状态)
uchar busy_check()
{
uchar LCD_status;
RS=0; //寄存器选择
RW=1; //读状态寄存器
E=1; //开始读
delayms(1);
LCD_status=P0;
E=0;
return LCD_status;
}
//写LCD命令
void write_LCD_command(uchar command)
{
while((busy_check()&0x80)==0X80);//忙等待,等待忙碌标志位BF(D7)=0 RS=0; //选择命令寄存器
RW=0; //写
E=0;
P0=command;
E=1;
delayms(1);
E=0;
}
//发送数据(写数据)
void write_LCD_data(uchar dat)
{
while((busy_check()&0x80)==0X80);//忙等待,等待忙碌标志位BF(D7)=0 RS=1; //选择数据存储器
RW=0; //写
E=0;
P0=dat;
E=1;
delayms(1);
E=0;
}
//LCD初始化
void initialize_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);
}
//显示字符串函数
void show_string(uchar x,uchar y,uchar *s)
{
uchar i=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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P2^4;
sbit ST=P2^5;
sbit EOC=P2^7;
sbit OE=P1^7;
sbit ADD_A=P1^0;//AD0808的输入控制引脚
sbit ADD_B=P1^1;
sbit ADD_C=P1^2;
sbit S0=P1^3;
sbit S1=P1^4;
uchar *display1="Wellcome to use!";
uchar *display2="Author:chufuhua";
uchar *display3="Current Voltage ";
uchar *display4=" V is 0.000V ";
uchar AD_data,zs,x1,x2,x3,X4;
uchar T0num=0;
bit sim=1;
//函数声明
void delayms(uchar);
void write_LCD_command(uchar);
void write_LCD_data(uchar);
void initialize_LCD();
void show_string(uchar,uchar,uchar);
//启动AD转换程序
void AD_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;
}
void change()
{
double value;
uint xs;
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位
}
void write_sfm(uchar add,uchar dat) //转字符串函数
{
write_LCD_command(0x80+0x40+add);
write_LCD_data(0x30+dat);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; //定时50ms
TL0=(65536-50000)%256;
T0num++;
if(T0num==20) //50ms*20=1s进行一次转换{
T0num=0;
sim=1;
}
}
void main()
{
initialize_LCD(); //初始化LCD
show_string(0,0,*display1); //显示"Wellcome to use!"
show_string(0,1,*display2); //显示"Author:chufuhua"
delayms(250);
delayms(250);
delayms(250);
show_string(0,0,*display3); //显示"Current Voltage "
show_string(0,1,*display4); //显示" V is 0.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;
}
else if(S0==0&&S1==1)
{
ADD_A=1;
ADD_B=0;
ADD_C=0;
X4=1;
}
else if(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.1 IN3系统调试图
图5.2 IN0系统调试图
第六章实训总结
通过两星期的紧张工作,最后完成了我的设计任务。

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

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

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

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

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

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

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

参考文献
[1] 徐爱钧.智能化测量控制仪表原理[M].北京:北京航空航天大学出版社,2004
[2] 吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:清华大学出版社,2002
[3] 黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,2004
[4] 汪德彪.MCS-51单片机原理及接口技术[M]. 第1版.北京:电子工业出版社,2003。

相关文档
最新文档