标题: 这单片机C语言代码循环到2就无法运行了? [打印本页]

作者: 1491236951    时间: 2019-6-2 22:37
标题: 这单片机C语言代码循环到2就无法运行了?
本人初学单片机,C语言也是才接触,比如这个用四位七段数码管实现静态显示1~4的简单习题,我用for循环输出,怎么显示输出到2就不动卡住了?百度几番无果,我这代码逻辑没错啊。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uint i,x;
  5. void delay(uint x);
  6. uchar duan[] = {0x06,0x5b,0x4f,0x66};
  7. uchar wei[] = {0xfe,0xfd,0xfb,0xf7};


  8. void main()
  9. {
  10.         while(1)
  11.         {
  12.                 for(i=0;i<3;i++)
  13.                 {
  14.                         P0 = duan[i];
  15.                         P2 = wei[i];
  16.                         delay(500);
  17.                 }
  18.         }
  19. }

  20. void delay(uint x)
  21. {
  22.         while(x--)
  23.                 {
  24.                         for(i=120;i>0;i--);
  25.                 }
  26. }
复制代码


请教各位大佬。最近经常遇到这种小毛病,代码看了没问题,一仿真就各种错误,好痛苦。



作者: 幻剑心    时间: 2019-6-3 04:00
没电路图,只能看代码猜,好辛苦的,而且问题也没说清楚。问题有两个。
1、i重用了。for(i=0;i<3;i++)这里用了i  然后在delay()里也有用。所以for程序循环第一次。然后进入delay(),结束返回时i=0,然后i++(for循环执行的),然后进入for第二次循环,又进入delay(),返回i=0,如此一来在执行到duan[ i],wei[ i]时,i永远为1,也就是显示第二个数(0x5b和0xfd)。还没办法接收for循环。因此才会出现你说的卡在2,其实是每次循环都输出的是2。把for循环的i改成别的变量就行。
2、即使程序改好了,也只是显示到3,因为for只循环3次
  1. for(i=0;i<3;i++)//这里for循环只循环了3次。0,1,2  i=3时直接跳出不循环了,
  2.                 {
  3.                         P0 = duan[i];
  4.                         P2 = wei[i];
  5.                         delay(500);
  6.                 }
复制代码

要显示4(0xf7),就要改成:for(i=0;i<4;i++)。
附上改好的程序 gai.rar (319 Bytes, 下载次数: 3)
作者: 1491236951    时间: 2019-6-3 12:22
幻剑心 发表于 2019-6-3 04:00
没电路图,只能看代码猜,好辛苦的,而且问题也没说清楚。问题有两个。
1、i重用了。for(i=0;i

谢谢大佬,以后提问会附上电路图,再次感谢

作者: suncat0504    时间: 2019-6-3 13:36
你的代码有问题。i是全局变量,在第一个mian函数中使用,作为循环0-2(i<3是边界条件,只能运行到i=2,范围是i=0,i=1,i=2),如果显示4个字段,需要扩大范围,for(i=0;i<4;i++).在第一个函数执行i=1时,i的值会被第二个延迟用的函数改变为0。这样,在执行完main中的i后,i在延迟处理中又变成了0;回到主循环,i加以处理,i变成1,判断i<3,所以继续处理P0,P2的输出,然后延迟处理使i又回到0;所以你需要在延迟函数中把i声明为局部变量。或者另外使用一个变量。看代码,你需要加强理解C语言中变量的作用范围,以及for循环处理。
作者: suncat0504    时间: 2019-6-3 13:38
你的代码实际运行时,会死循环在main函数中的for处理里,i永远被执行在0,1。
作者: suncat0504    时间: 2019-6-3 13:47
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint i,x;
void delay(uint x);
uchar duan[] = {0x06,0x5b,0x4f,0x66};
uchar wei[] = {0xfe,0xfd,0xfb,0xf7};


void main()
{
        while(1)
        {
                for(i=0;i<4;i++)
                {
                        P0 = duan[i];
                        P2 = wei[i];
                        delay(500);
                }
        }
}

void delay(uint x)
{
        uint j;
        while(x--)
                {
                        for(j=120;j>0;j--);
                }
}
这是修改后的代码。另外提醒你,直接用P2口驱动数码管,有问题。51系列单片机的P2口线最大灌入电流只有20mA,你的电路中,若某个数码管同时点亮2个以上笔段时(按照一个笔段10mA点亮的话),会烧了P2的口线。建议你加三极管驱动。
作者: 1491236951    时间: 2019-6-3 16:57
suncat0504 发表于 2019-6-3 13:36
你的代码有问题。i是全局变量,在第一个mian函数中使用,作为循环0-2(i

亏我之前还专门看了全局变量和局部变量的区别,看来还是学习不够扎实啊,谢谢解答了




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