基于51单片机的简易数字电压表的设计.docx
《基于51单片机的简易数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的简易数字电压表的设计.docx(25页珍藏版)》请在冰点文库上搜索。
基于51单片机的简易数字电压表的设计
五邑大学
单片机课程设计报告
基于51单片机的简易数字电压表的设计
学院:
信息工程学院
专业:
交通工程(交通控制与管理)
班
姓名
学号
指导老师:
完成日期:
2015年01月05日
1引言······················1
2设计方案····················1
3元器件·····················3
4实际电路····················8
5单片机程序···················10
6电路板制作···················15
7总结······················16
8附录······················16
9参考文献····················17
数字电压表设计
1引言
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:
转换模块、数据处理模块及显示模块。
其中,A/D转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号
2设计方案
2.1设计要求
以单片机为核心,设计一个数字电压表。
采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED显示,并存入内存。
超过界限时指示灯闪烁。
为了稍微增加一点难度,我加入测量温度的功能。
2.2设计思路
⑴根据设计要求,选择AT89C51单片机为核心控制器件。
⑵A/D转换采用ADC0808实现,与单片机的接口为P1口和P2口的高四位引脚。
电压显示采用4位一体的LED数码管。
LED数码的段码输入,由并行端口P0产生:
位码输入,用并行端口P2低四位产生。
2.3设计方案
将被测电压输入ADC0808的电压输入端口,进行采集。
接着,将采集到的模拟信号转换为数字信号。
然后,通过控制单片机的内部程序,让单片机系统按照规定的时序来采集ADC0808输入的数字信号,并通过算法计算出被测电压的值。
最后,单片机再将计算好的电压值,按照一定的时序送入LED数码管中,让其显示。
同时,设置监测电路,当电压达到预定值时,进行报警提示。
2.4流程图
图1:
设计方案流程图
3元器件
3.1A/D转换模块
一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用。
3.1.1逐次逼近型A/D转换器原理
逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。
它利用内部的寄存器从高位到低位一次开始逐位试探比较。
转换过程如下:
开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量[5]。
其原理框图如图2所示:
图2逐次逼近式A/D转换器原理图
3.1.2ADC0808
ADC0808是CMOS单片型逐次逼近式A/D转换器,带有使能控制端,与微机直接接口,片内带有锁存功能的8路模拟多路开关,可以对8路0-5V输入模拟电压信号分时进行转换,由于ADC0808设计时考虑到若干种模/数变换技术的长处,所以该芯片非常适应于过程控制,微控制器输入通道的接口电路,智能仪器和机床控制等领域[5]。
ADC0808主要特性:
8路8位A/D转换器,即分辨率8位;具有锁存控制的8路模拟开关;易与各种微控制器接口;可锁存三态输出,输出与TTL兼容;转换时间:
128μs;转换精度:
0.2%;单个+5V电源供电;模拟输入电压范围0-+5V,无需外部零点和满度调整;低功耗,约15mW[6]。
3.1.3ADC0808的外部引脚特征
ADC0808芯片有28条引脚,采用双列直插式封装,其引脚图如图3所示。
图3ADC0808引脚图
下面说明各个引脚功能:
IN0-IN7(8条):
8路模拟量输入线,用于输入和控制被转换的模拟电压。
地址输入控制(4条):
ALE:
地址锁存允许输入线,高电平有效,当ALE为高电平时,为地址输入线,用于选择IN0-IN7上那一条模拟电压送给比较器进行A/D转换。
ADDA,ADDB,ADDC:
3位地址输入线,用于选择8路模拟输入中的一路,其对应关系如表1所示:
表1ADC0808通道选择表
地址码
对应的输入通道
C
B
A
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
START:
START为“启动脉冲”输入法,该线上正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。
EOC:
EOC为转换结束输出线,该线上高电平表示A/D转换已结束,数字量已锁入三态输出锁存器。
D1-D8:
数字量输出端,D1为高位。
OE:
OE为输出允许端,高电平能使D1-D8引脚上输出转换后的数字量。
REF+、REF-:
参考电压输入量,给电阻阶梯网络供给标准电压。
Vcc、GND:
Vcc为主电源输入端,GND为接地端,一般REF+与Vcc连接在一起,REF-与GND连接在一起.
CLK:
时钟输入端。
3.1.4ADC0808的内部结构及工作流程
ADC0808由8路模拟通道选择开关,地址锁存与译码器,比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路和三态输出锁存器等组成,其内部结构如图4所示。
图4ADC0808的内部结构
其中:
(1)8路模拟通道选择开关实现从8路输入模拟量中选择一路送给后面的比较器进行比较。
(2)地址锁存与译码器用于当ALE信号有效时,锁存从ADDA、ADDB、ADDC3根地址线上送来的3位地址,译码后产生通道选择信号,从8路模拟通道中选择当前模拟通道。
(3)比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路组成8位A/D转换器,当START信号有效时,就开始对当前通道的模拟信号进行转换,转换完成后,把转换得到的数字量送到8位三态锁存器,同时通过引脚送出转换结束信号。
(4)三态输出锁存器保存当前模拟通道转换得到的数字量,当OE信号有效时,把转换的结果送出。
ADC0808的工作流程为:
(1)输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器从8路模拟通道中选通1路模拟量送给比较器。
(2)送START一高脉冲,START的上升沿使逐次寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
(3)当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。
(4)当CPU执行一读数据指令时,使OE为高电平,则从输出端D0-D7读出数据。
3.2.LED数码管
3.2.1LED基本结构
LED是发光二极管显示器的缩写。
LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。
LED显示器是由若干个发光二极管组成显示字段的显示器件。
在单片机中使用最多的是七段数码显示器。
LED七段数码显示器由8个发光二极管组成显示字段,其中7个长条形的发光二极管排列成“日”字形,另一个圆点形的发光二极管在显示器的右下角作为显示小数点用,其通过不同的组合可用来显示各种数字。
LED引脚排列如下图5所示:
图5LED数码管引脚排列
为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P0口与上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LED能按照正常的亮度显示出数字,如图6所示
图6LED与单片机接口间的设计
3.3.MCS-51系列单片机AT89C51
这是本次设计的核心器件,主要负责把接收到的数字
量经过数据处理,产生正确的LED显示段码,同时,
它还通过其四位I/O口,产生位选信号控制数码管
的亮灭。
3.3.1总线型DIP40引脚封装
电源引脚(2个)
VCC:
接+5V电源。
GND:
接地端。
外接晶体引脚(2个)
XTAL1:
外接晶振输入端(采用外部振荡器时,此引脚接地)。
XTAL2:
外接晶振输入端(采用外部振荡器时,此引脚作为外部振荡信号输入端)。
并行输入/输出引脚(32个)
P0.0~P0.7:
通用I/O引脚。
P1.0~P1.7:
通用I/O引脚。
P2.0~P2.7:
通用I/O引脚或数据低8位地址总线复用引脚。
P3.0~P3.7:
通用I/O引脚或第二功能引脚(RXD、TXD、INT0、INT1、T0、T1、WR、RD)。
控制引脚(4个)
RST/VPD:
复位信号输入引脚/备用电源输入引脚。
ALE/PROG:
地址锁存允许信号输出引脚/编程脉冲输入引脚。
EA/VPP:
内、外存储器选择引脚/片内EPROM(或Flatiron)编程电压输入引脚。
PSEN:
片外程序存储器读选通信号输出引脚。
4实际电路
4.1电路设计
经过以上的设计过程,可设计出基于单片机的简易数字直流电压表硬件电路原理图如下图所示。
此电路的工作原理是:
+5V模拟电压信号通过变阻器VR1分压后由ADC0808的IN0通道进入(由于使用的IN0通道,所以ADDA,ADDB,ADDC均接低电平),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给AT89C51芯片的P1口,AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过其四位I/O口P2.0、P2.1、P2.2、P2.3产生位选信号控制数码管的亮灭。
此外,AT89C51还控制ADC0808的工作,此外,我们还可以通过编程来实现对温度的测量。
简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用Proteus软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。
但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。
在protues软件仿真后的电路图是
4.2电路分析
我们开始的单片机课程设计就是一个数字电压表,而最后我们新添加一个测量温度的功能。
按钮1是切换两个测量电压的通道,按钮2是切换电压和温度的通道。
首先,+5V模拟电压信号通过变阻器VR1分压后由ADC0809的通道进入,经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给单片机,单片机控制ADC0809.然后单片机负责把接收到的数字信号经过数据处理,产生正确的7段数码管的显示段码,并且传送给四位数码管,同时通过单片机四位I/O口产生位选信号控制数码管的亮灭。
此外,我们通过编写程序,利用18b20温度传感器来实现对环境温度的检测,将温度数据传送给单片机处理,由单片机处理数据并在LED数码管中显示温度数据。
5单片机程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeLEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
ucharcodeLEDData1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef};//带小数点的0,1,2,3,4,5,6,7,8,9用于百位的显示
sbitOE=P2^6;//ADC输出允许端口
sbitAT=P3^0;//通道选择端口
sbitST=P2^5;//ADC启动端口
sbitP35=P3^6;//LED端口
sbitP36=P3^7;//扬声器端口
sbitCLK=P2^7;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitEOC=P2^4;
sbitDQ=P3^1;//温度传感器信号线
unsignedcharflag;
unsignedcharWD;
voiddelay(uintt)//1ms延时函数
{uinti;while(t--){for(i=0;i<125;i++);}}
voidTdelay(uinti)//精确延时,延时12us
{while(i--);}
Init_DS18B20(void)//DS18B20复位,初始化函数
{ucharx=0;DQ=1;//将数据置高电平
Tdelay(8);//延时
DQ=0;//数据线拉到低电平0
Tdelay(80);//延时480-960us
DQ=1;//数据拉到高电平
Tdelay(14);//延时等待
Tdelay(20);//若CPU读到数据线上的低电平0后,再次延时,至少480us
}
ReadOneChar(void)//读一个字节
{uchari;uchardat=0;
for(i=8;i>0;i--)//读取8位数据
{DQ=0;//数据线置低电平
dat>>=1;//读出的数据最低位再最前面,这样刚好一个字节在dat里
DQ=1;//将数据线拉到高电平
if(DQ)dat|=0x80;Tdelay(4);
}
return(dat);//返回数据
}
WriteOneChar(uchardat)//写一个字节
{uchari=0;
for(i=8;i>0;i--)
{DQ=0;DQ=dat&0x01;
Tdelay(5);DQ=1;dat>>=1;}
}
uintReadTemperature(void)//读取温度
{uchara=0;ucharb=0;
uintt=0;floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
/*t=b;
t<<=8;t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
delay(11);*/
flag=0;
if((b&0xf8)!
=0x00)//判断高五位得到温度正负标志
{
flag=1;
a=~a;//取反
b=~b;//取反
a=a+1;//低位加1
if(a>255)b++;//如果低8位大于255,向高8位进1
t=b;
t<<=8;t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
delay(11);
}
t=b;
t<<=8;t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
delay(11);
return(t*10);}
voiddisplay(ucharL1,ucharL2,ucharL3)//温度数据显示程序
{
P21=0;P0=L1;delay
(1);P21=1;
P22=0;P0=L2;delay
(1);P22=1;
P23=0;P0=L3;delay
(1);P23=1;
if(flag==1){P20=0;P0=0x40;delay
(1);P20=1;}}
voidDisplay_Result(uchard)//电压显示部分
{
uchart;
uchars;
ucharw;//采集的数值为d
uchary;
t=d/51;//分出百位
s=d%51;//余数存入s中
w=s/5;//分出十位
y=s%5;//分出个位
P23=0;
P0=LEDData[y];
delay
(1);
P23=1;
P22=0;//显示个位十位百位数值,其中百位调用有小数点的代码
P0=LEDData[w];
delay
(1);
P22=1;
P21=0;
P0=LEDData1[t];
delay
(1);
P21=1;
P20=0;
P0=LEDData[0];
delay
(1);
P20=1;
}
voidmain()
{
uchari,d,temp,s;
EA=1;
EX0=1;
IT0=1;//2个中断开启,都采用跳沿触发
EX1=1;IT1=1;
AT=0;//初始选择通道INT0
WD=0;//初始选择读取电压
while
(1)
{
CLK=0;
TMOD=0x10;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1;
ET1=1;
TR1=1;
ST=0;
ST=1;//开启ADC转换
ST=0;
while
(1)
{
if(WD==0){do{}while(!
EOC);
OE=1;//ADC输出允许
d=P1;
for(i=0;i<8;i++)
{temp=temp<<1;s=d>>i;if(s&0x01){temp=temp|0x01;}}
d=temp;
Display_Result(d);//显示数值
if(AT==0)//当选择通道INT0时
{if(d>0x80)//电压超过2.5V
{P35=0;//扬声器响,LED亮
P36=0;
delay(10);//延时后LED灭,实现LED闪烁
P35=1;
delay(10);}
else
{
P35=1;//电压未超过1.25V时,扬声器不响,LED也不亮
P36=1;
}
}
else//若选择通道INT1
{
if(d>0xC0)//电压超过3.75V时
{
P35=0;//扬声器响,LED亮
P36=0;
delay(10);
P35=1;//延时后LED灭,实现LED闪烁
delay(10);}
else
{
P35=1;//电压未超过2.5V时,扬声器不响,LED也不亮
P36=1;
}
}
OE=0;//输出允许关闭
ST=0;
ST=1;//开启ADC转换
ST=0;}
else{uinti;P35=1;//扬声器不响,LED也不亮
P36=1;
i=ReadTemperature();display(LEDData[i/1000],LEDData1[i%1000/100],LEDData[i%100/10]);}
}
}
}
voidINTT0()interrupt0
{
WD=!
WD;//功能选择的中断程序
}
voidINTT1()interrupt2
{
AT=!
AT;//通道选择的中断程序
}
voidT1ZD()interrupt3
{TH1=(65536-100)/256;
TL1=(65536-100)%256;
CLK=~CLK;
}
6硬件制造流程
6.1PCB图
6.2制板流程
7总结
通过这次比较完整的设计,使我摆脱了单纯的理论知识学习状态,达到了理论与实践的结合锻炼了我的综合运用所学的专业基础知识,解决实际设计问题的能力,同时,也提高了我们查阅文献资料、设计手册、设计规范以及电脑制图等专业能力水平,而且通过整体的掌握对布局的取舍以及对细节的斟酌处理,都使能力得到了锻炼、经验得到了丰富,抗压能力以及耐力在不同程度上得到了提高。
虽然这次毕业设计内容繁多、过程繁琐但我收获很多,在这次设计过程中我不仅对A/D转换芯片ADC0809有了进一步熟悉,随着设计的不断深入对它的工作原理、启动设置、转换结束判断及输出等都基本掌握,在和老师的沟通交流的过程中我对设计有了新的认识,并且对实物的连接与布局有了新的看法,对专业有了进一步的认识,希望在以后的实验中吸取更多地经验学会更多的实践知识。
同时,在整个课程设计的过程中,发生过很多错误。
通过不断纠正错误的过程,我学会了很多东西,不仅是专业知识,还有合理的时间安排,同学之间的互相帮助等等。
我觉得自己开始对电子这方面有了基本的兴趣爱好,希望自己以后可以做的更好。
8附录
元器件清单:
4位8段数码管共阴极1个
排阻10K1个
电阻1K1个
电解电容30pf1个
瓷片电容1uf1个
单片机芯片AT89C521个
数模转换ADC08081个
温度传感DS18B201个
插座(单片机)DIP-401个
晶振12M1个
蜂鸣器(有源)1个
轻触开关(4脚)2个
滑动变阻器1K2个
铜板10cm*8cm1块