基于ARM7的电压检测系统设计课程设计.docx
《基于ARM7的电压检测系统设计课程设计.docx》由会员分享,可在线阅读,更多相关《基于ARM7的电压检测系统设计课程设计.docx(29页珍藏版)》请在冰豆网上搜索。
基于ARM7的电压检测系统设计课程设计
《嵌入式系统设计导论》
课程设计
题目:
基于ARM7的电压检测系统设计
物联网工程学院
班级
学号
姓名
摘要
近年来随着科学技术的发展,人们趋向于电压检测方式的多样化,智能化,它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。
传统的模拟形式的电压检测方式逐步被数字化的处理芯片所替代。
本设计采用了飞利浦的32位ARM微处理器LPC2138作为核心处理器。
利用A/D转换、定时器、按键等模块,实现电压(可用滑动电阻)的检测、显示、阈值设置,以及超过阈值能声光报警。
该检测装置工作时,电压信号经电压检测模块采样得到模拟信号,该信号送到AD转换模块处理成数字信号。
CPU接收到该信号送给LCD模块显示输出,同时通过UART通信送给显示终端实时显示数据变化情况。
与此同时,还可通过按键设置报警门值电压。
当被测信号超出门值电压时,会发出声光报警信号。
实现了电压数据的自动采集、传输、处理与显示等功能,解决了传统的数据采集系统由于存在响应慢、精度低、可靠性差、效率低、操作繁琐等弊端。
关键字:
ARM微处理器、电压检测、AD转换
目录:
一、引言-----------------------------------------------------------------------3
二、设计目的-----------------------------------------------------------------3
三、设计要求-------------------------------------------------------------------3
四、系统总方案-------------------------------------------------------------3
五、硬件设计------------------------------------------------------------------4
1、电压检测模块设计-------------------------------------------------4
2、键盘设计---------------------------------------------------------------4
3、显示模块设计------------------------------------------------------5
4、A/D转换模块设计------------------------------------------------7
5、串行口通信模块设计--------------------------------------------7
6、声光报警模块设计---------------------------------------------------9
六、软件流程图-----------------------------------------------------------------10
七、程序代码设计----------------------------------------------------------11
八、设计结果演示----------------------------------------------------------21
九、设计体会------------------------------------------------------------------22
十、附录---------------------------------------------------------------------22
一、引言
近年来随着科学技术的发展,人们趋向于电压检测方式的多样化,智能化,它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。
所以市场上涌现出多种多样的智能电压传感器。
电压监测系统在工业生产和科学研究等各个行业开辟了更为广阔的发展空间。
也为嵌入式系统的进一步发展奠定良好的基础。
电压监测系统不论在哪个应用领域中,数据采集与处理越及时,工作效率就越高,取得的经济效益也越高而且比较价格低,在工农业中得到了广泛的应用。
本文设计的报警系统对电路电压进行实时的采样,一旦电压高于设定的正常阈值,系统就会触发报警动作,提醒人们做出相应措施。
本设计采用了飞利浦的32位ARM微处理器LPC2138作为核心处理器。
实现了电压数据的自动采集、传输、处理与显示等功能,解决了传统的数据采集系统由于存在响应慢、精度低、可靠性差、效率低、操作繁琐等弊端。
二、设计目的
1.通过本课程设计,熟悉嵌入式系统开发方法和流程。
2.能结合课堂所学自主设计实现一个简单的监测报警系统。
3.进一步学会应用定时器、A/D、显示等模块功能。
三、设计要求
1.要求能利用学过的A/D转换、定时器、按键等模块,实现电压(可用滑动电阻)的检测、显示、阈值设置,以及超过阈值能声光报警。
2.扩展功能:
将电压数据通过串行通信(UART)发送到PC上位机显示。
四、系统总体方案
本系统设计框图如下图1:
液晶显示
图1:
系统总框图
电压信号经电压检测模块采样得到模拟信号,该信号送到AD转换模块处理成数字信号。
CPU接收到该信号送给LCD模块显示输出,同时通过UART通信送给显示终端实时显示数据变化情况。
与此同时,还可通过按键设置报警门值电压。
当被测信号超出门值电压时,会发出声光报警信号。
五、硬件设计
1、电压检测模块设计
通过滑动变阻器的滑动,改变采样电阻所分电压值,此值可以通过采样引脚实时传送给CPU,这样便可通过AD转换模块将采得的电压值转换成数字信号,经处理后送显示输出模块。
本系统采用1K的电阻作为采样电阻,以最高采样电压为3.3v为例,实际应用中可根据情况更改其他阻值。
其结构设计如下图2:
图2:
电压检测模块
2、键盘设计
本系统设置两个机械按键,一个是控制门值电压的增加,另一个控制门值电压的减少。
每按下一次,门值电压值加0.1v或减0.1v。
这样可以控制检测电压的阀值得大小,其设计电路图如下3:
图3:
按键设计
3、显示模块设计
本模块采用液晶显示屏,具有显示质量高,数字式接口,体积小、重量轻,功耗低等特点。
因1602液晶屏并未做系统学习,现对采用的1602字符型LCD做如下简介:
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法
1602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图5所示:
图51602LCD尺寸图
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表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
背光源负极
表1:
引脚功能说明
仿真图如下图5:
图5:
LCD显示模块
4、A/D转换模块设计
在设计时应考虑A/D转换模块的如下特性:
1.本系统芯片是10位逐次逼近式模数转换器
2.4个(LPC2114/2124)或8个(LPC2210/2212/2214)引脚复用为A/D输入脚,本系统设计只采用一路A/D采样通道。
3.测量范围:
0~3.3V
4.10位转换时间>=2.44us
A/D转换器的基本时钟由VPB时钟提供。
可编程分频器可将时钟调整至逐步逼近转换所需的4.5MHz(最大)。
10位精度要求的转换需要11个A/D转转换时钟。
ADC转换时钟分频值计算:
5、串行口通信模块设计
LPC2114/2124/2210/2212/2214的两个UART,均具有16字节的收发FIFO,寄存器位置符合16C550工业标准,内置波特率发生器,两个串口具有基本相同的寄存器,其中UART1带有完全的调制解调器控制握手接口。
在使用UART与上位机PC通讯时,需要一个RS232电平转换电路,在本系统中直接采用虚拟终端。
UART0的基本寄存器功能框图如下图6:
图6:
UART0的基本寄存器功能框图
其中,寄存器U0RBR与U0THR是同一地址,但物理上是分开的,读操作时为U0RBR,而写操作时为U0THR;寄存器U0DLL与U0RBR/U0THR、U0DLM与U0TER具有同样的地址,如果要访问U0DLM、U0DLL,除数访问位DLAB必须为1,若要访问U0RBR/U0THR、U0IER,则除数访问位DLAB必须为0。
图5.34中,U0DLM和U0DLL寄存器是波特率发生器的除数锁存寄存器,用于设置合适的串口波特率;U0RBR为数据接以缓冲,用于读取接收到的数据,若FIFO使能,串口接收到的数据会压入FIFO缓冲;U0THR为发送保存,向此寄存器写入数据时,将会引起串口数据发送,若FIFO使能,数据会压入FIFO缓冲。
波特率的除数计算如下:
其中,baud为所需要的波特率。
在PROTEUS仿真中采用如下虚拟终端:
在仿真过程中可得到如下显示现象:
图7:
虚拟终端
6、声光报警模块设计
声光报警模块可以在被测信号超过规定值时,发出蜂鸣以示警告,同时LED灯发出视觉信号。
具体操作时,可使用按键设置报警门值电压,当被测信号超出门值电压时,会发出声光报警信号,提醒操作者采取措施。
其设计图如下图8:
图8:
声光报警模块设计
图9:
报警效果图
六、软件流程图
七、程序代码设计
1、主程序设计:
#include
#include"NXP/iolpc2138.h"
#include"cry1602.c"
#include"cry1602.h"
#include"uart.h"
#defineuintunsignedint
#defineucharunsignedchar
voidadcini();
voidTime0init(void);
uintv_gate=120,v_now,v_nows;
voidmain()
{
PINSEL0=0;
PINSEL0=0x00000005;//设置I/O连接到UART0
PINSEL1=0x00000000;
PINSEL2=0x00000000;
IO1DIR=IO1DIR|0xffffffff;
IO0DIR&=(~0x00003800<<16);
IO0DIR|=1<<16;
LcdReset();
adcini();
Time0init();
UART0_Ini();
DispNChar(0,0,16,"VOLTAGE:
GATE:
");
show_num1(v_gate);
while
(1)
{
if((IO0PIN&0x00001000)==0)
{
Delay5ms();
if((IO0PIN&0x00001000)==0)
{
while((IO0PIN&0x00001000)==0);
v_gate+=10;
if(v_gate>256)
v_gate=256;
show_num1(v_gate);
}
}
if((IO0PIN&0x00002000)==0)
{
Delay5ms();
if((IO0PIN&0x00002000)==0)
{
while((IO0PIN&0x00002000)==0);
if(v_gate<10)
v_gate=10;
v_gate-=10;
show_num1(v_gate);
}
}
AD0CR=AD0CR|(1<<24);
while((AD0DR&0x80000000)==0);
v_now=(AD0DR&0xfffc0)>>8;
v_nows=v_now*330/255;
show_num(v_nows);
if((T0IR&0X01)==0x01)
{
T0IR=1;
send_num(v_nows);
}
if(v_nows>v_gate)
IO0SET|=1<<16;
else
IO0CLR|=1<<16;
}
}
voidadcini()
{
PINSEL1=0x00400000;
AD0CR=(1<<0)|
(11<<8)|
(0<<16)|
(0<<17)|
(1<<21)|
(0<<22)|
(1<<24)|
(0<<27);
Delay5ms();
v_now=AD0DR;
}
voidTime0init(void)
{
T0TC=0;
T0PR=99;
T0MCR=0X03;
T0MR0=30000;
T0TCR=0X03;
T0TCR=0X01;
VICIntSelect=0;
VICVectCntl0=0x24;
VICIntEnable=0X00000010;
}
2、液晶显示部分:
#include"NXP/iolpc2138.h"
#include"cry1602.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
/*宏定义*/
#defineBusy0x80<<16
#defineCLR_RSIO1CLR|=0x0100<<16;//RS=P3.0
#defineSET_RSIO1SET|=0x0100<<16;
#defineCLR_RWIO1CLR|=0x0200<<16;//RW=P3.1
#defineSET_RWIO1SET|=0x0200<<16;
#defineCLR_ENIO1CLR|=0x0400<<16;//EN=P3.2
#defineSET_ENIO1SET|=0x0400<<16;
/***********************************************
函数名称:
DispStr
功能:
让液晶从某个位置起连续显示一个字符串
参数:
x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值:
无
***********************************************/
voidDispStr(ucharx,uchary,uchar*ptr)
{
uchar*vol;
uchari,n=0;
vol=ptr;
while(*ptr++!
='\0')n++;//计算字符串有效字符的个数
for(i=0;i{
Disp1Char(x++,y,vol[i]);
if(x==0x0f)
{
x=0;
y^=1;
}
}
}
/*******************************************
函数名称:
DispNchar
功能:
让液晶从某个位置起连续显示N个字符
参数:
x--位置的列坐标
y--位置的行坐标
n--字符个数
ptr--指向字符存放位置的指针
返回值:
无
********************************************/
voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)
{
uchari;
for(i=0;i{
Disp1Char(x++,y,ptr[i]);
if(x==0x0f)
{
x=0;
y^=1;
}
}
}
/*******************************************
函数名称:
LocateXY
功能:
向液晶输入显示字符位置的坐标信息
参数:
x--位置的列坐标
y--位置的行坐标
返回值:
无
********************************************/
voidLocateXY(ucharx,uchary)
{
ucharvol;
vol=x&0x0f;
y&=0x01;
if(y)vol|=0x40;//如果在第2行
vol|=0x80;
LcdWriteCommand(vol,1);
}
/*******************************************
函数名称:
Disp1Char
功能:
在某个位置显示一个字符
参数:
x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
返回值:
无
********************************************/
voidDisp1Char(ucharx,uchary,uchardata)
{
LocateXY(x,y);
LcdWriteData(data);
}
/*******************************************
函数名称:
LcdReset
功能:
对1602液晶模块进行复位操作
参数:
无
返回值:
无
********************************************/
voidLcdReset(void)
{
IO1DIR|=0X7FF;
//CtrlDir|=0x07;//控制线端口设为输出状态
//DataDir=0xFF;//数据端口设为输出状态
LcdWriteCommand(0x38,0);//规定的复位操作
Delay5ms();
LcdWriteCommand(0x38,0);
Delay5ms();
LcdWriteCommand(0x38,0);
Delay5ms();
LcdWriteCommand(0x38,1);//显示模式设置
LcdWriteCommand(0x08,1);//显示关闭
LcdWriteCommand(0x01,1);//显示清屏
LcdWriteCommand(0x06,1);//写字符时整体不移动
LcdWriteCommand(0x0c,1);//显示开,不开游标,不闪烁
}
/*******************************************
函数名称:
LcdWriteCommand
功能:
向液晶模块写入命令
参数:
cmd--命令,
chk--是否判忙的标志,1:
判忙,0:
不判
返回值:
无
********************************************/
voidLcdWriteCommand(ucharcmd1,ucharchk)
{
if(chk)WaitForEnable();//检测忙信号?
uintcmd;
cmd=cmd1<<16;
CLR_RS;
CLR_RW;
asm("NOP");
IO1SET|=cmd;
IO1CLR|=((~cmd)&(0xff<<16));
//DataPort=cmd;//将命令字写入数据端口
asm("NOP");
SET_EN;//产生使能脉冲信号
asm("NOP");
asm("NOP");
CLR_EN;
}
/*******************************************
函数名称:
LcdWriteData
功能:
向液晶显示的当前地址写入显示数据
参数:
data--显示字符数据
返回值:
无
********************************************/
voidLcdWriteData(uchardata1)
{
WaitForEnable();//等待液晶不忙
uintdata;
data=data1<<16;
SET_RS;
CLR_RW;
asm("NOP");
IO1SET|=data;
IO1CLR|=((~data)&(0xff<<16));
//DataPort=data;//将显示数据写入数据端口
asm("NOP");
SET_EN;//产生使能脉冲信号
asm("NOP");
asm("NOP");
CLR_EN;
}
/*******************************************
函数名称:
WaitForEnable
功能:
等待1602液晶完成内部操作
参数:
无
返回值:
无
********************************************/
voidWaitForEnable(void)
{
IO1DIR&=(~(0x000000FF<<16));//将P4口切换为输入状态
CLR_RS;
SET_RW;
asm("NOP");
SET_EN;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
while((IO1PIN&Busy&(0xff<<16))!
=0);//检测忙标志
CLR_EN;
IO1DIR|=0xFF<<16;//将P4口切换为输出状态
}
/*******************************************
函数名称:
Delay5ms
功能:
延时约5ms
参数:
无
返回值:
无
*****