实验三 定时器中断.docx
《实验三 定时器中断.docx》由会员分享,可在线阅读,更多相关《实验三 定时器中断.docx(11页珍藏版)》请在冰豆网上搜索。
实验三定时器中断
本科实验报告
实验名称:
实验三定时器中断实验
课程名称:
定时器中断实验
实验时间:
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),这个问题也迎刃而解了,实验还算比较顺利。