找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1426|回复: 6
打印 上一主题 下一主题
收起左侧

这单片机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. }
复制代码


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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:511890 发表于 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)
回复

使用道具 举报

板凳
ID:553310 发表于 2019-6-3 12:22 | 只看该作者
幻剑心 发表于 2019-6-3 04:00
没电路图,只能看代码猜,好辛苦的,而且问题也没说清楚。问题有两个。
1、i重用了。for(i=0;i

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

使用道具 举报

地板
ID:517466 发表于 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循环处理。
回复

使用道具 举报

5#
ID:517466 发表于 2019-6-3 13:38 | 只看该作者
你的代码实际运行时,会死循环在main函数中的for处理里,i永远被执行在0,1。
回复

使用道具 举报

6#
ID:517466 发表于 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的口线。建议你加三极管驱动。
回复

使用道具 举报

7#
ID:553310 发表于 2019-6-3 16:57 | 只看该作者
suncat0504 发表于 2019-6-3 13:36
你的代码有问题。i是全局变量,在第一个mian函数中使用,作为循环0-2(i

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表