ADC0832数字电压表.docx
《ADC0832数字电压表.docx》由会员分享,可在线阅读,更多相关《ADC0832数字电压表.docx(20页珍藏版)》请在冰豆网上搜索。
ADC0832数字电压表
信息与电气工程学院
单片机应用系统(三级项目)
设计说明书
(2014/2015学年第二学期)
题目:
数字电压表设计与实现
数字电压表设计与实现
一、课程设计目的
电压表已经有100多年的发展历史,虽然不断改进与完善,仍然无法满足现代电子测量的需求,近二十年,微电子技术,计算机技术,集成技术,网络技术等高新技术得到了迅猛发展。
这一背景和形势,不断地向仪器仪表提出了更高、更新、更多的要求,如要求速度更快、灵敏度更高、稳定性更好、样品量更少、遥感遥测更远距、使用更方便、成本更低廉、无污染等。
同时也为仪器仪表科技与产业的发展提供了强大的推动力,并成了仪器仪表进一步发展的物质、知识和技术基础。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
DVM的高速发展,使它已成为实现测量自动化、提高工作效率不可缺少的仪表,数字化是当前计量仪器发展的主要方向之一,而高准度的DC-DVC的出现,又使DVM进入了精密标准测量领域。
随着现代化技术的不断发展,数字电压表的功能和种类将越来越强,越来越多,其使用范围也会越来越广泛。
采用智能化的数字仪器也将是必然的趋势,它们将不仅能提高测量准确度,而且能提高电测量技术的自动化程序,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表(如:
温度计、湿度计、酸度计、重量、厚度仪等),几乎覆盖了电子电工测量、工业测量、自动化仪表等各个领域。
从而提高计量检定人员的工作效率。
目前数字电压表的内部核心部件是A/D转换器,转换器的精度很大程度上影响着数字电压表的准确度,本次课程设计A/D转换器采用ADC0832对输人模拟信号进行转换,控制核心STC89C52再对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的
二、课程设计正文
2.1总体论述
本次设计题目:
数字电压表设计与实现
设计要求:
1 以单片机为核心,设计一个数字电压表
2 采用中断方式,对2路0~5V的模拟电压进行循环采集
3 用AD0832完成数据数模转换,送单片机处理后通过1602液晶进行显示
该设计主要由三个模块组成:
A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0832来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块;数据处理则由芯片C51来完成,其负责把ADC0832传送来的数字量经过一定的数据处理;产生相应的显示码送到显示模块进行显示
设计实现思路:
1 根据设计要求,选择C51单片机为核心控制器件
2 A/D转换采用ADC0832实现,与单片机的接口P1的部分口连接
3 电压显示采用LCD1602液晶屏显示
4 LCD1602数据传输接口是单片机的P0口,单片机P0需要接上拉电阻。
为方便移植,只需将LCD1602三个控制端口与P3口连接即可
2.2设计方案
本设计硬件电路设计由4个部分组成:
A/D转换电路,C51单片机系统,LCD显示系统以及测量电压输入电路。
总体硬件电路框图如图
(1)所示:
图
(1)系统硬件设计框图
2.3硬件元器件的选择与设计
2.3.1AT89C51模块
(1)AT89C51的主要特征:
●与MCS-51兼容
●数据保留时间:
10年
●全静态工作:
0Hz~24Hz
●三级程序存储器锁定
●一个8位微处理器CPU
●4KB内部程序存储器,最大可扩充至64KB
●8个126Bytes内部数据存储器,最大可扩充至64KB
●32根可编程I/O口线
●片内振荡器和时钟电路
●低功耗的闲置和掉电模式
●具有逻辑代数运算功能
●2个16位的定时/计数器:
T0、T1
●5个中断源:
INTO、INT1、T0/T1、RXD/TXD,可编程为两个优先级
●1个全双工UART串行口,可多级通信
(2)AT89C51的引脚功能:
Vss(20脚):
接地端;
VCC(40脚):
芯片电源,接+5V;
注:
用万用表测试单片机引脚电流一般为0V或者5V,这是标准的TTL电平,但是有时候在单片机程序正在工作时,测试结果并不是这个值,而是介于0V-5V之间。
其实这只是万用表反映没有那么快而已,在一瞬间单片机引脚电流还是保持在0V或者5V的。
XTAL1(19脚):
接外部晶体震荡电路反相的输入端,在片内它是震荡电路反相放大器的输入端。
在采用外部时钟时,对于HMOS单片机,该端引脚必须接地;对于CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚):
接外部晶体反相的输出端。
在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。
若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。
RST(9脚):
单片机刚接上电源时,其内部各寄存器处于随机状态,在该引脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET),即10ms以上才可正常复位。
PSEN(29脚):
在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。
CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。
不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。
PSEN端同样可驱动8个LSTTL负载。
我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。
ALE/PROG(30脚):
在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。
CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。
不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。
PSEN端同样可驱动8个LSTTL负载。
我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。
⑴ALE功能:
用来锁存P0口送出的低8位地址/EPROM编程输入端。
当CPU访问片外存储器时,用于锁存P0口低8位地址(因为P0口作为地址/数据复用口,P0口上的信息究竟是地址还是数据完全由ALE定义)。
当单片机上电正常工作后,此端周期性地以时钟振荡频率的1/6的固定频率向外输出正脉冲信号。
所以,ALE信号可用作对外输出时钟或定时信号。
检查单片机芯片的好坏,可用示波器查看ALE端是否有脉冲信号输出。
ALE端的负载能力为8个LS型TTL。
⑵PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲
EA/VPP(31脚):
当EA端输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。
当地址超出4KB时,将自动执行片外程序存储器的程序。
当EA输入低电平时,CPU只访问片外程序存储器。
在对87C51EPROM编程时,此引脚用于施加编程电压VPP。
输入/输出引脚:
P0~P3是4个寄存器,也称为4个端口,是80C51单片机与外界联系的4个8位双向并行I/O口。
由于在数据的传输过程中,CPU需要对接口电路中输入输出数据的寄存器进行读写操作,所以在单片机中对这些寄存器像对存储单元一样进行编址。
通常把接口电路中这些已编址并能进行读写操作的寄存器称为端口(PORT)或简称口。
(1)P0.0-P0.7(39脚-32脚)
一个8位的准双向I/O口。
在访问片外存储器时,它分时作为8位地址线和8位双向数据线;不作总线使用时,可作普通I/O口;其每位的负载能力为8个LSTTL。
(2)P1.0-P1.7(1脚-8脚)
一个带内部上拉电阻的8位准双向I/O口。
其每位的负载能力为4个LSTTL。
(3)P2.0-P2.7(21脚-28脚)
一个带内部上拉电阻的8位准双向I/O口。
其每位的负载能力为4个LSTTL。
其每位的负载能力为4个LSTTL。
(4)P3.0-P3.7(10脚-17脚)
一个带内部上拉电阻的8位准双向I/O口;P3口除了作为一般准双向口使用外,每脚还具有第二功能(见表1);其每位的负载能力为4个LSTTL。
P3口线的第二功能:
口线
第二功能
P3.0
RXD(串行口输入)
P3.1
TXD(串行口输出)
P3.2
(外部中断0输入)
P3.3
(外部中断1输出)
P3.4
T0(定时器0的外部输入)
P3.5
T1(定时器1的外部输出)
P3.6
片外数据存储器写选通控制输出
P3.7
片外数据存储器读选通控制输出
表
(1)P3口线的第二功能表
2.3.2A/D数据转换模块
现实世界的物理量都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。
双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点。
与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、ADC0808等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。
一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用。
(1)ADC0832的主要特性:
●8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
●其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间
●芯片转换时间仅为32μS,转换速度快且稳定性能强
●独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便
●通过DI数据输入端,可以轻易的实现通道功能的选择
(2)ADC0832的引脚功能:
●CS(1脚):
片选端,低电平有效
●CH0、CH1(2、3脚):
两路模拟信号输入端
●DI(5脚):
两路模拟输入选择输入端
●DO(6脚):
模数转换结果串行输出端
●CLK(7脚):
串行时钟输入端
●Vcc/REF(8脚):
正电源端和基准电压输入端
●GND(4脚):
电源地
(3)ADC0832有DIP和SOIC两种封装,DIP封装的ADC0832引脚排列如图
(2)所示。
各引脚说明如下:
图
(2)ADC0832引脚图
(4)单片机对ADC0832的控制原理
一般情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。
当要进行A/D转换时,须先将CS端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK提供时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1个时钟脉冲到来之前DI端必须是高电平,表示启动位。
在第2、3个时钟脉冲到来之前DI端应输入2位数据用于选择通道功能,其功能项见表
(2)。
表
(2)功能表
如表
(2)所示,当配置位2位数据为1、0时,只对CH0进行单通道转换。
当配置2位数据为1、1时,只对CH1进行单通道转换。
当配置2位数据为0、0时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当配置2位数据为0、1时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。
到第3个时钟脉冲到来之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个时钟脉冲开始由DO端输出转换数据最高位D7,随后每一个脉冲DO端输出下一位数据。
直到第11个脉冲时发出最低位数据D0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个时钟脉冲输出D0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了,图(3)为ADC0832时序图。
图(3)ADC0832时序图
2.3.3LCD显示系统设计
(1)LCD的选择
在应用系统中,设计要求不同,使用的LCD显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LCD显示器供选择,在本设计中,选择采用LCD1602液晶屏显示。
LCD1602是字符型液晶,显示字母和数字比较方便,控制简单,成本较低。
(2)LCD1602显示器的引脚功能
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表(3)所示。
表(3)LCD1602引脚说明表
1脚:
VSS为地电源。
2脚:
VDD接5V正电源。
3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
7~14脚:
D0~D7为8位双向数据线。
15脚:
背光源正极。
16脚:
背光源负极
(3)LCD显示器与单片机接口设计
由于单片机的并行口不能直接驱动LCD显示器,所以在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作。
如果驱动电路能力差,即负载能力不够时,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LCD显示器的驱动电路设计是一个非常重要的问题。
为了简化数字式直流电压表的电路设计,在LCD驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LCD的D0-D7段显示引脚与P0口并联到上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LCD能按照正常的亮度显示出数字。
2.4程序设计总方案
根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图(4)所示。
初始化
调用显示子程序
结束
图(4)数字电压表主程序流程图
2.4.1.初始化程序
所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。
2.4.2显示子程序
显示子程序采用字符型液晶显示,此模块模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
2.4.3A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图(5)所示。
启动转换
A/D转换是否结束?
输出转换结果
数值转换
显示
结束
图(5)A/D转换流程图
根据以上电路元器件的选择与设计以及程序的设计,可以设计出基于单片机的数字直流电压表硬件电路原理图。
图(4)数字电压表原理图
三、软件调试与仿真
3.1软件调试
软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。
Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。
Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。
Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与uVisions3IDE工具软件结合进行编程仿真调试。
本系统的调试主要以软件为主,其中系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是C语言,用Keil软件将程序写入单片机。
3.2数字电压表仿真
图(5)数字电压表仿真图
通过两个滑动变阻器(RV1、RV2)的滑动改变电阻的大小,继而改变其电压值,数字电压表测试出相应的电压大小并在LCD1602液晶屏显示。
软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正,尽可能完善系统可能存在的缺陷与瑕疵。
四、课程设计总结
做了两周的课程设计,有很多的心得体会,更多的是同学之间的团队合作,老师的帮忙才完成。
老师对我们进行了细心、耐心的指导,鼓励我们对程序进行合理改进,培养了我们的创新意识和创新能力。
课程设计有一定的苦难,我们付出了很多心血和汗水,但我认为我们得到的更多。
通过本次项目设计,更加了解proteus和keil软件的使用。
经过本次项目的问题可以发现,当项目仿真没问题时并不代表做出的实物能够成功,我们需要注意硬件的区别,结合实际所拥有的硬件进行硬件电路设计和程序的编写。
如果没有同学们的互相帮助,这次课程设计就不会这么顺利,这种同舟共济的团队精神深深震撼了我,《礼记学记》上也有讲过:
“独学而无友,则孤漏而寡闻”。
同时有些同学积极的态度让我感到一丝惭愧,他们所体现出的坚持不懈的品质更令我折服。
真正的收获更多是思想上的,让我认识程序的复杂,团队精神的重要性,“学无止境”头一次认识的这么深刻,察觉自己的不足。
在这次编程中,同学帮了我很多,我一个人是不能完成的。
以后的学习生活真的要踏踏实实。
五、参考文献
[1]魏立峰.单片机原理及应用技术.北京大学出版社,2005年
[2]谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006年3月
[3]周润景.Protues在MCS-51&ARM7系统中的应用百例.第一版.北京:
电子工业出版社,2006年
附录
程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineIO_1602P0//IO口
sbitRS_1602=P3^3;
sbitRW_1602=P3^4;
sbitE_1602=P3^5;
sbitCS=P1^0;
sbitCLK=P1^1;
sbitDIO=P1^2;
voiddelay_ms(unsignedintt)//11.0592MHz1ms
{
ucharx,y;
for(t;t>0;t--)
{
for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
}
voidWr1602Cmd(unsignedchardat)
{//写命令函数
E_1602=0;
IO_1602=dat;
RS_1602=0;
RW_1602=0;
E_1602=1;
delay_ms
(1);
E_1602=0;
delay_ms
(1);
}
voidWr1602Dat(unsignedchardat)
{//写数据函数
E_1602=0;
IO_1602=dat;
RS_1602=1;
RW_1602=0;
E_1602=1;
delay_ms
(1);
E_1602=0;
delay_ms
(1);
}
voidInit1602(void)
{
delay_ms(20);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x06);
Wr1602Cmd(0x0c);
Wr1602Cmd(0x01);//清屏
Wr1602Cmd(0x80);//设置地址
}
ucharRdAdc0832(bitHx)
{
ucharvalue0,value1,i;
CS=1;CLK=0;DIO=1;
CS=0;
DIO=1;_nop_();_nop_();_nop_();_nop_();//写ST位
CLK=1;_nop_();_nop_();_nop_();_nop_();
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=1;_nop_();_nop_();_nop_();_nop_();//写SGL位
CLK=1;_nop_();_nop_();_nop_();_nop_();
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=Hx;_nop_();_nop_();_nop_();_nop_();//写通道号位
CLK=1;_nop_();_nop_();_nop_();_nop_();
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=1;
for(i=0;i<8;i++)
{
CLK=1;_nop_();_nop_();_nop_();_nop_();
CLK=0;_nop_();_nop_();_nop_();_nop_();
value0<<=1;
if(DIO==1)value0|=0x01;
elsevalue0&=0xfe;
}
for(i=0;i<8;i++)
{
value1>>=1;
if(DIO==1)value1|=0x80;
else
value1&=0x7f;
CLK=1;_nop_();_nop_();_nop_();_nop_();
CLK=0;_nop_();_nop_();_nop_();_nop_();
}
CS=1;
if(value0!
=value1)P1&=0X7F;
elseP1|=0X80;
returnvalue0;
}
voidmain()
{
unsignedlongi;
Init1602();
while
(1)
{
Wr1602Cmd(0x80);
i=RdAdc0832(0);
i=(i*5000/255);
Wr1602Dat('C');
Wr1602Dat('H');
Wr1602Dat('0');
Wr1602Dat('=');
Wr1602Dat(