ADC0832的数字电压表设计

更新时间:2024-02-27 11:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

浙江海洋学院

单片机课程设计报告

设计题目 ADC0832的数字电压表设计

2014 年 12 月 1 日

目 录

1. 引 言(字体4号,黑体,居中)..................................... 错误!未定义书签。 2. 方案设计(字体4号,黑体,居中)............................ 2错误!未定义书签。

2.1. 2.2.

设计要求(字体小4号,黑体)........................................................... 0 设计方案(字体小4号,黑体)...................... 1错误!未定义书签。

3. 硬件设计(字体4号,黑体,居中)............................................................... 33

3.1. 3.2. 3.3. 3.4. 3.5

单片机最小系统(字体小4号,黑体)............................................... 0 显示驱动部分(字体小4号,黑体).............. 1错误!未定义书签。 转换电路(字体小4号,黑体)........................................................... 0 单片机驱动部分(字体小4号,黑体)............................................... 0 电铃电路(字体小4号,黑体)........................................................... 0

4. 软件设计(字体4号,黑体,居中)............................... 错误!未定义书签。

4.1. 4.2.

软件流程(字体小4号,黑体)........................................................... 0 子程序模块(字体小4号,黑体).................. 1错误!未定义书签。

5. 实验结果与讨论(字体4号,黑体,居中)................... 错误!未定义书签。

5.1. 5.2.

实验仿真(字体小4号,黑体)........................................................... 0 结果讨论(字体小4号,黑体) .............................. 1错误!未定义书签。

6. 心得体会(字体4号,黑体,居中)............................... 错误!未定义书签。 7. 附 录;源程序(字体4号,黑体,居中)..................................................... 10 8. 参考文献(字体4号,黑体,居中)............................... 错误!未定义书签。

ADC0832的数字电压表设计 1.引言

模数AD和数模DA转换是模拟电路和数字电路进行沟通的渠道,在数字电路

里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路中,电平理论上有无数个状态。如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程。ADC0832是美国国家半导体公司生产的一种8位分辨率,双通道AD转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,并且目前已有很高的普及率。学习并且使用ADC0832可以使我们了解AD转换器的原理,有助于我们单片机技术水平的提高。

2.方案设计 2.1设计要求

按系统要实现功能,设计必须达到以下的几个步骤的要求

(1)主电路系统是由ADC0832,单片机AT89C52和LCD显示屏组成。 (2)ADC0832是模拟数字转换芯片,是将外侧电压信号转换成数字信号 再通过AT89C52处理,再通过LCD显示出来 (3)能测量0-5V的数字电压 (4)测量误差不大于0.1V

2.2设计方案

2.1.1单片机的选择

本设计选用单片机AT89C52 AT89C52是一个低电压,高性能CMOS8位单片机,片

内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

2.1.2总体设计及系统原理

在本次数字电压表的设计过程中,我们做得出来的数字电压表能够实现测电压并显示的功能,但是测量电压范围只有0-5V,测量电压范围太小,这是我们设计的电压表的缺陷。由于我们能力和时间精力有限,没能设计出更大范围的数字电压表。该数字电压表的扩展方向有:1、改用ADC0809芯片扩大量程、可调节量程或自动转换换量程。2、输出量可用平均值算法来改善,使测量准确度更高。3、若能将测量的电压值实时保存,使用时将更方便等。

3.1.单片机最小系统

单片机最小系统选用AT89C52,自动复位和手动复位电路可对单片机进行复位操作。

3.2.显示驱动部分

本设计是选用LCD1602显示器进行显示,用来显示电压的数值。LCD1602显示器成本低,配置灵活与单片机接口简单,在单片机应用系统中广泛应用

本设计采用LCD1602,它是一种专门用来显示字母,数字和符号等的点阵型的液晶模块。它由若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔。LCD1602显示器与AT89C52相连。

3.3转换电路

本设计是采用ADC0832芯片,ADC0832为8位分辨率A/D转换芯片,,其最高

分辨率可达256级,可以适应一般的模拟量的转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间,芯片转换时间仅为32μs具有双数据输出可作为数据检控,以减少数据误差。转换速度快且稳定性强。独立的芯片使能输入,使多器件挂接和处理器控制变得更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。

