目录一、引言.......................................................................................... 错误!未定义书签。
1.1设计目的 (9)1.2设计要求............................................................................ 错误!未定义书签。
二、总体设计方案.......................................................................... 错误!未定义书签。
2.1系统总体方案.................................................................... 错误!未定义书签。
2.2系统原理图........................................................................ 错误!未定义书签。
三、硬件设计 (2)3.1设计思路 (5)3.2系统电路设计.................................................................... 错误!未定义书签。
四、软件设计 (7)4.1设计思路 (7)4.2串口通信子程序................................................................ 错误!未定义书签。
五、程序设计与调试 (2)5.1程序代码设计 (5)5.2程序代码调试.................................................................... 错误!未定义书签。
六、设计结果演示.......................................................................... 错误!未定义书签。
七、心得体会.................................................................................. 错误!未定义书签。
参考文献.. (18)基于的电压检测报警系统摘要:本设计是基于嵌入式技术作为主处理器的电压报警系统,利用LPC318作为主控CPU,辅以电压采集模块采集数据,用滑动变阻器与之相连。
实现了简单的电压报警功能。
运用LM016L液晶动态显示提高系统的显示质,且其数字式接口使操作更简单。
解决了传统的数据采集系统由于存在响应慢、精度低、可靠性差、效率低、操作繁琐等弊端,能够完全适应现代化工业的高速发展。
关键词:嵌入式系统 ARM LPC318 LM016L液晶显示电压采集电压报警一、引言1.1设计目的1. 通过本课程设计,熟悉嵌入式系统开发方法和流程。
2. 能结合课堂所学自主设计实现一个简单的监测报警系统。
3. 进一步学会应用定时器、A/D、显示等模块功能1.2设计要求1. 根据题目,自行设计方案,并编写程序2. 要求能利用学过的A/D转换、定时器、按键等模块,实现温度(可用DS18B20传感器)或电压(可用滑动电阻)的检测、显示、阈值设置,以及超过阈值能声光报警。
3. 扩展功能:将温度/电压数据通过串行通信(UART)发送到PC上位机显示,由上位机可显示实时监测数据、历史曲线,并可发送控制命令给ARM实现报警或关闭加热源/电源。
注:上位机软件程序可用VB、VC++做界面,也可简单地通过“串口调试软件”显示。
二、总体方案设计2.1系统总体方案Philips公司的32位ARM7微控制器LPC2138具有强大的存储空间,内嵌32 KB片内静态RAM和512 KB的Flash存储器;可以实现在系统可编程(ISP)、在应用可编程(IAP);2个8路10位A/D转换器,1个D/A转换器,转换迅速准确;引脚资源丰富,多达47个可承受5 V电压的通用I/O口;多个串行接口,包括2个16C550工业标准UART、2个高速I2C接口、SPI,以及具有缓冲作用和数据长度可变功能的SSP协议。
LPC2138可以移植μC/0S-II操作系统,软件的可移植性好,工作可靠。
LM016L液晶应用非常广泛,操作简单,功能强大,通过对 LM016L的编程来读取滑动变阻器和按键的值来获取相应的信息,再通过对液晶的编程控制将获取到的信息通过一系列转换从而显示到液晶屏上。
最后达到有电压采集显示和报警等功能。
系统论证时通过在 proteus的仿真,能够达到预期的效果!系统设计方案的确定核心控制体:LPC2138显示:LM016L电压检测传感器:滑动变阻器报警模块,LED报警。
2.2系统原理图三、硬件设计3.1设计思路 本设计的基于ARM 的电压报警系统框图如下图所示。
由图可见,本系统采用“ARM 核心控制模块+电压采集模块+报警模块”实现所需功能。
并考虑到系统的可扩展性和延伸性,本系统添加了按键模块,使系统更加完善,提高了扩展性。
系统原理框图3.2系统电路设计3.2.1 电压检测模块电路设计通过改变滑动变阻器串入的阻值来改变采样电阻所分电压值,此值可以通过A/D 转换模块将采样所得的电压值转换为数字信号,从而显示到显示模块。
报警模块ARM处理器 LCD 显示器 按键模块 电压检测模块3.2.2按键模块电路设计设有两个按键,按上上面的按键阀值增加1000mv,按下下面的按键阀值减少1000mv。
界面简单,操作方便。
3.2.3报警模块电路设计报警系统由LED构成,在被测电压超过阀值时LED变亮发出警告。
数据端口接P0.21(由LPC的P0.21直接输出驱动)。
3.2.4 LCD显示模块电路设计运行时,上面显示的是此刻检测到的电压,下面显示的是报警电压阀值。
四、软件设计4.1设计思路本系统软件设计是在CodeWarrior for ADS开发环境下完成的。
本电压报警系统的主体由LPC2138核心控制模块构成,所以系统软件也是围绕这个模块来编写的。
程序流程图如由该流程图可看出,刚上电时,要先进行ARM 内部的初始化,以使ARM进入相应的状态和模式;然后初始化硬件装置,以使硬件系统可以正常支持电压数据采集;然后初始化LCD显示和键盘,在LCD上显示相应的菜单列表,供用户通过按钮操作;至此,系统初始化完成,并进入正常主程序循环状态。
在正常主程序循环状态中,首先扫描键盘,以快速的响应用户的按键操作;若没有键值按下,则ARM立即进行数据的采集、处理与显示,以实现实时数据采集与显示等功能。
其主程序包括电压采集程序、ARM获取电压子程序、电压处理和转换子程序。
当ARM 处理器接收到正确的电压数据后,立即进行相应的电压数据处理与转换,变成可被LCD直接显示的值。
4.2 串口通信子程序串口通信程序流程图如图所示。
串口通信子程序流程图五、程序设计与调试5.1程序代码#define uint unsigned int#define uchar unsigned char#define uint8 unsigned char#define uint32 unsigned int#include "stdio.h"#include "lpc21xx.h"#define RS (1<<24)#define RW (1<<25)#define E (1<<26)#define BUSY (1<<23)#define baojing (1<<1)uint32 adc_data,v_test,a,b,c,d,v_set,e,f,g,h;uint8 dis[]="v: mv";uint8 str[]="l: mv";uint32 v_test,adc_data;void CheckBusy(){IO1DIR = (0x700)<<16;while(1){IO1CLR = RS;IO1SET = RW;IO1SET = E;if(!(IO1PIN & BUSY)){break;}IO1CLR = E;}IO1DIR = (0x7ff)<<16;}void WriteCommand(unsigned char command) {CheckBusy();IO1CLR = RS;IO1CLR = RW;IO1CLR = (0xff)<<16;IO1SET = command<<16;IO1SET = E;IO1CLR = E;}void WriteData(unsigned char data){CheckBusy();IO1SET = RS;IO1CLR = RW;IO1CLR = (0xff)<<16;IO1SET = data<<16;IO1SET = E;IO1CLR = E;}void Set_XY(unsigned char x,unsigned char y){switch(x){case 0:y+=0x80;break;case 1:y+=0xc0;break;}WriteCommand(y);}void DisplayChar(unsigned char x,unsigned char y,unsigned char data){Set_XY(x,y);WriteData(data);}void DisplayString(unsigned char x,unsigned char y,unsigned char *str) {Set_XY(x,y);while(*str){WriteData(*str);str++;}}void InitLcd(){WriteCommand(0x01);WriteCommand(0x38);WriteCommand(0x0C);}void delay1ms(uint n){uint i,j;for(i=0;i<n;i++)for(j=1;j<2500;j++);}void delay(uint n){uint i,j;for(i=0;i<n;i++)for(j=1;j<500;j++);}void ADC(void){PINSEL1=0x00400000;ADCR=(1<<0)|((12000000/1000000-1)<<8)|(0<<16)|(0<<17)|(1<<21)|(0<<22)|(1<<24)|(0<<27);while((ADDR&0x80000000)==0);adc_data=ADDR;adc_data=(adc_data>>6)&0x3ff;v_test=(long)adc_data*3300/1024;}char keyscan(){char i=0;if((IO0PIN&0x01)==0){delay1ms(10);if((IO0PIN&0x01)==0){i=1;delay1ms(10);} }if((IO0PIN&0x04)==0){delay1ms(10);if((IO0PIN&0x04)==0){i=2;delay1ms(10);} }return(i);}int main(){ int i;v_set=2500;PINSEL0=0x00000000; PINSEL1=0x400000 ;IO0DIR|=2;IO1DIR|=0x7ff0000;IO0CLR|=baojing;InitLcd() ;DisplayString(0,0,dis);DisplayString(1,0,str); while(1){if(i==1){v_set=v_set-100;}if(i==2){ v_set=v_set+100;}i=0;ADC();a=v_test/1000;b=v_test%1000/100;c=v_test%1000%100/10;d=v_test%1000%100%10;DisplayChar(0,2,a+0x30);DisplayChar(0,3,b+0x30);DisplayChar(0,4,c+0x30);DisplayChar(0,5,d+0x30);e=v_set/1000;f=v_set%1000/100;g=v_set%1000%100/10;h=v_set%1000%100%10;DisplayChar(1,2,e+0x30);DisplayChar(1,3,f+0x30);DisplayChar(1,4,g+0x30);DisplayChar(1,5,h+0x30);if( v_test>v_set){ IO0SET|=baojing;delay(5);}elseIO0CLR|=baojing;i=keyscan();}}5.2程序代码调试调试工具:Proteus仿真工具、keil3用Protues仿真工具画好原理图,打开keil,选用LPC2138芯片,在keil中新建工程,设置好端口,将编好的程序添加再加以编译,生成axf文件,双击Protues 中LPC2138芯片,点击打开生成axf文件,然后可以进行仿真。