运用定时中断方法控制P1口亮灯实验

实验三 运用定时中断方法控制P1口亮灯实验

    名:郑旅军       号:0656061

指导老师:邹慧兰       绩:

如有疑问,请[email protected] 探讨

一、实验目的

1学习内部定时/计数器的使用

2学习定时中断处理程序的编程方法

二、实验内容

P1口作为输出口,接发光二极管,编写相应的程序使发光二极管点亮。发光二极管亮灭的时间间隔可以由定时中断子程序进行控制。要求0.5S中亮一个。

三、实验预备知识

1.       P1口是准双向口,可以定义为输入,也可以定义为输出

2.       本实验中采用定时器来实现中断

四、程序框图

五、实验电路图

P1.0--------LED0

P1.1--------LED1

P1.2--------LED2

P1.3--------LED3

P1.4--------LED4

P1.5--------LED5

P1.6--------LED6

P1.7--------LED7

 

六、实验步骤

1按要求编写相应的程序

#include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

uint num=4;

uchar XX=0x01;

void timer0() interrupt 1

{

    num--;

    TH0=0x0B;

    TL0=0xDC;    //重新设置初值

    if(num==0)

    {

        XX=_crol_(XX,1);  //或者是  XX=XX<<1

        num=4;

    }

}

void main()

{

   

    TMOD=0x01;  // set model one

 

    TH0=0x0B;

    TL0=0xDC;    //设置初值

 

    EA=1;      //总中断允许

    ET0=1;      //定时中断允许

    TR0=1;     //定时开始

    for(;;)

    {

        P1=XX;    //计时溢出时,退出循环,跳到中断子程序

    }

}

 

由于晶振是6 MHz,所以机器周期为 ,延时0.5 S,则是延时 =250000个机器周期,超出了计时器 ,所以考虑将250000分开4次循环计时,设置计数器num

这里选用定时器T0,工作于方式1,无门控.要开启中断,必须将EA(总中断允许)和ET0(定时器T0 中断允许)置1,程序中用“EA1;”和“ET01;”来实现。在做完这些工作以后,就用for(;;){P1= XX }让主程序进入循环中,边计数,边执行P1=XX,当溢出时,跳到中断去。中断的一个操作 num-- 完成后,判断一下,不符合,跳回主程序,边计数,边执行P1=XX,如此反复4次。

 

2连接实验电路图

3调试并运行程序,观察结果

五、实验要求

完成实验报告,简要写出相应的实验现象和结果。(如遇到的问题以及解决问题的方法)

  一开始对中断的实现过程不够理解,尤其是用C语言,开始的设计思路是这样的:

主函数设初值,在初值的基础上开始计时(一个机器周期加1),同时执行for() 里面的语句,当计到TH0=ff,TL0=ff,产生中断,退出for(),跳到timer(),执行timer()里面的语句,并判断num ,不满足,就回到主函数产生中断的地方去重新执行计时操作,如此反复4次。

   中途有个疑问,中断子程序是否需要每次都赋初值??答案是在采用除定时器工作方式3外的其它方式外都需要重新赋值,这个问题在老师讲的相关练习课上得到解决。

   上机实验时出现了一个错误,提示在中断子程序中没有定义变量 XX ,怀疑是因为没有把 XX 定义为全局变量,而只在主函数 void main() 中定义,所以出错。改正程序后,程序正常运行,并观察到正确实验现象:LED等循环被点亮,时间间隔为0.5S

你可能感兴趣的:(timer,工作,编程,语言,c)