苏州大学实验报告
院、系 年级专业 姓名 学号
课程名称 成绩
指导教师 同组实验者 实验日期
实验名称: 定时溢出中断实验
一.实验目的
通过该实验,进一步熟悉MT-IDE嵌入式开发系统环境、汇编和C语言以及调试方式;复习串口的相关原理和编程方法;理解用定时器实现计数与定时的工作原理以及实现方法;理解课本中的程序代码。
二.实验内容
编制一个利用定时器中断计数的程序。要求1秒钟中断一次,计数加1,该计数范围为从0到255,超过又重新计数,每次的数字通过接在PTA0~PTA7上的八个小灯动态显示,小灯亮,表示该位为“1”;小灯暗,表示该位为“0”。
三.实验过程
(一)基本原理
定时器的核心是一个不断加1的16位计数寄存器,该计数器的时钟频率由外部晶振时钟或总线时钟经过分频因子分频得到,在定时器内部有个控制和状态寄存器,通过对它某些位的设置,可以确定在多少时间后计数器加1。在定时器内部有个预置寄存器,当计数器的值等于预置寄存器的值时,称为计数器溢出。当计数器溢出时,计数器的值被赋0,同时将计数器溢出标志等状态置于控制和状态寄存器中。通过对控制和状态寄存器某些位的设置,可以决定在计数器溢出时,是否允许中断,利用这个中断,可以编写中断程序,实现计数与定时等功能。
四.编程
(一)流程图
(二)所用寄存器名称及其所用的位
T1状态和控制寄存器(Timer 1 Status and Control Register,T1SC)
T1计数寄存器(Timer 1 Counter Register,T1CNTH、TICNTL)
这是一个16位寄存器,分为高8位和低8位,每一个计数周期值加一。
T1预置寄存器(Timer 1 Counter Modulo Register,T1MODH、T1MODL)
这是一个16位寄存器,分为高8位和低8位,当计数寄存器中的值达到预置寄存器的值时发生中断。
(三)主要代码段
1.汇编方式:
2.C语言方式:
五.实验问答(根据实验指导书所列举的问题)
1.通过实验总结完全软件定时和利用可编程定时器定时的差异性以及各自优缺点
完全软件定时是利用计算机执行指令的时间来实现定时。通常设计一个延时子程序,子程序中包括一定指令。设计者需要对指令的执行时间严格的计算。该方法节省硬件,但延时时要执行延时程序,降低了CPU利用率,不利于多作业环境。
利用可编程定时器计时,结合了完全硬件完全软件的优点,其计时可由程序设置,设置后可与CPU并行工作,不占用CPU工作时间,同时定时器成本不高。因此该方法较优。
2.总结定时器初始化包括哪些内容?
定时器初始化过程中需要对定时器状态和控制寄存器、计数寄存器和预置寄存器设置。具体为根据要求的时间间隔、总线频率计算出分频因子和预置寄存器的值写入相应的寄存器同时设置计数寄存器的值为0,最后允许计数寄存器计数。
3.本自编程序中可以用寄存器A代替sec全局变量吗?
不可以。因为在每次中断发生时将寄存器A中的值压入堆栈,而在退出中断时又会将A中的值恢复为中断发生前A中的值,从而使得在中断过程中对其所作的更新无效。思考用寄存器H又如何。
4.本实验中是定时器的间隔为1秒,思考任何获得更小或更大的定时间隔?
首先可以通过对分频因子和预置寄存器的设置来获取所要求的时间间隔,当超过一定值后,可以通过中断处理程序解决。
5.想一想课本中第202页的中断程序1秒钟中断一次,最高能采用多大的时钟频率。
6.若本实验自编的中断程序时钟频率太高了,1秒钟的计数超过65535范围,中断程序该怎样处理以便解决这个问题。
通过计数时钟频率计算出1秒钟的计数次数。将该次数等分位n段,使得每断的计数次数不超过65535,将每段的计数次数写入到预置寄存器。增加标志变量,记录进入中断处理函数的次数。当进入中断处理函数的次数为n时,此时时间间隔为1秒。
7.计数寄存器可以如何清零?
向计数寄存器中直接写入0可以使计数寄存器清零;向定时器复位位写入1时会清除计数寄存器;在允许计数的情况下,当计数寄存器的值达到预置寄存器的设定值时,计数寄存器亦自动清零。
六.实验小结
通过该实验,了解了如何使用定时器溢出中断进行计时,熟悉和掌握了MT-IDE嵌入式开发系统环境及其调试方式,进一步熟悉汇编编程和C语言编程;复习了串口通信(SCI)的相关原理和方法。
第二篇:实验报告(中断和定时的使用1)
中国地质大学(北京)
实 验 报 告
课程名称: 单片机原理
实验名称: 单片机定时和外部中断的使用(1)
姓 名: 徐奥
学 号: 1010092225
班 级: 10100922
指导教师: 曾 卫 华
评 分:
实验时间: 20##-10
实验题目:单片机定时和外部中断的使用(1)
一、 实验目的
1、了解单片机C语言程序的设计和调试方法
2、掌握单片机定时和中断控制程序的简单编程
3、进一步熟悉单片机上机操作实践过程,加深对硬件应用的理解
二、 实验要求
通过使用51单片机的定时器功能,控制P89V51RD2单片机实验板上的8个LED灯。要求上电复位后,每个LED跑马灯的点亮时间为500ms,每按一次INT0键并产生外部中断后,LED灯的点亮时间减少10ms,程序运行期间4位7段数码管显示当前点亮时间,显示不闪烁。
三、实验原理
1)工作原理框图
7_SEG_LED:
8_BI Ts_LED:
2)实验原理
见以下参考程序:
四、参考程序
#include<reg51.h>
void Time0(void);
void int0(void);
void display(unsigned char);
void UART(void);
void send(unsigned char j);
void delay();
static unsigned char ksbl=50;
unsigned char counter;
sbit fd=P3^2;
sbit clk=P3^6;
unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char code Tab0[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
void main(void)
{;
IP=0x01;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=(65536-55536)/256;
TL0=(65536-55536)%256;
ET0=1;
EA=1;
TR0=1;
UART();
counter=0;
send(ksbl);
while(1)
{display(ksbl);}
}
void Time0(void) interrupt 1 using 0
{ static unsigned char i=0;
counter++;
if(counter==ksbl)
{
P0=Tab[i];
clk=1;
clk=0;
counter=0;
if(i<7) i++;
else i=0;
}
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
TR0=1;
}
void Int0(void) interrupt 0 using 0
{ int s;
s=0;
while(fd==0)
s++;
if(s>100)
{
if(ksbl>0)
{
ksbl--;
send(ksbl);
}
else ksbl=50;
s=0;
EX0=1;
IT0=1;
}
}
void display(unsigned char ksbl)
{
P1=0x8e;
P0=0x03;
delay();
P1=0x4e;
P0=Tab0[ksbl%10];
delay();
P1=0x2e;
P0=Tab0[ksbl/10];
delay();
}
void delay()
{
unsigned char i;
for(i=0;i<250;i++)
;
}
void UART(void)
{
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=0;
TR1=1;
}
void send(unsigned char ksbl)
{
SBUF=Tab0[ksbl/10];
while(TI==0);
if(TI)
TI=0;
SBUF=Tab0[ksbl%10];
while(TI==0) ;
if(TI)
TI=0;
SBUF=Tab0[0];
while(TI==0);
if(TI)
SBUF=0x20;
while(TI==0);
if(TI)
TI=0;
}
五、实验步骤
1、在keil软件中新建实验项目exp2;
2、新建文件,输入实验程序并补充完整,保存为.c文件;
3、将上述.c文件添加到实验项目exp2中,编译调试实验程序,并修改错误;
4、再次编译生成hex文件,用flash magic烧录到单片机中
5、将单片机复位上电,运行
6、按INT0键,观察led管的显示数字,每按一次观察是否有变化,变化是否按设计进行
六、实验结果
个人感觉非常成功,实现了用外中断控制闪亮时间,通过使用P0的锁存器,用P0口点亮了LED灯和数码管。闪的很好看哦。按键的防抖设置有了很好的效果,若没有防抖,闪亮速度会变化的没规律。
七、实验感想
编程是个很细致的活,一点错都会导致没有预期效果,而且编程真的建立在理解单片机工作原理的基础上,必须对单片机每一步执行的细节细致考虑,不然什么现象都没有。
复杂功能最好一点点实现,从最开始的点亮一个灯开始,很多事情不是想象的那样的,做完了才知道,原来是那样的。