基于ad0832的液晶显示数字电压表.docx
《基于ad0832的液晶显示数字电压表.docx》由会员分享,可在线阅读,更多相关《基于ad0832的液晶显示数字电压表.docx(29页珍藏版)》请在冰豆网上搜索。
基于ad0832的液晶显示数字电压表
第三章硬件设计及电路图
3.1芯片资料介绍
3.1.1AT89C51
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,外形及引脚排列如图所示。
图3-1AT89C51外形及引脚排列
3.1.2AD0832
美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
ADC0832具有以下特点:
•8位分辨率;
•双通道A/D转换;
•输入输出电平与TTL/CMOS相兼容;
•5V电源供电时输入电压在0~5V之间;
•工作频率为250KHZ,转换时间为32μS;
•一般功耗仅为15mW;
•8P、14P—DIP(双列直插)、PICC多种封装;
•商用级芯片温宽为0℃to+70℃,工业级芯片温宽为−40℃to+85℃;
ADC0832有DIP和SOIC;两种封装,DIP封装的ADC0832引脚排列如下图所示:
图3-2ADC0832的引脚封装图
芯片接口说明:
•CS_片选使能,低电平芯片使能。
•CH0模拟输入通道0,或作为IN+/-使用。
•CH1模拟输入通道1,或作为IN+/-使用。
•GND芯片参考0电位(地)。
•DI数据信号输入,选择通道控制。
•DO数据信号输出,转换数据输出。
•CLK芯片时钟输入。
•Vcc/REF电源输入及参考电压输入(复用)。
3.2单片机对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位数据用于选择通道功能。
3.3LCD显示模块
LCD显示器分为字段显示和字符显示两种。
其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。
字符显示是根据需要显示基本字符。
本设计采用的是字符型显示。
系统中采用LCD1602作为显示器件输出信息。
与传统的LCD数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。
LCD1602可以显示2行16个汉字。
如图:
图3-3LCD1602引脚图
3.4时钟电路
时钟电路是外部时钟和内部时钟组成。
内部是由单片机本身及外部12MHZ的晶振和两个电容构成工作主频时钟电路,这样外电源断开时钟也不会停止。
如图:
图3-4时钟电路
3.5电压调节部分
本部分采用两个滑动变阻器和两个电压表来调节输入同道CHO和CH1的电压,如图:
图3-5电压调节部分电路
3.6复位电路
单片机的复位方式主要有上电自动复位和按钮手动复位。
为了保证单片机系统有效复位,要求RST端脚维持高电平大于10MS以上。
电阻和电容的值随时钟频率的不同而变化。
本部分采用的是电动复位,如图:
图3-6复位电路
3.7系统原理图
单片机AT89S51是本系统的核心部分,根据以上各功能模块得到应用电路总原理图。
原理图如3-7所示:
图3-7系统原理图
第四章系统程序设计
4.1软件总体框架设计
系统软件的总体框架,主程序采用死循环结构,在其中调用了三个子程序,为初始化程序,AD转换子程序,动态显示子程序,首先,单片机片选A/D转换器,然后发出信号启动A/D转换。
若有,即启动信号采集,对A/D转换器的数据输出口送来的数值进行存储,数据处理完之后,将电压数值送显示器显示出来。
程序总体流程图如图4-1所示:
图4-1总体流程图
4.2系统子程序设计
4.2.1初始化程序
所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。
4.2.2A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图4.2所示。
图4-2A/D转换子程序图
ADC0832.C模数转换源程序:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitCS=P1^3;
sbitCLK=P1^0;
sbitDI=P1^1;
sbitDO=P1^1;
//函数声明
ucharGet_Value_ADC0832(ucharCH);//获取指定通道的A/D转换结果
//获取指定通道的A/D转换结果
ucharGet_Value_ADC0832(ucharCH)
{
uchari,dat1=0,dat2=0;//起始控制位
CLK=0;_nop_();_nop_();
DI=1;_nop_();_nop_();
CS=0;_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=CH;_nop_();_nop_();
CLK=1;DI=1;_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;
}
//第11-18个脉冲期间读数据(LSB->MSB)
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DO)<
CLK=1;_nop_();_nop_();
CLK=0;_nop_();_nop_();
}
CS=1;
return(dat1==dat2)?
dat1:
0;
}
4.2.3LCD显示子程序
LCD显示程序的设计一般先要确定LCD的初始化、光标定位、确定显示字符后,显示流程如图4-3显示:
;
图4-3LCD显示子程序
收获和体会
在本次数字电压表的设计过程中,我们做得出来的数字电压表能够实现测电压并显示的功能,但是测量电压范围只有0-5V,测量电压范围太小,这是我们设计的电压表的缺陷。
由于我们能力和时间精力有限,没能设计出更大范围的数字电压表。
该数字电压表的扩展方向有:
1、改用ADC0809芯片扩大量程、可调节量程或自动转换换量程。
2、输出量可用平均值算法来改善,使测量准确度更高。
3、若能将测量的电压值实时保存,使用时将更方便等。
致谢
在两周的课程设计过程中,不断的阅读资料,以及在老师的指导下与同学的讨论,拓宽了我的思路,并帮助我解决了许多难题,才让我取得本次课程设计的成功。
在此谨向他们表示衷心的感谢!
感谢学校对我们课程设计工作的关心与支持,为我们提供了良好的课程设计场所和完备的实验器材,使课程设计能够顺利进行。
参考文献
[1]李朝青.单片机原理及接口技术(简明修订版).杭州:
北京航空航天大学出版社,1998
[2]李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3]阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
[4]石东海等.单片机数据通信技术从入门到精通.西安:
西安电子科技大学出版社,2002.148~150.[5]王忠飞,胥芳.MCS一51单片机原理及嵌入式系统应用[M].西安:
西安电子科技大学出版社,2007.P268-273
[6]蔡朝洋,单片机控制实习与专题制作[M].北京:
北京航空航天大学出版社,2006
[7]张毅刚,彭喜源,谭晓昀等.MSC-51单片机应用设计[M].哈尔滨:
哈尔滨工业大学出版社,1999
[8]周坚.单片机C语言轻松入门[M].北京:
北京航空航天大学出版社,2006
[9]李全利,迟荣强.单片机原理及接口技术[M].北京:
高等教育出版社,2004
[10]梅丽凤,王艳秋.单片机原理及接口技术(修订本)[M].北京:
清华大学出版社;北京交通大学出版社,2006
附录1
附录2完整程序代码
1.头文件
#ifndef__LCD_160128_H__
#define__LCD_160128_H__
#include
#include
#include
#include
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineSTX0x02//
#defineETX0x03//
#defineEOT0x04//
#defineENQ0x05//
#defineBS0x08//
#defineCR0x0d//
#defineLF0x0a//
#defineDLE0x10//
#defineETB0x17//
#defineSPACE0x20//
#defineCOMMA0x2c//
#defineTRUE1//
#defineFALSE0//
#defineHIGH1//
#defineLOW0//
//T6963C端口定义
#defineLCMDWXBYTE[0x8000]//数据口
#defineLCMCWXBYTE[0x8100]//命令口
#defineDISRAM_SIZE0x7fff//设