C310uFRV112341k51%U2CSCH0CH1GNDADC0832VCCCLKDIDO8756 3.4单片机驱动部分 正常情况下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 位数据用于选择通道功能

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 4,软件设计 4.1软件流程

开 始 初 始 化 调用A/D转换程 调用数据处理程 调用显示程 在本设计实验里面单片机是对ADC0832的控制,在正常情况下ADC0832与单片

机的接口应为4条数据线,分别是CS,CLK,DO.DI。但由于DO端与DI端在通信

时并未同事有效并与单片机的接口是双向的,,所以电路设计将DO和DI端并联在一根数据线上使用。当ADC0832未工作时器CS输入端为高电平,此时芯片禁用CLK和DI/DO的电平可任意。当进行A/D转换时,必须将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高压平,表示启始信号。在第2、3个脉冲下沉之前DI端输入2用于选择通道功能。当此2位数据位“1”“0”时,只对CHO进行单通道转换。当2位数据为“1”、“”时,只对CH1进行单通道转换。当2位数据位“0”、“0”时,将CHO作为正输入端IN+,CH1作为负输入端IN—进行输入。当2位数据位“0”、“1”时,将CHO作为负输入端IN-,CH1作为正输入端IN+进行输入。到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATAO。一个字节的数据输出完成。也正是从此位开始输出一个相反字节的数据,即从第11个字节的下沉输出DATAO。随后输出8位数据,到第19个脉冲时输出完成。也标志着一次A/D转换的结束。最后将CS置高平禁用芯片,直接将转换后的数据进行处理就可以了

4.2子程序模块

开 始 初 始 化 产生时钟信输入通道控制 读取1字节数据 将值送入指定的寄存器

结 束 主要控制子程序说明如下:

(1)delay:延时子程序;void DelayMS(uint X)

(2) void Initialize_LCD1602(),是LCD1602的功能设定。

例如; LCD_Write_Command(0x38);DelayMS(1);//功能设置,数据长度为8位,双行显示,5×7点阵字体

(3)void LCD_Display(uchar *str) 是lcd的显示程序。

5实验结果与讨论 5.1实验仿真

依据各功能模块的功能要求和工作过程画出程序的流程图,然后根据流程图和系统的硬件连接写出详细的程序,接着对各个子程序进行编译,调试,运行,看看是否能达到其功能,然后再将整个程序糅合在一起进行整体软件调试。在整体调试中,需注意寄存器组不能重复,在进入中断时,哪些寄存器内容和参数需入栈保护,以及调用子程序时各参数必须统一,在编译通过时,最好能把整个程序再单步执行一遍。单步执行时看看每步执行完后数据各个特殊功能寄存器中数据的变化,这样才能确保整个程序按照系统的工作过程和功能要求执行。仿真结果。

5.2讨论结果

本设计以AT89C52单片机为系统的控制核心,采用proteus仿真软件进行测试。Proteus是一款比较常用的单片机仿真软件,用proteus和keil配合进行仿真提高系统运行效率与稳定性。

6.心得体会

通过这次设计,使我深入了解了AT89S52单片机和ADC0832(A\\D转换器)的结构和特点及数字电压表的工作原理,加深了对课本理论知识的理解,锻炼了实践动手能力,理论知识与实践设计相结合,培养了创新开发的思维。作为整个学习体系的有机组成部分,此次课程设计虽然只安排短短两周时间,但并不具有绝对独立的意义。它的一个重要功能,在于运用学习成果,检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。

在此次课程设计中,收获知识的同时,我还收获了阅历。在此过程中,我们通过查找资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高,比如说,学习方法,要有自己合理的见解,然后实践出来。课设中,我主要是做软件部分,包括Proteus原理图和程序仿真。编程部分,首先得有大概的思路,把流程图画出来,然后根据流程图,把各部分的程序一一编出来。Protues原理图部分,首先要了解自己所使用的芯片的特点,然后就是细心画图了。在仿真过程中,最不能有的是惰性,最不能少的是耐性。只有通过自己真正的努力得到的结果才是最令自己兴奋的!

