用LCD1602和ADC0832设计的两路电压表.docx
《用LCD1602和ADC0832设计的两路电压表.docx》由会员分享,可在线阅读,更多相关《用LCD1602和ADC0832设计的两路电压表.docx(8页珍藏版)》请在冰豆网上搜索。
用LCD1602和ADC0832设计的两路电压表
学习情境3-数字电压表的设计
之 基于LCD1602和ADC0832设计的数字电压表
●点名,复习
1、DS1302的引脚及其功能,以及DS1302与单片机的硬件连接?
2、如何编写基于1602LCD的显示驱动程序?
●新课讲授
3.1基于LCD1602和ADC0832设计的数字电压表
这堂课我们来学习ADC0832芯片的应用。
模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,在数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路里,电平则理论上有无数个状态,比如0V、0.1V、0.2V…等等。
如何将模拟电平值在数字电路里表达出来呢?
这就需要AD转换过程。
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,且目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
3.1.1ADC0832芯片
ADC0832具有以下特点:
(1)8位分辨率;
(2)双通道A/D转换;(3)输入输出电平与TTL/CMOS相兼容;(4)5V电源供电时输入电压在0~5V之间;(5)工作频率为250KHZ,转换时间为32μS;(6)一般功耗仅为15mW;(7)8P、14P—DIP(双列直插)、PICC多种封装;(8)商用级芯片温宽为0°Cto+70°C?
,工业级芯片温宽为40℃-+85℃
引脚及功能:
图6-1-1DAC0832引脚图
CS:
片选使能,低电平有效
CH0:
模拟输入通道0,或作为IN+/-使用
CH1:
模拟输入通道1,或作为IN+/-使用
GND:
芯片参考0电位(地)
DI:
数据信号输入,选择通道控制
DO:
数据信号输出,转换数据输出
CLK:
芯片时钟输入
VCC:
电源输入
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
芯片转换时间仅为32μS,具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。
时序图:
图6-1-2ADC0832时序图
与DS1302非常相似,CS作为选通信号,在时序图中可以看到,从CS置为低电平开始,一直到置为高电平结束。
CLK提供时钟信号。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据(SGL、Odd)用于选择通道功能,当此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端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。
直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,此时就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。
在程序读取二个数据后,我们可以加上检验来看看数据是否被正确读取。
作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。
如果作为由IN+与IN-输入的输入时,可将电压值设定在某一个较大范围之内,从而提高转换的宽度。
但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压,则转换后的数据结果始终为00H。
6.1.2系统硬件设计
硬件系统主要有单片机最小系统电路,LCD1602液晶显示电路,ADC0832模数转换电路3个电路模块。
为了便于仿真观测,在ADC0832模数转换电路的模拟信号输入端并接了虚拟电压表,液晶显示器显示的电压值应当和虚拟电压表测得的电压一致。
具体硬件连线图如下图6-1-3所示:
图6-1-3硬件结构图
3.1.3软件系统设计
软件系统主要分两大类:
一是关于ADC0832的函数的设计,有获取通道A/D转换结果的函数(Get_Value_ADC0832()),及其刷新显示缓冲函数(Refresh_Disp_Buffer());二是LCD1602驱动显示程序,对于1602的用法,我们比较熟悉,在此不作叙述。
本项目的关键就是获取A/D转换结果函数的编写。
根据ADC0832的引脚功能和时序图可知,对于该程序的设计分以下几个步骤:
①起始控制位的设置,即开始启动芯片转换;②输入模式的选择,该步骤在第一个下降沿到来之前设置;③设置通道,ADC0832有2个输入通道CH0,CH1,在第二个下降沿到来之前,通过设置DI引脚的电平来实现通道的选择;④模式和通道选择好后,在第三个下降沿到来之前,把引脚DI设置为高电平,表示A/D转换的准备工作已经完成,真正的数据转换工作开始;⑤数据处理分两次进行,一次为对第4-11个脉冲数据进行处理,一次为对第12-19个脉冲进行处理;⑥最后停止转换,设置引脚CS为高电平。
下面为获取ADC0832转换数值的具体程序:
//获取指定通道的A/D转换结果
ucharGet_Value_ADC0832()
{
uchari,dat1=0,dat2=0;
//起始控制位
CS=0; _nop_();_nop_();
CLK=0;_nop_();_nop_();
DI=1;_nop_();_nop_();
CLK=1;_nop_();_nop_();
//第一个下降沿之前,设置DI=1/0;
//选择单端/差分(SGL/DIF)模式中的单端输入模式
CLK=0;DI=1;_nop_();_nop_();
CLK=1; _nop_();_nop_();
//第二个下降沿之前,设置DI=0/1;选择CH0/CH1
CLK=0;DI=1;_nop_();_nop_();
CLK=1;DI=0;_nop_();_nop_();
//第三个下降沿之前,设置DI=1;
CLK=0;DI=1;_nop_();_nop_();
//第4-11个脉冲期间读数据(MSB->LSB)
for(i=0;i<8;i++)
{
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
dat1=dat1<<1|DO;
}
//第12-19个脉冲期间读数据(LSB->MSB)
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DO)<
CLK=1; _nop_();_nop_();
CLK=0; _nop_();_nop_();
}
CS=1;
DI=1;
//CLK=1;
returnResult_ADC0832=(dat1==dat2)?
dat1:
0;
}
获取了A/D转换结果后就应该把数值显示在LCD1602显示屏上,所以应该对转换后的结果做一个处理,处理代码如下:
voidRefesh_Disp_Buffer()
{
uintt=Result_ADC0832*500.0/255; //
Display_Buffer[1][7]=t/100+'0'; //整数位
Display_Buffer[1][9]=t/10%10+'0'; //两个小数位
Display_Buffer[1][10]=t%10+'0';
}
上述代码中的第一行语句把转换的结果(Result_ADC0832)乘以500.0再除以255的目的是为了得到显示结果的各个位的数码。
假设虚拟电压表的数值为3.25,那么根据ADC0832的转换规则可知,ADC0832的转换结果Result_ADC0832=
×500;要想正确显示3.25就应当把3.25变成325,然后把3、2、5显示在1602显示屏上。
实现这个功能的代码就是:
t=Result_ADC0832*500.0/255。
程序中后面的3条语句就是把要显示的电压值的各个数值分解出来,并送到显示缓冲数组中。
●课堂小结
本节课我们主要学习了如何应用ADC0832设计一个数字电压表。
知道了在硬件上ADC0832芯片和单片机的连接,在软件方面,我们着重介绍了如何获取A/D转换结果函数的设计,这需要我们从ADC0832芯片的技术资料中获得设计程序的方法。
这充分说明利用单片机控制硬件芯片时,芯片的引脚功能、控制逻辑和控制时序对程序的设计是多么的重要。
●完整程序代码
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitCS =P1^0;
sbitCLK=P1^1;
sbitDI=P1^2;
sbitDO=P1^2;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE =P2^2;
ucharResult_ADC0832=0;//转换结果变量
ucharDisplay_Buffer[2][16]={
{"CurrentVoltage:
"},
{"(CH)= 0.00V "}
};