用lcd1602和adc0808设计的数字电压表

合集下载

基于ADC0832和LCD160128设计的数字电压表

基于ADC0832和LCD160128设计的数字电压表

学习情境3-数字电压表的设计之基于ADC0832和LCD160128设计的数字电压表☆点名,复习1、ADC0832的引脚及其功能,以及与单片机的硬件连接?2、PCF8591的引脚及其功能,以及与单片机的硬件连接?引言:新课讲授3.4基于ADC0832和LCD160128设计的数字电压表3.4.1 LCD160128简介LCD160128是一种图形点阵液晶显示模组。

它用T6963C作为控制器,KS0086作为驱动的160(列)X128(行)的全点阵液晶显示。

具有与INTER8080时序相适配的MPU接口功能,并有专门的指令集,可完成文本显示和图形显示的功能设置。

LCD160128液晶显示器的工作电压为+5V士10%,能够显示显示10个(/行)X8共120个(16 X 16点阵)的中文字符,共有13条操作指令。

1.芯片引脚及其功能表1引脚功能2.与主控制器的通信(1)读状态在数据读写操作之前必须进行状态检查。

T6963C的状态可以从数据总线中读取。

此时RD#和CE#引脚为低电平,WR#和C/D#引脚为高电平。

状态字格式如下所示:MSB LSBSTA7 D7STA6D6STA5D5STA4D4STA3D3STA2D2STA1D1STA0D0表2 状态子STA0 指令读写状态0:禁止;1:使能;STA1 数据读写状态0:禁止;1:使能;STA2 自动模式数据读状态0:禁止;1:使能;STA3 自动模式数据写状态0:禁止;1:使能;STA4 保留STA5 控制器操作状态0:禁止;1:使能;STA6 读屏/考屏错误标志0:无错误;1:错误;STA7 闪烁状态检查0:关显示;1:正常显示注意1:必须同时检查STA0与STA1的状态,由于硬件中断可能引起数据错误操作。

注意2:STA0与STA1用于大多数模式的状态检查。

注意3:STA2与STA3用于自动模式数据读写使能,此模式下,STA0与STA1无效。

状态检查流程:图1 状态检查流程图注意4:如果使用MSB=0命令,则必须先读取状态操作。

单片机毕业论文基于LCD显示技术的数字电压表设计

单片机毕业论文基于LCD显示技术的数字电压表设计

单片机毕业论文基于LCD显示技术的数字电压表设计基于LCD显示技术的数字电压表设计基于LCD显示技术的数字电压表设计摘要:本报告介绍了基于AT89S52单片机为核心的、以AD0809数模转换芯片采样、以1602液晶屏显示的具有电压测量功能的具有一定精度的数字电压表。

在实现基础功能要求之上扩展了串口通讯、时钟功能、高压报警、短路测试、电阻测量、交流电压峰峰值和周期测试等功能,使系统达到了良好的设计效果和要求。