7.附 录A;源程序

#include #include #include #define uint unsigned int #define uchar unsigned char sbit CS = P1^0; sbit CLK = P1^1; sbit DI = P1^2; sbit DO = P1^2; sbit RS = P2^0; sbit RW = P2^1; sbit E = P2^2;

uchar Result_ADC0832=0; //转换结果变量 uchar Display_Buffer [2][16] ={

{\ {\ }; //函数声明

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;j<2;j++) {

Get_Value_ADC0832();//通道0.1,A/D转换 Refesh_Disp_Buffer(); //刷新显示缓冲 if(j==0) {

LCD_Write_Command(0x80);//写LCD命令,设置从第0行位置开始显示 LCD_Display(Display_Buffer[j]);//在LCD上显示字符串 } else {

LCD_Write_Command(0xC0);//写LCD命令,设置从第1行位置开始显示 LCD_Display(Display_Buffer[j]);//在LCD上显示字符串 } } } }

//--------------------------------------------------------------- // 获取指定通道的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/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)<

return Result_ADC0832=(dat1==dat2)?dat1:0; }

//-------------------------------------------------------------------------- // 刷新显示缓冲

//------------------------------------------------------------------------- void Refesh_Disp_Buffer() {

uint t=Result_ADC0832*500.0/255; //

Display_Buffer[1][7] = t/100+'0'; //整数位 Display_Buffer[1][9] = t/10+'0'; //两个小数位 Display_Buffer[1][10] = t+'0'; }

//--------------------------------------------------- // 延时程序

//--------------------------------------------------- void DelayMS(uint X) {

uchar i;

while(X--) for(i=0;i<120;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_Command(0x38);DelayMS(1);//功能设置,数据长度为8位,双行显示,5×7点阵字体

LCD_Write_Command(0x0C);DelayMS(1);// 显示开,关光标

LCD_Write_Command(0x06);DelayMS(1);//字符进入模式:屏幕不动,字符后移 LCD_Write_Command(0x01);DelayMS(1); //清屏 }

//-----------在LCD上显示字符串-----------------*/ void LCD_Display(uchar *str) {

uchar k;

for(k=0;k

Write_LCD_Data(str[k]); DelayMS(2); } }

8.1参考文献

[1] 吴炳胜,80C51单片机原理及应用技术.北京.冶金工业出版社个2008. [2] 林立,张俊亮单片机原理及应用.北京.电子工业出版社 2013 [3] 蓝和慧,宁武,闫晓金,单片机应用技能.北京.电子工业出版社 2009 [4] 王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002. [5] 蔡朝洋.单片机控制实习与专题制作.北京.北京航空航天大学出版社 2006 [6] 高禹.C语言程序设计.北京.清华大学出版社 2011

//--------------------------------------------------- //LCD初始化

//----------------------------------------------------------- void Initialize_LCD1602() {

LCD_Write_Command(0x38);DelayMS(1);//功能设置,数据长度为8位,双行显示,5×7点阵字体

LCD_Write_Command(0x0C);DelayMS(1);// 显示开,关光标

LCD_Write_Command(0x06);DelayMS(1);//字符进入模式:屏幕不动,字符后移 LCD_Write_Command(0x01);DelayMS(1); //清屏 }

//-----------在LCD上显示字符串-----------------*/ void LCD_Display(uchar *str) {

uchar k;

for(k=0;k

Write_LCD_Data(str[k]); DelayMS(2); } }

8.1参考文献

[1] 吴炳胜,80C51单片机原理及应用技术.北京.冶金工业出版社个2008. [2] 林立,张俊亮单片机原理及应用.北京.电子工业出版社 2013 [3] 蓝和慧,宁武,闫晓金,单片机应用技能.北京.电子工业出版社 2009 [4] 王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002. [5] 蔡朝洋.单片机控制实习与专题制作.北京.北京航空航天大学出版社 2006 [6] 高禹.C语言程序设计.北京.清华大学出版社 2011

本文来源:https://www.bwwdw.com/article/3zqa.html

Top