用lcd1602和adc0808设计的数字电压表
基于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显示技术的数字电压表设计摘要:本报告介绍了基于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制作数字电压表
{
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程序)
基于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制作的数字电压表
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(); }}。
基于单片机的4通道模拟信号采集与显示系统设计
EOC CLK OE
3.4 显示部分
• 本设计的显示部分
由液晶显示器 LCD1602取代数码 管来完成。开始时 显示器将一直处于 初始状态。系统进 入工作后显示欢迎 界面,按键按下后 显示通道电压。
LCD1
LM016L
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7
U1
D0 D1 D2 D3 D4 D5 D6 D7
7 8 9 10 11 12 13 14
22pF
D0 D1 D2 D3 D4 D5 D6 D7
R2 10k R3 R4 R5
KEY0
P2.7
RV5
51%
1k
KEY1
10k P2.6
20uF
C3
29 30 31 PSEN ALE EA
KEY2
10k P2.5
VSS VDD VEE
RS RW E 4 5 6 RS RW E
RP1
1 2 3 4 5 6 7 8 9
C1
1 2 3
X1
CRYSTAL
19
XTAL1
C2
22pF 18
R1
10k 9
XTAL2
RST
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
用LCD1602和ADC0832设计的两路电压表
学习情境3-数字电压表的设计之基于LCD1602和ADC0832设计的数字电压表☆点名,复习1、DS1302的引脚及其功能,以及DS1302与单片机的硬件连接?2、如何编写基于1602LCD的显示驱动程序?☆新课讲授3.1基于LCD1602和ADC0832设计的数字电压表这堂课我们来学习ADC0832芯片的应用。
模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,在数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路里,电平则理论上有无数个状态,比如0V、0.1V、0.2V…等等。
如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程。
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,且目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
3.1.1 ADC0832芯片ADC0832具有以下特点:(1)8位分辨率;(2)双通道A/D转换;(3)输入输出电平与TTL/CMOS相兼容;(4)5V电源供电时输入电压在0~5V之间;(5)工作频率为250KHZ,转换时间为32μS;(6)一般功耗仅为15mW;(7)8P、14P—DIP(双列直插)、PICC 多种封装;(8)商用级芯片温宽为0°C to +70°C?,工业级芯片温宽为40℃- +85℃引脚及功能:图6-1-1 DAC0832引脚图CS:片选使能,低电平有效CH0:模拟输入通道0,或作为IN+/-使用CH1:模拟输入通道1,或作为IN+/-使用GND:芯片参考0电位(地)DI:数据信号输入,选择通道控制DO:数据信号输出,转换数据输出CLK:芯片时钟输入VCC:电源输入ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
用lcd1602和adc0808设计的数字电压表
学习情境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(需外加一定电路)。
ADC0809+lcd1602测量电压
#include<reg52.h>#include<intrins.h> //调用_nop_();延时函数用#define uchar unsigned char#define uint unsigned intuchar code table[]="0123456789";//定义显示的数组uchar code table1[]="";sbit lcden=P1^0;//定义管脚sbit lcdrs=P1^7;sbit lcdrw=P1^6;sbit a=P1^3;sbit b=P1^4;sbit c=P1^5;sbit st=P3^3;sbit eoc=P1^1;sbit oe=P1^2;sbit CLOCK=P3^4;uchar num,flag;void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//1602读指令{ lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date)//1602读数据{ lcdrw=0;lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;void lcd_init()//1602初始化函数{lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}void main(){uchar date=0;float temp=0.0;uchar q,b,s,g;uchar i;a=1;//选着ADC0809的第7通道b=1;c=1;TMOD=0x12;//选择定时器工作方式2TH0=254;TL0=254;//定时2us,为ADC0809提供500Khz的工作频率TR0=1;ET0=1;EA=1;lcd_init();oe=0;while(1){st=0;//ADC0809初始化st=1;_nop_();_nop_();st=0;_nop_();_nop_(); _nop_();for(i=0;i<20;i++);while(eoc==0);//等待转换完成{oe=1;date=P2;//p2选择为ADC的数据口oe=0; }temp= (float) date*5.0/256;//数据处理temp=temp/100.0;temp=temp*100000.0;q=(int)temp/1000;b=(int)temp%1000/100;s=(int)temp%1000%100/10;g=(int)temp%10;write_com(0x80);//1602显示处理好的数据{ write_data(table[q]);delay(20);write_data(table1[3]);delay(20);write_data(table[b]);delay(20);write_data(table[s]);delay(20);write_data(table[g]);delay(20);}write_com(0x80+0x40);for(num=0;num<13;num++){write_data(table1[num]);delay(20);}}}void int1(void )interrupt 1//定时器中断{CLOCK=~CLOCK;}。
ADC0809+LCD1602+AT89S52=C语言数字电压表程序
{
uchar temp=0;
ST=0;
//EOC=1;
// ALE=1;
ADDA=0;
ADDB=0;
ADDC=0;
delay(1);
//ALE=0;
//OE=0;
ST=0;
ALE=1;
ST=1;
ALE=0;
ST=0;
delay(2);
while(EOC==0);
OE=1;
temp=P2;
lcd_1602(0x80+wei);
/*temp= *p;
while(temp!='\0')
{
lcd_write(temp);
p++;
temp=*p;
}*/
for(temp=*p;temp!='\0';p++,temp=*p)
lcd_write(temp);
delay(10);
}
void lcd_data(uchar *p,uchar wei)
void lcd_init()
{
delay(15);
lcd_1602(0x38);
delay(3);
lcd_1602(0x3);
delay(3);
lcd_1602(0x08);
lcd_1602(0x01);
delay(3);
lcd_1602(0x06);
{
CLK=~CLK;
}
/*ADC0809程序模块*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
(完整)基于ADC0808的数字电压表汇编语言_完整版,推荐文档
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
CLR P3.6;启动AD转换
JNBEOC,$;等待转换结束
SETBOE
MOVADC,P1;读取AD转换结果
CLROE
MOVA,ADC
MOV TEMP,A
SUBB A,#128;减小一半量程
JC JUD1;小于一半量程则跳转
SETB P3.6;大于一半量程则蜂鸣器响
JUD1:MOV A,TEMP;判断是否小于四分之一量程
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚 备选功能
P3.0 RXD(串行输入口)
管脚说明:
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次பைடு நூலகம்1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
51单片机的数字电压表设计
摘要
近些年来,数字电压表逐渐进入人们的视线中,它主要采取数字化测量技 术。与传统的指针式仪表相比,它的功能有了进一步的完善,并且精度也有了 很大的提高。数字电压表主要采用单片机和模/数转换模块,这样不仅提高了测 量速度,而且抗干扰能力强、使用便捷、可扩展性强、测量准确。 本文主要采用 AT89C51 单片机和 ADC0808 芯片制作的简易数字电压表, 可以采集 0~5V 和 5~10V 的模拟直流电压进行测量,其测量结果在液晶 LCD1602 上显示。 该设计硬件电路主要有三个模块组成:A/D 转换模块、 数据处 理模块及输出显示模块。数据处理由单片机 AT89C51 来完成,它主要把 ADC0808 传送来的数值经一定的数据处理,然后送至显示模块进行显示,同时 控制显示芯片 1602 的工作。 程序设计上有各模块初始化操作、 电压档位选择和 LCD1602 液晶显示程序等。
8
3. 系统程序设计
系统的主程序流程如图 3-1 所示:
开始
初始化
m>1000? N 接收并处理 数据
Y
选择量程
显示电压值
显示MAX
等待下一次数据
图 3-1
系统主程序流程图
本设计程序设计主要分为几个模块: 初始化程序设计、 A/D 采样程序设计、 测量参数数据处理程序设计、量程选择和报警程序设计、LCD1602 显示程序设 计。下面逐个介绍各个模块的程序设计。 3.1 初始化程序 所谓初始化,将利用到单片机内部各部件或扩展芯片进行初始工作状态设 定,其主要负责设置定时器模式、初始设定、开中断和打开定时器等,对于液 晶 1602 同样也要进行初始化,其中包括清除显示屏、显示开/关控制、功能设 置、进入模式设置等。其中部分初始化程序如下:
数字电压表的设计(DOC)
摘要数字电压表的设计是以AT89C51单片机为中央控制单元,通过ADC0809转换芯片与LCD1602液晶显示器等扩展模块,实现了精确测量直流电压并通过数字的方式显示的功能。
该设计主要实现了直流电压的测量,单片机通过ADC0809转换芯片获取需测量的电压并转换为数字信号,而LCD1602液晶显示器则是将单片机处理后的电压值在显示屏上显示出来,而且该电压表还可以通过手动来调节测量电压的量程。
而软件则通过C语言编程,将所有模块结合在一起完成数字电压表。
经过测试,各模块的功能均能正常实现,同时该电压表还具有操作简单,反应灵敏和测量精确等优点。
关键词:单片机;电压表; A/D转换器AbstractThe digital voltmeter is designed with an AT89C51 single-chip as its central control unit. By use of the ADC0809 converter chip and LCD 1602 display device. we can reali ze the function of accurate measurement of DC voltage.The design mainly realized DC voltage measurement.with the help of ADC0809,the microcontroller can obtain the volt age that we want to measure,and then convert it to the digital signal. The function of LC D1602 is display the result of the voltage.Moreover,you can adjust this voltmeter manua lly.The software is programmed by C language.All the modules are combined to realize the function of the digital voltmeter.After testing ,each module of the voltmeter is norm al.Besides ,the advantages of this voltmeter can be various.Such as the simple operation ,accurate measurement,and very sensitive response.Keywords: Micro Controller Unit;voltage meter;A/D Converters目录摘要 (I)Abstract ..................................................................................................................... I I 1 绪论 .. (1)1.1 课题概述 (1)1.1.1 数字电压表的发展历程 (1)1.1.2 国内外的发展现状与趋势 (1)1.2 课题的意义和目的 (3)1.3 本文所作的主要工作 (3)2 数字电压表的总体设计 (4)2.1 设计指标 (4)2.2 系统概述 (4)2.2.1 设计方案 (4)2.2.2 工作过程简介 (5)2.2.3 软件程序设计简介 (5)2.3 小结 (5)3 数字电压表的硬件设计 (6)3.1 A/D转换电路 (6)3.1.1 A/D转换芯片的选择 (6)3.1.2 ADC0809转换原理介绍 (6)3.1.3 ADC0809芯片介绍 (7)3.1.4 ADC0809与单片机的接口方法 (8)3.2 单片机介绍 (8)3.2.1 单片机介绍 (8)3.2.2 采用AT89C51的原因 (9)3.2.3 AT89C51芯片主要性能参数 (9)3.2.4 功能介绍 (9)3.2.5 芯片管脚介绍及分配 (10)3.3 电压显示器件 (11)3.3.1 1602LCD的基本参数及引脚功能 (12)3.3.2 LCD1602与AT89C51单片机之间的连接 (14)3.4 小结 (14)4 单片机最小系统的介绍 (15)4.1 复位电路 (15)4.1.1复位电路的用途 (15)4.1.2复位电路的工作原理 (15)4.2 晶振电路 (16)4.3 P0口的上拉电阻 (17)4.4 31脚EA/Vpp接电源 (17)5 数字电压表的软件设计 (18)5.1 软件系统整体设计 (18)5.1.1 C51简介 (18)5.1.2 程序流程图 (18)5.1.3 数据采集模块的设计 (19)5.1.4 数据处理模块的设计 (20)5.3 小结 (20)6 数字电压表的抗干扰设计 (21)6.1 硬件系统的可靠性与抗干扰设计 (21)6.1.1 供电系统抗干扰措施 (21)6.1.2 接地 (21)6.1.3 传输通道的抗干扰措施 (22)6.2 软件系统的可靠性与抗干扰设计 (22)6.3 小结 (23)7 电路制作及调试 (24)7.1 器件的选择 (24)7.2 电源电路的设计 (24)7.3 换量程电路的设计 (24)7.4 焊接 (25)7.4 系统调试及结果分析 (26)8 结论 (27)8.1 主要结论 (27)8.2 进一步工作及展望 (27)参考文献 (28)致谢 (29)附录A (30)1 绪论1.1 课题概述1.1.1 数字电压表的发展历程数字电压表简称DVM,它是采用数字化测量技术设计的电压表。
基于ADC0808电路设计的数字电压表
基于ADC0808/0809数字电压表的设计(下节试验制作万年历)作成:宗茂伟先看先成品电路:摘要:本文主要介绍基于单片机8051和ADC0808数模转换电路的制作目的:深入的学习软件的编写,初步的学习ADC电路在实际电路中的应用,加强动手能力。
从实际的电路学习联想到实际车载平台的应用。
一、设计思路:⑴根据设计要求,选择AT89C51单片机为核心控制器件。
⑵A/D转换采用ADC0808实现,与单片机的接口为P1口和P2口的高四位引脚。
⑶电压显示采用4位一体的LED数码管。
⑷LED数码的段码输入,由并行端口P0产生:位码输入,用并行端口P2低四位产生。
二:硬件平台:三、硬件介绍:STC8052就不用说了,下面主要说说ADC0808现实世界的物理量都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。
双积分式A/D 转换器具有抗干扰能力强、转换精度高、价格便宜等优点。
与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、ADC0808等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。
一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用[1]。
逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。
它利用内部的寄存器从高位到低位一次开始逐位试探比较。
转换过程如下:开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量[5]。
PCB项目说明书 用 ADC0832 设计的两路电压表(用 LCD1602显示)
利用单片机 STC89C52 与 ADC0832 设计一个两路电压表,将模拟信号 0~5V 之间的电压值转换成数字量信号,并在 LCD1602 显示屏上显示,通过虚拟电压表 观察 ADC0832 模拟量输入信号的电压值,LCD1602 实时显示相应的数值量。
项目要求: (1)LCD 显示清晰无鬼影不闪烁 (2) 程序设计中,要使 LCD 显示变化的电压
图 3-2 ADC0832 时序图
集成模数转换芯片 ADC0832 实现的 A/D 转换电路如图 3-2 所示。被测信号 由 ADC0832 模拟输入端输入,完成 A/D 转换后送入单片机,经相应处理后送出 显示。
4 液晶显示屏 LCD1602 简介
1602 液晶显示器它是一种专门用来显示字母、数字、符号等的点阵型液晶 模块。它有若干个 5*7 或者 5*11 等点阵字符位组成,每个点阵字符位都可以显 示一个字符。其为 5V 电压驱动,带背光,可显示两行,每行 16 个字符,内置 含 128 个字符的 ASC 字符集字库,只有并行接口,无串行接口。其中 D0~D7 与单片机的 P0.0~P0.7 相连接,RS 与单片机的 P2.0 相连接,R/W 与单片机的 P2.1 相连,E 与单片机 P2.2 相连。
当前地址指针的数值
原则上每次对控制器进行读写操作之前,都必须进行读/写检测,确保 SAT7 为 0。实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不 进行读/写检测,或只进行简短的延时即可。
c)数据指针设置见表 4-3。 控制器内部设有一个数据地址指针,用户可以通过它们访问内部的全部 80B 的 RAM。
电源地
2
VDD
电源正极
3
VO
液晶显示对比度调节端
0809,1602设计数字报警电压表(按键调节报警电压值)
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar H,M,L;uchar o;sbit KEY3 =P3^5;sbit LED =P2^0;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;uchar code dis1[] = {"0123456789CV:.V"}; uchar code dis2[] = {"0123456789WV:.V"}; //0809sbit START =P2^4;sbit EOC =P2^3;sbit OE =P2^2;sbit CLK =P2^1;uchar getdata=0,volt;uchar qian,bai,shi,ge;void adc0809(){START =0;START =1;START =0;while(EOC==0);OE=1;getdata =P1 ;OE =0;}void volt_result(){volt=getdata*500/255;}void dingshi() interrupt 3{CLK=~CLK;}void dschushihua(){TMOD=0x20;TH1=0xfb;TL1=0xfb;TR1=1;EA=1;}//延时函数void delay(int ms){uint i,TempCyc;for(i=0;i<ms;i++){TempCyc =70;while(TempCyc--);}}//测忙函数bit lcd_bz(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P0 & 0x80);LCD_EP = 0;return result;}//写指令void lcd_wcmd(int cmd){while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;P0 = (cmd&0x0f)<<4;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80);}/****************写数据函数************************/ void lcd_wdat(uchar dat){while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat ;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();_nop_();_nop_();P0 = (dat&0x0f)<<4;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}void lcd_init(){lcd_wcmd(0x38);delay(5);lcd_wcmd(0x0c);delay(5);lcd_wcmd(0x02);delay(5);lcd_wcmd(0x01);delay(100);}void xianshi1(){lcd_pos(4);bai=(volt*2)/100;shi=(volt*2)%100/10; ge=(volt*2)%10;lcd_wdat(dis1[10]);lcd_wdat(dis1[11]);lcd_wdat(dis1[12]);lcd_wdat(dis1[bai]) ;lcd_wdat(dis1[13]);lcd_wdat(dis1[shi]);lcd_wdat(dis1[ge]);}//按键中断void delay3(uint k) {uint p,q;for(p=k;p>0;p--){for(q=110;q>0;q--);}}void INT_init(){EX0=1;IT0=1;EX1=1;IT1=1;EA=1;}void data_in(void){H=o/10;M=o%10;}void L_count(){ if(KEY3==0) {delay3(1);if(KEY3==0){if(L==9){L=0;}else{L++;}} }}void xianshi2(){lcd_pos(0x44);lcd_wdat(dis2[10]); lcd_wdat(dis2[11]);lcd_wdat(dis2[12]);lcd_wdat(dis2[H]) ;lcd_wdat(dis2[M]);lcd_wdat(dis2[L]);lcd_wdat(dis2[14]);}//比较void comp(){ if(bai>H){LED=1;}elseif(bai==H&&shi>M) {LED=1;}elseif(bai==H&&shi==M) {if(ge>L){LED=1;}else{LED=0;}}else{LED=0;}}void main(){ lcd_init();INT_init();o=10;dschushihua();while(1){adc0809();volt_result();xianshi1();data_in();L_count();xianshi2();comp();delay(100) ;}}void int0() interrupt 0{delay3(10);if(INT0==0){if(o==50){o=0;}else{o++;}} }void int1() interrupt 2 { delay3(10);if(INT1==0){if(o==0){o=50;}else{o--;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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>。