淮阴工学院测控电路课程设计简易数字电压表的设计.docx

上传人:b****3 文档编号:27035398 上传时间:2023-06-26 格式:DOCX 页数:22 大小:172.33KB
下载 相关 举报
淮阴工学院测控电路课程设计简易数字电压表的设计.docx_第1页
第1页 / 共22页
淮阴工学院测控电路课程设计简易数字电压表的设计.docx_第2页
第2页 / 共22页
淮阴工学院测控电路课程设计简易数字电压表的设计.docx_第3页
第3页 / 共22页
淮阴工学院测控电路课程设计简易数字电压表的设计.docx_第4页
第4页 / 共22页
淮阴工学院测控电路课程设计简易数字电压表的设计.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

淮阴工学院测控电路课程设计简易数字电压表的设计.docx

《淮阴工学院测控电路课程设计简易数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《淮阴工学院测控电路课程设计简易数字电压表的设计.docx(22页珍藏版)》请在冰豆网上搜索。

淮阴工学院测控电路课程设计简易数字电压表的设计.docx

淮阴工学院测控电路课程设计简易数字电压表的设计

简易数字电压表的设计

1设计目的和要求

1.1设计目的

《测控系统原理与设计》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练,在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计和练习,可使学生初步体验微机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的

1.2设计任务

利用单片机AT89C52与ADC0809设计制作一个数字电压表,要求简易电压表可以测量0-5V范围内的8位输入电压值,并且在4位LED数码管上轮流显示和单路选择显示。

1.3设计要求:

(1)根据设计要求,选择AT89C2单片机为核心控制器件。

(2)A/D转换采用ADC0809实现,与单片机的接口为P1口和P2口的高四位引脚。

(3)电压显示采用4位一体的LED数码管。

(4)LED数码的段码输入,由并行端口P0产生:

位码输入,用并行端口P2低四位产生。

二、设计方案

运用单片机构成的数字电压表中包含三个模块:

数据采集模块、数据处理模块和输入/输出模块。

在数据采集保持模块中,基本结构大部分都一样,主要是对电压信号采样前,用放大器进行预处理,然后通过保持器保持采样。

目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度。

本次以简易数字直流电压表的设计为研究内容,系统主要包括三大模块:

转换模块、数据处理模块及显示模块。

其中,A/D转换采用ADC0809对输入的模拟信号进行转换,控制核心AT89C52再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号。

硬件电路设计由6个部分组成;A/D转换电路,AT89C51单片机系统,LED显示系统、时钟电路、复位电路及测量电压输入电路。

硬件电路设计框图2-1所示。

2-1数字电压表系统硬件设计框图

三、程序设计

3.1程序设计总方案

根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图3-1所示。

图3-1数字式直流电压表主程序框图

3.2系统子程序设计

3.2.1初始化程序

所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。

3.2.2A/D转换子程序

A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图3-2所示。

图3-2A/D转换流程图

3.2.3显示子程序

显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。

在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。

图3-3显示子程序

 

四、单元硬件设计

4.1AT89C52单片机简介

AT89C52是此次课程设计的核心部分。

其管脚图4-1如下:

图4-1AT89C52管脚图

AT89C52是低功耗、高性能的CMOS8位单片机。

片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。

另外,AT89C52的指令系统和引脚与80C52完全兼容。

AT89C52各管脚功能如下:

VCC:

供电电压;GND:

接地;P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

;P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流;P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入;P3口管脚功能:

P3.0是RXD(串行输入口);P3.1是TXD(串行输出口);P3.2是/INT0(外部中断0);P3.3是/INT1(外部中断1);P3.4是T0(记时器0外部输入);P3.5是T1(记时器1外部输入);P3.6是/WR(外部数据存储器写选通);P3.7是/RD(外部数据存储器读选通);P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许输出电平用于锁存地址的地位字节。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

4.2A/D转换器选择

A/D转换器是核心器件,它关系到最后数字电压表的精确度。

所以A/D芯片的选择是设计过程中的一个很重要的环节。

常用的A/D芯片ADC0808,ADC0809,ADC0832,TLC2543等几种。

ADC0809是8位逐次逼近型A/D转换器,与微机直接接口,片内带有锁存功能的8路模拟多路开关,可以对8路0-5V输入模拟电压信号分时进行转换,由于ADC0809设计时考虑到若干种模/数变换技术的长处,所以该芯片非常适应于过程控制。

ADC0808主要特性:

8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接口;可锁存三态输出,输出与TTL兼容;转换时间:

128μs;转换精度:

0.2%;单个+5V电源供电;模拟输入电压范围0-+5V,无需外部零点和满度调整;低功耗,约15mW。

逐次逼近式A/D转换器的工作原理:

图4-2逐次逼近法原理

4.3ADC0809的外部引脚特征

图4-3ADC0809的管脚图

ADC0809是8位逐次逼近型A/D转换器。

它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成(见图7)。

多路开关可选通8个模拟通道,

允许8路模拟量分时输入,共用A/D转换器进行转换。

三态输出锁存器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据

D7-D0:

8位数字量输出引脚。

