单片机数字电压表设计

摘要:

本设计中利用STC89C52单片机制作了一个简单的数字电压表,主要通过A/D转换器XPT2046把输入的模拟信号即电位器的电压值转换成数字信号,送到1602液晶进行数据显示,并预设了一个警报值,当超过警报值时,报警电路发出警报。

硬件电路主要包括单片机最小系统、显示模块、按键模块、报警模块和AD转换模块、数据存储模块六部分。软件采用了模块化的设计方法,主要分为主程序A/D转换子程序、按键检测子程序、液晶显示子程序E2PROM存储程序和中断程序

 

 

关键字:单片机、A/D、1602液晶、E2PROM


目录:

1. 概述.............................................................1

1.1课题研究背景与意义...........................................1

1.2课题设计内容.................................................1

2. 设计方案........................................................1

3. 硬件电路设计....................................................2

3.1 器件选择....................................................2

A. STC89C52..................................................2

B. XPT2046...................................................3

C. AT24C02...................................................4

D. LCD1602...................................................5

3.2 单片机最小系统..............................................6

3.3 A/D转换模块.................................................7

3.4 数据显示模块................................................7

3.5 数据存储....................................................8

3.6 按键模块....................................................8

3.7 报警模块....................................................9

3.8 电路原理图..................................................9

4.软件设计.........................................................10

4.1 主程序.....................................................10

4.2 AD转换程序.................................................11

4.3 数据存储程序...............................................11

4.4 1602液晶显示程序...........................................12

4.5 按键驱动程序...............................................12

4.6 中断程序...................................................13

4.7 部分程序代码...............................................13

5.仿真与调试.......................................................14

5.1软件仿真....................................................14

5.2硬件调试....................................................16

结束语.............................................................17

附录1.............................................................18

附录2.............................................................19

 

 

 

 

1. 概述

1.1课题研究的背景与意义

随着电子技术的发展,老式通过人眼估读的电压值不能满足工业甚至是科技的要求,那这就需要我们去追求准确度高,分辨率高,测量速度快的数字电压表,然后通过LED或者是LCD显示出来。

在电量的测量中,电压、电流和频率是最基本的3个被测量,其中电压量的测量最为常见,经常需要测量出精度高的多点电压值,因此多点数字电压表变得越来越重要。数字电压表(Digital Voltmeter)简称DVM,是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。由于数字仪器具有读数准确、精度高、误差小、灵敏度高、分辨率高、测量速度快等特点而备受青睐。

 

1.2课题设计的内容

以单片机为控制器,对05V的模拟电压进行循环采集,采集的数据送LEDLCD显示,并存入内存24WC04。超过界限时指示灯闪烁并报警。

编写下列控制程序

1.05V模拟信号输入实行循环采集,连续采集16次,取平均值并显示。

2.设定采集的上限值,若采集的平均值超过该界限值,则对应的指示灯闪烁10次后一直亮,指示灯闪烁时喇叭发声,以示警告。

3可按键查看以往的电压采集值并显示。

 

2. 设计方案

本设计选用A/D芯片XPT2046接收电位器上的电压信号,转换后的数字信号输送到单片机STC89C52,数据经过单片机处理之后通过LCD1602进行数据显示,同时,将数据写入AT24C02进行数据存储,通过按键控制可进行数据回显。按键还可以设置报警值,当测得数据大于报警值时,蜂鸣器会发出警报。总体框图如图2.1所示。

单片机数字电压表设计_第1张图片

 2.1. 总体框图

 

3. 硬件电路设计

3.1 器件选择

A.STC89C52

本设计选用单片机STC89C52,是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,基于Intel 标准的8052,指令代码完全兼容传统的8051 系列单片机,12 时钟/机器周期和6 时钟/机器周期可任意选择,最新的D 版本内集成MAX810 专用复位电路。

主要特性:

1). 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[1]

2). 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)

3).工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz

4). 用户应用程序空间为8K字节

5). 片上集成512 字节RAM

6). 通用I/O 口(32 个),复位后为:P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。

7). ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口直接下载用户程 序,数秒即可完成一片

8). 具有EEPROM 功能

9). 共3 个16 位定时器/计数器。即定时器T0、T1、T2

10).外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒

11). 通用异步串行口(UART),还可用定时器软件实现多个UART

12). 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)

B. XPT2046

XPT2046是一种典型的逐次逼近型模数转换器(SARADC),包含了采样/保持、模数转换、串口数据输出等功能。同时芯片集成有一个2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046可以单电源供电,电源电压范围为2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。引脚分布如图3.1所示。

