实验三 定时器中断.docx

上传人:b****6 文档编号:5729726 上传时间:2022-12-31 格式:DOCX 页数:11 大小:367.07KB
下载 相关 举报
实验三 定时器中断.docx_第1页
第1页 / 共11页
实验三 定时器中断.docx_第2页
第2页 / 共11页
实验三 定时器中断.docx_第3页
第3页 / 共11页
实验三 定时器中断.docx_第4页
第4页 / 共11页
实验三 定时器中断.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验三 定时器中断.docx

《实验三 定时器中断.docx》由会员分享,可在线阅读,更多相关《实验三 定时器中断.docx(11页珍藏版)》请在冰豆网上搜索。

实验三 定时器中断.docx

实验三定时器中断

本科实验报告

实验名称:

实验三定时器中断实验

课程名称:

定时器中断实验

实验时间:

2015.11.25

任课教师:

梁蕻

实验地点:

4-338

实验教师:

梁蕻

实验类型:

□原理验证

√综合设计

□自主创新

学生姓名:

学号/班级:

组号:

学院:

信息与电子学院

同组搭档:

专业:

信息工程

成绩:

 

实验三定时器中断实验

一、实验目的:

1.学习使用PIC定时器模块和中断功能

2.学习对PIC18F452的编程

二、实验原理:

TIMER2模块工作原理:

Timer2模块定时器有以下特性:

•8位定时器(TMR2寄存器)

•8位周期寄存器(PR2)

•可读写(TMR2和PR2寄存器均可)

•可软件编程的预分频器(1:

1、1:

4和1:

16)

•可软件编程的后分频器(1:

1到1:

16)

•TMR2与PR2匹配时中断

Timer2模块利用8位定时器(TMR2寄存器)对单片机指令周期(16MHz,4us)从0开始进行计数,当计数值与预先存在PR2寄存器中的数值相等时,TMR2寄存器自动归0,同时产生一个中断。

若预分频器设为1:

16,后分频器设为1:

10,PR2设为199,则Timer2模块的定时时间为

4/16×16×10×200=8ms

三、程序设计内容:

1.用Timer2控制LED点亮,点亮持续时间为8mS。

将Timer2模块设定为中断模式,每8mS中断一次。

2.LED间隔48mS向左移7bit后再向右移7bit

3.LED重复左、右移动(跑马灯)

四.实验步骤:

根据实验要求,需要修改程序

1.首先需要设置中断优先级位RCONbits.IPEN=1;

2.Timer2设为高优先级,对应的中断向量地址地址为0x08HIPR1bits.TMR2IP=1;

3.允许高优先级中断INTCONbits.GIEH=1;

4.预分频器设为1:

16,后分频器设为1:

10,PR2设为199

修改后的实验代码:

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

//*

//*Exercise4

//*MPLABC18WOrkshopExerciseforHigh-priority*

//*SettingwithCcode.

//*

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

#include

#include

#include

#pragmaconfigWDT=OFF

#pragmaconfigOSC=HS

#pragmaconfigLVP=OFF

voidisr_high(void);

volatileunsignedcharLong_Count;

volatileunsignedcharDirect_LED;

volatileunsignedcharDir_Count;

voidmain(void)

{

TRISD=0x00;//SetoutputportforLEDdriver

PORTD=0b00000001;//Setb0ofLEDisOn

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

//Exercise

//EnableTimer2interruptwithhighPriority

//

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

//(Refer18fxx2_cn(39564b)ofPage75-84)//EnableInterruptPrioritybit

//SetTimer2forHighPriority

//EnableHighPriorityInterrupt

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

/*InterruptTime*/

/*(4/16Mhz)[16*10*(199+1)]=8mS*/

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

//(ReferMPLABC18函数库ofPage50)//TurnOntheTimer2withInterrupt

//(4/16Mhz)[16*10*(199+1)]=8mS

RCONbits.IPEN=1;

IPR1bits.TMR2IP=1;

INTCONbits.GIEH=1;

OpenTimer2(TIMER_INT_ON&T2_PS_1_16&T2_POST_1_10);

PR2=199;

Long_Count=0;

Direct_LED=0;

Dir_Count=0;

while

(1);//LoopHere!

}

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

//*#pragmaInterruptDeclarations*

//**

//*Function:

isr_high_direct*

//*-Directexecutiontotheactual*

//*high-priorityinterruptcode.*

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

#pragmacodeisrhighcode=0x0008

voidisr_high_direct(void)

{

_asm//beginin-lineassembly

gotoisr_high//gotoisr_highfunction

_endasm//endin-lineassembly

}

#pragmacode

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

//*Function:

isr_high(void)*

//*Highpriorityinterruptwill*

//**

//*SavethereceiveddatatobufferRec_Data*

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

#pragmainterruptisr_high

voidisr_high(void)

{

PIR1bits.TMR2IF=0;//ClearTimer2interruptFlag

if(Long_Count<=6)Long_Count++;//8mS*6=48mS

else

{

Long_Count=0;//Timeis48mS,dothefunction

if(Direct_LED==0x00)//RightorLeftshift

{

PORTD<<=1;//LEDleftshift

Dir_Count++;

if(Dir_Count==7)//EndofLEDposition?

{

Dir_Count=0;//Yes,setflagofrightshift

Direct_LED=0x1;

}

}

else

{

PORTD>>=1;//LEDrightshift

Dir_Count++;

if(Dir_Count==7)

{

Dir_Count=0;

Direct_LED=0x00;

}

}

}

}

#pragmacode

实验过程:

实验结果:

 

五、调试

用ICD2编程、调试:

建立好新项目后,设置好项目设置,把源程序加入项目,按照要求对源程序进行修改,编译成功后,再创建完成之后把程序烧写进单片机。

运行后,单片机红色的LED灯从左至右然后从右至左依次亮起、熄灭,跑马灯实验程序成功。

六、实验心得

经过前俩次的实验基础积累,这次的实验明显比前俩次的手忙脚乱好了很多,不管是程序代码的调试,还是软件的使用,都有了很大的进步。

尽管在连接ICD2的时候遇到了无法连接的问题,但是经过一次软件的重新打开(不要拔掉ICD2),这个问题也迎刃而解了,实验还算比较顺利。

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

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1