关键词:AT89S52单片机模数转换液晶显示扩展功能Based on the LCD display technologyof digital voltmeter designAbstract: The report describes the AT89S52 based on the microcontroller as the core, AD0809 digital-to-analog converter chip sampling, to 1602 LCD display with voltage measurement function with a certain precision of digital voltage meter. In achieving functional requirements based upon the expansion of serial communications, high-pressure alarm, short circuit, electrical resistivity measurement, AC voltage and the peak of cycle testing and other functions, allowing the system to achieve good results and the design requirements.Keywords: AT89S52 SCM analog-to-digital conversion functions LCD expansion1基于LCD显示技术的数字电压表设计目录绪论.......................................................................................3 1数字电压表简介........................................................................4 1.1数字电压表的介绍 (4)1.2数字电压表的基本结构及工作原理…………………………………………4 1.3数字电压表的发展趋势……………………………………………………5 2单片机的概述………………………………………………………………62.1单片机简介………………………………………………………………6 2.2单片机的特点……………………………………………………………7 2.3单片机的应用……………………………………………………………7 3 方案论证..............................................................................8 3.1 CPU的选择...........................................................................8 3(2 液晶显示器的选择 (11)3.2.1液晶显示原理………………………………………………………………11 3.2.2液晶显示器各种图形的显示原理………………………………………11 4系统硬件设计……………………………………………………………………184.1硬件电路系统框图.....................................................................18 4.2软件设计流程图........................................................................18 4.3电源电路设计 (20)4.4 CPU系统设计………………………………………………………………20 4.5 CPU与显示器接口电路设计…………………………………………………21 4.6数字电压表硬件电路………………………………………………………23 总结体会....................................................................................24 致谢.......................................................................................25 参考文献 (26)附录 (27)附录1: 部分系统源程序附录2:运行图片及部分数据2基于LCD显示技术的数字电压表设计0绪论单片微型计算机简称单片机,又称微控制器,特别适用于控制领域。

用单片机制作电压表

用单片机制作电压表

用单片机制作电压表摘要:本文介绍了如何用单片机制作一种简单的电压表。

首先讲述了设计思路和所需材料,然后详细介绍了电压表的电路和程序设计。

最后,进行了实验验证和误差分析,结果表明该电压表具有较高的精度和稳定性,可用于实际应用中。

关键词:单片机,电压表,电路设计,程序设计,实验验证正文:一、设计思路电压表是一种用来测量电源电压、信号源电压等的电子测试仪器。

在实际工作中,电压表的精度和稳定性对测量结果具有重要影响。

因此,本文采用单片机的方法设计一种简单的电压表,以提高其精度和稳定性。

二、所需材料本电压表所需材料如下:1.AT89C51单片机2.LCD1602液晶显示器3.AD转换芯片4.电阻等电子元器件三、电路设计1. AD转换电路该电压表采用的是单片机内部的AD转换芯片,可将输入的模拟电压转换成数字信号。

因此,需要设计一个合适的AD转换电路。

该电路的原理图如下图所示:其中,R1和R2为分压电阻,可通过调整它们的阻值来调整输入电压的范围。

C1为滤波电容,将输入电压进行滤波,使AD转换器输入的电压更加稳定。

2. 单片机电路单片机电路的原理图如下图所示:其中,U1为单片机,U2为LCD液晶显示器,U3为电源芯片,P1为电压输入接口,R3和R4为接在U1的引脚上的上拉电阻,可以保证单片机工作的稳定。

R5和R6为控制LCD1602液晶显示器的调整电位器。

四、程序设计该电压表的程序设计如下:1. 设置单片机的输入/输出口2. 初始化LCD1602液晶显示器3. 初始化AD转换器4. 通过AD转换器读取输入电压的模拟信号5. 将模拟信号转换成数字信号6. 将数字信号转换成电压值7. 将电压值显示在LCD液晶显示器上五、实验验证经过实验验证,该电压表的精度约为0.1V,稳定性较高,可以满足实际应用需求。

但是,由于电阻和电容的选型和电路设计的误差,误差值有时会有所不同。

因此,在实际应用中需要进行误差分析和校准。

六、误差分析误差分析的主要目的是分析电路的精度,以确定设计的合理性。

简易数字电压表课程设计

简易数字电压表课程设计

电子测量结课作业简易数字电压表指导教师:学院:专业班级:姓名:学号:摘要本文介绍了一种基于单片机的简易数字电压表的设计。

该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。

A/D转换主要由芯片ADC0832来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。

数据处理则由芯片AT89C52来完成,其负责把ADC0832传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0832芯片工作。

该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。

此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过一个LCD1602液晶屏显示出来。

关键词: 单片机;数字电压表;A/D转换;AT89C52;ADC0832目录1 数字电压表的简介 01.1数字电压表简介 01.2数字电压表的的背景与意义 02 设计总体方案 (2)2.1 设计要求 (2)2.2 设计思路 (2)2.3 设计方案 (2)3 硬件电路设计 (4)3.1 A/D转换模块 (4)3.2 单片机系统 (6)3.3 复位电路和时钟电路 (9)3.4 LCD显示系统设计 (10)3.5 总体电路设计 (12)4 程序设计 (13)4.1 程序设计总方案 (13)4.2 系统子程序设计 (13)5 仿真 (15)5.1软件调试 (15)5.2显示结果及误差分析 (15)5.2.1 显示结果 (15)5.2.2 误差分析 (17)结论 (19)参考文献 (20)附录............................................................................................... 错误!未定义书签。

1 数字电压表的简介1.1数字电压表简介在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。

使用ADC制作数字电压表

使用ADC制作数字电压表
//在指定位置显示一个字符
{
if(line>1||pos>16)
return0;
if(line==0)//显示在第一行
LCD1602_WrCom(0x80+pos);//显示地址设为80H+起始位置
else
LCD1602_WrCom(0x80+0x40+pos);//显示地址设为80H+起始位置
LCD1602_Delay(5);
另外也外接了一个频率计来测量输入的时钟信号。可以查看一下0809的工作最低时钟频率要求。
51仿真时未输出ALE时钟信号,同时由于实验板的ALE引脚未引出,但0809的CLK引脚已和HC74HC的输出作在一起,故只能单独用一个引脚来产生时钟信号。这里使用定时器模式2,产生。
单片机外围解法如下:
串联的74HC74解法如下:
return1;
pos+=0x80;
if(line)//显示在第2行
pos+=0x40;
LCD1602_WrCom(pos);//显示地址设为80H+起始位置
for(i=0;i<5;i++)
{
if(num/tenPower||zero||i==4)
{
LCD1602_WrData('0'+num/tenPower);
0808可以接最多8路模拟输入,但是我们只需要一路即可,因此对于选通信号线ABC都可以直接接低电平,这样永远只选通第一路输入信号。使用滑动变阻器接5V电压来模拟外界电压,模拟输入的范围是0-5V。
由于我们这里只需测量0-5V而且是直流即可,因此参考电压可以选定VCC。同事OE可以直接接高。

基于单片机的数字电压表的课程设计

基于单片机的数字电压表的课程设计

目录1 引言 (2)2 设计原理及要求 (2)3 软件仿真电路设计 (2)3.1 设计思路 (3)3.2 仿真软件简介 (3)3.2.1 Proteus 6 Professional (3)3.2.2 Keil uVision2 (3)3.3设计过程 (3)4 硬件设计 (4)4.1单片机控制模块设计 (4)4.1.1时钟电路 (4)4.1.2复位电路 (4)4.2 A/D转换模块设计 (5)4.2.1 ADC0808简介 (5)4.2.2 A/D转换电路设计 (6)4.3 显示模块设计 (7)4.3.1 LCD显示模块 (7)4.3.2 LCD1602的引脚功能 (7)4.3.3 LCD1602的显示操作 (7)5系统软件程序的设计 (11)5.1主程序设计 (11)5.2 A/D转换程序 (11)6 系统仿真 (12)7 结论 (13)参考文献 (14)附录1 (15)附录2 (20)1 引言随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。

数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。

与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。

本章重点介绍A/D 转换器以及由它们构成的基于单片机的数字电压表的工作原理。

电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。

数字电压表的核心部件就是A/D转换器。

它是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。

较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。

单片机数字电压表(带仿真图C程序)

单片机数字电压表(带仿真图C程序)

基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很多种,有的采用ADC0809,或者ADC0808等,他们都是8温AD,并口传输数据,具有速率高的优点。

但是硬件复杂,与单片机电路繁琐,焊接起来比较麻烦。

所以本设计采用ADC0832,同样8位AD,特点是串口传输数据,硬件接口简单,且精度误差一致,速率也比较快,对于要求不高的系统非常适合。

2.显示电路,网上采用LED显示居多,本设计采用LCD1602液晶显示,具有硬件搭设简单,显示美观等优点3.本设计方便移植,只需将LCD1602三个控制端口,ADC0832 四个控制端口修改即可。

注意LCD1602数据传输接口是单片机的P0口,如下图,需要接上拉电阻4.程序采用C代码编写,亲测直接可以使用,若需仿真文件,请用E-mail联系邮系。

邮箱:gnsywb@5.网上很多设计数据转换程序有误,不够正确。

在转换过程中,中间变量需设置为int 类型,虽然8位AD输出最高位255,但是余数转换过程中会大于255。

若设计char型,会造成显示输出有误。

void convert(uchar a){ uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10; dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10; dis[2]=temp/51; //取小数点后第二位}具体电路图如下:1.利用电压表与测量显示电压对比附录:C程序/******************************************** 功能:单片机数字电压表ADC0832+LCD16021,测量范围0-5V2,2路输入电压,可自行设定3,测量精度误差0.01V,LCD液晶显示编写者:小子在西藏gnsywb@编写日期:2012-11-5*********************************************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6; //1602控制端口sbit DI=P3^4;sbit DO=P3^4; //DI和DO与单片机共接口sbit Clk=P3^3;sbit CS=P3^5;//ADC0832控制端口uchar dis[3]={0x00,0x00,0x00}; //显示缓冲区uchar date=0; //AD值uchar CH; //ADC0832通道值/*****************************************AD0832转换程序******************************************/uchar ADC0832(uchar CH){uchar i,dis0,dis1;Clk=0; //拉低时钟DI=1; //初始化_nop_();CS=0; //芯片选定_nop_();Clk=1; //拉高时钟_nop_();if(CH==0) //通道选择{Clk=0; //第一次拉低时钟DI=1; //通道0的第一位_nop_();Clk=1; //拉高时钟_nop_();Clk=0; //第二次拉低时钟,ADC0832 DI接受数据DI=0; //通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DI=1; //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DI=1; //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0; //第三次拉低时钟,此前DI两次赋值决定通道DI=1; //DI开始失效,拉高电平,便于DO数据传输for(i= 0;i<8;i++) //读取前8位的值{_nop_();dis0<<= 1;Clk=1;_nop_();Clk=0;if (DO)dis0|=0x01;elsedis0|=0x00;}for (i=0;i<8;i++) //读取后8位的值{dis1>>= 1;if (DO)dis1|= 0x80;elsedis1|= 0x00;_nop_();Clk=1;_nop_();Clk=0;}if(dis0==dis1) //两次结束数据比较,若相等date=dis0; //则赋值给dat_nop_();CS=1; //释放ADC0832DO=1; //拉高输出端,方便下次通道选择DI端有效Clk=1; //拉高时钟return date;}/***********************************************数据转换程序功能:将0-255级换算成0.00-5.00的电压数***********************************************/void convert(uchar a){uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10;dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10;dis[2]=temp/51; //取小数点后第二位}/***************************************** LCD1602驱动程序******************************************/ void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=122;y>0;y--);}void write_cmd(uchar cmd)//lcd1602写命令函数{lcdrs=0;lcdrw=0; //选择指令寄存器lcden=1;P0=cmd; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void write_date(uchar date)//lcd1602写数据函数{lcdrs=1;lcdrw=0; //选择数据寄存器lcden=1;P0=date; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void init_lcd1602()//lcd1602初始化{write_cmd(0x01); //清屏write_cmd(0x38); //功能设置write_cmd(0x0c); //显示设置write_cmd(0x06); //输入方式从左到右delay(1);}/***************************************** 显示函数*****************************************/ void display(void){uchar i;write_cmd(0x80);for(i=0;i<3;i++){if(i==1) write_date('.'); //第二位显示小数点write_date (0x30+dis[i]);delay(5);}write_date('V'); //最后一位后显示字符'V'}/************************************************ 主函数***************************************************/ void main(void){CH=0; //选择通道0或1init_lcd1602();//液晶1602显示初始化while(1) //主循环{date=ADC0832(CH);//启动ADC0832转换并接受数据delay(1);convert(date); //数据转换成BCD码display(); //显示数值}}。

LCD1602+ADC0832制作的数字电压表

LCD1602+ADC0832制作的数字电压表

ADC0832+LCD1602+PROTEUS仿真电路C51程序//********************************//LCD1602+ADC0832制作的数字电压表//接口方式:模拟口线//作者:曾宪阳//网址:/zxymcu//********************************#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define IO_1602 P0 //IO口sbit RS_1602=P2^0;sbit RW_1602=P2^1;sbit E_1602=P2^2;sbit CS=P1^0;sbit CLK=P1^1;sbit DIO=P1^2;void delay_ms(unsigned int t)//11.0592MHz 1ms {uchar x,y;for(t;t>0;t--){for(x=0;x<114;x++)for(y=0;y<1;y++);}}void Wr1602Cmd(unsigned char dat) {//写命令函数E_1602=0;IO_1602=dat;RS_1602=0;RW_1602=0;E_1602=1;delay_ms(1);E_1602=0;delay_ms(1);}void Wr1602Dat(unsigned char dat) {//写数据函数E_1602=0;IO_1602=dat;RS_1602=1;RW_1602=0;E_1602=1;delay_ms(1);E_1602=0;delay_ms(1);}void Init1602(void){delay_ms(20);Wr1602Cmd(0x38);delay_ms(5);Wr1602Cmd(0x38);delay_ms(5);Wr1602Cmd(0x06);Wr1602Cmd(0x0c);//Wr1602Cmd(0x01);//清屏Wr1602Cmd(0x80);//设置地址}uchar RdAdc0832(bit Hx){uchar value0,value1,i;CS=1;CLK=0;DIO=1;CS=0;DIO=1;_nop_();_nop_();_nop_();_nop_(); //写ST位 CLK=1;_nop_();_nop_();_nop_();_nop_();CLK=0;_nop_();_nop_();_nop_();_nop_();DIO=1;_nop_();_nop_();_nop_();_nop_();//写SGL位 CLK=1;_nop_();_nop_();_nop_();_nop_();CLK=0;_nop_();_nop_();_nop_();_nop_();DIO=Hx;_nop_();_nop_();_nop_();_nop_();//写通道号位CLK=1;_nop_();_nop_();_nop_();_nop_();CLK=0;_nop_();_nop_();_nop_();_nop_();DIO=1;for(i=0;i<8;i++){CLK=1;_nop_();_nop_();_nop_();_nop_();CLK=0;_nop_();_nop_();_nop_();_nop_();value0<<=1;if(DIO==1) value0|=0x01;else value0&=0xfe;}for(i=0;i<8;i++){value1>>=1;if(DIO==1) value1|=0x80;else value1&=0x7f;CLK=1;_nop_();_nop_();_nop_();_nop_(); CLK=0;_nop_();_nop_();_nop_();_nop_(); }CS=1;if(value0!=value1) P1&=0X7F;else P1|=0X80;return value0;}void main(){unsigned long i;Init1602();while(1){Wr1602Cmd(0x80);i=RdAdc0832(0);i=(i*5000/255);Wr1602Dat('C');Wr1602Dat('H');Wr1602Dat('0');Wr1602Dat('=');Wr1602Dat('0'+i/1000);Wr1602Dat('.');Wr1602Dat('0'+i%1000/100);Wr1602Dat('0'+i%1000%100/10); Wr1602Dat('0'+i%1000%100%10); Wr1602Dat('V');Wr1602Cmd(0xC0);i=RdAdc0832(1);i=(i*5000/255);Wr1602Dat('C');Wr1602Dat('H');Wr1602Dat('1');Wr1602Dat('=');Wr1602Dat('0'+i/1000);Wr1602Dat('.');Wr1602Dat('0'+i%1000/100);Wr1602Dat('0'+i%1000%100/10);Wr1602Dat('0'+i%1000%100%10);Wr1602Dat('V');}}LCD1602+ADC0809制作的数字电压表-总线连接方式//********************************//LCD1602+ADC0809制作的数字电压表//接口方式:总线扩展//作者:曾宪阳//网址:/zxymcu//******************************** #include<reg52.h>#define ADC0809Addr 0x78ff#define LCDWriteComAddr 0xa7ff#define LCDWriteDatAddr 0xafff#define uchar unsigned char#define uint unsigned intuchar Disp[6];void delay_ms(uint t){uchar x,y;for(t;t>0;t--){for(x=0;x<114;x++)for(y=0;y<1;y++);}}void Init1602(void){delay_ms(15);*((uchar xdata*)LCDWriteComAddr)=0x38; delay_ms(5);*((uchar xdata*)LCDWriteComAddr)=0x38; delay_ms(5);*((uchar xdata*)LCDWriteComAddr)=0x38;delay_ms(2);*((uchar xdata*)LCDWriteComAddr)=0x08; delay_ms(2);*((uchar xdata*)LCDWriteComAddr)=0x01; delay_ms(2);*((uchar xdata*)LCDWriteComAddr)=0x0c; delay_ms(2);*((uchar xdata*)LCDWriteComAddr)=0x06; delay_ms(2);*((uchar xdata*)LCDWriteComAddr)=0x80; delay_ms(2);}void Display(void){*((uchar xdata*)LCDWriteComAddr)=0XC0;delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)='I';delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)='N';delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)='0';delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)='=';delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('0'+Disp[0]); delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('.');delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('0'+Disp[1]); delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('0'+Disp[2]); delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('0'+Disp[3]); delay_ms(2);*((uchar xdata*)LCDWriteDatAddr)=('V');delay_ms(2);}void ADC0809(void){unsigned long i;*((uchar xdata*)ADC0809Addr)=0;delay_ms(100);i=*((uchar xdata*)ADC0809Addr);P1=i;i=(i*5000/255);Disp[0]=(i/1000);Disp[1]=(i%1000/100);Disp[2]=(i%1000%100/10);Disp[3]=(i%1000%100%10);}void main(void){Init1602();while(1){ADC0809(); Display(); }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习情境6-数字电压表的设计之用lcd1602和adc0808设计的数字电压表☆点名,复习1、ADC0832的引脚及其功能,以及与单片机的硬件连接?引言:数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。

较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。

数字电压表的核心部件是A/D 转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。

一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。

积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。

根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。

逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。

斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。

在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。

本设计以AT89C51单片机为核心,以逐次比较型A/D转换器ADC0808、液晶显示器LCD1602为主体,构造了一款简易的数字电压表,能够测量1路0~5V直流电压,最小分辨率0.02V。

☆新课讲授6.2基于LCD1602和ADC0808设计的数字电压表逐次逼近型A/D转换器属于直接型A/D转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。

主要由比较器、环形分配器、控制门、寄存器与D/A 转换器组成。

6.2.1 ADC0808简介1、主要技术指标和特性(1)分辨率:8位。

1LSB,ADC 0809为±1LSB。

(2)总的不可调误差:ADC0808为±2(3)转换时间:取决于芯片时钟频率,如CLK=500kHz时,TCONV=128μs。

(4)单一电源:+5V。

(5)模拟输入电压范围:单极性0~5V;双极性±5V,±10V(需外加一定电路)。

(6)具有可控三态输出缓存器。

(7)启动转换控制为脉冲式(正脉冲),上升沿使所有内部寄存器清零,下降沿使A/D转换开始。

(8)使用时不需进行零点和满刻度调节。

2、ADC0808引脚功能图6-2-1 ADC0808引脚图(1)IN0~IN7——8路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。

(2)D7~D0——A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。

8位排列顺序是D7为最高位,D0为最低位。

(3)ADDA、ADDB、ADDC——模拟通道选择地址信号,ADDA为低位,ADDC为高位。

地址信号与选中通道对应关系如表11.3所示。

(4)VR(+)、VR(-)——正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。

在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。

地址选中通道ADD C ADD B ADD A11IN0IN1IN21111111111IN3IN4IN5IN6IN7(5)ALE——地址锁存允许信号,高电平有效。

当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。

在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。

(6)START——A/D转换启动信号,正脉冲有效。

加于该端的脉冲的上升沿使逐次逼近寄存器清零,下降沿开始A/D转换。

如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中止,重新从头开始转换。

(7)EOC——转换结束信号,高电平有效。

该信号在A/D转换过程中为低电平,其余时间为高电平。

该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。

在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。

(8)OE——输出允许信号,高电平有效。

当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。

在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。

3、ADC0808内部结构图逐次逼近型A/D转换器ADC0808由八路模拟开关、地址锁存与译码器、比较器、D/A 转换器、寄存器、控制电路和三态输出锁存器等组成。

其内部结构如图4所示。

图6-2-2 ADC0808内部结构4、工作时序与使用说明图6-2-3 ADC0808工作时序ADC 0808/0809的工作时序如图11.21所示。

当通道选择地址有效时,ALE信号一出现,地址便马上被锁存,这时转换启动信号紧随ALE之后(或与ALE同时)出现。

START的上升沿将逐次逼近寄存器SAR复位,在该上升沿之后的2μs加8个时钟周期内(不定),EOC 信号将变低电平,以指示转换操作正在进行中,直到转换完成后EOC再变高电平。

微处理器收到变为高电平的EOC信号后,便立即送出OE信号,打开三态门,读取转换结果。

6.2.2 系统硬件设计从以上分析可知。

ADC0808有8个模拟通道,本文的模拟量从0通道输入,由ADC0808的模拟通道地址表可知,电路中应当把ADDC、ADDB、ADDA三个引脚全部接地。

根据ADC0808的工作时序图可知,START引脚在一个高电平后启动A/D转换,当EOC 引脚出现一个低电平时转换结束,然后由OE引脚控制,从并行输出端读取一个字节的转换结果。

转换后的结果为0x00-0xFF,转换过程中芯片所需的时钟信号由单片机定时器中断子程序提供。

具体硬件结构图如图6-2-4所示:图6-2-4 系统硬件连接图6.2.3 系统软件设计根据需要,可将系统软件按照功能划分为4个模块,分别是主程序模块、A/D转换模块、液晶显示模块、中断服务程序模块(改变显示的小数点位置)。

编写系统软件时,可首先编写各模块的底层驱动程序,而后是系统联机调试,最后编写上层主程序。

1、主程序设计主程序主要负责初始化工作:设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶实时显示等,其流程图如图6-2-5所示。

图6-2-5主程序流程图2、A/D转换程序图6-2-6 A/D转换程序流程图A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。

当系统设置好后,单片机扫描转换结束管脚P1.7的输入电平状态,当输入为高电平则转换完成,将转换的数值转换并显示输出。

若输入为低电平,则继续扫描。

程序流程图如图6-2-6所示。

程序如下:#include<reg52.h>#include <intrins.h>unsigned long dat_adc0808;uint adc0808_init() // AD初始化{START=0;OE=0;START=1;START=0;while(EOC==0);OE=1;dat_adc0808=P1;OE=0;return dat_adc0808;}得到ADC0808的转换结果后,应当及时处理成LCD1602能够显示的数字字符。

以下函数实现此功能,为ADC0808显示刷新子程序:void Refresh_show() //刷新显示{uint t=dat_adc0808*500.0/255; //display_buffer[1][7] = t/100+'0'; //整数位display_buffer[1][9] = t/10%10+'0'; //两个小数位display_buffer[1][10] = t%10+'0';}☆课堂小结本节课我们主要学习了如何应用ADC0808设计一个数字电压表。

知道了在硬件上ADC0808芯片和单片机的连接,在软件方面,我们着重介绍了如何获取A/D转换结果函数的设计,这需要我们从ADC0808芯片的技术资料中获得设计程序的方法。

通过和前面一个项目的对比可知,对于模数转换芯片的使用,关键的一点就是我们必需明白A/D芯片的转换机制,ADC0808转换时和时钟引脚的频率有很大的关系,频率设置不当,ADC0808就不能转换,这一点同学们要特别注意。

☆完整程序代码1、LCD1602.c源程序//液晶控制与显示驱动程序#include <reg52.h>#include <intrins.h>#include <string.h>#include "LCD1602.h"#include "ADC0808.h"//---------------忙检查-------------------//uchar LCD_Busy_Check(){uchar LCD_Status;RS = 0;RW = 1;E = 1;delay4us();LCD_Status = P0;E = 0;return LCD_Status;}//--------------向LCD写入命令--------------------//void Write_LCD_Command(uchar cmd){while((LCD_Busy_Check()& 0x80)==0x80); //忙等待RS = 0;RW = 0;E = 0;P0 = cmd;delay4us();E = 1;delay4us();E = 0;}//-----------向LCD写入一个字节的数据函数-----------------*/ void Write_LCD_Data(uchar dat){while((LCD_Busy_Check()&0x80)==0x80);RS = 1;RW = 0;E = 0;P0 = dat;delay4us();E = 1;delay4us();E = 0;}//-----------LCD初始化-----------------*/void Initialize_LCD1602() //液晶初始化函数{Write_LCD_Command(0x38);delay50us(10); //功能设置,数据长度为8位,双行显示,5×7点阵字体Write_LCD_Command(0x0C);delay50us(10); // 显示开,关光标Write_LCD_Command(0x06);delay50us(10); //字符进入模式:屏幕不动,字符后移Write_LCD_Command(0x01); delay50us(10);//清屏}//-----------在LCD上显示字符串-----------------*/void LCD_Display(uchar *str){uchar i;for(i=0;i<strlen(str);i++){Write_LCD_Data(str[i]);delay50us(100);}}2、lCD1602_H头文件#ifndef __lCD1602_H__#define __LCD1602_H__#include <reg52.h>。

相关文档
最新文档