单片机程序的工作循环过程和循环语句while(1)的作用。

我找到一段C语言写的单片机点亮一个流水灯程序,可是我把
while(1)
{
}
去掉后,开发板上的流水灯全都亮了。为什么?
源程序
sbit P10 = P1^0;//要控制的LED灯
sbit P11 = P1^1;//要控制的LED灯
sbit P20 = P2^0;//关闭数码管
sbit P21 = P2^1;//关闭数码管
sbit CS88 = P2^2;//关闭点阵
/******************************主函数*****************************/
void main (void){
P1=0x00; //关闭数码管
P20=0; //关闭数码管
P21=0; //关闭数码管
CS88=0; //关闭点阵
//此方法使用1个字节对单个端口赋值
P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,
//ff换算成二进制是 1111 1111

P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮
//0xfe是16进制,0x开头表示16进制数,
//fe换算成二进制是 1111 1110
while (1) //主循环
{
//主循环中添加其他需要一直工作的程序
}
}

/*****************************************************************/

这个while(1)循环并不能阻止程序的跑飞(应该用看门狗防止程序跑飞),不过这样写也是很正确的做法,就是让程序一直在运行着(原地循环),这里的while(1)并不是防止程序“跑飞”的,而是防止main()返回。
① 在嵌入式中main是不能返回的。不同的C语言实现的单片机初始化代码会有不同的表现,有的是在call _main后jmp,而有的是jmp 0,等等这些会导致不可预料的结果。
② 在我们写的C语言后转换成汇编,再观察单片机的代码区,你会发现没有写程序的部分例如全1或者全0区域,程序运行到这里,就会有可能造成意料不到的结果。若无while(1)循环,程序全部执行后,跳转至程序起始处重新执行。
我用keil将去掉while(1)的程序编译,编译后的汇编代码如下,注意C:0x0012行(RET后会从0开始运行)和C:0x001C行(运行结束后跳转至main)这个方式是keil编译器的跳转方法,其他的可能会不同:
C:0x0000 020013 LJMP C:0013
10: void main (void){
11: P1=0x00;
C:0x0003 E4 CLR A
C:0x0004 F590 MOV P1(0x90),A
12: P20=0;
C:0x0006 C2A0 CLR P20(0xA0.0)
13: P21=0;
C:0x0008 C2A1 CLR P21(0xA0.1)
14: CS88=0;
15:
C:0x000A C2A2 CLR CS88(0xA0.2)
16: P1 = 0xFF;
17:
18:
C:0x000C 7590FF MOV P1(0x90),#0xFF
19: P1 = 0xfe;
20:
21:
22: // while (1)
C:0x000F 7590FE MOV P1(0x90),#0xFE
23: {
C:0x0012 22 RET
C:0x0013 787F MOV R0,#0x7F
C:0x0015 E4 CLR A
C:0x0016 F6 MOV @R0,A
C:0x0017 D8FD DJNZ R0,C:0016
C:0x0019 758107 MOV SP(0x81),#0x07
C:0x001C 020003 LJMP main(C:0003)追问

你好。我后来也领教到了程序跑飞的意外。谢谢。学习单片机,汇编语言是必不可少的吗?我现在用c语言入门有没有什么好的资料书籍可以学习呢?

追答

学习单片机,汇编语言必不可少!因为单片机控制,是无法绕过汇编语言的,在精确定时及控制时就算C语言编程,也需要确认程序的执行时间,这就需要通过编译后的汇编代码计算!并且C语言的代码普遍比汇编的耗时多,必要情况(精确定时、高效率程序代码)需要汇编语言的嵌入!C语言的入门还是谭浩强的比较好吧,现在大部分院校还是谭浩强的书用的较多!然后单片机和C语言的配合可以看下keil C的用户手册!基本就没问题了,剩下的就是经验值了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-16
while(1)


是为了让程序停在这儿 防止程序跑偏
去掉while (1)后便一直重复执行void main()中的语句追问

那是如何跑偏的呢?为什么八个二极管全亮了?

第2个回答  2012-03-16
循环是保证单片机一直处于工作状态,在有信号触发的时候,能执行相应的动作。
相似回答