标题: 单片机捉虫之点亮LED所用软件延时 求指导 [打印本页]

作者: 15587674366    时间: 2022-9-29 22:21
标题: 单片机捉虫之点亮LED所用软件延时 求指导
一、硬件环境:金沙滩KST-51单片机开发板
二、软件环境:Keil C51
三、软件预期功能:
       KST-51 LED2 延时相同时间
四、Bug复现流程:
1、新建项目1;
2、新建C源程序文件;
3、将虚线以下代码第一部分粘贴进2新建的C源程序文件;
4、编译、下载hex文件至开发板,观察LED2延时时长;
5、新建项目2;
6、新建C源程序文件;
7、将虚线以下代码第二部分粘贴进6新建的C源程序文件;
8、编译、下载hex文件至开发板,观察LED2延时时长;
5、bug现象如题目所附视频所示,两次LED2延时时长明显不同。
五、要求(提示:第一二部分唯一的区别仅在于变量 i 的类型不同):
1、指出延时时长明显不同的原因所在(80分);
2、通过程序跟踪调试,结合代码具体分析两次延时不同的根本原因(20分)。

六、提交要求:
1、在答案区以文字叙述即可,不需要上传任何形式的附件。
------------------------------------------第一部分----------------------------------------

#include <reg52.h>

sbit LED2 = P0^0;

sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;

int i;
void delay();
void main(){
while(1){
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

ENLED = 0;
ADDR3 = 1;

P0 = 0xFE;
delay();
P0 = 0xFF;
delay();
}
}

void delay(){
for(i=0;i<30000;i++);
}
------------------------------------------第二部分------------------------------
#include <reg52.h>

sbit LED2 = P0^0;

sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;

long i;
void delay();
void main(){
while(1){
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;

ENLED = 0;
ADDR3 = 1;

P0 = 0xFE;
delay();
P0 = 0xFF;
delay();
}
}

void delay(){
for(i=0;i<30000;i++);
}


作者: hb_lhw    时间: 2022-9-30 07:49
看这两段程序哪里有差别,再看看变量占用字节的个数,就知道为什么了!
作者: yzwzfyz    时间: 2022-9-30 08:33
是来布置作业的。
作者: pdwdzz    时间: 2022-9-30 10:44
int和long的数据类型不同,长度不同,程序执行的步骤就不同,比如int i
作者: pdwdzz    时间: 2022-9-30 10:48
比如int i,要判断i是否为0,int是2字节,对单片机来说,先要判断低8位是不是0,再判断高8位是不是0。long i,要判断i是否为0;long4字节。那就要4次。虽然对于C语言都是通用一句话。但是编译出来的代码不同的。long类型的代码量要多。
作者: pdwdzz    时间: 2022-9-30 10:50
1、指出延时时长明显不同的原因所在(80分);delay函数所用时间不同
2、通过程序跟踪调试,结合代码具体分析两次延时不同的根本原因(20分)。int类型和long类型长度不同,编译出来的指令数量不同。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1