单片机数字电压表设计_第2张图片

 3.1. XPT2046引脚分布

XPT2046通过SPI接口与主控制器进行通信,其与主控制器的接口包括以下信号:PENIRQ_N:笔触中断信号,当设置了笔触中断信号有效时,每当触摸屏被按下,该引脚被拉为低电平。当主控检测到该信号后,可以通过发控制信号来禁止笔触中断,从而避免在转换过程中误触发控制器中断。该引脚内部连接了一个50K的上拉电阻。

CS_N:芯片选中信号,当CS_N被拉低时,用来控制转换时序并使能串行输入/输出寄存器以移出或移入数据。当该引脚为高电平时,芯片(ADC)进入掉电模式。

DCLK:外部时钟输入,该时钟用来驱动SARADC的转换进程并驱动数字IO上的串行数据传输。

DIN:芯片的数据串行输入脚,当CS为低电平时,数据在串行时钟DCLK的上升沿被锁存到片上的寄存器。

DOUT:串行数据输出,在串行时钟DCLK的下降沿数据从此引脚上移出,当CS_N引脚为高电平时,该引脚为高阻态。

BUSY:忙输出信号,当芯片接收完命令并开始转换时,该引脚产生一个DCLK周期的高电平。当该引脚由高点平变为低电平的时刻,转换结果的最高位数据呈现在DOUT引脚上,主控可以读取DOUT的值。当CS_N引脚为高电平时,BUSY引脚为高阻态。

 

C. AT24C02

AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。引脚分布如图3.2所示。

 单片机数字电压表设计_第3张图片

3.2. AT24C02引脚分布

器件操作:

时钟及数据传输:SDA 引脚通常被外围器件拉高。SDA 引脚的数据应在 SCL 为低时变化;当数据在 SCL 为高时变化,将视为下文所述一个起始或停止命令。

起始命令:当 SCL 为高,SDA 由高到低的变化被视为起始命令,必须以起始命令作为任何一次读/写操作命令的开始

停止命令:当 SCL 为高,SDA 由低到高的变化被视为停止命令,在一个读操作后,停止命令会使 EEPROM 进入等待态低功耗模式。

应答:所有的地址和数据字节都是以 8 位为一组串行输入和输出的。每收到一组 8 位的数据后,EEPROM 都会在第 9 个时钟周期时返回应答信号。每当主控器件接收到一组 8 位的数据后,应当在第 9 个时钟周期向EEPROM 返回一个应答信号。收到该应答信号后,EEPROM 会继续输出下一组 8 位的数据。若此时没有得到主控器件的应答信号,EEPROM 会停止读出数据,直到主控器件返回一个停止命令来结束读周期。

等待模式:24C01/02/04/08/16 特有一个低功耗的等待模式。可以通过以下方法进入该模式:(a)上电 (2)收到停止位并且结束所有的内部操作后。

器件复位:在协议中断、下电或系统复位后,器件可通过以下步骤复位:(1)连续输入 9 个时钟;(2)在每个时钟周期中确保当 SCL 为高时 SDA 也为高3)建立一个起始条件。

 

D. LCD1602

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用

 

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.1所示:

 

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

3.1. 1602引脚说明

 

3.2 单片机最小系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.电路图如图3.3所示。

 单片机数字电压表设计_第4张图片

图3.3. 单片机最小系统

 

复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.

晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)

 

3.3 A/D转换模块

利用XPT2046来采集电位器的得电压信号,经转换之后输送给单片机。电路图如图3.4所示。

单片机数字电压表设计_第5张图片 

图3.4. A/D转换电路

 

3.4 数据显示模块

1602液晶接收单片机P0口输出的数据直接进行显示,在1602的V0引脚接上一个电位器来调整液晶显示的对比度。由于单片机的P0口进行数据传输需接上拉电阻。电路图如图3.5所示。

单片机数字电压表设计_第6张图片 

图3.5. 数据显示模块

 

3.5 数据存储

将芯片 A2、A1、A0 都是接的 GND,也就是说都是 0,因此 24C02的 7 位地址实际上是二进制的 0b1010000,也就是 0x50。我们用 I 2 C 的协议来寻址 0x50,利用IIC通信来读写数据。电路图如图3.6所示。

 单片机数字电压表设计_第7张图片

图3.6. 数据存储电路

3.6 按键模块

