用LCD1602和ADC0832设计的两路电压表.doc_第1页
用LCD1602和ADC0832设计的两路电压表.doc_第2页
用LCD1602和ADC0832设计的两路电压表.doc_第3页
用LCD1602和ADC0832设计的两路电压表.doc_第4页
用LCD1602和ADC0832设计的两路电压表.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作者 张小波学习情境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.11 adc0832芯片adc0832具有以下特点:(1)8位分辨率;(2)双通道a/d转换;(3)输入输出电平与ttl/cmos相兼容;(4)5v电源供电时输入电压在05v之间;(5)工作频率为250khz,转换时间为32s;(6) 一般功耗仅为15mw;(7)8p、14pdip(双列直插)、picc多种封装;(8)商用级芯片温宽为0c to +70c?,工业级芯片温宽为40- +85引脚及功能:图 6-1-1 dac0832引脚图cs:片选使能,低电平有效ch0:模拟输入通道0,或作为in+/-使用ch1:模拟输入通道1,或作为in+/-使用gnd:芯片参考0电位(地)di:数据信号输入,选择通道控制do:数据信号输出,转换数据输出clk:芯片时钟输入vcc:电源输入adc0832为8位分辨率a/d转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在05v之间。芯片转换时间仅为32s,具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过di数据输入端,可以轻易的实现通道功能的选择。正常情况下adc0832与单片机的接口应为4条数据线,分别是cs、clk、do、di。但由于do端与di端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将do和di并联在一根数据线上使用。时序图:图6-1-2 adc0832时序图与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的输入电压是05v且8位分辨率时的电压精度为19.53mv。如果作为由in+与in-输入的输入时,可将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行in+与in-的输入时,如果in-的电压大于in+的电压,则转换后的数据结果始终为00h。6.12 系统硬件设计硬件系统主要有单片机最小系统电路,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转换结果uchar get_value_adc0832( ) uchar i,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/ch1clk=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;i8;i+) clk=1; _nop_(); _nop_(); clk=0; _nop_(); _nop_();dat1=dat1msb)for(i=0;i8;i+) dat2=dat2|(uchar)(do)i);clk=1; _nop_(); _nop_(); clk=0; _nop_(); _nop_(); cs=1; di=1; /clk=1; return result_adc0832=(dat1=dat2)?dat1:0;获取了a/d转换结果后就应该把数值显示在lcd1602显示屏上,所以应该对转换后的结果做一个处理,处理代码如下:void refesh_disp_buffer() uint t=result_adc0832*500.0/255;/ display_buffer17 = t/100+0; /整数位 display_buffer19 = t/10%10+0; /两个小数位 display_buffer110 = 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 #define uint unsigned int#define uchar unsigned charsbit cs = p10;sbit clk = p11;sbit di = p12;sbit do = p12;sbit rs = p20;sbit rw = p21;sbit e = p22;uchar result_adc0832=0; /转换结果变量uchar display_buffer216 = current voltage:, (ch)= 0.00v ;/函数声明uchar get_value_adc0832();/ 获取指定通道的a/d转换结果void refesh_disp_buffer();/ 刷新显示缓冲 void lcd_busy_check(); /忙检查void lcd_write_command(uchar cmd);/向lcd写入命令void write_lcd_data(uchar dat);/向lcd写入数据void initialize_lcd1602(); /液晶初始化函数void lcd_display(uchar str);/在lcd上显示字符串void delayms(uint x);/ 延时程序uchar read_state();/读取lcd的状态/-/ 主程序/- void main() uchar j;initialize_lcd1602();/液晶初始化函数while(1) for(j=0;jlsb)for(i=0;i8;i+) clk=1; _nop_(); _nop_(); clk=0; _nop_(); _nop_();dat1=dat1msb)for(i=0;i8;i+) dat2=dat2|(uchar)(do)i);clk=1; _nop_(); _nop_(); clk=0; _nop_(); _nop_(); cs=1; di=1; /clk=1; return result_adc0832=(dat1=dat2)?dat1:0;/-/ 刷新显示缓冲/-void refesh_disp_buffer() uint t=result_adc0832*500.0/255;/ display_buffer17 = t/100+0; /整数位 display_buffer19 = t/10%10+0; /两个小数位 display_buffer110 = t%10+0;/-/ 延时程序/-void delayms(uint x) uchar i; while(x-) for(i=0;i120;i+);/-/读取lcd的状态/-uchar read_state() uchar state; rs = 0; rw = 1; e = 1; delayms(1); state=p0; e = 0; delayms(1); return state;/-/忙等待/- void lcd_busy_check() while(read_state()& 0x80!=0x80); delayms(1);/-/向lcd写入命令/-void lcd_write_command(uchar cmd) lcd_busy_check();rs = 0;rw = 0;e = 0;p0 = cmd;e = 1;delayms(1);e = 0;/-/向lcd写入数据/-void write_lcd_data(uchar dat) lcd_busy_check();rs = 1;rw = 0;e = 0;p0 = dat;e = 1;delayms(1);e = 0;/-/lcd初始化/-void initialize_lcd1602()lcd_write_comman

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论