单片机与0832 1602的电压表完整程序

合集下载

利用单片机、1602、LM331设计数字电压表

利用单片机、1602、LM331设计数字电压表

《单片机原理及应用》课程设计报告题目直流电压表的设计姓名专业班级 2011级电子信息工程指导教师日期目录一、设计任务与要求 (2)二、元器件清单及简介 (3)2.1 LM331 (3)2.2 1602字符型LCD简介 (5)三、设计原理分析 (8)四、设计中的问题及改进 (12)五、总结 (13)六、参考文献 (14)附录一、原理图 (14)附录二、源程序 (14)摘要在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。

而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。

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

由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。

传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。

采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。

数字电压表是诸多数字化仪表的核心与基础。

以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。

目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。

最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。

数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC 化),另一方面,精度也从0.01%-0.005%。

目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。

基于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命令,则必须先读取状态操作。

基于单片机的数字电压表代码

基于单片机的数字电压表代码
{
while((LCD_Busy_Check()& 0x80)==0x80);//忙等待
RS = 0;
RW = 0;
E = 0;
P0 = cmd;
delay4us();
E = 1;
delay4us();
E = 0;
}
//-----------向LCD写入一个字节的数据函数-----------------*/
#define uint unsigned int
sbit START=P2^3;
sbit EOC=P2^4;
sbit OE=P2^5;
void delay50us(uint m);//延时
uint adc0808_init(); // AD初始化
Байду номын сангаасvoid Refresh_show();
#endif
主程序:
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "LCD1602.h"
#include "ADC0808.h"
//---------------忙检查-------------------//
uchar LCD_Busy_Check()
void Write_LCD_Data(uchar dat)
{
while((LCD_Busy_Check()&0x80)==0x80);
RS = 1;
RW = 0;
E = 0;
P0 = dat;
delay4us();
E = 1;

基于51单片机的ADC0832数字电压表(仿真+程序)

基于51单片机的ADC0832数字电压表(仿真+程序)

仿真图:/*********************************包含头文件********************************/ #include <reg52.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位的值,如果不相同舍去。

单片机+1602液晶计跑表程序设计

单片机+1602液晶计跑表程序设计
record[order][1]=swmin;
record[order][2]=swsec;
record[order][3]=swmsec;
order1=order;
writerom(0x40|0x80);
recordscan1();
case 2:
if(swsurface==0) {swsec=0;swhour=0;swmin=0;swmsec=0;}
else
{
if(order1>0)
{
order1--;
recordscan();
}
}
}
}
}
}
void recordscan1()
{
write(tab[record[order1][0]/10]);
write(tab[record[order1][0]%10]);
write(':');
write(tab[record[order1][1]/10]);
}
break;
case 3:
if(swsurface==1)
{
swsurface=0;
if(order!=0)
order1=order-1;
writerom(0x40|0x80);
recordscan1();
case 1:
if(swsurface==0)TR0=!TR0;
else
{
if((order1+2)<or3;;
recordscan();
}
}
break;
if(swsec==60)

用单片机制作电压表

用单片机制作电压表

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

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

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

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

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

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

二、所需材料本电压表所需材料如下: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,稳定性较高,可以满足实际应用需求。

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

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

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

单片机课程设计报告:电压表(附程序)

单片机课程设计报告:电压表(附程序)

——电压表【课题】电压表【设计要求】设计一个量程可变的数字电压表,用3个LED数码管显示,电压表量程为0~200mV(显示0~200mV)、200mV~2V(显示0.2V~2V)。

【设计原理】一、实验电路图二、工作原理如上图所示,实验中主要用到的芯片有运算放大器、继电器、ADC0832、8951单片机及其外围设备。

电压表的量程为两档,0~200mV 和200mV~2V。

其相对应的运放的放大增益是25倍和2.4倍,这样即使是最大的输入其通过运放后的输出电压都会小于5V,其通过限幅电路后电压均为其真实值。

然后模拟输入电压由AD0832输入,经过模数转换后送给单片机。

由p0口输出字形,同时由p1.4的电平控制74LS573的锁存和直通状态。

P1.5、p1.6、p1.7控制字位。

P1.2控制继电器的工作状态,当P1.2低电平时,三极管工作在截止状态,继电器线圈无电流通过,继电器处于常闭状态,那么相对应的运放的放大增益为25倍。

而当P1.2为高电平时,三极管工作在饱和状态,继电器线圈有电流通过,产生电磁力将继电器的开关吸到常开状态,其对应的放大增益即变为2.4倍。

对于一个模拟输入,现将其放大2.4倍,然后由AD 输入并相应转化,如果它的输出要是小于0.5V ,也就是19H ,则选择此档位是不精确的,也说明此时的输入电压介于0~200mV 之间。

那么我们就需要让P1.2置低电平,将相应的放大倍数改成25以提高转换精度。

若其满足相应的条件则直接将其转换成BCD 码并直接送数显示即可。

实验中用到了模数转换器ADC0832,其引脚图如右图所示,ADC0832是8位逐次逼近型A /D 转换器, 单一正5V 电源供电,CS 为片选, CLK 提供串行输入/输出时钟信号,DO用于串行数字输出,CHO 和CHl 为双通道模拟输入端, 它可用软件设定为单端或差分输人。

在差分方式中,通道口地址的选择由DI 逐位输入,GND 是数字、模拟公共地,cc V (REP V )为芯片电源、参考电压公共端。

第15章 采用ADC0832的两路电压表设计

第15章 采用ADC0832的两路电压表设计

{Wr1602Cmd(0x80+0x03);
i=RdAdc0832(0);
//读取Adc0832 0通道的

i=(i*5000/255);
Wr1602Dat('C');
//显示Adc0832 0通道的

Wr1602Dat('H');
Wr1602Dat('0');
Wr1602Dat('=');
Wr1602Dat('0'+i/1000);//个位
// LCD1602初始化函数
{ delay_ms(20);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x06);
Wr1602Cmd(0x0c);
Wr1602Cmd(0x01); //清屏
Wr1602Cmd(0x80); //设置地址
Wr1602Dat('.');
Wr1602Dat('0'+i%1000/100); //小数点后一位
Wr1602Dat('0'+i%1000%100/10); //小数点后两位
Wr1602Dat('0'+i%1000%100%10); //小数点后三位
Wr1602Dat('V');
Wr1602Cmd(0xC0+0x03);
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=Hx;_nop_();_nop_();_nop_();_nop_();//写通道号位

51单片机驱动ADC0832模数转换程序lcd1602显示

51单片机驱动ADC0832模数转换程序lcd1602显示

51单片机驱动ADC0832模数转换程序-lcd1602显示/*这个芯应用不多*/#include ;#define uchar unsigned char#define uint unsigned intuchar Chan0Value,Chan1Value;sbit RS=P1^0; //1602各控制脚sbit RW=P1^1;sbit EN=P1^2;sbit Cs0832= P2^0;//0832各控制脚sbit Clk0832= P3^6;sbit Di0832= P3^7;sbit Do0832= P3^7;void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){int i,j;for(i=0;i;>;i;}for(i=0;i<8;i++)//从低到高取一次数{if(Do0832) Dat2|=0x01<<i;Clk0832=1; //下降沿有效Clk0832=0;}Cs0832=1;Di0832=1;Clk0832=1; //数据读取完成,释放所有数据线if(Dat1==Dat2)return Dat1; //校验两次数相等,输出}/*本程序与其他一般程序最大的不同就是要读两次一次从最高位到最低位,一次从最低位到最高位,两次所读值相等即为正常,可以输出*//******************************LCD1602*********** ***************************//*************************lcd1602程序**************************/void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x80);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void writevalue(uchar add,uchar dat) {wr_com(0x80+add);wr_dat(dat);}void zifuchuan(uchar *ch){while(*ch!=0)wr_dat(*ch++);delay1ms(20);}void main(void){lcd_init();while(1){Chan0Value=GetValue0832(0);delay1ms(100);Chan1Value=GetValue0832(1);wr_com(0x80);zifuchuan(&quot;Chanal 0:&quot;);writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan(&quot;Chanal 1:&quot;);writevalue(0x40+10,Chan1Value/100+0x30);writevalue(0x40+11,Chan1Value%100/10+0x30); writevalue(0x40+12,Chan1Value%100%10+0x30); delay1ms(1000);}}/*此程序只为调通ADC0832,没有对电压值进行转换要想得到准确电压值,请把Chan0Value和Chan1Value 的值乘以5再除以255即可。

ADC0832的数字电压表设计说明

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:艺,低功耗20mWADC0832 转换器芯片为20引脚,双列直插式封装。

该转换器由输入寄存器和DAC寄存器构成两级数据输入锁存。

使用时数据输入可以采用两级锁存(双锁存)形式,或单级锁存(一级锁存,一级直通)形式,或直接输入(两级直通)形式。

2. 方案设计2.1设计要求按系统要实现功能,设计必须达到以下的几个步骤的要求(1)主电路系统是由ADC0832单片机AT89C52和LCD显示屏组成。

(2)ADC083是模拟数字转换芯片,是将外侧电压信号转换成数字信号再通过AT89C52处理,再通过LCD显示出来(3)能测量0-5V的数字电压(4)测量误差不大于0.1V2.2设计方案2.1.1 单片机的选择本设计选用单片机AT89C52它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS位微处理器该器件采用ATME高密度非易失存储器制造技术制造,与工业标准的MCS-51指令系统及8052产品引脚兼容,功能强大、使用方便的AT80C52单片机适用于许多较为复杂的应用场合。

单片机数字电压表(带仿真图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(); }}。

用LCD1602和ADC0832设计的两路电压表

用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级,可以适应一般的模拟量转换要求。

单片机代码-AD转换电压在1602中显示

单片机代码-AD转换电压在1602中显示

#include<reg52.h>#include<intrins.h>//为了使用这个头文件中的_nop_()延时函数sbit sda=P2^0;//SDA线sbit scl=P2^1;//SCL线sbit rst=P2^4; //关掉时钟芯片输出sbit hc573_sg_le=P2^6; //对用于锁存段数据的573锁存LE端进行定义sbit hc573_bit_le=P2^7;//对用于锁存位选通数据的573锁存LE端进行定义sbit lcd_rs=P1^0; //1602数据/命令选择端,高电平执行数据操作,低电平执行命令操作sbit lcd_rw=P1^1;//1602读/写控制端高电平读,低电平写sbit lcd_en=P2^5;//1602读写控制使能信号,它为高脉冲信号才可执行读写操作sbit sta7=P0^7;//1602忙信号检测位,为1则忙,需等待,为0表示空闲void delay_ms(unsigned int t) //tms的延时函数{unsigned int a,b;for(a=0;a<t;a++){for(b=0;b<113;b++){;}}}void _nop5_()//5个机器周期的延时,大约延时5us{_nop_();_nop_();_nop_();_nop_();_nop_();}void iic_start()//主机发送开始信号的函数{scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,准备产生开始信号scl=1;//SCL线拉高_nop5_(); //SDA线高电平持续5us,以符合开始信号定义的要求(>4.7us)sda=0;//SDA线拉低,产生开始信号_nop5_();//SDA线低电平持续5us,以符合开始信号定义的要求(>4us)}void iic_stop()//主机发送停止信号的函数{scl=0;//SCL线拉低,以便让SDA线准备变化sda=0;//SDA线拉低,准备产生停止信号scl=1;//SCL线拉高_nop5_(); //SDA线低电平持续5us,以符合停止信号定义的要求(>4us)sda=1;//SDA线拉高,产生停止信号_nop5_(); //SDA线的高电平持续5us,以符合停止信号定义的要求(>4.7us)}void iic_ack()//检测从机应答信号的函数{unsigned char i;i=255;scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,准备检测从机的应答信号while(sda==1)//当SDA为高电平时,则等待从机的应答将SDA拉低{if(i>0)i--;else return; //如果i自减到0了,从机还没响应,则不再等待,返回}//这种情况极少发生,一般是从机器件出问题了才会发生scl=1;//从机已经应答,将SDA线拉低了_nop5_();//SDA线的低电平持续5us,以符合应答信号定义的要求(>4us)scl=0;//SCL线拉低,以便让从机把SDA线释放}void send_ack()//主机给从机发送应答信号{scl=0;//SCL线拉低,以便让SDA线准备变化sda=0;//SDA线拉低,即将发送应答信号给从机scl=1;//SCL线拉高,将应答信号发送过去_nop5_();//SDA线的低电平持续5us,以符合应答信号定义的要求(>4us)scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//释放SDA线}void iic_send_no_ack()//主机给从机发送非应答信号{scl=0;//SCL线拉低,以便让SDA线准备变化sda=1;//SDA线拉高,即将发送非应答信号给从机scl=1;//SCL线拉高,将应答信号发送过去_nop5_();//SDA线的高电平持续5us,以符合非应答信号定义的要求(>4us)}void iic_write(unsigned char dat)//主机向从机写操作函数{unsigned char i;for(i=0;i<8;i++){scl=0;//SCL线拉低,以便让SDA线准备变化sda=(bit)(0x80&dat); //取字节数据的最高位,发送到SDA线dat=dat<<1;//发送的数据都是由高位到低位顺序发送的,所以要将所//需发送的那位移到数据的最高位,以发送到SDA线上scl=1;//SCL线拉高,数据被发送过去}}unsigned char iic_read()//主机向从机读操作的函数{unsigned char i;unsigned char dat; //定义一个字节变量,用来存储读出的从机数据dat=0;for(i=0;i<8;i++){dat=dat<<1;//将位数据不断地往高位移动,将接收到的位数据转换为字节数据scl=0;//SCL线拉低,以便让SDA线准备变化dat=dat|(unsigned char)sda;//将接收到的位数据强制转换成字节数据,并存到dat 中scl=1;//SCL线拉高,接收下一位数据}return dat;//数据接收完毕,带数据返回}void lcd_busy_check(void)//1602忙信号检测,忙则等待{P0=0xff;do{lcd_rs=0;//读状态操作,为0lcd_rw=1;//读操作为1lcd_en=0;lcd_en=1;//读状态,需为高电平}while (sta7==1);//如果为1则忙,等待...直到为0lcd_en=0;}void lcd_write_cmd(unsigned char cmd) //液晶写命令函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=0;//执行命令操作,为0lcd_rw=0;//写操作,为0P0=cmd;//送指令到液晶数据端口P0,准备执行命令_nop_();//这是一个延时函数,可延时一个机器周期,它在“intrins.h”中lcd_en=1;//高电平,指令送入液晶控制器_nop_();//保持一会儿,使指令可靠地送入液晶控制器lcd_en=0;//低电平,执行命令}void lcd_write_data(unsigned char dat) //液晶写数据函数{lcd_busy_check();//每次操作之前都要进行忙信号检测lcd_rs=1;//执行数据操作,为1lcd_rw=0;//写操作,为0P0=dat;//送数据到液晶数据端口P0,准备执行数据操作_nop_();lcd_en=1;//高电平,数据送入液晶液晶数据RAM_nop_();//保持一会儿,使显示数据可靠地送入液晶数据RAMlcd_en=0;//低电平,显示数据}void lcd1602_init()//液晶显示初始化操作{P0=0x00;hc573_sg_le=0;//关闭HC573使数码管不显示hc573_bit_le=0;lcd_en=0;//为0,为实现高脉冲作准备lcd_write_cmd(0x38);//设置为5x7显示lcd_write_cmd(0x0c);// 打开显示-显示光标-光标闪烁lcd_write_cmd(0x6);//地址加一,光标右移,整屏显示不移动lcd_write_cmd(0x01);//清屏}/*--这个函数的作用是:将读到的8591中的数据换算为电压值的个位值,----并转换为对应的ASCII码,用以在液晶中显示*/unsigned char data1_convert(unsigned char dat_temp){unsigned char data1;data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值data1=data1+48; //转换为对应的ASCII码,因为0对应ASCII码的48,以此类推return data1;}/*--这个函数的作用是:将读到的8591中的数据换算为电压值的小数点后第一位的值,----并转换为对应的ASCII码,用以以在液晶中显示*/unsigned char data0_convert(unsigned char dat_temp){unsigned char data0,data1;data1=(unsigned char)(((float)dat_temp/255)*5);//换算为电压值的个位值data0=(unsigned char)((((float)dat_temp/255)*5-data1)*10);//换算为为电压值的小--//--数点后第一位的那个值data0=data0+48;return data0;//转换为对应的ASCII码}void main(){unsigned char dat;//用于接收从8591中读到的数据lcd1602_init();rst=0;//关闭DS1302时钟芯片,避免引起干扰hc573_sg_le=0;hc573_bit_le=0;lcd_write_cmd(0x80);lcd_write_data('C');lcd_write_data('H');lcd_write_data('1');lcd_write_data(':');lcd_write_cmd(0x85);lcd_write_data('.');lcd_write_cmd(0x87);lcd_write_data('V');//上面的这些都是为了在1602中显示"CH1: : V"while(1){iic_start();iic_write(0x90);//对8591进行写操作iic_ack();iic_write(0x01);//设置为4路独立信号输入,并关闭通道自动加1,只用通道1iic_ack();iic_start();//重新开始,为读数据作准备iic_ack();iic_write(0x91);//对8591进行读操作iic_ack();dat=iic_read();//这还只是一个8位的数据(需进一步转换为实际电压值)iic_send_no_ack();iic_stop();lcd_write_cmd(0x84); //将要显示的字符显示在此地址处lcd_write_data(data1_convert(dat));//显示电压的整数部分lcd_write_cmd(0x86);//将要显示的字符显示在此地址处lcd_write_data(data0_convert(dat)); //显示电压的小数部分}}。

基于ADC0832数字电压表

基于ADC0832数字电压表

阿坝师范高等专科学校电子信息工程系课程设计基于ADC0832数字电压表学生姓名任银鹏专业名称电子信息工程技术班级电信班学号20113026基于ADC0832数字电压表一、设计要求设计一个在单片机AT89S52作用下基于ADC0832数字电压表.二、系统设计方案1. 模块图2. 模块作用该电压表由单片A/D转换器构成,在很大的电压情况下,电压表去测量时会对其并联很大的电阻分掉高压,然后再进行测量,这本来很大的电压,到后来测出来的电压就会很小,这就是A/D转换实现低压电压表测量高压三、硬件原理1.LCD1602图3.1 LCD1602外观如图3.1 LCD1602外观,从LCD1602参数手册知道芯片工作电压为4.5~5.5V,工作电流20mA。

模块最佳工作电压为5V。

引脚作用说明如下表3.1:表3.1引脚作用说明从参数手册知道LCD1602与单片机8051系列连接方式如图3.2所示,LCD1602引用电路如图3.3:图3.2 LCD1602与单片机8051系列连接方式图3.3 LCD1602引用电路如图3.3 LCD1602引用电路,单片机P2口与LCD1602的7-14脚连接,单片机14脚与LCD1602的6脚连接,单片机15脚与LCD1602的4脚连接。

2. ADC0832ADC0832具有8位分辨率;双通道A/D转换;输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在0-5V之间,工作频率为250KHz,转换时间为32us;一般功耗仅为15Mw的特点。

ADC0832芯片引脚说明如图3.4:图3.4ADC0832芯片引脚说明:cs:片选使能,低电平芯片使能;cho:模拟输入通道0,或作为IN+/-使用;ch1:模拟输入通道:1,或作为IN+/-使用;GND:芯片参考0电位;DI:数据信号输入,悬着通道控制;DO:数据信号输出,转换数据输出;CLK:芯片时钟输入;Vcc/REF:电源输入及参考电压输入。

单片机课程设计数字电压表参考程序

单片机课程设计数字电压表参考程序

/************************************************************************ADC0809数据电压表,采用数码管显示,显示000~255* 硬件连接:START,ALE接P2.0,EOC-P2.1 OE-P2.2 CLK -P2.3,CH0接模拟电压输入TEST0*ADDA、ADDB、ADDC接P2.4, P2.5,P2.6,*数据D0--D7依此对应连接P1.0-P1.7*数码管段码接P0口*数码管位码接P3口******************************************************************************* */#include <reg52.H>#define uint unsigned int#define uchar unsigned char#define DIGI P0 //宏定义,将P0口定义为数码管#define SELECT P3 //宏定义,将P3定义为数码管选择口sbit START = P2^0;sbit EOC = P2^1;sbit OE = P2^2;sbit CLK = P2^3;sbit ADDA = P2^4; // ADDA接P2.4sbit ADDB = P2^5; // ADDB接P2.5sbit ADDC = P2^6; // ADDC接P2.6uchar getdata; //定义变量接受AD转换的8位二进制void delay() //延迟函数{ uint ii=200; //若发现数码管闪烁,调节这里即可while(ii--);}uchar disbuffer[8]={0,1,2,3,4,5,6,7}; //定义显示缓冲区void display( ){ uchar i=0,temp,i1;uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字段码表uchar select[]={0x01,0x02,0x04,0x00,0x00,0x00,0x00,0x00};//位选码for(i=0;i<3;i++) //8个数码管轮流显示{ temp= disbuffer[i];i1 = codevalue[temp];DIGI = i1; //选择第i个数码管SELECT = select[i]; //显示idelay();} }/************************************************///定时器初始化void init(){TMOD= 0x12;// 定时器0工作方式2,定时器1工作方式1TH0=246;TL0=246;TH1=(65536-20000)/256;TL1=(65536-20000)%256;EA=1;ET0=1;ET1=1;TR1=1;TR0=1;}/***********************************************///软件延时产生ADC0809的时钟void clk() interrupt 1{CLK=(~CLK);}void displayint(void) interrupt 3 //定时/计数器1中断,数码管显示{TH1=(65536-20000)/256;TL1=(65536-20000)%256;display( );}/************************************************///AD转换函数unsigned char ADC(){char value;ADDA =0;ADDB =0;ADDC =0;START=0;START=1; //地址锁存START=0; //开始转换while(EOC==0);//等待转换结束OE=1;value=P1;OE=0;return value;}/************************************************/void main(){uint temp1;init();while(1){getdata = ADC();//输出转换得到的数据temp1=getdata; //暂存转换结果disbuffer[2]=getdata/100; /*将转换结果转换为10进制数放显示缓冲区*/temp1=temp1- disbuffer[2]*100;disbuffer[1]=temp1/10;temp1=temp1- disbuffer[1]*10;disbuffer[0]=temp1;}}1.在它的基础上,显示用LCD1602或12864;2.在它的基础上,加按键选择实现多路数字电压表。

1602电压表

1602电压表

sbit RS=P2^0; //LCD1602指令数据选择端
sbit RW=P2^1; //LCD1602读写选择端
sbit E=P2^2; //LCD1602使能端
//延时子程序
void a;
for(;t>0;t--)
{
CLK=!CLK;
}
}
uint8 ADC_Conventer()
{
uint8 ad;//局部变量
ST=1; //启动转换,并锁存地址
delay(1);
ST=0;
delay(10);
while(EOC==1); //等待转换结束
while(EOC==0);
OE=1; //使能数据输出
#define ADC_DataPort P1 //ADC0809数据口D0-D7
sbit OE=P3^6; //ADC0809输出使能
sbit ST=P3^5; //转换开始控制
sbit CLK=P3^7; //ADC0809时钟
sbit EOC=P3^2; //ADC0809转换结束信号
{
while(*str!='\0') //终止符
{
Write1602(*str,DAT);
str++;
}
}
//初始化子程序
void Init()
{
P1=0XFF; //ADC0809数据口
ST=0; //开始信号初始化
OE=1; //始终输出
CLK=0; //始终端口初始化
Write1602(0x38,CMD); //8位数据格式,两行显示,5*7点阵

单片机对1602液晶的驱动

单片机对1602液晶的驱动

单片机对1602液晶的驱动
液晶的操作:
1602液晶只能显示ASCI,今天把1602液晶驱动起来,液晶操作要比数码管简单
液晶的基本操作时序:
1.1读状态:输入:RS = L,RW =H,E = H输出D0~D7
1.2写指令:输入:RS = L,RW = L,D0~D7指令码,E = 高脉冲,输出:无;
RS是数据命令选择端(H/L);
1.3读数据:输入RS= H,RW=H,E=H
1.4写指令:输出,RS = L,RW = L,D0~D7=数据,E=高脉冲
注意:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0,可以用简单的延时来代替
初始化设置
显示模式设置
指令码:00111000 功能16*2显示,5*7点阵,8为数据接口0x38的指令
显示开/关光标的设置
因此左移和右由N和S设置
数据指针的指令码
80H+地址码(0-27H,40H到67H)
其他设置
指令码01H 功能是显示清屏:1数据指针清零,2所有显示清零
02H显示回车:1数据指针清零
电路图如图所示:
示例代码:动态显示
#include
#include。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CALL INIT_LCD ;初始化 LCD
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
CLR LCD_RW
JMP START
;===================================================
START: MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
C1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL SET_LCD
START1: CALL AD_CONV ;AD转换
CALL AD_CHULI ;数据处理
CALL LCD_CONV ;数据显示
JMP START1
AD_CLK EQU P1.0 ;ADC0832 时钟端
AD_DAT EQU P1.1 ;ADC0832 数据端
AD_CS EQU P3.4 ;ADC0832 片选信号
LCD_RS EQU P2.0 ;LCD 数据/命令选择端
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
;=====================================================
;写数据使能子程序
INC LCD_X ;设置位置
MOV A,#'.'
MOV B,LCD_X
CALL LCDP2 ;显示小数点
MOV A,R5 ;加载数据
;---------------------------------------
SHOW_DIG2A:
MOV B,#16
DIV AB
MOV A,B ;只取整数部分的个位
ADD A,#30H ;转换为ASCII码
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;=================================================
;ASCII 转换并在第二行显示数字子程序
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
DELAY0: MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
CALL WCOM
CALL DELAY1
RET
;-------------------------------------------------
DELAY1: ;延时5MS
MOV R6,#25
JMP FILL ;继续填入字符
RET
;---------------------------------------------------
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
;-----------------------------------------------------
; LCD 接口初始化
;-----------------------------------------------------
INIT_LCD:
MOV A,#38H ;双列显示,字形5*7点阵
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
;==================================================
;在LCD的第一行或第二行显示信息字符
;=================================================
LCD_CONV:
MOV A,R4 ;加载数据
MOV LCD_X,#10 ;设置位置
CALL SHOW_DIG2A ;显示数据
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;======================================================
; 写指令使能子程序
MOV DPTR,#INFO2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
;-----------------------------------------------------
INFO1: DB "DIGITALVOLTMETER",0 ;LCD 第一行显示信息
INFO2: DB " VOLTAGE: V ",0 ;LCD 第二行显示信息
;-----------------------------------------------------
LCDP2:
PUSH ACC ;入栈保护A
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;=====================================================
WDATA:
MOV P0,A
SETB LCD_RS
CLR LCD_RW
INC LCD_X ;设置位置
CALL SHOW_DIG2B ;显示数据
RET
;---------------------------------------
;整数部分转换为ASCII码,送显示
;只显示一位数
;==================================================
LCD_SHOW:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
相关文档
最新文档