单片机软件延时的一种容易出现错误

由来

一次程序编写的过程中,发现延时不能按照正确的时间。下面是通过stc软件生成的延时,其中黑色部分是定义任何ms的函数,区别在于把函数参数作为一个可以控制的值。但出现了问题,一个很容易忽略的问题,循环后的再次赋值,这里do-while并没有对循环后的再次赋值

通过初始值比较

下面图中,为了延时500ms,第一个只是把1ms的循环加入,但三层循环的乘积居然差了这么多,而且通过实际现象发现,乘积小的延时时间反而更长

原因分析

实际从程序中可以看出,内部两次循环在一次大循环后的值会怎么样?当然会变成0 ,下次大循环呢,由于数据是用的无符号字符类型,会从0开始然后是255(这个要从计算机实际记录的数据来理解)。数据会溢出