找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4493|回复: 30
收起左侧

单片机流水灯,只循环一次,有老哥帮看看吗

  [复制链接]
ID:624696 发表于 2019-11-15 17:05 | 显示全部楼层 |阅读模式
这是一个流水灯,先从两侧向中间亮,在从中间向两侧亮,为什莫只循环一次呢

有没有老哥给说下啊

先谢谢了

单片机源程序如下:
  1. #include <reg52.h>

  2. unsigned char code table[] = {
  3. 0xff,0x7e,0x3c,0x18,0x00,                //从两侧向中间点亮
  4. 0xff,0xe7,0xc3,0x81,0x00                //从中间向两侧点亮



  5. };
  6. unsigned char i;
  7. void delay()
  8. {
  9.          unsigned int s;
  10.         for (s=0;s<30000;s++);
  11.         
  12. }
  13. void main ()
  14. {
  15.         while(1)
  16.         {
  17.                 if (table[i]!= 0xee)
  18.                 {
  19.                         P1 = table[i];
  20.                         i++;
  21.                         delay();
  22.                 }
  23.                 else
  24.                 {
  25.                         i=0;
  26.                         
  27.                
  28.                 }
  29.         
  30.         }
  31.         
  32.         
  33. }
复制代码
回复

使用道具 举报

ID:394424 发表于 2019-11-16 08:47 | 显示全部楼层
看门狗是不是复位了
回复

使用道具 举报

ID:25310 发表于 2019-11-16 08:52 | 显示全部楼层
if (table[i]!= 0xee)  下一个条件 这里如果相等了要让他等于0吧
回复

使用道具 举报

ID:213173 发表于 2019-11-16 10:38 | 显示全部楼层
if(table[i]!= 0xee)的条件永远满足,i++;跑飞。
回复

使用道具 举报

ID:275826 发表于 2019-11-16 11:01 | 显示全部楼层
table[]里没有OXEE,i一直加,上天了
回复

使用道具 举报

ID:511501 发表于 2019-11-16 11:57 来自手机 | 显示全部楼层
table[i]永远不会等于0xee,所以跑一遍就超出数组大小了,可以这样改:主函数while(1)里面全部替换成:
回复

使用道具 举报

ID:511501 发表于 2019-11-16 12:00 来自手机 | 显示全部楼层
for(i=0;i<10;i++){P1=table[i];delay();}
回复

使用道具 举报

ID:643100 发表于 2019-11-16 12:51 | 显示全部楼层
跑完一次后,就会一直循环i++这个地方,跑飞了
回复

使用道具 举报

ID:272485 发表于 2019-11-16 13:44 | 显示全部楼层
i赋初值为0,数组里面结尾加个0xee也行
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:43 | 显示全部楼层
huh 发表于 2019-11-16 13:44
i赋初值为0,数组里面结尾加个0xee也行

谢谢了,;老哥,你这个方法是可以的
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:45 | 显示全部楼层
wulin 发表于 2019-11-16 10:38
if(table!= 0xee)的条件永远满足,i++;跑飞。

是的,对的,东 了谢谢老哥
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:45 | 显示全部楼层
tyrl800 发表于 2019-11-16 11:01
table[]里没有OXEE,i一直加,上天了

谢谢了,没错,我加了0xee就可以了
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:46 | 显示全部楼层
1842058863 发表于 2019-11-16 12:51
跑完一次后,就会一直循环i++这个地方,跑飞了

明白了,谢谢老哥
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:46 | 显示全部楼层
huh 发表于 2019-11-16 13:44
i赋初值为0,数组里面结尾加个0xee也行

谢谢老哥,加了0xee确实可以了
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:50 | 显示全部楼层

谢谢谢谢,这样也是可以的,厉害哦大家
回复

使用道具 举报

ID:624696 发表于 2019-11-16 15:53 | 显示全部楼层
Wprogrammer 发表于 2019-11-16 08:47
看门狗是不是复位了

不太懂你的意思,还是谢谢了
回复

使用道具 举报

ID:603411 发表于 2019-11-16 17:20 | 显示全部楼层
数组中没有oxee这个值,也就是i不停地加,一直执行if (table[i]!= 0xee)中的内容,所以就只循环一次
回复

使用道具 举报

ID:263427 发表于 2019-11-16 19:00 | 显示全部楼层
看到楼上已经解决的差不多了,但是原理还不太清楚,在这儿我着重阐述一下原理。

if语句里面没有结束条件,所以永远不可能出if,更不可能去执行while语句,究其原因,是i++没有结束条件,解决的方法楼上已经给出,加一个限制条件就好了。
回复

使用道具 举报

