utopia_xu

基于51单片机的电压表设计

0
阅读(2480)

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

2017-3-8

一,设计内容、技术条件和要求

1、量程:直流电压输入0~5V;

2、测量误差:不超过±0.1V;

3、测量结果显示:采用液晶显示模块。

二,设计所需器件:

1,AT89S52单片机;2,PCF8591 8位A/D转换模块;3,1602LCD液晶屏。

三,硬件设计:

1,AT89S52单片机系统:

QQ截图20170226111003.png

2,1602液晶屏:

RS引脚接单片机P2.0,RS=0:输入指令;RS=1:输入数据。

RW引脚接单片机P2.1,RW=0,向LCD写入指令或者数据;RW=1;从LCD读取信息。

使能信号E引脚接单片机P2.2,E=1;读取信息;E从1变为0时执行指令。

第7到第14引脚接单片机P0.0到P0.7,用来数据和指令的传输。




3,A/D转换电路

2,AD转换电路:

AD转换电路我们采用PCF8591芯片,PCF8591通过I2C中线通讯协议与单片机进行通讯。

I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。

I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。

PCF8591是一种具有I2C总线接口的A/D转换芯片。在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。

PCF8591是具有I2C总线接口的8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。这就是说,它既可以作A/D转换也可以作D/A转换。A/D转换为逐次比较型。在这里,我们主要使用他的A/D转换功能。

芯片的电源电压典型值为5V。

AIN0~AIN3:模拟信号输入端,一共有4组,在这里我们在AIN0即通道0接一个电位器,这样我们就能把模拟电压通过PCF8591转换位数字电压。

A0~A3:器件引脚地址端,通过设定器件地址,我们可以挂接多个器件。

VDD、VSS:电源端。(2.5~6V)

SDA、SCL:I2C总线的数据线、时钟线,SCL接单片机P3.4引脚,SDA接单片机P3.5引脚。

OSC:外部时钟输入端,内部时钟输出端,一般用不到。

EXT:内部、外部时钟选择线,使用内部时钟时EXT接地,一般用不到。

AGND:模拟信号地。

AOUT:D/A转换输出端。

VREF:基准电源端,在这里接+5V。

PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。飞利蒲公

司规定A/D器件地址为1001。引脚地址为A2A1A0,其值由用户选择,在这里A2A1A0全部接0,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。地址的最后一位为方向位R/W ,当主控器对A/D器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。

我们向PCF8591芯片发送控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主控器发送的第二字节。其格式如下所示


1.png

D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3。

D2自动增益选择(有效位为1)。

D5、D4模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效

当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:这里采用四路单端输入所以D5D4取00。最低两位时通道编号位,当对0通 /道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。

在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答…一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。

/******************************************************************** *name: 51单片机的电压表设计 *fuction:通过pcf8591A/D转换芯片,把模拟电压转换为数字电压,在液晶屏上面显示出来。 *other:误差0.1V, 范围0.00V~5.00V *version:v1.0 *author:xu沫尘 time:2017-3-1 ***************************************************/ /////////////////////////////////////////////////// #include #include //包涵__nop_(),1us延迟函数 #define uchar unsigned char #define uint unsigned int #definepcf8591_write 0x90 //pcf8591写指令 #definepcf8591_read 0x91//pcf8591读指令 sbit scl=P3^4;// 将p3.4口模拟时钟口 sbit sda=P3^5;// 将p3.5口模拟时钟口 sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit bf=P0^7; uchar dat=0;//the data of pcf8591 uchar dis[3]={0,0,0},dis1[]={"Voltage= . V"}; void delay(uint n)//delay n ms { uint i; for(i=0;i
       




















Baidu
map