淮阴工学院测控电路课程设计简易数字电压表的设计.docx
《淮阴工学院测控电路课程设计简易数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《淮阴工学院测控电路课程设计简易数字电压表的设计.docx(22页珍藏版)》请在冰豆网上搜索。
淮阴工学院测控电路课程设计简易数字电压表的设计
简易数字电压表的设计
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修订版
谢辞
在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。
这三年中还得到众多老师的关心支持和帮助。
在此,谨向老师们致以衷心的感谢和崇高的敬意!
另外,感谢学院给予我们这样一次机会,能够独立地完成一个课程设计,并在这个过程当中,给予我们各种方便,使我们在这学期快要结课的时候,能够将学到的只是应用到实践中,增强了我们实践操作和动手应用能力,提高了独立思考的能力。
感谢所有任课老师和所有同学在这三年来给自己的指导和帮助,是他们教会了我专业知识,教会了我如何学习,教会了我如何做人。
正是由于他们,我才能在各方面取得显著的进步,在此向他们表示我由衷的谢意。
最后再一次感谢老师在学习中给予我的照顾和帮助,祝愿老师身体健康、工作顺利!
!
!