ID:245004 发表于 2019-11-16 20:21 | 显示全部楼层
  1. #include <reg52.h>

  2. #define TAB_LENGTH 10
  3. unsigned char code table[TAB_LENGTH] = {
  4.     0xff, 0x7e, 0x3c, 0x18, 0x00,  //从两侧向中间点亮
  5.     0xff, 0xe7, 0xc3, 0x81, 0x00}; //从中间向两侧点亮
  6. void delay(void) {
  7.   unsigned int s;
  8.   for (s = 0; s < 30000; s++) {
  9.   }
  10. }
  11. void main(void) {
  12.   while (1) {
  13.     unsigned char i;

  14.     for (i = 0; i < TAB_LENGTH; i++) {
  15.       P1 = table[i];
  16.       delay();
  17.     }
  18.   }
  19. }
复制代码
这样写试试。

回复

使用道具 举报

ID:245004 发表于 2019-11-16 20:28 | 显示全部楼层
如果一定要用if语句,那就把主函数这样写:
  1. void main(void) {
  2.   while (1) {
  3.     unsigned char i;

  4.     if (i < TAB_LENGTH) {
  5.       P1 = table[i];
  6.       delay();
  7.       i++;
  8.     } else {
  9.       i = 0;
  10.     }
  11.   }
  12. }
复制代码



回复

使用道具 举报

ID:643346 发表于 2019-11-16 20:37 | 显示全部楼层
这个是不是忘加while循环里了,还有要加个扫描
回复

使用道具 举报

ID:93224 发表于 2019-11-17 15:48 | 显示全部楼层
数组里面没有0xee
回复

使用道具 举报

ID:296956 发表于 2019-11-17 17:10 | 显示全部楼层
table[] 数组后面加个0xee 的值。
回复

使用道具 举报

ID:624696 发表于 2019-11-26 22:05 | 显示全部楼层
13144088433 发表于 2019-11-16 11:57
table永远不会等于0xee,所以跑一遍就超出数组大小了,可以这样改:主函数while(1)里面全部替换成:

为什莫led灯点亮不是按照数组的顺序进行的呢???
回复

使用道具 举报

ID:624696 发表于 2019-11-26 22:07 | 显示全部楼层
huh 发表于 2019-11-16 13:44
i赋初值为0,数组里面结尾加个0xee也行

为什么led灯的点亮顺序不是按照数组里的顺序来的呢??为什么不是一个一个点亮呢,而是同时点亮
回复

使用道具 举报

ID:213173 发表于 2019-11-27 09:56 | 显示全部楼层
TRX007 发表于 2019-11-26 22:07
为什么led灯的点亮顺序不是按照数组里的顺序来的呢??为什么不是一个一个点亮呢,而是同时点亮

按你的题意,先从两侧向中间亮,在从中间向两侧亮,反复循环。
  1. #include <reg52.h>

  2. unsigned char code table[] = {0x7e,0xbd,0xdb,0xe7};
  3. unsigned char i;
  4. void delay()
  5. {
  6.         unsigned int s;
  7.         for(s=0;s<30000;s++);        
  8. }
  9. void main ()
  10. {
  11.         while(1)
  12.         {
  13.                 for(i=0;i<4;i++)
  14.                 {
  15.                         P1=table[i];
  16.                         delay();
  17.                 }
  18.                 for(i=2;i>0;i--)
  19.                 {
  20.                         P1=table[i];
  21.                         delay();
  22.                 }
  23.         }       
  24. }
复制代码
回复

使用道具 举报

ID:624696 发表于 2019-11-27 10:19 | 显示全部楼层
wulin 发表于 2019-11-16 10:38
if(table!= 0xee)的条件永远满足,i++;跑飞。

老哥, 请问为什么led的点亮顺序是同时点亮呢,而不是按数组的顺序一个一个点亮呢?
回复

使用道具 举报

ID:624696 发表于 2019-11-27 10:20 | 显示全部楼层
bh2030693 发表于 2019-11-16 20:28
如果一定要用if语句,那就把主函数这样写:

请问,为什么led点亮不是按照数组的顺序一个个点亮,而是同时亮呢?
回复

使用道具 举报

ID:213173 发表于 2019-11-27 10:49 | 显示全部楼层
TRX007 发表于 2019-11-27 10:19
老哥, 请问为什么led的点亮顺序是同时点亮呢,而不是按数组的顺序一个一个点亮呢?

按你的题意,先从两侧向中间亮,再从中间向两侧亮,反复循环。看26楼回复。
回复

使用道具 举报

ID:415088 发表于 2019-11-30 10:23 | 显示全部楼层
if (table[i]!= 0xee) 这里的判断条件有问题
回复

使用道具 举报

ID:653047 发表于 2019-11-30 20:16 | 显示全部楼层
很显然在数组table中,没有数能让table[i]==0xee,也就是说,while循环只是在table[i]!=0xee的条件下循环,i的值只会无限增大,不归零
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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