keil在编程51单片机8个流水灯编程程序中while(1)的问题

简单的用T0定时器计时1秒做流水灯程序

//程序功能:用T0定时器8位自动重装模式产生中断计数3600次为1秒,P1口产生流水灯效果1秒移动一次

问题出在变量a的声明上,这个程序如果鼡int声明是可以正常工作的但是用unsigned int声明就会出现流水灯跳着走的问题

刚开始没有头绪,认为自己写的程序没有问题就排查编程软件和51单爿机8个流水灯编程(现在看来是太高看自己了),换了Keil uvision3、4、5三个版本51单片机8个流水灯编程用了STC89C52RC和STC89C516RD+两个,问题都是一样的

自己实在不知道程序還能有什么错误于是发到QQ群里请大家验证

有个人说,for中a的运算为什么要a=a-3600不能直接a=0吗?试了一下问题果然消失了

然后开始想为什么有苻号类型没有问题,无符号类型会出现这个问题

难道是51单片机8个流水灯编程在运行a>=3600的时候有什么意外情况导致a<3600的时候也执行了a-3600这一行吗?然后无符号数-3600得到的结果肯定比3600要大的多

但是整数又不是浮点,怎么会出现这种错误

后来我打电话咨询STC的技术支持回复:a是16位数据,51单片机8个流水灯编程是8位机运算时会拆分为两次8位数据运算,如果在a=a-3600运算一半时T0中断到来就会在中断中再次对a进行16位运算,中断结束后a=a-3600运算中的a值已经不是中断之前的a值,所以出现运算错误在编程中要避免中断内外同时对一个16位变量进行运算

我要回帖

更多关于 51单片机8个流水灯编程 的文章

 

随机推荐