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

2024-12-15 21:30:24
推荐回答(2个)
回答1:

你好:
从程序上看,定时器装初值为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灭了……如此循环。
修改这程序也不难,回复我我帮你想想。
希望我的回答能帮助到你。

回答2:

建议做以下修改:
去掉变量 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;

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