IN0-IN7:

8位模拟量输入引脚。

VCC:

+5V工作电压。

GND:

地。

REF(+):

参考电压正端。

REF(-):

参考电压负端。

START:

A/D转换启动信号输入端。

ALE:

地址锁存允许信号输入端。

(以上两种信号用于启动A/D转换).

EOC:

转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。

OE:

输出允许控制端,用以打开三态数据输出锁存器。

CLK:

时钟信号输入端(一般为500KHz)。

4.4复位电路和时钟电路

4.4.1复位电路设计

单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。

MCS-51单片机有一个复位引脚RST,采用施密特触发输入。

当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。

复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。

单片机的复位方式有上电自动复位和手动复位两种,图4-4是52系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能工作。

图4-4复位电路

4.4.2时钟电路设计

单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。

CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。

MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。

本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简单,只需要一个晶振和两个电容即可,如图4-5所示。

图4-5时钟电路

电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。

4.5LED显示系统设计

4.5.1LED基本结构

LED是发光二极管显示器的缩写。

LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。

LED显示器是由若干个发光二极管组成显示字段的显示器件[6]。

在单片机中使用最多的是七段数码显示器。

LED七段数码显示器由8个发光二极管组成显示字段,其中7个长条形的发光二极管排列成“日”字形,另一个圆点形的发光二极管在显示器的右下角作为显示小数点用,其通过不同的组合可用来显示各种数字。

LED引脚排列如下图4-6所示:

图4-6LED引脚排列

4.5.2LED显示器的选择

在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。

本系统中前一位显示电压的整数位,即个位,后两位显示电压的小数位。

4-LED显示器引脚如图3-8所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。

图4-5-24位LED引脚

对于这种结构的LED显示器,它的体积和结构都符合设计要求,由于4位LED阴极的各段已经在内部连接在一起,所以必须使用动态扫描方式(将所有数码管的段选线并联在一起,用一个I/O接口控制)显示。

4.6总体电路设计

经过以上的设计过程,可设计出基于单片机的简易数字直流电压表硬件电路原理图如图4-6所示。

图4-6简易数字电压表电路图

 

五.设计总结

通过本次实验,了解了AD0809的作用以及其的接口作用,用Proteus进行仿真,了解了Proteus软件的基本使用方法,用keil转换伟福识别语言,使该软件能够识别C语言,也加深了对单片机模拟仿真软件的认识和理解;也在实际操作连接外电路的过程中,遇到了许多问题,意识到自己知识的匮乏,自己的动手能力也亟待提高,无疑这对以后的学习是种无形的激励。

同时在寻求解决问题,查找资料,向老师请教的同时,提高了自己做设计实验的能力,也学会了如何利用图书资源和自身知识去转换为实际应用,为以后的学习提高奠定了基础,总之这次实验我受益匪浅。

附录

程序代码

全部软件程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

#definekey_state00//键盘扫描的各个状态

#definekey_state11

#definekey_state22

#definekey_state33

sbitrs=P1^2;//1602液晶写命令/数据标志,0时写命令

sbitrw=P1^1;//1602液晶写入/读出标志,0时写入数据

sbitep=P1^0;

sbitinput=P1^4;

sbitoutput=P1^3;

sbitcs=P1^5;

sbitclk=P1^6;

sbitkey=P2^0;

sbitflag_1=P2^1;//定义电压表档位相关标志

sbitflag_2=P2^2;

sbitflag_3=P2^3;

sbitflag_4=P2^4;

ucharcodetab0[]="V";//显示的单位及有关的字符

ucharcodetab1[]="MV";

ucharcodetab2[]="Power:

";

ucharcodetab3[]="Aver_V:

";//平均电压值标志符

uchart;

voiddelay(intz)//延时函数

{

intx,y;

for(x=z;x>0;x--)

for(y=10;y>0;y--);

}

voidwrite_com(ucharcom)//往1602液晶写命令函数

{

rs=0;

P0=com;

delay(5);

ep=1;

delay(5);

ep=0;

}

voidwrite_dat(uchardat)//往1602液晶写数据函数

{

rs=1;

P0=dat;

delay(5);

ep=1;

delay(5);

ep=0;

}

voidinit_1602()//对1602液晶的初始化函数

{

rs=0;

rw=0;

write_com(0x38);

delay

(1);

write_com(0x0c);

delay

(1);

write_com(0x06);

delay

(1);

write_com(0x01);

delay

(1);

}

voidinit_timer0()//定时计数器0初值化函数,

{

TMOD=0x01;//方式一

TH0=(65536-50000)/256;//每50ms中断一次

TL0=(65536-50000)%256;

IE=0x82;//打开中断

TR0=0;//定时器首先不可工作

}

voiddisplay(ucharx,uchary,uintdat)//显示电压值的函数,x行y列开始显示

{

uintadd;

uchari,a[5];

switch(x)

{

case0:

add=0x80;break;

case1:

add=0x80+0x40;break;

}

add=add+y;

write_com(add);

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

{

a[i]=dat%10;

dat=dat/10;

}

write_dat(a[4]+0x30);

write_dat(a[3]+0x30);

write_dat(a[2]+0x30);

write_dat('.');

write_dat(a[1]+0x30);

write_dat(a[0]+0x30);

}

 

