数字电压表报告.docx
《数字电压表报告.docx》由会员分享,可在线阅读,更多相关《数字电压表报告.docx(26页珍藏版)》请在冰豆网上搜索。
![数字电压表报告.docx](https://file1.bdocx.com/fileroot1/2023-2/4/4f61a62d-1ef3-4e15-879f-f977832ac2cd/4f61a62d-1ef3-4e15-879f-f977832ac2cd1.gif)
数字电压表报告
数字电压表表
前言
单片机是最普及、最实用的嵌入式微控制器,单片机应用技术也可以说是智能化电子产品设计的核心技术。
因此,单片机在工业控制、仪器仪表、日常家电、电子通信、办公自动化设备等方面,都有广泛的应用。
本次设计利用了单片机在测量技术中的应用,采用STC89C52单片机实现模拟电压信号的检测与显示,构成数字式电压表。
数字电压表是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
体现了单片机在测量中的应用。
以往的测量技术与之相比,只能将被测量通过指针式指示仪表显示测量数值。
但是指针式指示仪表读数不方便,且不易于实现计算机控制。
传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,而采用单片机的数字电压表,精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
因此,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
目录
第1章设计任务
1.1设计要求………………………………
1.2设计方案………………………………
第二章硬件设计
2.1原理图设计与分析……………………
2.2PCB的制作与腐蚀……………………
第三章软件设计
3.1程序设计与流程图……………………
3.2程序仿真…………………………
第四章调试(故障分析与解决方法)
第五章附件
1、原理图……………………………………
2、PCB图……………………………………
3、程序……………………………………
第一章
1.1设计要求
1、测量范围:
0V--5V,直流;
2、精度误差0.3以内;
3、采用595芯片实现静态显示;
4、用0809进行模数转换;
1.2方案论证
1、主控芯片
方案1:
选用专用电压转化芯片INC7107实现电压的测量和实现。
用四位数码管显示出最后的转换电压结果。
缺点是精度比较低,且内部电压转换和控制部分不可控制。
优点是价格低廉。
方案2:
选用单片机AT89S52和A/D转换芯片ADC0809实现电压的转换和控制,用四位数码管显示出最后的转换电压结果。
缺点是价格稍贵;优点是转换精度高,且转换的过程和控制、显示部分可以控制。
基于要求,我们优先选用了:
方案2
2、显示部分
方案1:
选用4个单体的共阳数码管。
优点是价格比较便宜;缺点是焊接时比较麻烦,容易出错。
方案2:
选用一个四联的共阳数码管,外加四个三极管驱动。
这个电路几乎没有缺点;优点是便于控制,价格低廉,焊接简单。
基于要求,我们优先选用了:
方案2
第二章硬件
2、1原理图设计与分析
单片机硬件系统的设计一般要注意以下几个问题:
1、尽可能选择标准化、模块化的典型电路、提高系统的灵活性;
2、尽可能选择功能强、集成度高、标准化的集成电路芯片,提高系统的可靠性,降低制作成本;
3、选择通用性强、市场货源充足的元器件,增强系统的可维护性;
4、在系统设计中,应留有一定的余量,尤其是在进行存储器扩展和I/O接口扩展时,为后期系统的升级和维护打下基础;
5、在系统设计的工艺上,要考虑整个系统的安装、调试和维护的方便性;
6、在硬件系统设计中,还要针对系统的运行的可靠性,在硬件上考虑系统的抗干扰设计。
结合以上几点以及设计内容的要求,我们设计的数字电压表用到了一下几块芯片:
STC89C52、ADC0809、共阴数码管、74HC595。
下面对这三个模块进行分析。
1、STC89C52数据处理模块:
这一模块主要是程序,硬件没有多少内容,只是单片机必备的时钟电路和复位电路。
其复位电路有两种:
1、上电复位;2、按键复位。
我们采用的是上电复位,电路图如下:
图一
2、ADC0809数模转换:
ADC0809是8位逐次逼近型A/D转换器。
它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
各个引脚的功能如下:
vIN0-IN7:
8条模拟量输入通道
vADDA~C:
8路模拟开关的地址选通信号输入端,作为地
址线选通某一路通道
vALE:
作为地址锁存允许输入线,高电平有效
vSTART:
启动A/D转换控制信号输入端。
当START上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,START应保持低电平。
vEOC:
转换结束信号输出端。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
vOE:
输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
vCLK:
时钟输入信号线
vVREF(+),VREF(-)为参考电压输入,一端接+5V,另一端接地。
我选用的是0通道,其电路图如下:
图二
3、显示模块;
1、共阴极数码管我选用的是SM4205,我用了四个数码管,第一个用来显示是电压整数部分及小数点,其他三个数码管用来显示小数点部分。
2、74HC595是一款漏极开路输出的CMOS移位寄存器,输出端口为可空控的三态输出端,亦能串行输出控制下一级级联芯片。
特点:
1.高速移位时钟频率Fmax>25MHz
2.标准串行(SPI)接口
3.CMOS串行输出,可用于多个设备的级联
4.低功耗:
TA=25℃时,Icc=4μA(MAX)管脚图:
图三
(1)QA——QH:
三态输出管脚,即并行输出口;
(2)SQH:
串行数据输出口;
(3)SCLK:
移位寄存器清零端;
(4)SCK:
数据输入时钟线;
(5)RCK:
输出存储器锁存时钟线;
(6)OE:
输出使能;
(7)SI:
串行数据输入口;
3、电路图如下:
图四
其工作设置如下:
SCK
RCK
OE
SCLR
SI
SQH
Qn
×
×
L
↓
×
L
NCMR为低电平时紧紧影响移位寄存器
×
↑L
L
×
L
L
空移位寄存器到输出寄存器
×
×
H
L
×
L
Z清空移位寄存器并行输出为高阻状态
↑
×
L
H
H
Q6’
NC逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入。
例如以前的状态6(内部Q6”)出现在串行输出位
×
↑
L
H
×
NC
Qn’移位寄存器的内容到达保持寄存器并从并口输出
↑
↑
L
H
×
Q6’
Qn’移位寄存器内容移入先前的移位寄存器的内容到达保持寄存器并输出
2、2PCB的制作与腐蚀
一、PCB的制作:
1、在prote绘制原理图如下图
2、绘制PCB图:
先返回到Document文件夹,单击右键选择New,创建电压表.pcb文件,双击此文件,将其打开;在KeepOutLayer层上描画PCB的边缘线;然后选择Design|Netlist命令导入前面生成的网络表,单击Excute按钮,将网络表中的所有元件装载入PCB图中;换到底层对其进行布局;将线的宽度设为0.8mm,对布局好后的图进行连接即可。
2、电路板的腐蚀:
PCB画好后,操作如下:
(1)1、File——Print/Preview;
2、右击MultilayercompositePrint选Propertise;
3、选中showHoles和Black&White,单击OK;
4、右击Topverlay点Delet即可;
图五
5、选择打印。
(2)1、将打印出来的图纸覆盖在电路板上,用高温将纸上的碳转
印到电路板的覆铜面;
2、将板子放在氯化铜的腐蚀液中,将多余的铜腐蚀掉后,取
出板子;
3、再有焊盘的地方打上孔,再讲打印的图纸进行镜像处理后
打印出来,用相同的方法将图纸覆盖在电路板的未覆铜面;
4、在板子上把器件焊接即可。
第3章软件设计
3、1程序设计与流程图
单片机软件系统的设计一般要注意以下几个问题:
(1)采用模块化设计方法,将系统软件分成若干相对独立的部分,各功能程序实行模块化、子程序化,使软件总体结构清晰、简洁,流程合理,既便于调试、链接,又便于修改;
(2)合理分配系统的资源,包括存储器、定时器、计数器、中断源等;
(3)在编写程序的过程中,应养成添加注释的习惯,提高程序的可读性;
(4)在软件设计中也要进行抗干扰程序设计,增强系统工作的可靠性。
软件部分设计主要是程序的设计,数字电压表程序的设计主要分为这么几个模块:
选通ADC808哪一路进行数据采集、启动ADC808工作、数据处理、扫描选通、显示。
主程序如下:
voidmain()
{uchartemp;
TMOD=0x21;//设置定时器0为方式1,定时器1为方式2
TH0=(65536-10000)/256;//T0设置为10ms
TL0=(65536-10000)%256;
TH1=256-2;
TL1=256-2;
ET0=1;//开中断
ET1=1;
EA=1;
TR0=1;//启动定时器T0
TR1=1;
START=0;//ADC0809初始化
START=1;
START=0;
OE=1;//将单片机的引脚设置成输入状态
while
(1)
{temp=ADC0809();
covert(temp);//每1s读一次数据并转换为显示的数据
display();//调用显示子函数
}
}
采用的是中断定时,产生脉冲来驱动ADC0809,其驱动程序如下:
voidtime0()interrupt1using1
{TH0=(65536-10000)/256;//重赋初值
TL0=(65536-10000)%256;
}
voidtime1()interrupt3using3
{CLK=~CLK;}
ADC0809的驱动设置程序如下:
ucharADC0809()
{uchard;
START=1;
_nop_();
_nop_();
_nop_();
START=0;//启动ADC089,开始A/D转换
_nop_();
_nop_();
while(EOC==0);//等待A/D转换结束
{OE=1;//允许ADC0809输出
d=data_point;//读入数据
OE=0;//禁止ADC0809输出
}
returnd;//返回A/D转换数据
}
74HC595的串口转并口的静态输出程序如下:
voidwrite_595(uchard)
{uchari;
for(i=0;i<8;i++)
{d=d<<1;
dsin=CY;
sh_cp=1;
_nop_();
_nop_();
sh_cp=0;
}
}
voidout_595()
{ucharm;
for(m=0;m<32;m++)
{st_cp=0;
_nop_();
_nop_();
st_cp=1;
_nop_();
}
}
voiddisplay()
{sh_cp=0;
{write_595(table[q]);
write_595(table[p]);
write_595(table[n]);
write_595(table1[k]);
out_595();
}
}
数据处理的计算程序如下:
voidcovert(uchary)
{k=y/51;//获得整数部分
o=(y%51)*10;//小数部分
n=o/51;//第一位小数
o=o*10;
p=o/51;//第二位小数
o=0*10;
q=o/51;//第三位小数
}
其设计流程图如下:
N
Y
图六
3.2程序仿真
一、仿真
在proteus中画出仿真原理图,把编好的程序,生成HEX文件加载到仿真图中,仿真如下
图七
第4章调试(故障分析与解决方法)
1、ADC0808不工作,仿真时clock端一直显示高电平:
开始时clock我接的单片机的ALE端,用ALE作为时钟源,同时把单片机的晶振改成3Mhz,这样输入ADC808的频率就是500Khz,这样符合ADC0808工作的条件,但是我在仿真时发现clock端的输入电压一直是高电平,并且仿真时ADC808不工作,所以我把clock输入端直接接数字时钟,并将其频率设置为500khz,这时仿真时问题得以解决。
2、仿真时读数没有按预期的显示:
在检查几遍程序后,确定程序是完全没有出错的,所以把视线注意到连线上,由于读数的值并没有出现不在0-9范围内的,所以确定显示部分的连线没有出错,为什么读数是错误的,所以只能是ADC808的连线问题,仔细对照ADC808的说明书,发现原来自己把ADC0808的数据输出端的高低端接错了,改变后数据显示是正确的。
3、把程序下载到电路板时数码管不全亮:
因仿真时显示正确,所以问题不会出现在软件上。
在对硬件进行检查后,发现是第三个595芯片10和16的电源管脚没有接在一起,在两管脚接上飞线后,显示正常。
4、再下载程序的过程中找不到串口:
在下载程序时无法下载,因是接口找不到,所以应是硬件问题。
检查后,是时钟电路的晶振一个管脚没有焊接,接好后,程序顺利下载,显示正常,此次设计成功。
第五章附件
附件一
原理图:
附件二
PCB图:
附件三
仿真图:
附件四
程序:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedata_pointP0//定义数据读入口
sbitsh_cp=P1^6;//移位寄存器时钟输入
sbitdsin=P1^5;//数据串行输入
sbitst_cp=P1^7;//存储寄存器时钟输入
/*******定义ADC0809的控制引脚**********/
sbitEOC=P2^2;
sbitOE=P2^1;
sbitSTART=P2^3;
sbitCLK=P2^0;
uchartable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed};
uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchark,n,p,q,o;
/******74HC595的显示程序***************/
voidwrite_595(uchard)
{uchari;
for(i=0;i<8;i++)
{d=d<<1;
dsin=CY;
sh_cp=1;
_nop_();
_nop_();
sh_cp=0;
}
}
voidout_595()
{ucharm;
for(m=0;m<32;m++)
{st_cp=0;
_nop_();
_nop_();
st_cp=1;
_nop_();
}
}
voiddisplay()
{sh_cp=0;
{write_595(table[q]);
write_595(table[p]);
write_595(table[n]);
write_595(table1[k]);
out_595();
}
}
/**********定义ADC0809读入数据子函数,并通过函数返回*******/
ucharADC0809()
{uchard;
START=1;
_nop_();
_nop_();
_nop_();
START=0;//启动ADC089,开始A/D转换
_nop_();
_nop_();
while(EOC==0);//等待A/D转换结束
{OE=1;//允许ADC0809输出
d=data_point;//读入数据
OE=0;//禁止ADC0809输出
}
returnd;//返回A/D转换数据
}
/*********显示数据转换子函数**************/
voidcovert(uchary)
{k=y/51;//获得整数部分
o=(y%51)*10;//小数部分
n=o/51;//第一位小数
o=o*10;
p=o/51;//第二位小数
o=0*10;
q=o/51;//第三位小数
}
/**************主函数********************/
voidmain()
{uchartemp;
TMOD=0x21;//设置定时器0为方式1,定时器1为方式2
TH0=(65536-10000)/256;//T0设置为10ms
TL0=(65536-10000)%256;
TH1=256-2;
TL1=256-2;
ET0=1;//开中断
ET1=1;
EA=1;
TR0=1;//启动定时器T0
TR1=1;
START=0;//ADC0809初始化
START=1;
START=0;
OE=1;//将单片机的引脚设置成输入状态
while
(1)
{temp=ADC0809();
covert(temp);//每1s读一次数据并转换为显示的数据
display();//调用显示子函数
}
}
/****************T0中断程序**********************/
voidtime0()interrupt1using1
{TH0=(65536-10000)/256;//重赋初值
TL0=(65536-10000)%256;
}
voidtime1()interrupt3using3
{CLK=~CLK;}