用LCD1602和ADC0832设计的两路电压表.docx

上传人:b****8 文档编号:29446257 上传时间:2023-07-23 格式:DOCX 页数:8 大小:234.62KB
下载 相关 举报
用LCD1602和ADC0832设计的两路电压表.docx_第1页
第1页 / 共8页
用LCD1602和ADC0832设计的两路电压表.docx_第2页
第2页 / 共8页
用LCD1602和ADC0832设计的两路电压表.docx_第3页
第3页 / 共8页
用LCD1602和ADC0832设计的两路电压表.docx_第4页
第4页 / 共8页
用LCD1602和ADC0832设计的两路电压表.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

用LCD1602和ADC0832设计的两路电压表.docx

《用LCD1602和ADC0832设计的两路电压表.docx》由会员分享,可在线阅读,更多相关《用LCD1602和ADC0832设计的两路电压表.docx(8页珍藏版)》请在冰豆网上搜索。

用LCD1602和ADC0832设计的两路电压表.docx

用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 "}

};

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1