#include<reg52.h>
void delay(unsigned int t);
sbit duan=P2^6;
sbit wei=P2^7;
unsigned char a;
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void main()
{
wei=1;
P0=0xc0;
wei=0;
for(a=0;a<16;a++)
{
duan=1;
P0=table[a];
duan=0;
delay(500);
}
}
void delay(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=200;j>0;j--);
}
这个程序应该是到显示FFFFFF,6个数码管都显示F就应该停止了吧。为什么会不停的又从0开始不停新循环呢,就好像加上了while(1)。求解答
51单片机少写了一个循环语句,为什么还能执行循环,错在哪里呢?程序如下:
答案:3 悬赏:30 手机版
解决时间 2021-01-28 02:44
- 提问者网友:感性作祟
- 2021-01-27 13:29
最佳答案
- 五星知识达人网友:野味小生
- 2021-01-27 13:38
结论 1:如果主程序中没有 while(1) 这个无限循环,程序走到最后会再次从头开始执行。
结论 2:如果主程序有 while(1) 这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。
这应该属于 Keil 编译器的 bug,有网友做过实验,表示 Keil 编译后期产生的汇编代码中,结尾有一条 LJMP main,意思就是跳到 main 函数重复执行……还有一种说法是 PC 指针溢出,溢出后的地址指向开头,造成继续执行的效果……(个人觉得还是 Keil 的问题,要是 Keil 编译器不产生 LJMP main 这种语句,也不会产生循环效应……)
不管怎么说,在程序结尾加上 while(1) 能够解决循环执行 main 函数的 bug……(其实也不算 bug)
结论 2:如果主程序有 while(1) 这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。
这应该属于 Keil 编译器的 bug,有网友做过实验,表示 Keil 编译后期产生的汇编代码中,结尾有一条 LJMP main,意思就是跳到 main 函数重复执行……还有一种说法是 PC 指针溢出,溢出后的地址指向开头,造成继续执行的效果……(个人觉得还是 Keil 的问题,要是 Keil 编译器不产生 LJMP main 这种语句,也不会产生循环效应……)
不管怎么说,在程序结尾加上 while(1) 能够解决循环执行 main 函数的 bug……(其实也不算 bug)
全部回答
- 1楼网友:轮獄道
- 2021-01-27 16:22
两种方法: 一、里面的led后的延时,使用定时器实现。如:设置个标志flag,flag = 1;开启定时器,定时500ms,时间到了自动把flag值为零。 参考代码: flag = 1; //开定时器 while(flag ==1) { //键盘扫描 } 二、把键盘扫描放到,延时函数里。 没有做不到,只有想不到。供参考。
- 2楼网友:梦中风几里
- 2021-01-27 14:56
程序会一直运行至程序存储器的结尾,然后再从头开始运行。
因为程序容量不大,运行速度又很快,人还没有感觉出停顿,程序就又从头执行了。
只要有电源,复位正常,有时钟,PC指针就会按照时钟的振荡而不停的自加,除非程序中有改变PC指针的值的指令。所以当给一个内部没有程序的单片机上电,复位并供上时钟时,单片机不是静止的,而是一直在运行的,运行的方式是从头到尾的执行程序存储器中的指令。如果程序存储器中是全0,执行的是空指令,如果是全1,执行的是mov R7, A。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