计数器 T0 产生 2 秒钟的定时,每当 2 秒定时到来时,更换指 …

示灯闪烁,每个指示闪烁的频率为 0.2 秒,不知道为什么实现不了,感觉中断嵌套那不对劲儿,又找不出来错…可以用两个定时器分别定时吗??
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar tt,num,a;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;

void main()
{

TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

EA=1;
ET0=1;
TR0=1;

while(1)
{

if(tt==40)
{
tt=0;
num++;
if(num==5)
num=1;

a++;
if(a==4)
{
a=0;
switch (num)
{
case 1: D1=~D1;
break;
case 2: D2=~D2;
break;
case 3: D3=~D3;
break;
case 4: D4=~D4;
break;
}
}
}

}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

第1个回答  2013-10-24
你好:
从程序上看,定时器装初值为50000,判断晶振为12MHz,每50ms中断一次,启动定时器之后进入死循环执行相应代码。
但是,tt变量为40时才执行具体代码,就是说每隔2s才会使num和a自增一次,当a自增到4就是8s过去了才会对闪烁灯进行操作,而a等于4后被赋值为0,num等于5后被赋值为1,这样导致当进入a等于4这个if语句时,num总是为4。
总体程序运行是这样的效果:一开机LED不亮,过了8s,D4亮了,再过8s,D4灭了……如此循环。
修改这程序也不难,回复我我帮你想想。
希望我的回答能帮助到你。追问

嗯 分析的对,卡在每个LED的闪烁频率0.2秒用T0设置,这个0.2秒很是纠结……

追答

现在可以了

第2个回答  2013-10-25
建议做以下修改:
去掉变量 a ,按以下形式写:

uint tt; // 将tt改为整型数据

/*============以下可替代while(1)里面的内容==========*/
num = tt/40;
switch(num)
{
case 0: D1=1; //假设D1=1灯亮
break; // 第一个2s,D1亮
case 1: D1=0;
break; // 第二个2s,D1灭
case 2: D2=1;
break; // 第三个2s,D2亮
case 3: D2=0;
break; // 第四个2s,D2灭
case 4: D3=1;
break; // 第五个2s,D3亮
case 5: D3=0;
break; // 第六个2s,D3灭
case 6: D4=1;
break; // 第七个2s,D4亮
case 7: D4=0;
break; // 第八个2s,D4灭
default: break;
}

/*==========以下是中断程序中的修改==========*/
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

if(tt<320) tt++;
else tt=0;

以上个人意见,仅供参考。 程序也还有其他多种方案,你可以按自己喜好编写程序。
相似回答