ARM设计实验报告Word格式文档下载.docx
- 文档编号:16719551
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:11
- 大小:61.47KB
ARM设计实验报告Word格式文档下载.docx
《ARM设计实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ARM设计实验报告Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
5,陈述完以上的模块初始化后,下面简要说明一下程序的流程
先调用以上各个模块的初始化函数lcd_int(),RTCint()
然后开启RTC时钟,并调用LCD显示函数SendTimetRtc(),如果没用中断发生就判断实时时间是否与以设定的报警时间相同,如果相同就马上接通蜂鸣器报警并且点亮LED灯。
假如有中断发生,在无效状态下,马上给中断标志寄存器EXTINT对应位,然后写1清零,然后转到中断服务程序。
本实验设定7种系统状态
正常运行:
0态
设定RTC的
HOUR1态
SEC2态
MIN3态
ALHOUR4态
ALSEC5态
ALMIN6态
电路中通过三个按钮开关与三个中断eint的输入端相连,对应也有eint0,eint1,eint3三个中断服务程序,当eint2
端按下时,就转到eint2中断服务程序,它的功能就是设定系统当前所取的状态,也就是所选择实时时钟和报警时间的时,分,秒,按一下,状态就自增一,eint0,eint1的中断服务程序都是调节时间不同的是一个以加1调节,一个以减2调节。
按下一次就加一次时间值,但具体是对HOUR,SEL,MIN,ALHOUR,ALMIN,ALSEL中的哪一个调节那还得看eint2触发下系统所处的状态所以只有在eint2发生的基础上eint0,eint1发生才有意义。
在判断状态是我灵活的使用了C语言开关语句——switch,可以优化程序使程序看起来更紧凑,一目了然。
五软件时钟的电路原理图
六程序流程图及C程序(软件部分)
#include"
config.h"
#definers(1<
<
8)
#definerw(1<
9)
#defineen(1<
10)
#definebusy(1<
7)
#defineFPCLK2764800L
uint8change;
uint8txt[]={"
ALM:
"
};
uint8MESSAGE[]={"
RTC:
/**********************************外部中断*************************************/
void__irqeint0(void)//向量中断开始,说明有外部中断
{
switch(change)
{
case1:
{while(EXTINT&
(1<
0))EXTINT=1<
0;
VICVectAddr=0;
ALSEC++;
if(ALSEC>
59)ALSEC=0;
break;
}
case2:
ALMIN++;
if(ALMIN>
59)ALMIN=0;
case3:
ALHOUR++;
if(ALHOUR>
23)ALHOUR=0;
case4:
SEC++;
if(SEC>
23)SEC=0;
case5:
MIN++;
if(MIN>
23)MIN=0;
case6:
HOUR++;
if(HOUR>
23)HOUR=0;
}
void__irqeint1(void)//向量中断开始,说明有外部中断
1))EXTINT=1<
1;
ALSEC--;
if(ALSEC==0XFF)ALSEC=59;
ALMIN--;
if(ALMIN==0XFF)ALMIN=59;
ALHOUR--;
if(ALHOUR==0XFF)ALHOUR=23;
SEC--;
if(SEC==0XFF)SEC=59;
MIN--;
if(MIN==0XFF)MIN=59;
HOUR--;
if(HOUR==0XFF)HOUR=23;
void__irqeint2(void)//向量中断开始,说明有外部中断
change++;
if(change>
6)
change=0;
while(EXTINT&
2))//等待extint[2]变成1
EXTINT=1<
2;
//往extint[1]写1清除中断
VICVectAddr=0;
//向量中断结束
/****************************LCD**************************************/
/****************************************************************************
*名称:
WrOp()
*功能:
写函数
****************************************************************************/
voidChkBusy()
{
IODIR=0x700;
//设置P0.8~P0.10为输出
while
(1)
IOCLR=rs;
//命令选择
IOSET=rw;
//写操作
IOSET=en;
//使能有效
if(!
(IOPIN&
busy))break;
IOCLR=en;
//使能无效
IODIR=0x7ff;
//设置P0.0~P0.10为输出
写命令函数
voidWrOp(uint8dat)
ChkBusy();
//判忙
IOCLR=rs;
//全部清零,命令选择
IOCLR=rw;
//写选择
IOCLR=0xff;
//先清零
IOSET=dat;
//再送数
IOSET=en;
//使能有效
IOCLR=en;
//使能无效
WrDat()
写数据函数
voidWrDat(uint8dat)
IOSET=rs;
//数据选择
lcd_init()
lcd初始化函数
voidlcd_init(void)
WrOp(0x38);
//设置16*2显示,5*7点阵
WrOp(0x06);
//读/写后地址加一,光标加一
WrOp(0x0c);
//开显示,不显示光标,光标不闪烁
voidDisText(uint8addr,uint8*p)
WrOp(addr);
//调用写命令函数
while(*p!
='
\0'
)WrDat(*(p++));
/******************************************************
//函数名称:
voidlcd_string(uchar*p,ucharflag)
//函数功能:
1602LCD显示函数
//参数功能:
*p--显示数据首地址;
//flag--显示行数
******************************************************/
voidlcd_string(uint8*p,uint8flag)
if(flag==1)
{
DisText(0x80,p);
//指定显示地址,第一行显示
}
if(flag==2)
{
DisText(0xc0,p);
//指定显示地址,第二行显示
/*****************************RTC**********************************/
voidRTCIni(void)
{PREINT=FPCLK/32768-1;
//设置预分频器
PREFRAC=FPCLK-(FPCLK/32768)*32768;
YEAR=2005;
//初始化年
MONTH=6;
//初始化月
DOM=10;
//初始化日
HOUR=8;
MIN=30;
SEC=0;
ALHOUR=8;
ALMIN=50;
ALSEC=37;
AMR=0xf8;
CIIR=0x01;
//设置秒值的增量产生一次中断
CCR=0x01;
//启动RTC
/*******************************************************************************
*名称:
SendTimeRtc()
*功能:
读取RTC的时间值,并将读出的时分秒值由lcd1602显示,显示报警时间
*******************************************************************************/
voidSendTimeRtc(void)
MESSAGE[4]=HOUR/10+'
0'
;
//时的值
MESSAGE[5]=HOUR%10+'
MESSAGE[6]='
:
'
MESSAGE[7]=MIN/10+'
//取得分的值
MESSAGE[8]=MIN%10+'
MESSAGE[9]='
MESSAGE[10]=SEC/10+'
//取得秒的值
MESSAGE[11]=SEC%10+'
lcd_string(MESSAGE,1);
txt[4]=ALHOUR/10+'
//时的报警值
txt[5]=ALHOUR%10+'
txt[6]='
txt[7]=ALMIN/10+'
//分的报警值
txt[8]=ALMIN%10+'
txt[9]='
txt[10]=ALSEC/10+'
//秒的报警值
txt[11]=ALSEC%10+'
lcd_string(txt,2);
voidDelayNS(uint32dly)
{uint32i;
for(;
dly>
dly--)
for(i=0;
i<
500;
i++);
/*****************************************************************
*******************************主函数**************************************/
intmain()
lcd_init();
//LCD初始化
RTCIni();
//RTC初始化
PINSEL0=PINSEL0|0XA0000000;
//选择外部中断1,2
PINSEL1=PINSEL1|0X00000001;
//选择外部中断0
//EXTPOLAR=0X00;
//低电平或下降沿
//EXTMODE=0X07;
//下降沿
VICIntSelect=0;
//Eint0,Eint1,Eint为普通中断
VICIntEnable=0x0001c000;
//允许Eint0,Eint1,Eint中断
VICVectCntl0=0x0000002e;
//外部中断0的优先级为0
VICVectCntl1=0x0000002f;
//外部中断1的优先级为1
VICVectCntl2=0x00000030;
//外部中断3的优先级为2
VICVectAddr0=(int)eint0;
//给向量地址0赋初值
VICVectAddr1=(int)eint1;
//给向量地址1赋初值
VICVectAddr2=(int)eint2;
//给向量地址2赋初值
EXTINT=0x07;
//Eint0,eint1,eint中断状态为清除,等待中断在把这3位置1
while((ILR&
0x01)==0);
//等待RTC增量中断标志位
SendTimeRtc();
if((ALSEC==SEC)&
&
(ALMIN==MIN)&
(ALHOUR==HOUR))
IODIR=0xffff;
IOSET=0x1800;
//IOCLR=(IOCLR|(3<
11));
DelayNS(8000);
//CCR=0x00;
//while
(1);
ILR=0x01;
}
七proteus仿真图(硬件部分)
虚拟元器件:
一个喇叭,一个蜂鸣器,5个电阻,三个按钮开关,一盏LED灯
一个PNP三极管,一个极性电容。
微处理器芯片PLC2106一片,液晶显示器LCD1602一片
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)