利用独立按键来进行控制,S0进行数据回显,S1、S2是对警告值进行加

减,每次加减0.5V。电路图如图3.7所示。

 单片机数字电压表设计_第8张图片

图3.7. 独立按键

 

3.7 报警模块

当测得的电压值大于设定的报警值时,会从P2^3引脚输出一个1HZ脉冲是小灯闪烁10次,然后输出一个低电平,小灯常亮。蜂鸣器采用了有源蜂鸣器,需给端口一定频率的脉冲,蜂鸣器才会发出声音。电路图如图3.8所示。

 单片机数字电压表设计_第9张图片

图3.8. 报警电路

 

3.8 电路原理图

见附录1。

4. 软件设计

4.1 主程序

主程序主要调用A/D转换程序、按键驱动程序、1602液晶显示程序、数据存储程序和警报程序。首先对系统进行初始化,当被测电压输入后,调用A/D转换子程序,转换出来的数值经数据存储程序写入AT24C02,并通过1602液晶显示程序进行数据显示,同时,与报警值进行比较,当大于报警值时,启用报警程序。主程序流程图如图4.1所示。

 单片机数字电压表设计_第10张图片 

图4.1. 主程序流程图

 

4.2 A/D转换程序

A/D转换程序主要是对电位器产生的模拟信号进行数据转换,首先启动AD芯片,输入指令后,等待数据处理完后,输出结果,本次转换完成。子程序流程图如图4.2所示。

                                                            单片机数字电压表设计_第11张图片

图4.2. A/D转换程序流程图

 

4.3数据存储程序

 数据存储程序主要是对A/D转换后的数值进行数据存储,当按键控制的时候可以数据回显。AT24C02用IIC进行数据通信,首先选择芯片地址,然后进行数据读取,待完成后输出结果。程序流程图如图11所示。

                                                                      单片机数字电压表设计_第12张图片

图4.3. 数据存储程序流程图

 

4.4 1602液晶显示程序

本设计使用1602液晶进行数据显示,接收从单片机传输的字符型数据直接进行显示。首先初始化液晶,输入数据显示的地址,即在液晶屏上显示的行与列。再输入字符型的数据,液晶即可进行数据显示。程序流程图如图4.4所示。

单片机数字电压表设计_第13张图片

4.4.1602液晶显示流程图

4.5按键驱动程序

本设计使用3个独立按键,一个按键用来控制读取E2PROM中存储的数据,然后通过液晶1602进行数据显示。另外两个按键来进行报警值的调整S1对报警值加5,S2对数据减5,报警值在1602上立即刷新。按键每次按下会有抖动,所以进行按键消抖,这样按键使用更加精准。程序流程图如图4.5所示。

                                                    单片机数字电压表设计_第14张图片

4.5.按键驱动程序流程图

4.6中断程序

本程序使用定时器中断0,中断优先级为1,定时2ms,中断中主要产生一个1s和200ms的时间标志位、进行按键的扫描和产生蜂鸣器需要的脉冲。

 

4.7 部分程序代码

见附录2.

 

5.仿真与调试

1).软件仿真

仿真运行的时候,液晶显示如图5.1所示。

                                 单片机数字电压表设计_第15张图片

5.1

S0按下并调整电位器的值得时候,液晶显示如图5.2所示。

                                 单片机数字电压表设计_第16张图片

5.2 

2).硬件调试

当接通电源的时候,液晶显示如图5.3所示。

                                 单片机数字电压表设计_第17张图片

5.3 

S0按下,并调整电位器,液晶如图5.4所示。

                                 单片机数字电压表设计_第18张图片

5.4 

当按下S2的时候,报警值减掉0.5V,并调整电位器,使其电压大于报警值,电路发出警报,蜂鸣器器报警,小灯闪烁。如图5.5所示。

                                 单片机数字电压表设计_第19张图片

5.5

6.结束语

通过这次课程设计有很多收获,把所学到的知识得到了应用,对所学的知识有了更深的了解,有了新的体会。对于制图软件AltiumDesigner、编程软件keil5掌握的更加熟悉,也发现了不少的问题,经过一系列的努力得以解决,充实了自己。


附录1:

单片机数字电压表设计_第20张图片

附录2:

主程序:

void main()

