基于ARM7LPC2138的实时时钟.docx

上传人:b****0 文档编号:9497023 上传时间:2023-05-19 格式:DOCX 页数:24 大小:1.06MB
下载 相关 举报
基于ARM7LPC2138的实时时钟.docx_第1页
第1页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第2页
第2页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第3页
第3页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第4页
第4页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第5页
第5页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第6页
第6页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第7页
第7页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第8页
第8页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第9页
第9页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第10页
第10页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第11页
第11页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第12页
第12页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第13页
第13页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第14页
第14页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第15页
第15页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第16页
第16页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第17页
第17页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第18页
第18页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第19页
第19页 / 共24页
基于ARM7LPC2138的实时时钟.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于ARM7LPC2138的实时时钟.docx

《基于ARM7LPC2138的实时时钟.docx》由会员分享,可在线阅读,更多相关《基于ARM7LPC2138的实时时钟.docx(24页珍藏版)》请在冰点文库上搜索。

基于ARM7LPC2138的实时时钟.docx

基于ARM7LPC2138的实时时钟

前言

近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。

嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。

32位嵌入式系统发展很快,32位单片机已逐渐占领8位机的市场,并以很高的性价比赢得了越来越多的用户的青睐。

随着科技和工艺的进步,32位单片机的优势会更加突显出来,将会成为嵌入式系统的主流。

在32位嵌入式系统中,基于ARM的应用占据了大部分份额。

实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。

RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。

随着集成电路技术的不断发展,RTC器件的新品也不断推出。

这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。

本次设计是采用LPC2138的32位芯片设计的可调万年历,具有调时、调分、调月、调日和准点报时的功能。

当整点时,蜂鸣器响的次数为当时小时的值以及LED会闪烁相应的次数。

关键词:

ARMLPC2138LEDRTC

 

 

一、功能说明

利用内部RTC的实时时钟,制作一个时钟,通过液晶显示模块显示年、月、日和时间。

K1键、K2键、K3键和K4键分别可用于调整月份、日、小时和分钟数。

在调整过程中,日期和时钟以新的时间为起点继续刷新显示。

同时,该设计具有整点报时的功能,当整点时,蜂鸣器响的次数为当时小时的值以及LED会闪烁相应的次数。

本设计采用的是OCM128128液晶显示模块是128×128点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用T6963C驱动IC进行控制。

本实验板中采用的是3.3V的液晶模块,可以直接连接到LPC2138的GPIO上,而不需要进行电平转换。

二、系统硬件设计

2.1系统结构

本实验是基于LPC2138ARM处理器而设计的实时时钟,综合性较强,涉及到RTC外部中断,引脚的GPIO功能,C语言编程等知识。

首先要定义P0口为基本I\O功能,然后通过引脚功能选择寄存器PINSEL0及PINSEL1定义输入输出外部中断口所在的位,另外还要对外部中断进行初始化,其中有规定他们的优先级,中断触发方式,中断地址分配,

本实验采用液晶模块OCM128128同时显示实时时间,同样要对他们进行初始化,包括检查总线忙与闲,传送地址,传送数据及显示函数的编程、

LPC2138微控制器自带有一个实时时钟RTC带日历和时钟功能,要使用它也要进行一下的基本操作:

设置RTC基准时钟分频器

初始化RTC的时钟值如,YEAR,MONTH,HOUR等

启动RTC即CCR的CLKEN位职位

读取完整时间寄存器值或等待中断。

陈述完以上的模块初始化后,下面简要说明一下程序的流程。

先调用以上各个模块的初始化函数lcd_int(),RTCint()。

然后开启RTC时钟,并调用LCD显示函数SendTimetRtc(),如果没用中断发生就判断实时时间是否与以设定的报警时间相同,如果相同就马上接通蜂鸣器报警并且点亮LED灯。

假如有中断发生,在无效状态下,马上给中断标志寄存器EXTINT对应位,然后写1清零,然后转到中断服务程序。

根据项目要求,确定该系统的设计方案,图2-1为该系统设计方案的结构框图。

硬件电路由6个部分组成,即ARMLPC2138处理器、时钟电路、复位电路、液晶显示模块、时间调整模块、整点报时模块。

图2-1系统结构框图

2.2元器件的选择

选用嵌入式arm7系列的LPC2138芯片和LCDPG128128a显示器:

三、系统软件设计

3.1程序和芯片的初始化

程序中包括:

Lcd的初始化:

voidinit_lcd(void)

{

IO0CLR=rst;

IO0SET=rst;

delay1(50);

IO0CLR=ce;

IO0SET=wr;

IO0SET=rd;

wr_xd(addr_w,0x40);//文本显示区首地址

wr_xd(addr_t,0x42);//图形显示区首地址

wr_td(width,0x00,0x41);//文本显示区宽度

wr_td(width,0x00,0x43);//图形显示区宽度

wr_comm(0x81);//逻辑"异或"

wr_td(0x56,0x00,0x22);//CGRAM偏置地址设置

wr_comm(0x9c);//启用文本显示,启用图形显示

}

中断向量的初始化:

VICIntSelect=0x00000000;

