定时器中断
时间: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;
}
}
程序一:
#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);程序就跑一遍就结束啦!
