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

毕业设计题目用ADC0832设计的两路电压表学生姓名王进学号 ********** 所在院(系) 物理与电信工程学院专业班级电信1101 指导教师杨创华完成地点陕西理工学院用ADC0832设计的两路电压表王进(陕理工学院电子信息科学与技术专业1101班级,陕西汉中723000)指导教师:杨创华[摘要]:本设计由A/D转换、数据处理及显示控制等组成,测量0~5V范围内的输入电压值,由显示器1602显示,最大分辨率0.1V,误差±0.05V。
数字电压表的核心为AT8051单片机和ADC0832 A/D转换集成芯片。
数字电压表(Digital Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高,抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
于此同时,由DVM扩展而成的各种通用及专用数字仪器,也把电量及非电量测技术提高到崭新水平[关键字]:AT8051单片机;ADC0832;1602液晶显示屏Two voltage meter designed by ADC0832Wang jin(Class1101,Major Electronic information science and technology,Shaanxi University of Technology,Hanzhong 723000,Shaanxi)Tutor: Yang ChuanghuaAbstract:The design is composed of A/D conversion, data processing and display control, etc., and the input voltage from 0 to 5V is measured, and the maximum resolution 0.1V is 1602, and the error is + 0.05V. The core of the digital voltmeter is A T8051 microcontroller and A/D ADC0832 conversion chip. Digital voltage meter (digital voltmeter) referred to as DVM, it is using digital measuring technology, the continuous analog (DC input voltage conversion into a non continuous, discrete digital form and the instrument display. The traditional analog voltage table single function, low precision, unable to meet the needs of the digital age, using the singlechip digital voltage meter, by the high precision, strong anti-interference ability, expansion and strong, easy to be integrated, but also communicate with the PC in real time. At present, composed of various monolithic A / D converter digital voltage meter, has been widely used in electronic and electrical measurement, industrial automation instrument, automatic test system, intelligent measurement field, showing a strong vitality. At the same time, the variety of general and special digital instruments made by DVM, also can improve the power consumption and the non - electric measurement technology to a new level.Key words: A T8051SCM; ADC0832;1602 LCD screen目录引言 (3)1数字电压表设计两种方案 (4)1.1 由数字电路及芯片构建 (4)1.2 由单片机系统及A/D转换芯片构建 (4)2原器件介绍 (4)2.1单片机8051 (4)2.1.1 8051单片机引脚图与引脚功能简介 (4)2.1.2 8051内部结构 (5)2.2 ADC0832简介 (7)2.3 LCD1602液晶显示屏 (10)3设计方案 (13)4系统硬件电路的设计 (14)4.1 单片机系统 (14)4. 2 时钟电路 (14)4. 3 复位电路 (15)4. 4 LED显示电路 (15)5软件设计 (15)5.1 主程序 (16)5.2 A/D转换子程序 (16)5.3 显示子程序 (16)5.4 总流程图 (16)总结 (18)致谢 (19)参考文献 (20)附录A (21)仿真图 (21)附录B (22)程序 (22)引言数字电压表(Digital Voltmeter)是在50年代初,60年代末发展起来的电压测量仪表,简称为DVM,它运用的是数字化的测量技术,能够把连续的模拟量,也就是连续的电压值转变为不连续的数字量,加以数字处理然后再通过显示器件显示出来。
单片机与0832 1602的电压表完整程序

CALL DELAY1
MOV DPTR,#INFO1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
;---------------------------------------------------
;在 LCD 第二行指定位置显示字符
;(A)=ASCII 数据, (B)=位置变量
;---------------------------------------------------
;====================================================
; LCD 初始化设置
;====================================================
SET_LCD:
CLR LCD_EN
LCD_RW EQU P2.1 ;LCD 读/写选择端
LCD_EN EQU P2.2 ;LCD 使能信号
LCD_X EQU 20H ;LCD 地址变量
ORG 0000H
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;=====================================================
WCOM:
MOV P0,A
CLR LCD_RS
ADC0832的数字电压表设计说明

目录1.引言 (1)2.方案设计 (1)2.1设计要求 (1)2.2设计方案 (1)3.硬件设计 (2)3.1单片机最小系统 (2)3.2显示驱动部分 (2)3.3转换电路 (3)3.4单片机驱动部分 (3)4.软件设计 (4)4.1软件流程 (4)4.2子程序模板 (5)5实验结果与讨论 (5)5.1实验仿真 (5)5.2结果讨论 (5)6心得体会 (6)7参考文献 (13)8附录8.1程序 (7)8.2 原理图 (7)1.引言随着片机技术的飞速发展,,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发肢和社会信息化程度的提商,人们为了寻求最好的科技,为了方便人类在使用科技产品的快速性,准确性。
例如数字电压表能够准确的,快速的量出电压。
利用ADC0832和AT89C52的结合再通过LCD来显示出来。
ADC0832是一个8位D/A转换器。
单电源供电,从+5V~+15V均可正常工作。
基准电压的围为±10V;电流建立时间为1μS;CMOS工艺,低功耗20mW。
ADC0832转换器芯片为20引脚,双列直插式封装。
该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。
使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。
2.方案设计2.1设计要求按系统要实现功能,设计必须达到以下的几个步骤的要求(1)主电路系统是由ADC0832,单片机AT89C52和LCD显示屏组成。
(2)ADC0832是模拟数字转换芯片,是将外侧电压信号转换成数字信号再通过AT89C52处理,再通过LCD显示出来(3)能测量0-5V的数字电压(4)测量误差不大于0.1V2.2设计方案2.1.1单片机的选择本设计选用单片机AT89C52它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS8位微处理器该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令系统及8052产品引脚兼容,功能强大、使用方便的AT80C52单片机适用于许多较为复杂的应用场合。
基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)

基于单片机的数字电压表制作——ADC0832模数转换应用程序(C语言)主要部件:AT89S51 ADC0832 八段数码管关键字:ADC0832程序C语言数字电压表本文所描述的数字电压表是利用ADC0832模数转换芯片完成的。
该芯片能将0~5V的模拟电压量转换为0说实在话,量程只有5V的电压表没有什么实际的意义,而且也没有人无聊到自己会去做一个没有意义的以后做真正有用的电路打下基础。
而且,对于那些做毕业设计的同学也是一种参考。
这也就是本文的意ADC0832的资料百度一下可以找到一大堆,我就不在这里赘述了。
这里只给出连接图。
以下是程序部分:该程序是本人自编的,经测试可用,但不保证程序的可靠性及稳定性。
若有转载请标明出处。
如果有同学将本程序烧写到单片机里却不能正常工作的,请注意以下三点:1、是否将端口重新定义。
每个单片机开发板的引脚连接都是不一样的,若不加修改直接把程序烧写到2、是否正确选择通道值。
ADC0832有两个模拟输入端口(也就是我说的通道),你要先弄清楚你用的是默认使用0通道,如果0通道不行就改成1通道,反正不是0通道就是1通道。
3、如果你做的电压表在保证电路连接正确且没有以上两点问题的情况下,还是不能正常工作,请将程问题。
我有两个单片机开发板,其中一个必须要把那一行删掉才能工作。
这说明ADC0832读出的前8位与理。
我不知道到底是硬件还是软件出了问题,特此把这种现象标明。
若有哪位同学知道其原因的还请多/***********************************************************************************//*简易数字电压表制作——ADC0832模数转换应用程序(C语言版)*//*目标器件:AT89S51/*晶振:12.000MHZ/*编译环境:Keil uVision2 V2.12/***********************************************************************************//*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^4;sbit DATI = P3^3;sbit DATO = P3^3;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/**************************************************************************** 函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/ unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。
单片机数字电压表(带仿真图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(); //显示数值}}。
adc0832数字电压表(程序+仿真图)

adc0832数字电压表(程序+仿真图)仿真图:/*********************************包含头文件********************************/#include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED 段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };/**************************************** ************************************函数功能:AD转换子程序入口参数:CH出口参数:dat***************************************** ***********************************/unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。
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(); }}。
用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级,可以适应一般的模拟量转换要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习情境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命令,则必须先读取状态操作。
如果没有进行状态检查,则T6963C 不能正常操作,就是延时后也不行。
当硬件中断发生在地址计算周期期间时(每一行的最后),如果MSB=0命令在此期间发送给T6963C,则T6963C进入等待状态。
如果在下一个命令到来之前没有进行状态检查操作,则很有可能数据与命令都无法到达。
a) 一个数据情况b) 两个数据情况图2 命令发送步骤(2)数据发送在使用T6963C时,都是先发送数据,后发送命令。
(3)命令发送步骤,见图2。
当发送的数据多于两个时,最后一个数据有效。
3.命令定义LCD160128液晶显示器能够显示显示10个(/行)X8共120个(16 X 16点阵)的中文字符,共有13条操作指令。
我们主要学习其具体的用法。
表3 T6963C控制命令码表命令编码数据1 数据2 功能二进制十六进制寄存器设置0010 0001 0x21 X地址Y地址设置光标位置0010 0010 0x22 偏移地址数据00H 设置CGRAM偏移地址0010 0100 0x24 地址低8位地址高8位设置地址指针设置控制字0100 0000 0x40 地址低8位地址高8位设置文本区起始地址0100 0001 0x41 列数00H 设置文本区宽度0100 0010 0x42 地址低8位地址高8位设置图形区起始地址0100 0011 0x43 列数00H 设置图形区宽度模式设置1000 x000 0x80 -- -- 逻辑“或”模式1000 x001 0x81 -- -- 逻辑“异或”模式1000 x010 0x82 -- -- 逻辑“与”模式1000 x011 0x83 -- -- 文本特性模式1000 0xxx Bit3 =0时,内部CG ROM模式内部CG ROM模式1000 1xxx Bit3 =1时,外部CG RAM模式外部CG RAM模式显示模式1001 0000 0x90 -- -- 关闭显示1001 xx10 Bit0为光标闪烁显示开关光标显示,闪烁关闭1001 xx11 Bit1为光标显示开关光标显示,闪烁显示1001 01xx Bit2为文本显示开关文本显示,图形关闭1001 10xx Bit3为图形显示开关文本关闭,图形显示1001 11xx 文本显示,图形显示光标形状选择1010 0000 0xA0 -- -- 1行(光标占的行数)1010 0001 0xA1 -- -- 2行1010 0010 0xA2 -- -- 3行1010 0011 0xA3 -- -- 4行1010 0100 0xA4 -- -- 5行1010 0101 0xA5 -- -- 6行1010 0110 0xA6 -- -- 7行1010 0111 0xA7 -- -- 8行数据自动读/写命令1011 0000 0xB0 -- -- 数据自动写设置1011 0001 0xB1 -- -- 数据自动读设置1011 0010 0xB2 -- -- 数据自动读/写结束数据读/写1100 0000 0xC0 数据-- 数据写,地址加1 1100 0001 0xC1 -- -- 数据读,地址加1 1100 0010 0xC2 数据-- 数据写,地址减1 1100 0011 0xC3 -- -- 数据读,地址减1 1100 0100 0xC4 数据-- 数据写,地址不变1100 0101 0xC5 -- -- 数据读,地址不变屏读命令1110 0000 0xE0 -- -- 屏读命令屏拷贝命令1110 1000 0xE8 -- -- 屏拷贝命令位置位/清除1111 0xxx 0xF0 -- -- Bit3 =0时,位清除;1111 1xxx -- -- -- Bit3 =1时,位置位;1111 x000 -- -- -- Bit0(LSB)1111 x001 -- -- -- Bit11111 x010 -- -- -- Bit21111 x011 -- -- -- Bit31111 x100 -- -- -- Bit41111 x101 -- -- -- Bit51111 x110 -- -- -- Bit61111 x111 -- -- -- Bit7(MSB)4.各指令功能详细分析在T6963C指令中有的指令需要参数的补充,T6963C指令参数的输入是在指令代码写入之前。
下面是T6963C指令写入的流程图。
图3 T6963C指令写入的流程图(1)读状态字(read status)格式:T6963C的状态字由7位标志位组成,它们是:1、当计算机写指令或一次读/写数据时,S0和S1要同时有效,即“准备好”状态。
2、当计算机使用自动读/写功能时,S2或S3将取代S0和S1作为标志位,此时计算机要判断他是否有效。
3、S6标志是考察T6936C屏读或屏拷贝执行情况的标志位。
4、S5和S7表示控制器内部运行状态,在T6936C的应用上不会使用它们。
对T6936C的软件操作每一次之前都要进行判“忙”,只有有不“忙”状态下计算机对T6936C的操作才有效。
(2)地址指针设置(Register set)命令编码HEX. 功能表述数据1 数据20010 0001 21H 设置光标位置X地址Y地址0010 0010 22H 设置CGRAM偏移地址偏移地址数据00H0010 0100 24H 设置地址指针地址低8位地址高8位设置光标位置(21H)光标位置由X、Y地址来确定,光标的移动只能用该命令实现。
从MPU读写数据是不会改变光标位置的。
X、Y的值由下面指定:X地址:00H~4FH(低7位有效)(0~80列)Y地址:00H~1FH(低5位有效)(0~32行)a.单屏幕(X地址:00H~4FH)Y地址:00H~0FHb.双屏幕(X地址:00H~4FH)上屏幕Y地址:00H~0FH下屏幕Y地址:10H~1FH设置CGRAM偏移地址(22H)偏移寄存器用来确定外部字符生成RAM(CG RAM)区域起始位置,T6963C使用如下16位地址总线:当T6963C配有外部字符生成器时,字符编码80H~FFH分配给内部字符生成器。
在外部字符生成模式下,字符编码00H~7FH分配给外部字符生成器。
??16位地址的高5位定义了外部显存CG RAM区域的起始地址,随后的8位表示字符的编码。
在内部CG ROM模式下,字符编码00H~7FH代表预定义内部CG ROM字符,而字符编码80H~FFH代表用户自定义的外部CG RAM字符。
在外部CG RAM模式下,所有256个00H~FFH编码都可代表用户自定义字符。
最低3位表示8行中的1行(8点)定义了字符的形状。
显示缓存地址与偏移寄存器的关系列表偏移地址数据CG RAM hex. 地址(Start to end)00000 0000~07FFH00001 0800~0FFFH00010 1000~17FFH11100 E000~E7FFH11101 E800~EFFFH11110 F000~F7FFH11111 F800~FFFFH(例1)偏移寄存器02H字符编码80H字符生成RAM起始地址0001 0100 0000 00001 4 0 0 H(例2)显存数据与显示字符对应关系γ与ζ通过字符生成RAM显示。
设置地址指针(24H)设置地址指针命令用于指定读写外部RAM的起始地址。
设置地址指针的流程图如下所示:(3)设置控制字命令设置文本区起始地址(40H)用于文本显示的显示缓存区起始地址由该命令确定,文本起始地址指得是最上端和最左端位置。
显存地址与显示位置的对应关系TH:文本起始地址TA:文本区宽度(列数)CL:固定列数(硬件确定),可编程引脚确定。
(例)文本起始地址0000H文本区宽度(列)0020H(32列)MD2 = H, MD3 = H 32列DUAL# = H, MDS = L , MD0 = L, MD1 = H 4行(4行×32列)设置图形区起始地址(42H)用于图形显示的显示缓存区起始地址由该命令确定,图形起始地址指得是最上端和最左端位置。
显存地址与显示位置的对应关系GH:图形起始地址GA:图形区宽度(列数)CL:固定列数(硬件确定),可编程引脚确定。
(例)图形起始地址0000H图形区宽度(列)0020H(32列)MD2 = H, MD3 = H 32列DUAL# = H, MDS = L , MD0 = H, MD1 = H 2行设置文本区宽度(41H)文本区宽度(列数)由硬件确定,该命令可以用于调整文本显示列数。
(例)LCD大小20列,4行;文本区起始地址0000H文本区0014H(20列)MD2 = H, MD3 = H 32列DUAL# = H, MDS = L , MD0 = L, MD1 = H 4行设置图形区宽度(43H)图形区宽度(列数)由硬件确定,该命令可以用于调整图形显示列数。