永发信息网

51单片机少写了一个循环语句,为什么还能执行循环,错在哪里呢?程序如下:

答案:3  悬赏:30  手机版
解决时间 2021-01-28 02:44
#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)。求解答
最佳答案
结论 1:如果主程序中没有 while(1) 这个无限循环,程序走到最后会再次从头开始执行。

结论 2:如果主程序有 while(1) 这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。

这应该属于 Keil 编译器的 bug,有网友做过实验,表示 Keil 编译后期产生的汇编代码中,结尾有一条 LJMP main,意思就是跳到 main 函数重复执行……还有一种说法是 PC 指针溢出,溢出后的地址指向开头,造成继续执行的效果……(个人觉得还是 Keil 的问题,要是 Keil 编译器不产生 LJMP main 这种语句,也不会产生循环效应……)

不管怎么说,在程序结尾加上 while(1) 能够解决循环执行 main 函数的 bug……(其实也不算 bug)
全部回答
两种方法: 一、里面的led后的延时,使用定时器实现。如:设置个标志flag,flag = 1;开启定时器,定时500ms,时间到了自动把flag值为零。 参考代码: flag = 1; //开定时器 while(flag ==1) { //键盘扫描 } 二、把键盘扫描放到,延时函数里。 没有做不到,只有想不到。供参考。
程序会一直运行至程序存储器的结尾,然后再从头开始运行。 因为程序容量不大,运行速度又很快,人还没有感觉出停顿,程序就又从头执行了。 只要有电源,复位正常,有时钟,PC指针就会按照时钟的振荡而不停的自加,除非程序中有改变PC指针的值的指令。所以当给一个内部没有程序的单片机上电,复位并供上时钟时,单片机不是静止的,而是一直在运行的,运行的方式是从头到尾的执行程序存储器中的指令。如果程序存储器中是全0,执行的是空指令,如果是全1,执行的是mov R7, A。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
KTV一台两通道功放结4个音箱并结声音好还是串
谁能发QQ群公告,我是管理员,能发不?
午时已到HighNoon桌游吧私人影院地址在什么地
南半球的意思是什么啊?知道的请说下!
CocktailClub地址在什么地方,想过去办事
逆袭桌游工作室地址在什么地方,我要处理点事
怎样和女子交谈
【两厘米多长】2厘米等于多少米
黄药子的意思是什么啊?知道的请说下!
新闻媒体源有哪些平台网站?比如人民网,青年
遇见网红地址有知道的么?有点事想过去
手自一体的小车挂倒档有刺耳声音是何原因
我卖完房子后又在别的中介买了房子,原中介说
退款原因写因为是假货,对店铺有影响吗
求二战时期太平洋战争的纪录片或电影(最好要
推荐资讯
PDCA循环可以使质量水平( )。A.螺旋上升B.直
紫都宾馆地址在哪,我要去那里办事
工行牡丹金卡信用额度50000怎么理解
我想在同一天吃红糖姜茶,阿胶固元膏和蜂蜜,可
“想要死得快,就去二戈寨”出自哪首歌?
东莞中医院何炎燊已停诊,现在在哪坐诊
有谁能简要解释一下声场和声场的深度和宽度是
cANCA阳性可见于()。
上海科技馆参观最佳路线
玩GTA5的时候,玩一会怎么就出现未响应然后就
做好做恶的意思是什么啊?知道的请说下!
”老夫聊发少年狂“的”狂“字可以看出词作者
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?