搜索
bottom↓
回复: 31

while(1)中有什么奇怪的东西导致无法循环

[复制链接]

出0入0汤圆

发表于 2014-1-2 09:08:55 | 显示全部楼层 |阅读模式
  1.         while(1)
  2.         {
  3.                 key_value = Keyboard_scan();
  4.                
  5.                 ad3 =        Adconv(1,0);       
  6.                 bai=ad3/100;
  7.                 shi=(ad3%100)/10 ;
  8.                 ge=ad3%10;
  9.                 for(i=0;i<bai;i++)
  10.                 {
  11.                         Buzzer();
  12.                         for(j=0;j<2;j++)
  13.                                 delay_ms(255);
  14.                 }
  15.                 for(i=0;i<8;i++)
  16.                         delay_ms(255);               
  17.                 for(i=0;i<shi;i++)
  18.                 {
  19.                         Buzzer();
  20.                         for(j=0;j<2;j++)
  21.                                 delay_ms(255);
  22.                 }
  23.                 for(i=0;i<8;i++)
  24.                         delay_ms(255);               
  25.                 for(i=0;i<ge;i++)
  26.                 {
  27.                         Buzzer();
  28.                         for(j=0;j<2;j++)
  29.                                 delay_ms(255);
  30.                 }               
  31.                 for(i=0;i<8;i++)
  32.                         delay_ms(255);       
  33.         }
复制代码

这段代码里有什么问题呢,为什么while(1)里的内容并没有循环,而是只执行了一遍

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-1-2 09:30:11 | 显示全部楼层
本帖最后由 jackybany 于 2014-1-2 09:35 编辑

有没有其他函数关系到i和j

出100入18汤圆

发表于 2014-1-2 09:35:58 | 显示全部楼层
光看while,你系统里没有中断?

出0入0汤圆

发表于 2014-1-2 09:37:35 | 显示全部楼层
key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变量你到后边再也没用过,是怎么回事?

出0入0汤圆

发表于 2014-1-2 09:41:38 | 显示全部楼层
还有一种可能是你的单片机有看门狗,但是你用的时候没有禁止。或没有考虑。

出0入0汤圆

发表于 2014-1-2 09:42:59 | 显示全部楼层
里面还有死循环吧.

出0入4汤圆

发表于 2014-1-2 09:43:43 | 显示全部楼层
注释掉一些语句测试

出0入0汤圆

 楼主| 发表于 2014-1-2 09:53:15 | 显示全部楼层
jackybany 发表于 2014-1-2 09:30
有没有其他函数关系到i和j

有函数关系到i和j但是没有地方调用那些函数啊~

出0入0汤圆

 楼主| 发表于 2014-1-2 09:54:17 | 显示全部楼层
hcambridge 发表于 2014-1-2 09:35
光看while,你系统里没有中断?

没有中断的!

出0入0汤圆

 楼主| 发表于 2014-1-2 09:55:57 | 显示全部楼层
Vrcaj7z2se 发表于 2014-1-2 09:37
key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变 ...

没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了!

出0入0汤圆

发表于 2014-1-2 10:02:46 | 显示全部楼层
shuidiyu 发表于 2014-1-2 09:55
没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了! ...

把这行注掉再试。

出0入0汤圆

 楼主| 发表于 2014-1-2 10:07:31 | 显示全部楼层
qqliyunpeng 发表于 2014-1-2 09:41
还有一种可能是你的单片机有看门狗,但是你用的时候没有禁止。或没有考虑。 ...

