微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 定时器中断

定时器中断

时间:10-02 整理:3721RD 点击:
问:程序一和程序二为什么没能产生同样效果(程序一使P2^0口的LED间隔一秒的闪烁,程序二却没与任何反应)
程序一:
#include "reg52.h"               
typedef unsigned int u16;          
typedef unsigned char u8;
sbit led=P2^0;         
void Timer0Init()
{
        TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;       
        ET0=1;
        EA=1;
        TR0=1;               
}
void main()
{       
        Timer0Init();
        while(1);               
}
void Timer0() interrupt 1
{
        static u16 i;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        i++;
        if(i==20)
        {
                i=0;
                led=~led;       
        }       
}

程序二:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P2^0;
void main()
{        
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void timer0() interrupt 1
{
        uint i;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        i++;
        if(i==20)
        {
                i=0;
                d1=~d1;       
        }
}

由于程序二main()的结构不完整,缺少死循环等待语句while(1);导致程序不断反复初始化定时器,中断根本没有机会发生。另外临时变量 i 的使用也不对,应先赋值后使用,如果没有关键词static,临时变量使用后即销毁。这在简单程序中感觉不到,复杂程序中这么用程序跑飞你都找不到头绪,

关键是i定义,第二个是个临时变量,每次中断,初始都为0,所以不可能计数到20

感觉主要是少了一个while(1); 吧

3#正解

在第二个主程序里添加【while(1);】试试看,没加 while(1);程序就跑一遍就结束啦!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top