工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->光电电路图->其他光电实用电路图->采用单片机的数字电压表头制作

采用单片机的数字电压表头制作

作者:dolphin时间:2016-09-08

  数字万用表是由数字电压表头和转换电路组成的,本文的实验主要介绍怎样用ATmega8和LCD1602液晶显示模块组成数字电压表头,通过实验和学习使大家掌握ATmega8的ADC与LCD1602液晶显示模块的功能和使用方法。

  一.ATmoga8模数转换(肌C)功能介绍

ATmega8提供6路逐次逼近型的ADC,其中ADC0~ADC3四个通道提供10位的转换精度,ADC4、ADC5两个通道只提供8位的转换精度。

  进行AD转换时要有一个参考电压,参考电源可采用芯片内部的2.56V参考电压,或者采用AVCC,也可采用由引脚ARFE接入的外部参考电压。本例使用内部参考电压,并在引脚ARFE上接电容Cl以提高ADC的抗噪性能。

  与ADC相关的寄存器主要有以下三种:

  1.多工选择寄存器ADMUXADMUX中各位的定义见表1,其中REFSl、REFS0作ADC参考电源电压的选择控制,其取值和参考电压的对应关系见表2。

2

  ADLAR为AD转换结果对齐方式选择。

  MUX3~0为模拟通道选择,所取二进制数的值即为通道的号,比如取0011时表示选择ADC3通道,余下以此类推。

2

  2.控制和状态寄存器ADCSRA.ADCSRA中各位的定义见表3。ADEN为ADC使能,写入“1”使能ADC,写入“0”关闭ADC。ADSC为ADC开始转换控制位。ADFR为连续模式选择,当该位被置“1”时,ADC工作在连续转换模式下,清零该位将中止连续转换模式。ADIF为中断标志位,ADIE为中断允许位。ADPS2~O为ADC预分频选择,这些位决定了XTAL时钟与输入到ADC的ADC时钟之间的分频数,见表4。3

  3.数据寄存位ADCL和ADCH当ADC转换完成时,可以在这两个寄存器读取转换的结果,这两个寄存器合起来为16位,转换结果只使用了其中的10位,当ADLAR=0,为右对齐,低8位使用.ADCL,高2位使用ADCH的低2位;当ADLAR=1,为左对齐,高8位使用ADCH,低2位使用ADCL的高2位。

  二.LCD1602液晶显示模块

  LCD1602液晶显示模块能显示的内容为16字符×2行,即最多显示32个字符。

  1.引脚功能

4

  LCDl602的引脚功能见表5。2.寄存器选择功能寄存器选择功能见表6。

4

  3.指令功能

  指令格式:RSR/WD7D6D5D4D3D2D1。D0例如要在LCD1602的数据寄存器写入数据0x41的指令为:1001000001,把这个二进制数送到LCD1602的4~14脚,就会在LCD1602的显示屏显示字符A,当然在这之前要先写入显示的地址。

  4、标准字符库

  有的读者可能会问:上面我们把数据0x41写入到LCD1602的数据寄存器,怎么显示出来的不是16进制的数字41而是A呢?原来是LCD1602给每个要显示的字符都定义了一个字符码,字符A的字符码就是0x41。LCD1602模块内有一个标准字符库,只要输入字符码就可以显示出对应的字符,常用字符的字符码就使用其在ASCⅡ码表中对应的字符码。在编写程序的过程中,如果使用汇编语言,我们必须给出字符的ASCⅡ码;如果使用ICCAVRC语言,可以给出字符的ASCⅡ码,也可以只给出要显示的字符,字符码由ICCAVR编译器自动生成,本文的配套程序采用的就是后一种方法。

  三、数字电压表头实验

  1.实验电路

  利用单片机ATmega8与LCD1602设计一个数字电压表,能够测量0~2.5V的直流电压值,四位数码显示。

  实验板上与数字电压表头有关的电路部分见下图,模拟电压通过J2输入到ATmega8的PC3脚,转换结果数据通过PB0~PB7输出到LCD1602显示,PC0~PC2是LCD1602的控制线。

3

  2.程序设计

  程序由主函数、初始化函数、AD转换函数、计数值处理函数、LCD显的工作过程是这样的:从J2输入的直流电压经ADC转换后由计数值处理函数把16进制的数转换成10进制的BCD码,再通过查表的方式得到对应数字的ASCⅡ码,最后通过LCD1602进行显示。

  ADC转换结束后,在ADC数据寄存器中可以取得转换结果,其转换结果可表示为:ADC=(VIN×1024)/VREF,其中VIN表示输入电压,VREF表示选定的参考电源电压。由公式可知:当输入电压和参考电源电压相等时结果为1024,但由于ADC数据寄存器为10位二进制寄存器,能表示的最大值为1023,因此实际转换的结果为1023,即使输入电压大于参考电源电压,其结果仍然为1023,故输入电压必须不大于参考电源电压,否则得不到正确的转换结果。

  在本文的实例中选择内部2.56V作为参考电源电压,最大输入电压可达2.56V,因此这里输入电压确定为0~2.5V,当输入电压为2.5V时,AD转换的结果正好为1000,为了在LCD1602上显示2500(单位为mV),必须将结果乘以2.5送LCD1602显示。

  为了能通过查表得到待显示数字的ASCⅡ码,定义了一个字符数组Table[],并用字符串给这个数组赋值:Table[]=“0123456789”,例如LCD1602要显示数字0,只要读取ASCⅡ码0x30,即Table[0]=0x30而不是Table[0]=0,相应地Table[1]=0x31、Tablel[2]=0x32等等。上面由字符获得其ASCⅡ码的翻译工作是ICCAVR在编译时自动完成的。

  3.电压测量4

  按右图的电路将可变电阻器RP输出的电压送到J2接口,图2中的5V电源就使用实验板上的电源。打开实验板的电源,调节RP我们就可发现LCD1602上显示数字跟着变化。

4  对于不大于2.5V的电压可以直接输入到J2测量其电压值,如果电压超过这一范围,就要改变数字电压表头的量程,比如把量程改为10V,这时只要做两件事情:一是按左图做一个转换电路,使其输入电压在0~10V变化时输出电压在0~2.5V变化,以满足ADC转换的要求。二是将程序中的语句“i=i*5/2;”改为“i=i*10;”,这时LCD1602的显示范围为0~9999。因为这里只显示4位,当电压为10V时最高位的1不能显示,显示数为0000,因此当量程大于10V时要修改源程序使得LCD1602显示5位数字,只有这样才能满足测量的要求。



评论

技术专区