1、数字电压表数字电压表摘要:本文运用AT89S52和ADC0832进行A/D转换,根据数据采集的工作原理,设计实现数字电压表,最后完成单片机的LCD数据显示,显示所测量的电压值 。本系统用精度高,稳定性好等特性。关键字:数字电压表 AT89S52 ADC0832 LCD1602 一、方案论证及选择1、主控芯片 方案1:选用专用电压转换芯片INC7107实现电压的测量和现实。缺点是精度比较低,且内部电压转换和控制部分不可控制。优点是价格低廉。方案2:选用单片机AT89S52和A/D转换芯片ADC0832实现电压的转换和控制,用LCD1602显示出最后的转换电压结果。缺点是价格稍贵。优点是转换精度高
2、,且转换的过程和控制、显示部分可以控制。基于课程设计的要求,我们优先选用了:方案2。2、显示部分方案1:选用4个单体的共阳数码管,将ah全部连接起来,然后接到单片机口的I/O上进行控制。缺点是焊接时比较麻烦,容易出错。优点是价格比较便宜。方案2用一个LCD1602显示结果,1602可以显示数字和字符显示内容十分的丰富。基于以上方案和课程设计的要求,我们优先选用了:方案2。二、硬件设计 这个电路主要芯片有ADC0832、单片机AT89S52和LCD1602组成,下面分别介绍一下它们的功能:ADC08321主要特性1)2路8位AD转换器,即分辨率8位。 2)具有转换起停控制端。 3)转换时间为10
3、0s4)单个5V电源供电 5)模拟输入电压范围05V,不需零点和满刻度校准。 6)工作温度范围为-4085摄氏度 2内部结构ADC0832内部结构框图 图1 ADC0832引脚图 3外部特性(读写时序) ADC0832时序 正常情况下 ADC0832 与单片机的接口应为 4条数据线,分别是 CS、CLK、DO、DI。但由于 DO端与 DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO和 DI 并联在一根数据线上使用。 (见图 3) 当 ADC0832未工作时其 CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行 A/D转换时,须先将 C
4、S使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端 CLK 输入时钟脉冲,DO/DI端则使用 DI端输入通道功能选择的数据信号。在第 1 个时钟脉冲的下沉之前 DI端必须是高电平,表示启始信号。在第 2、3个脉冲下沉之前 DI端应输入 2 位数据用于选择通道功能,其功能项见下表。 如上表 所示,当此 2 位数据为“1” 、 “0”时,只对 CH0 进行单通道转换。当 2位数据为“1” 、 “1”时,只对 CH1进行单通道转换。当 2 位数据为“0” 、“0”时,将 CH0作为正输入端 IN+,CH1作为负输入端 IN-进行输入。当 2 位数据为
5、“0” 、 “1”时,将 CH0作为负输入端 IN-,CH1 作为正输入端 IN+进行输入。 到第 3 个脉冲的下沉之后 DI端的输入电平就失去输入作用,此后 DO/DI端则开始利用数据输出 DO进行转换数据的读取。 从第 4个脉冲下沉开始由 DO端输出转换数据最高位 DATA7,随后每一个脉冲下沉 DO端输出下一位数据。直到第 11个脉冲时发出最低位数据 DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第 11个字节的下沉输出 DATD0。随后输出 8位数据,到第 19 个脉冲时数据输出完成,也标志着一次 A/D转换的结束。最后将 CS置高电平禁用芯片,直接
6、将转换后的数据进行处理就可以了。AT89S521、AT89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K在系统可编程Flash存储器,32位I/O口线,三个16位定时器/计数器,另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。2、引脚结构及作用 AT89S52管脚图三、软件设计#include #include #include sbit dc=P30; /*LCD 的RS */sbit rw=P31; /*LCD 的R/W */sbit cs=P32; /*LCD 的E */sbit ADC_CS =P34;sbit ADC_CLK=P35;sbit A
7、DC_DO =P37;sbit ADC_DI =P36;sfr lcdbus=0xa0; /*p0LCD 数据 D0=P2*/*写LCD命令*/void lcd_wrcmd(unsigned char lcdcmd) /8 lcdusing1=1; while(lcd_checkbusy(); lcdbus=lcdcmd; dc=0; /*dc=1为数据,=0 为命令.*/ rw=0; /*rw=1为读,=0为写.*/ cs=1; /*cs=1选通.*/ soft_nop(); cs=0; lcdbus=0xff;/8 lcdusing1=0;/*在当前显示位置显示数据*/void lcd_w
8、rdata(char lcddata) /* char i; lcdusing2=1; while(lcd_checkbusy(); if(lcdcounter=20) lcd_moveto(20); while(lcd_checkbusy(); if(lcdcounter=40) lcd_moveto(40); while(lcd_checkbusy(); if(lcdcounter=60) lcd_moveto(60); while(lcd_checkbusy(); if(lcdcounter=80) lcd_moveto(0); while(lcd_checkbusy(); lcdcou
9、nter=0; /*为通用而如此 lcdcounter+; */ lcdbus=lcddata; dc=1; /*dc=1为数据,=0 为命令.*/ rw=0; /*rw=1为读,=0为写.*/ cs=1; /*cs=1选通.*/ soft_nop(); cs=0;/ lcdbus=0xff;/ lcdusing2=0;/*/* 设置显示字符的位置/* X为列坐标,Y为行坐标/* void lcd_set_xy (char x,char y) /x =015 y= 01 char xy ; xy = (x+0x80)+y*0x40 ; lcd_wrcmd (xy); /delayNms(10)
10、; /*在指定显示位置显示LCD 字符串*/*/* 显示字符串/* 在adr坐标处显示一个字符/*void lcd_string(unsigned char adr ,unsigned char *strpoint) /register i=0; unsigned char i = 0; unsigned char row,colum ; while(strpointi!=0) row = adr / 16 ; colum = adr % 16 ; lcd_set_xy(colum,row) ; lcd_wrdata(strpointi); adr+; i+; /*/* 显示单字符/* 在ad
11、dress坐标处显示一个字符aa/* void lcd_char(unsigned char address,unsigned char aa ) / address =031 unsigned char row,colum ; row = address / 16 ; colum = address % 16 ; lcd_set_xy(colum,row) ; lcd_wrdata(aa);/ cs = 0 ; void lcd_init()/*初始化*/ lcd_wrcmd(0x38); /*设置8 位格式,2行,5*7*/ lcd_wrcmd(0x0c); /*整体显示,关光标,不闪烁*
12、/ lcd_wrcmd(0x06); /*设定输入方式,增量不移位*/ lcd_wrcmd(0x01); /*清除显示*/ lcdcounter=0;void Delay(unsigned char x) unsigned char i; for(i=0;ix;i+); /延时,脉冲一位持续的时间unsigned char ReadADC(void) /把模拟电压值转换成8位二进制数并返回 unsigned char i,ch; ch=0; ADC_CS=0; ADC_DO=0;/片选,DO为高阻态 for(i=0;i10;i+) ; ADC_CLK=0; Delay(2); ADC_DI=1
13、; ADC_CLK=1; Delay(2); /第一个脉冲,起始位 ADC_CLK=0; Delay(2); ADC_DI=1; ADC_CLK=1; Delay(2); /第二个脉冲,DI=1表示双通道单极性输入 ADC_CLK=0; Delay(2); ADC_DI=1; ADC_CLK=1; Delay(2); /第三个脉冲,DI=1表示选择通道1(CH2) ADC_DI=0; ADC_DO=1;/DI转为高阻态,DO脱离高阻态为输出数据作准备 ADC_CLK=1; Delay(2); ADC_CLK=0; Delay(2); for (i=0; i8; i+) ADC_CLK=1; D
14、elay(2); ADC_CLK=0; Delay(2); ch=(ch1)|ADC_DO;/在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数 ADC_CS=1;/取消片选,一个转换周期结束 return(ch);/把转换结果返回void main() unsigned char i,j; unsigned int jiang; unsigned char hong=0x00; unsigned char jj3;lcd_init(); while (1) hong=ReadADC(); jiang = (unsigned int)hong*50)/(unsigned int)255
15、; jj0=jiang/10; jj2=jiang%10;lcd_string(0,0,jj);六、总结 本次课程设计对点阵显示电路认真的学习以及对单片机技术有了更进一步的熟悉,实际操作和课本上的知识有很大联系,但又高于课本,一个看似很简单的电路,要动手把它设计出来就比较困难了,因为是设计要求我们在以后的学习中注意这一点,要把课本上所学到的知识和实际联系起来,同时通过本次电路的设计,不但巩固了所学知识,也使我们把理论与实践从真正意义上结合起来,增强了学习的兴趣,考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力。通过这次设计不仅锻炼了我们的团队协作精神,而且提高了创新能力。在收
16、获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高,而且在与老师和同学的交流过程中,互动学习,将知识融会贯通。更重要的是我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。不管怎样,这些都是一种锻炼,一种知识的积完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。九、参考文献1、单片机原理及应用 张毅刚、刘杰 哈尔宾工业大学2、单片机基础第三版 李广弟、朱月秀、冷祖祁 人民邮电3、单片机的C语言应用程序设计 马忠梅、张凯北航大学4、51系列单片机 楼然苗、李光飞 北京航空航天大学
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1