|
|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 fireflying 于 2024-12-28 00:07 编辑
用的开发板是STC89C52单片机。
P0.0到P0.7上面接了7个LED一字排列。
练习程序如下,程序的功能是让P0.0到P0.7上面接的8枚LED从左到右依次点亮,到了最右边之后再从右向左依次点亮,这么来回循环的流水灯效果:
void main()
{
unsigned int i = 0; //定义延时用途自加变量
unsigned char cnt = 0; //定义移位计数变量
while(1) //主循环
{
for(cnt=0;cnt<8;cnt++) //移位计数变量归零,判断移位次数是否小于等于8,计数变量自加
{
P0 = ~(0x80 >> cnt); //先点亮最左侧LED,然后依次右移
for(i=0;i<32767;i++); //延时
}
for(cnt=0;cnt<8;cnt++) //移位计数变量归零,判断移位次数是否小于等于8,计数变量自加
{
P0 = ~(0x01 << cnt); //先点亮最右侧LED,然后依次左移
for(i=0;i<32767;i++); //延时
}
}
}
其中for语句部分是个延时功能,用来调整相邻两个LED依次点亮的间隔时间。
我为了观察程序延时效果,就调整for语句中间那个条件表达式的数值,当我调整到32767的时候,觉得LED灯的流动速度还是太快了,然后我把那数值调整到32768,数值仅仅加了1,结果流动速度断崖式的变得非常慢。
我在Keil里面Debug跟踪for语句的执行时间,发现32767的时候,执行时间是178毫秒,而32768的时候是1.3秒!
变量i的数据类型是unsigned int,查找资料,unsigned int数据类型的最大值是65535,我这个并没有溢出,但是程序运行的表现有点像超过了32767之后溢出了。
然后我又试着把变量i的数据类型改为unsigned long,在那数值仍然是32767的情况下,流水灯的流动速度就明显变慢了,这下把我彻底搞晕了。
实在检查不出问题原因,反复试验也没找到原因。哪位老师能帮我分析一下这个问题的原因?
|
|