首页 > 代码库 > 一个犯过的编程错误
一个犯过的编程错误
为了得到周期一定的时序,我们总是用定时器产生,C51中最常见的用法就是:
void tim0_IRQHandler(void) interrupt 1
{
static unsigned int cnt = 0;
TH0 = XX;
TL0 = XX;
cnt++;
if((cnt %10) == 0){
//一个时序
}
if((cnt%13) == 0)
{
//又一个时序
]
if(cnt == 6500){
cnt = 0;
}
}:
这样的写法一点问题都没有,如果你将cnt定义为全局变量,if判断条件不放在定时器0中断函数里面时,这种做法就出错了。如下:
unsigned int cnt = 0;
void tim0_IRQHandler(void) interrupt 1
{
TH0 = XX;
TL0 = XX;
cnt++;
}
void fun(void)
{
if((cnt %10) == 0){
//一个时序
}
if((cnt%13) == 0)
{
//又一个时序
]
if(cnt == 6500){
cnt = 0;
}
}
void main(void)
{
fun();
}
错误就出在,当cnt=10是一段时间,存在时间为一次中断时间间隔,在这个时间间隔了,if((cnt % 10 ) == 0){},括弧里面的内容被执行了好多遍。为什么中断函数行呢?因为
中断函数只有发生中断才能进入,所以只会执行if((cnt % 10 ) == 0){}括弧里面的内容一遍。
如果你想放外边,又只想{}里的内容执行一遍,解决办发就是设置一个标志。
void fun(void)
{
static unsigned char old = 0xff;
if(((cnt %10) == 0) && (cnt != old)){
old = cnt;
//添加你需要的代码
}
}
很低级的错误,就是一些小错误也让你找半天。哎,分享给那些需要的同学。水平比较低,见笑。
一个犯过的编程错误