{

EA = 1;

AUXR &= 0x7F;

TMOD &= 0xF0;

TL0 = 0xCD;

TH0 = 0xF8;

TF0 = 0;

TR0 = 1;

ET0 = 1;

LcdInit();

while(1)

{

KeyDriver();

if (flag_200ms)

{

flag_200ms = 1;

if (flag_s1)

{

Get_AD_buf();

AD_Display();

}

if (flag_s1 == 0)

{

sdat = E2Read(0x00);

buf[0] = sdat/10+'0';

buf[1] = '.';

buf[2] = sdat%10+'0';

buf[3] = '\0';

LcdWriteCom(0x80+0x40);

LcdWriteData(buf[0]);

LcdWriteData(buf[1]);  

LcdWriteData(buf[2]);

}

}

if (pdat > warn)

{

BUZZ = buz;

if (n<10)

 

Led_1s();

else

LED = 0;

}else

{

n = 0;

LED = 1;

BUZZ = 0;

}

}

}

 

A/D转换程序:

void SPI_Write(uchar dat)

{

uchar i;

CLK = 0;

for(i=0; i<8; i++)

{

DIN = dat >> 7;  

dat <<= 1;

CLK = 0;

CLK = 1;

}

}

uint SPI_Read(void)

{

uint i, dat=0;

CLK = 0;

for(i=0; i<12; i++)

{

dat <<= 1;

CLK = 1;

CLK = 0;

dat |= DOUT;

}

return dat;

}

uint Read_AD_Data(uchar cmd)

{

uchar i;

uint AD_Value;

CLK = 0;

CS  = 0;

SPI_Write(cmd);

for(i=6; i>0; i--);

CLK = 1;

_nop_();_nop_();

CLK = 0;

_nop_();_nop_();

AD_Value=SPI_Read();

CS = 1;

return AD_Value;

}

 

1602液晶显示程序:

void LcdWriteCom(uchar com)  

{

LCD1602_E = 0;     

LCD1602_RS = 0;    

LCD1602_RW = 0;   

LCD1602_DATAPINS = com;     

Lcd1602_Delay1ms(1);

LCD1602_E = 1;          

Lcd1602_Delay1ms(5);   

LCD1602_E = 0;

}

  

void LcdWriteData(uchar dat)

{

LCD1602_E = 0;

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   

Lcd1602_Delay1ms(5);   

LCD1602_E = 0;

}

void LcdInit()   

{

  LcdWriteCom(0x38);

LcdWriteCom(0x0c);  

LcdWriteCom(0x06);  

LcdWriteCom(0x01);  

LcdWriteCom(0x80);  

}

 

E2PROM存储程序:

void IIC_Start(void)

{

SDA = 1;

SCL = 1;

somenop;

SDA = 0;

somenop;

SCL = 0;

}

void IIC_Stop(void)

{

SDA = 0;

SCL = 1;

somenop;

SDA = 1;

}

void IIC_Ack(unsigned char ackbit)

{

if(ackbit)

SDA = 0;

else

SDA = 1;

somenop;

SCL = 1;

somenop;

SCL = 0;

SDA = 1;

somenop;

}

bit IIC_WaitAck(void)

{

SDA = 1;

somenop;

SCL = 1;

somenop;

if(SDA)    

{   

SCL = 0;

IIC_Stop();

return 0;

}

else  

{

SCL = 0;

return 1;

}

}

void IIC_SendByte(unsigned char byt)

{

unsigned char i;

for(i=0;i<8;i++)

{   

if(byt&0x80)

{

SDA = 1;

}

else

{

SDA = 0;

}

somenop;

SCL = 1;

byt <<= 1;

somenop;

SCL = 0;

}

}

unsigned char IIC_RecByte(void)

{

unsigned char da;

unsigned char i;

for(i=0;i<8;i++)

{   

SCL = 1;

somenop;

da <<= 1;

if(SDA)

da |= 0x01;

SCL = 0;

somenop;

}

return da;

}

unsigned char E2Read(unsigned char addr)

{

unsigned char str;

IIC_Start();

IIC_SendByte(0xa0);

IIC_WaitAck();

IIC_SendByte(addr);

IIC_WaitAck();

IIC_Start();

IIC_SendByte(0xa1);

IIC_WaitAck();

str = IIC_RecByte();

IIC_WaitAck();

IIC_Stop();

return str;

}

void E2Write(unsigned char str,unsigned char addr)

{

IIC_Start();

IIC_SendByte(0xa0);

IIC_WaitAck();

IIC_SendByte(addr);

IIC_WaitAck();

IIC_SendByte(str);

IIC_WaitAck();

IIC_Stop();

你可能感兴趣的:(单片机数字电压表设计)