voiddisplay_zifu(ucharx,uchary,uchar*str)//显示字符函数,x行y列开始显示

{

uintadd;

switch(x)

{

case0:

add=0x80;break;

case1:

add=0x80+0x40;break;

}

add=add+y;

write_com(add);

while(*str!

='\0')

{

write_dat(*str);

str++;

}

}

uintread_AD(ucharcon_way)//读取AD转换值操作函数

{

uintdat=0;

uchari;

cs=0;

clk=0;

con_way<<=4;

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

{

con_way<<=1;/*选择0通道,在输入该控制数据的同时输出前一次AD转结果*/

input=CY;

dat<<=1;

if(output)/*输出AD转换结果*/

dat=dat|0x01;

delay

(2);

clk=1;

delay(5);

clk=0;

}

cs=1;

returndat;

}

 

uintread_value()

{

longfloatdq;

longfloatdat_v;

dq=read_AD(0);//把读取得的AD转换值给变量dq

if(!

flag_3)

dat_v=(200*dq)/4096*100;//三档,量程为200V

elseif(!

flag_2)

dat_v=(20*dq)/4096*100;//二档,量程为20V

elseif(!

flag_1)

dat_v=(2*dq)/4096*100;//一档,量程2V

returndat_v;

}

 

voidread_key()//键盘扫描函数

{

staticucharkey_state=0;

switch(key_state)

{

casekey_state0:

if(key==0)

key_state=key_state1;

break;

casekey_state1:

if(key==0)

{

TR0=1;

display_zifu(1,0,tab3);

key_state=key_state2;

}

else

key_state=key_state0;

break;

casekey_state2:

if(key)

key_state=key_state0;

break;

}

}

voidmain()

{

longfloatdat;

longfloatdat_aver,dat1,dat2,dat3,dat4,dat5;//定义5个随机电压值变量

ucharflag;//后五秒取随机电压的标志

init_timer0();

init_1602();

delay(10);

while

(1)

{

dat=read_value();

if(dat>=100)//当电压值大于1V时,用V显示,否则用mV显示

{

display_zifu(0,1,tab2);

display(0,7,dat);

display_zifu(0,13,tab0);

}

else

{

display_zifu(0,1,tab2);

display(0,7,dat*1000);

display_zifu(0,13,tab1);

}

read_key();//当键盘按下时,计算后五秒的平均电压值

if(t==20)

{

t=0;

flag++;

}

if(flag==1)

dat1=dat;

if(flag==2)

dat2=dat;

if(flag==3)

dat3=dat;

if(flag==4)

dat4=dat;

if(flag==5)

{

dat5=dat;

dat_aver=(dat1+dat2+dat3+dat4+dat5)/5;

display(1,7,dat_aver);

display_zifu(1,13,tab0);

dat_aver=0;

}

if(flag==8)

{

flag=0;

write_com(0x01);

TR0=0;

}

}

}

voidtimer0()interrupt1//定时器中断函数

{

TH0=(65536-50000)/256;//重新放入初始值

TL0=(65536-50000)%256;

t++;

}

5.参考文献

[1]蔡美琴等编著,MCS-51系列单片机系统及其应用,高等教育出版社,2004年4月

[2]谭浩强编《C语言程序设计(第二版)》清华大学出版社

[3]朱定华编著《微机原理、汇编与接口技术》清华大学出版社

[4]陈堂敏.刘焕平主编.单片机原理与应用.北京:

北京理工大学出版社,2007.

[5]李广弟等单片机基础北京航空航天出版社,2001.7

[6]楼然苗等51系列单片机设计实例北京航空航天出版社,2003.3

[7]刘瑞新等单片机原理及应用教程机械工业出版社,2003.7[6]

[8]李全利,迟荣强编著单片机原理及接口技术高等教育出版社,2004.1

[9]霍孟友等,单片机原理与应用,机械工业出版社,2004.

[10]许泳龙等,单片机原理及应用,机械工业出版社,2005.1

[11]马忠梅等,单片机的C语言应用程序设计,北京航空航天大学出版社,2003修订版

 

谢辞

在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。

这三年中还得到众多老师的关心支持和帮助。

在此,谨向老师们致以衷心的感谢和崇高的敬意!

另外,感谢学院给予我们这样一次机会,能够独立地完成一个课程设计,并在这个过程当中,给予我们各种方便,使我们在这学期快要结课的时候,能够将学到的只是应用到实践中,增强了我们实践操作和动手应用能力,提高了独立思考的能力。

感谢所有任课老师和所有同学在这三年来给自己的指导和帮助,是他们教会了我专业知识,教会了我如何学习,教会了我如何做人。

正是由于他们,我才能在各方面取得显著的进步,在此向他们表示我由衷的谢意。

最后再一次感谢老师在学习中给予我的照顾和帮助,祝愿老师身体健康、工作顺利!

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

当前位置:首页 > 高中教育 > 语文

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

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