这是完整的main 里面并没有打开看门狗啊

  1. void main(void)
  2. {
  3.         uchar i,j,key_value,bai,shi,ge;
  4.    
  5.         P1 = 0xf8;
  6.         P2 = 0xFF;
  7.         P3 = 0xff;
  8.        
  9.         while(1)
  10.         {
  11. //                 key_value = Keyboard_scan();
  12.                
  13. //                 AD_H = 1;
  14.                 ad3 =        Adconv(1,0);        bai=ad3/100;  shi=(ad3%100)/10 ; ge=ad3%10;
  15.                 for(i=0;i<bai;i++)
  16.                 {
  17.                         Buzzer();
  18.                         for(j=0;j<2;j++)
  19.                                 delay_ms(255);
  20.                 }
  21.                 for(i=0;i<8;i++)
  22.                         delay_ms(255);               
  23.                 for(i=0;i<shi;i++)
  24.                 {
  25.                         Buzzer();
  26.                         for(j=0;j<2;j++)
  27.                                 delay_ms(255);
  28.                 }
  29.                 for(i=0;i<8;i++)
  30.                         delay_ms(255);               
  31.                 for(i=0;i<ge;i++)
  32.                 {
  33.                         Buzzer();
  34.                         for(j=0;j<2;j++)
  35.                                 delay_ms(255);
  36.                 }               
  37.                 for(i=0;i<8;i++)
  38.                         delay_ms(255);               
  39. //                 ad7 =        Adconv2(1,0);       
  40. // //                 AD_H = 0;
  41. // //                 AD_L = 1;
  42. //                 ad5 =        Adconv(1,1);       
  43. // //                 AD_L = 0;               

  44. //                 switch(key_value)
  45. //                 {
  46. //                         case 1:                //吸液     
  47. //                                 Act_in();
  48. //                                 break;
  49. //                         case 2:                //放液
  50. //                                 Act_out();
  51. //                                 break;
  52. //                   case 3:
  53. //                                 break;
  54. //                         default:
  55. //                                 break;
  56. //                 }
  57.         }
  58. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-1-2 10:09:09 | 显示全部楼层
Vrcaj7z2se 发表于 2014-1-2 10:02
把这行注掉再试。

刚才试过了,还是不行,值执行一遍,不知道死在哪里了,看门狗的问题吗?没有打开看门口

出0入0汤圆

发表于 2014-1-2 10:19:14 | 显示全部楼层
有可能是调用的函数有问题

出0入0汤圆

发表于 2014-1-2 10:33:23 | 显示全部楼层
仿真,跟踪下看看。

出0入9汤圆

发表于 2014-1-2 10:40:26 | 显示全部楼层
有的MCU默认上电开看门狗的,要先关闭,就像C8051F的

出0入9汤圆

发表于 2014-1-2 10:42:19 | 显示全部楼层
按guer说的,最好还是仿真跟踪看一下

出0入0汤圆

 楼主| 发表于 2014-1-2 10:45:27 | 显示全部楼层
firewind 发表于 2014-1-2 10:19
有可能是调用的函数有问题

你是指这个 Adconv(1,0); 函数吗?!

出0入0汤圆

 楼主| 发表于 2014-1-2 10:45:59 | 显示全部楼层
guer 发表于 2014-1-2 10:33
仿真,跟踪下看看。

没有仿真器的!

出0入0汤圆

 楼主| 发表于 2014-1-2 10:46:57 | 显示全部楼层
ndt2000 发表于 2014-1-2 10:40
有的MCU默认上电开看门狗的,要先关闭,就像C8051F的

哦,我看看怎么关闭开门狗,之前都没有用过看门狗!

出0入0汤圆

发表于 2014-1-2 11:46:16 | 显示全部楼层
shuidiyu 发表于 2014-1-2 10:45
你是指这个 Adconv(1,0); 函数吗?!

所有引用的函数都有可能,检查一下程序有没有跑飞吧

出0入0汤圆

发表于 2014-1-2 11:59:18 | 显示全部楼层
试试

while (1) Buzzer ();

运行一下,看看能响多久?

出0入0汤圆

 楼主| 发表于 2014-1-2 12:56:18 | 显示全部楼层
firewind 发表于 2014-1-2 11:46
所有引用的函数都有可能,检查一下程序有没有跑飞吧

找到原因了只要有下面这段代码,程序就死!
  1.                 for(i=0;i<shi;i++)
  2.                 {
  3.                         Buzzer();
  4.                         for(j=0;j<2;j++)
  5.                                 delay_ms(255);
  6.                 }
复制代码

出0入0汤圆

 楼主| 发表于 2014-1-2 12:57:12 | 显示全部楼层
stdio 发表于 2014-1-2 11:59
试试

while (1) Buzzer ();

由于这段代码引起的,具体还不清楚!
  1.                 for(i=0;i<shi;i++)
  2.                 {
  3.                         Buzzer();
  4.                         for(j=0;j<2;j++)
  5.                                 delay_ms(255);
  6.                 }
复制代码

出0入21汤圆

发表于 2014-1-2 13:07:39 | 显示全部楼层
shuidiyu 发表于 2014-1-2 12:57
由于这段代码引起的,具体还不清楚!

90%是因为你的看门狗复位了。

出0入0汤圆

 楼主| 发表于 2014-1-2 13:57:22 | 显示全部楼层
117433525 发表于 2014-1-2 13:07
90%是因为你的看门狗复位了。

刚刚发现
  1.                 for(i=0;i<8;i++)
  2.                         delay_ms(255);               
  3.                 for(i=0;i<shi;i++)
  4.                 {
  5.                         Buzzer();
  6.                         for(j=0;j<2;j++)
  7.                                 delay_ms(255);
  8.                 }
  9.                 for(i=0;i<8;i++)
  10.                         delay_ms(255);       
复制代码

执行一遍不循环
  1.                 for(i=0;i<8;i++)
  2.                         delay_ms(255);               
  3.                 for(i=0;i<shi;i++)
  4.                 {
  5.                         Buzzer();
  6.                         for(j=0;j<2;j++)
  7.                                 delay_ms(255);
  8.                 }
  9.                 for(i=0;i<8;i++)
  10.                         delay_ms(255);        Buzzer();       
复制代码

而在后面加上buzzer();后就可以一直循环了,看反汇编也找不到问题奇怪了

出0入0汤圆

 楼主| 发表于 2014-1-2 14:35:20 | 显示全部楼层
shuidiyu 发表于 2014-1-2 13:57
刚刚发现
执行一遍不循环

大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-1-2 15:00:17 | 显示全部楼层
shuidiyu 发表于 2014-1-2 14:35
大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的! ...

哦 ,明白了这段汇编!原来是当a加到8的时候才跳转! 不过为什么程序没有从跳转的地方继续执行呢!

出0入0汤圆

发表于 2014-1-2 15:11:07 | 显示全部楼层
楼主能上传完整的工程么

出0入0汤圆

 楼主| 发表于 2014-1-4 16:11:40 | 显示全部楼层
lcw_swust 发表于 2014-1-2 15:11
楼主能上传完整的工程么

恩,好 的!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-1-13 10:39:50 | 显示全部楼层

大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主试试把ad3=Adconv(1,0);改成ad3=123;

出0入0汤圆

 楼主| 发表于 2014-1-17 16:17:04 | 显示全部楼层
lcw_swust 发表于 2014-1-13 10:39
大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主 ...

好的 ,我试试!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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