VICVectCntl0=0x20|13;

VICVectAddr0=(uint32)RTC_int;

ILR=0x03;

VICIntEnable=(1<<13);

__enable_irq();

RTC的初始化:

voidRTC_int(void)

{

uint32i,h;

uint8hh[2];

h=HOUR;

hh[0]=HOUR/10+0x30;

hh[1]=HOUR%10+0x30;

clrram();//清屏

disp_img(0,16,64,nBitmapDot);//显示图画

disp_zf(0,12,"CurrentTime:

");

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

{

disp_zfyg(13+i,12,hh[i]);

}

for(i=0;i

{

IO0CLR=LED;

IO0SET=BEAK;

DelayNS(30);

IO0SET=LED;

IO0CLR=BEAK;

DelayNS(30);

}

ILR=0x03;

VICVectAddr=0x00;

clrram();//清屏

}

 

3.2构建功能模块

调整时间和日期的函数

voidkey()

{

if((IO0PIN&ATH)==0)

{

CIIR=0x00;

HOUR++;

if(HOUR>23)HOUR=0;

CIIR=0x04;

while((IO0PIN&ATH)==0);

}

if((IO0PIN&ATM)==0)

{

CIIR=0x00;

MIN++;

if(MIN>59)MIN=0;

CIIR=0x04;

while((IO0PIN&ATM)==0);

}

if((IO0PIN&ATS)==0)

{

CIIR=0x00;

MONTH++;

if(MONTH>12)MONTH=0;

CIIR=0x04;

while((IO0PIN&ATS)==0);

}

if((IO0PIN&ATD)==0)

{

CIIR=0x00;

DOM++;

CIIR=0x04;

while((IO0PIN&ATD)==0);

}

}

 

延时函数

voidDelayNS(uint32dly)

{uint32i;

for(;dly>0;dly--)

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

}

 

整点报时函数

voidRTC_int(void)

{

uint32i,h;

uint8hh[2];

h=HOUR;

hh[0]=HOUR/10+0x30;

hh[1]=HOUR%10+0x30;

clrram();//清屏

disp_img(0,16,64,nBitmapDot);//显示图画

disp_zf(0,12,"CurrentTime:

");

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

{

disp_zfyg(13+i,12,hh[i]);

}

for(i=0;i

{

IO0CLR=LED;

IO0SET=BEAK;

DelayNS(30);

IO0SET=LED;

IO0CLR=BEAK;

DelayNS(30);

}

ILR=0x03;

VICVectAddr=0x00;

clrram();//清屏

}

输出字符串函数

voiddisp_zf(uint32x,uint32y,uint8*str)

{

charc;

wr_xd((addr_w+16*y+x),0x24);

wr_comm(0xb0);

while(*str!

='\0')

{

c=(*str);

wr_auto(c-32);

str++;

}

wr_comm(0xb2);

}

 

输出一个字符的函数

voiddisp_zfyg(uint32x,uint32y,uint8str)

{

charc;

wr_xd((addr_w+16*y+x),0x24);

wr_comm(0xb0);

c=str;

wr_auto(c-32);

wr_comm(0xb2);

}

四、实验测试

4.1IAR软件的编译,连接和运行

构建完整的程序:

添加头文件,中断处理汇编程序段,初始化函数和主函数:

4.2protues仿真软件的联合调试

为LPC2138芯片选择Hex文件路径:

五、实验结果

5.1仿真结果

 

5.2实验板结果

 

 

六、心得体会

众所周知,ARM微处理器功能特别的强大,与MC51单片机相比,它更适合做中高端数字系统的微处理器,ARM已经成了现代主流微处理器内核,目前,绝大多数码产品,如,手机,MP3,MP4,数码相机,他们的系统都嵌入了ARM系列内核,ARM微处理器更新换代很快,现在的诺基亚N系列智能手机如N78,N79已经采用了ARM11了,使得运行于塞班操作系统S60第三版的应用程序流畅自如。

回顾起此次课程设计,至今我仍感慨颇多,从理论到实践,在整整半个月的日子里,我学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。

在设计的过程遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识。

七、程序清单

/****************************************************************************

*文件名:

LCDTEST.C

*功能:

显示图像,显示汉字,显示字符。

显示点阵

****************************************************************************/

#include"Config.h"

#include"Target.h"

#include"T6963C.h"

#include

#defineuint32unsignedint

#defineuint8unsignedchar

#defineBEAK(1<<20)

#defineLED(1<<16)

#defineATM(1<<17)//调整分钟

#defineATH(1<<18)//调整小时

#defineATS(1<<22)//调整月份

#defineATD(1<<23)//调整日期

//*************************************

//调整时间和日期的函数

//*************************************

voidkey()

{

if((IO0PIN&ATH)==0)

{

CIIR=0x00;

HOUR++;

if(HOUR>23)HOUR=0;

CIIR=0x04;

while((IO0PIN&ATH)==0);

}

if((IO0PIN&ATM)==0)

{

CIIR=0x00;

MIN++;

if(MIN>59)MIN=0;

CIIR=0x04;

while((IO0PIN&ATM)==0);

}

if((IO0PIN&ATS)==0)

{

CIIR=0x00;

MONTH++;

if(MONTH>12)MONTH=0;

CIIR=0x04;

while((IO0PIN&ATS)==0);

}

if((IO0PIN&ATD)==0)

{

CIIR=0x00;

DOM++;

CIIR=0x04;

while((IO0PIN&ATD)==0);

}

}

//*************************************

//输出字符串函数

//*************************************

voiddisp_zf(uint32x,uint32y,uint8*str)

{

charc;

wr_xd((addr_w+16*y+x),0x24);

wr_comm(0xb0);

while(*str!

='\0')

{

c=(*str);

wr_auto(c-32);

str++;

}

wr_comm(0xb2);

}

//*************************************

//输出一个字符的函数

//*************************************

voiddisp_zfyg(uint32x,uint32y,uint8str)

{

charc;

wr_xd((addr_w+16*y+x),0x24);

wr_comm(0xb0);

c=str;

wr_auto(c-32);

wr_comm(0xb2);

}

/****************************************************************************

*名称:

DelayNS()

*功能:

长软件延时

*入口参数:

dly延时参数,值越大,延时越久

*出口参数:

****************************************************************************/

voidDelayNS(uint32dly)

{uint32i;

for(;dly>0;dly--)

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

}

//*************************************

//液晶初始化函数

//*************************************

voidinit_lcd(void)

{

IO0CLR=rst;

IO0SET=rst;

delay1(50);

IO0CLR=ce;

IO0SET=wr;

IO0SET=rd;

wr_xd(addr_w,0x40);//文本显示区首地址

wr_xd(addr_t,0x42);//图形显示区首地址

wr_td(width,0x00,0x41);//文本显示区宽度

wr_td(width,0x00,0x43);//图形显示区宽度

wr_comm(0x81);//逻辑"异或"

wr_td(0x56,0x00,0x22);//CGRAM偏置地址设置

wr_comm(0x9c);//启用文本显示,启用图形显示

}

/**********************************************************

整点报时函数

***********************************************************/

voidRTC_int(void)

{

uint32i,h;

uint8hh[2];

h=HOUR;

hh[0]=HOUR/10+0x30;

hh[1]=HOUR%10+0x30;

clrram();//清屏

disp_img(0,16,64,nBitmapDot);//显示图画

disp_zf(0,12,"CurrentTime:

");

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

{

disp_zfyg(13+i,12,hh[i]);

}

for(i=0;i

{

IO0CLR=LED;

IO0SET=BEAK;

DelayNS(30);

IO0SET=LED;

IO0CLR=BEAK;

DelayNS(30);

}

ILR=0x03;

VICVectAddr=0x00;

clrram();//清屏

}

/*

**************************************************************************

**函数名称:

RTCInit()

**函数功能:

初始化实时时钟

**入口参数:

**出口参数:

**************************************************************************

*/

voidRTCInit(void)

{

PREINT=Fpclk/32768-1;//设置基准时钟分频器

PREFRAC=Fpclk-(Fpclk/32768)*32768;

CCR=0x00;//禁止时间计数器

YEAR=2013;

MONTH=07;

DOM=01;

DOW=1;

HOUR=2;

MIN=59;

SEC=55;

CIIR=0x04;//设置HOUR值的增量产生1次中断

ILR=0x03;//清除RTC增量和报警中断标志

CCR=0x01;//启动RTC

}

 

/*------------------主程序--------------------*/

voidmain()

{

uint32i;

uint8k[18];

TargetResetInit();

RTCInit();

VICIntSelect=0x00000000;

VICVectCntl0=0x20|13;

VICVectAddr0=(uint32)RTC_int;

ILR=0x03;

VICIntEnable=(1<<13);

__enable_irq();

PINSEL0=0x0000000;//设置I/O连接到UART1

PINSEL1=0x00000000;//设置PS2口为GPIO输入

IO0DIR=0xff39ffff;

IO0SET=LED;

IO0SET=ATM;

IO0SET=ATH;

init_lcd();//液晶初始化

clrram();//清屏

while

(1)

{

key();

k[0]=YEAR/1000+0x30;

k[1]=YEAR%1000/100+0x30;

k[2]=YEAR%100/10+0x30;

k[3]=YEAR%10+0x30;

k[4]='-';

k[5]=MONTH/10+0x30;

k[6]=MONTH%10+0x30;

k[7]='-';

k[8]=DOM/10+0x30;

k[9]=DOM%10+0x30;

k[10]=HOUR/10+0x30;

k[11]=HOUR%10+0x30;

k[12]=':

';

k[13]=MIN/10+0x30;

k[14]=MIN%10+0x30;

k[15]=':

';

k[16]=SEC/10+0x30;

k[17]=(SEC%10+0x30);

disp_img(0,16,64,nBitmapDot);//显示图画

disp_zf(0,10,"DATE:

");

disp_zf(0,13,"TIME:

");

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

{

disp_zfyg(6+i,10,k[i]);

}

for(i=10;i<18;i++)

{

disp_zfyg(6+i-10,13,k[i]);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2