程序是这样的:
#include<ioCC1110.h>
#define uchar unsigned char
#define uint unsigned int
#define RLED P1_1 //红led
#define GLED P1_0 //绿led
uchar counter=0; //统计中断次数
uchar TempFlag; //闪烁标志
void delay(uint); //延迟函数
void initial(); //初始化函数
void main()
{
initial();
RLED=0; //红led亮
GLED=1; //绿led灭
if(TempFlag==1)
{
GLED=RLED;
RLED=~RLED;
delay(6000);
}
}
void delay(uint z)
{
uint i;
for(i=0;i<z;i++);
for(i=0;i<z;i++);
for(i=0;i<z;i++);
for(i=0;i<z;i++);
for(i=0;i<z;i++);
}
void initial()
{
P1DIR|=0X03;//将P1.0和P1.1设置成输出
RLED=1;//红led、绿led都灭
GLED=1;
T1CTL=0x3d;//通道0.中断有效,128分频,自动装载
EA=1;//使能总中断
IEN1=0x02;//使能timer1中断
}
#pragma vector=T1_VECTOR
__interrupt void TIMER1_ISR() //中断处理函数
{
if(counter<10) //10次中断,LED闪烁一轮
counter++;
else
{
counter=0;
if(TempFlag)
TempFlag=0;
else TempFlag=1;
}
}
硬件调试结果是:红LED向点亮,一会儿后,红LED和绿LED快速轮流点亮,再过一段时间,绿LED点亮,红LED熄灭,再次闪烁,此后不断重复。
在这里,定时器1工作在自动装载模式下,即定时器由0计到0xFFFF时,产生定时器溢出中断,每进入中断服务程序一次,counter都会加1,直到计完10次中断,闪烁标志TempFlag才会取反。也就是说,每10次中断后,红LED和绿LED的点亮情况就会互换一次。
于是我的疑惑就是:为什么会有“红LED和绿LED快速轮流点亮”这个过程?不知道是否有人和我做过同样的硬件调试,求大神解答!先谢谢了
Ken Wang:
Hi wan,
看了一下你的程序,发现下面的语句有点问题:
GLED=RLED;
RLED=~RLED;
为什么GLED要赋RLED端口的值啊,这里是不是写错了?
谢谢
ken
wan zeng:
回复 Ken Wang:
首先很感激您花时间阅读我的程序,愿意为我解答疑问!
在main()函数中,我要补充一下,
void main()
{
initial();//初始化
RLED=0;//红LED点亮
GLED=1;//绿LED熄灭
while(1)
{
if(TempFlag==1)
{
GLED=RLED; //
RLED=~GLED; //
delay(6000);
}
}
}
主函数中,initial()初始化后,通过RLED=0; GLED=1;我点亮了红灯,熄灭了绿灯,当中断满10次后,即满足TempFlag=1条件后,GLED=RLED;RLED=~RLED;是为了让绿灯和之前的红灯一样亮起来,让红灯和自己之前的状态相反(红灯之前的状态时点亮),即熄灭,所以您怀疑的这个地方应该是没有错的。