作业帮 > 综合 > 作业

51单片机 定时器#include#define uint unsigned int uint pp;sbit led=

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/04/29 04:18:05
51单片机 定时器
#include
#define uint unsigned int
uint pp;
sbit led=P1^0;
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1).
TR0=1; //打开定时器
TH0=0Xff; //定时器设置,每隔100微秒发起一次中断.
TL0=0Xa4;
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
if(pp==10000)led=0;//时隔1s后,led被点亮.
if(pp==20000)led=1;//led亮了一秒之后会灭.
}
}
void time0() interrupt 1
{TH0=0Xff;
TL0=0Xa4;
pp++;
}
单片机运行的结果是一秒后第一个LED会亮,然后亮了一秒之后会灭,但是为什么灭了之后等好几秒之后会再次亮起,之后重复循环?
51单片机 定时器#include#define uint unsigned int uint pp;sbit led=
试分析你的程序.你的time0中断里面只有pp++,也就是在第一次灭了以后,pp是20000,而这个时候你没有对pp清零,pp还会一直+下去,20001,20002,20003……一直循环下去,如果p变量无界的话,你这个程序就只能亮一次,灭一次,以后就再也亮不起来了,但为什么过了好多秒又亮了呢?因为pp的类型是uint,可以查得uint型变量的最打值是65535,如果pp=65535的时候,再+1的话,pp就变成了0,而这个时候再过1秒钟,LED就亮了起来了,而pp从20000到65535需要大概4.5秒,再从0到10000又需要大概1秒,所以需要大概5.5秒!
改正方法:
再你的time0中断里加入判断,如果pp>20000,则将pp清零,也就是在pp++后加入
if (pp>20000) pp=0;
这样应该就正常了,试验一下吧,如果对您有用,请麻烦点击一下【采纳】,你我才都能得到知道经验,谢啦~