|
摘要:
本设计中利用STC89C52单片机制作了一个简单的数字电压表,主要通过A/D转换器XPT2046把输入的模拟信号即电位器的电压值转换成数字信号,送到1602液晶进行数据显示,并预设了一个警报值,当超过警报值时,报警电路发出警报。
硬件电路主要包括单片机最小系统、显示模块、按键模块、报警模块和AD转换模块、数据存储模块六个部分。软件采用了模块化的设计方法,主要分为主程序、A/D转换子程序、按键检测子程序、液晶显示子程序、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课题设计的内容
以单片机为控制器,对0—5V的模拟电压进行循环采集,采集的数据送LED或LCD显示,并存入内存24WC04。超过界限时指示灯闪烁并报警。
编写下列控制程序:
1).对0—5V模拟信号输入实行循环采集,连续采集16次,取平均值并显示。
2).设定采集的上限值,若采集的平均值超过该界限值,则对应的指示灯闪烁10次后一直亮,指示灯闪烁时喇叭发声,以示警告。
3)可按键查看以往的电压采集值并显示。
2. 设计方案
本设计选用A/D芯片XPT2046接收电位器上的电压信号,转换后的数字信号输送到单片机STC89C52,数据经过单片机处理之后通过LCD1602进行数据显示,同时,将数据写入AT24C02进行数据存储,通过按键控制可进行数据回显。按键还可以设置报警值,当测得数据大于报警值时,蜂鸣器会发出警报。总体框图如图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所示。
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所示
器件操作:
时钟及数据传输: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所示:
3.2 单片机最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.电路图如图3.3所示。
复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.
晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)
3.3 A/D转换模块
利用XPT2046来采集电位器的得电压信号,经转换之后输送给单片机。电路图如图3.4所示。
3.4 数据显示模块
1602液晶接收单片机P0口输出的数据直接进行显示,在1602的V0引脚接上一个电位器来调整液晶显示的对比度。由于单片机的P0口进行数据传输需接上拉电阻。电路图如图3.5所示。
3.5 数据存储
将芯片 A2、A1、A0 都是接的 GND,也就是说都是 0,因此24C02的 7 位地址实际上是二进制的 0b1010000,也就是 0x50。我们用 I 2 C 的协议来寻址 0x50,利用IIC通信来读写数据。电路图如图3.6所示。
3.6 按键模块
利用独立按键来进行控制,S0进行数据回显,S1、S2是对警告值进行加
减,每次加减0.5V。电路图如图3.7所示。
3.7 报警模块
当测得的电压值大于设定的报警值时,会从P2^3引脚输出一个1HZ脉冲是小灯闪烁10次,然后输出一个低电平,小灯常亮。蜂鸣器采用了有源蜂鸣器,需给端口一定频率的脉冲,蜂鸣器才会发出声音。电路图如图3.8所示。
3.8 电路原理图
见附录1。
4. 软件设计
4.1 主程序
主程序主要调用A/D转换程序、按键驱动程序、1602液晶显示程序、数据存储程序和警报程序。首先对系统进行初始化,当被测电压输入后,调用A/D转换子程序,转换出来的数值经数据存储程序写入AT24C02,并通过1602液晶显示程序进行数据显示,同时,与报警值进行比较,当大于报警值时,启用报警程序。主程序流程图如图4.1所示。
4.2 A/D转换程序
A/D转换程序主要是对电位器产生的模拟信号进行数据转换,首先启动AD芯片,输入指令后,等待数据处理完后,输出结果,本次转换完成。子程序流程图如图4.2所示。
4.3数据存储程序
数据存储程序主要是对A/D转换后的数值进行数据存储,当按键控制的时候可以数据回显。AT24C02用IIC进行数据通信,首先选择芯片地址,然后进行数据读取,待完成后输出结果。程序流程图如图11所示。
4.4 1602液晶显示程序
本设计使用1602液晶进行数据显示,接收从单片机传输的字符型数据直接进行显示。首先初始化液晶,输入数据显示的地址,即在液晶屏上显示的行与列。再输入字符型的数据,液晶即可进行数据显示。程序流程图如图4.4所示。
4.5按键驱动程序
本设计使用3个独立按键,一个按键用来控制读取E2PROM中存储的数据,然后通过液晶1602进行数据显示。另外两个按键来进行报警值的调整,S1对报警值加5,S2对数据减5,报警值在1602上立即刷新。按键每次按下会有抖动,所以进行按键消抖,这样按键使用更加精准。程序流程图如图4.5所示。
4.6中断程序
本程序使用定时器中断0,中断优先级为1,定时2ms,中断中主要产生一个1s和200ms的时间标志位、进行按键的扫描和产生蜂鸣器需要的脉冲。
4.7 部分程序代码
见附录2.
5.仿真与调试
1).软件仿真
仿真运行的时候,液晶显示如图5.1所示。
当S0按下并调整电位器的值得时候,液晶显示如图5.2所示。
2).硬件调试
当接通电源的时候,液晶显示如图5.3所示。
当S0按下,并调整电位器,液晶如图5.4所示。
当按下S2的时候,报警值减掉0.5V,并调整电位器,使其电压大于报警值,电路发出警报,蜂鸣器器报警,小灯闪烁。如图5.5所示。
6.结束语
通过这次课程设计有很多收获,把所学到的知识得到了应用,对所学的知识有了更深的了解,有了新的体会。对于制图软件AltiumDesigner、编程软件keil5掌握的更加熟悉,也发现了不少的问题,经过一系列的努力得以解决,充实了自己。
主程序:
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转换程序:
voidSPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8;i++)
{
DIN = dat >>7;
dat <<= 1;
CLK = 0;
CLK = 1;
}
}
uintSPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12;i++)
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
uintRead_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液晶显示程序:
voidLcdWriteCom(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;
}
voidLcdWriteData(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存储程序:
voidIIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
voidIIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
voidIIC_Ack(unsigned char ackbit)
{
if(ackbit)
SDA = 0;
else
SDA = 1;
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
bitIIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
voidIIC_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 charIIC_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 charE2Read(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;
}
voidE2Write(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();
|
-
20.png
(667.69 KB, 下载次数: 111)
-
19.png
(841.69 KB, 下载次数: 119)
-
18.png
(593.47 KB, 下载次数: 110)
-
17.png
(176.37 KB, 下载次数: 96)
-
16.png
(215.24 KB, 下载次数: 113)
-
15.png
(17.52 KB, 下载次数: 97)
-
14.png
(12.67 KB, 下载次数: 99)
-
13.png
(12.02 KB, 下载次数: 107)
-
12.png
(18.35 KB, 下载次数: 103)
-
11.png
(41.59 KB, 下载次数: 106)
-
10.png
(56.42 KB, 下载次数: 107)
-
9.png
(58.42 KB, 下载次数: 110)
-
8.png
(70.48 KB, 下载次数: 102)
-
7.png
(148.07 KB, 下载次数: 112)
-
6.png
(129.96 KB, 下载次数: 105)
-
5.png
(258.54 KB, 下载次数: 108)
-
4.png
(45.37 KB, 下载次数: 105)
-
3.png
(24.73 KB, 下载次数: 103)
-
2.png
(51.46 KB, 下载次数: 108)
-
1.png
(25.87 KB, 下载次数: 114)
|