实验2 定时器实验

  • 格式:doc
  • 大小:557.00 KB
  • 文档页数:10

单片机原理及应用

学院 计算机与电子信息学院

专业 电子信息工程 班级 电信11 - 班

姓名 学号 110340301

指导教师 左 敬 龙

实验报告评分:_______

实验2 定时器实验

一、 实验原理及电路

利用单片机中断系统来实现流水灯效果。本次定时器实验我是通过利用内部中断源中的定时器/计数器0中断来控制P0、P1口的8个LED灯,为了使它产生流水灯的效果,必须要对每个LED灯进行有规律的控制。但由于定时器/计数器0有定时和计数效果,使用起来就相当于我们之前的延时函数一样,可以控制LED灯闪烁的时间长短。要使用定时器/计数器就必须先设置好有关的器件,第一步:设置中断屏障寄存器IE,由于IE可以位寻址,所以把定时器/计数器0的中断允许位ET0置1,同时也把中断允许总控位EA置1。我选择的是16位定时器/计数器0,所以要把工作方式寄存器TMOD赋值为0x01(由于TMOD不能位寻址,只能进行字节操作),接着设置定时器/计数器控制寄存器TCON当中的定时器/计数器0的溢出中断标志位TF0和运行控制为TR0,并同时置1(由于TCON可以位寻址,因此可以使用位操作指令进行设置,即TF0=1、TR0=1),接下来还有对TL0、TH0设初值,我那块实验板上的时钟频率是11.0592MHZ,所以机械周期为12*(1/11.0592)=1.09微秒,50ms溢出一次的话,那么计数的个数N=50/1.09=45872,所以装入TH0和TL0的数分别为TH0=(65536-45872)/256、TL0=(65536-45872)%256。然后,根据不同的实验板,要使得LED灯亮起来,可能有些高电平有效,有些是低电平有效。所以对P0、P1口进行编码就需要注意。而我的实验板是低电平有效的,换句话说也就是0代表亮、1代表灭。接下来就要分别对P0、P1口进行编码,由于闪烁的方式比较多,为了使别人看起来简单、易懂,我就使用数组的方式来进行编码。最后还要一个While语句使得P0、P1口的编码不间断地循环执行,这样就可以使得LED灯无间断地有规律地闪烁起来。

电路原理图

二、 功能说明

该流水灯一共有四种闪烁方式:第一种:三个三个轮流闪亮(从P0^0、P0^1开始);第二种:来回逐次闪烁一盏(从P0^0开始);

第三种:P0、P1口各三个轮流闪亮直到最后然后全亮全灭2次接着倒流回来(从P0^0-2、P1^0-2开始);第四种:一个接一个亮起来直到全亮然后一个接一个熄灭直到全灭,之后全亮全灭3次。

三、 实验框图

四、 实验代码

#include

#define uint unsigned int

#define uchar unsigned char

uchar num,i; uchar code pattern_P0[]=

{ 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff,0x00,0xff,0x00,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,

0x00,0xff,0x00,0xff,0x00,0xff

};

uchar code pattern_P1[]=

{ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff,0x00,0xff,0x00,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x00,0xff,0x00,0xff,0x00,0xff

};

void main()

{

TMOD=0x01; TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

P0=pattern_P0[i];

P1=pattern_P1[i];

}

}

void T0_time() interrupt 1

{ TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

num++;

if(num==10)

{ num=0;

i++;

}

if(i==100)

i=0;

}

五、 实验过程

第一步 启动Keil,新建一个工程

第二步 新建一个zd.C,并加入到工程中,输入如下内容:

第三步 编译并调试程序

第四步 将单片机学习板与计算机连接,并将编译完成后生成的*.hex文件下载到开发板

第六步 实验现象:将程序下载到学习板后,按下开发板的复位按钮,能够按照一开始设计的闪烁方式进行,没有出错。

六、 实验小结

通过本次实验,使我对Proteus 7 Professional软件的使用方法有了进一步的了解,还认识了定时器/计数器中断的结构和每种工作方式的具体用法。同时,还懂得了怎么计算定时器的初值和书写中断服务程序。虽然在本次试验中遇到了的问题,但经过自己的不断探索和查阅资料,问题得到了解决,同时还进一步了解了单片机方面的有关知识,增加了我对单片机的亲密度。