单片机C语言高手进 点击:709 | 回复:17



蠢猪

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-09 11:53:08
楼主

#include "reg51.h"
sbit Y6=P2^6; //温控器
sbit Y5=P2^5; //时间继电器
sbit Y4=P2^4; //压
sbit Y3=P2^3; //拉
/////////////////////
sbit X0=P0^0; //拉到位
sbit X1=P0^1; //压原位
sbit X2=P0^2; //压到位
sbit X3=P0^3; //时间
/////////////////////
sbit X4=P0^4; //手动/自动
sbit X5=P1^0; //温控
sbit X6=P1^1; //手动拉
sbit X7=P1^2; //手动压
sbit X8=P1^3; //启动
unsigned char BU=0;
void YANS(unsigned int YS)
{
 unsigned int j;
 for(;YS>0;YS--)
  {
   for(j=0;j<124;j++)
    {;}
  }
}
void main()
 {
  P0=0xff;
  P1=0xff;
  P2=0xff;
  P3=0xff;
  while(1) //手动区
    {
     if(X5==1)
     Y6=1;
     else
      {
       YANS(20); 
       if(X5==0)
       Y6=0;
       else Y6=1;
      }
      if(X4==0)
       {
        YANS(20); ///程序运行到这里就会卡主 去掉这个延时就好了
        if(X4==0)
         {
          if((P1|0xf9)==0xff)
           {
            b_0:P2=(P2|0x18);
            continue;
           }
          YANS(20);
          if((P1|0xf9)==0xff)
          goto b_0;
          if(X6==0) 
          Y3=0;
          if(X7==0)
          Y4=0; 
         }
       } 
       else //自动区
       switch(BU)
        {
         case 0:if(X8==0)
                       {
                        YANS(20);
                         if(X8!=0)
                         break;
                        } 
                      else break; 
         case 1:Y3=0;
         case 2:if(X0==0




lclzg

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 26回
  • 年度积分:0
  • 历史总积分:32
  • 注册:2008年8月28日
发表于:2008-12-09 21:43:07
1楼
把 void YANS(unsigned int YS) 换成void YANS( int YS) 试一下

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-10 09:03:50
2楼

上面的大师

首先谢谢你热心的回复

我照你说的做了还是不行哦

帮帮我啊

想起时正是忘记

  • 精华:0帖
  • 求助:0帖
  • 帖子:42帖 | 1651回
  • 年度积分:0
  • 历史总积分:1960
  • 注册:2007年1月26日
发表于:2008-12-10 09:14:34
3楼
按理说改成 INT应 该 没 问 题 ,要 不 然 把 for(;YS>0;YS--)中 的 YS>0改 成 YS>1?

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-10 09:37:07
4楼

引用想起时正是忘记 的回复内容:按理说改成 INT应 该 没 问 题 ,要 不 然 把 for(;YS>0;YS--)中 的 YS>0改 成 YS>1?


谢谢上面大师的回复
还是不行啊

按理说延时只要可用不存在

其它的可用唯独一个不可用吧

想起时正是忘记

  • 精华:0帖
  • 求助:0帖
  • 帖子:42帖 | 1651回
  • 年度积分:0
  • 历史总积分:1960
  • 注册:2007年1月26日
发表于:2008-12-10 10:15:49
5楼
if((P1|0xf9)==0xff)
goto b_0;
--------------------------这 会 不 会 容 易 产 生 死 循 环 ?如 果 一 直 0XFF,程 序 就 死 了 ,0XFF是 外 部 器 件 产 生 ,若 有 故 障 ,软 件 没 做 判 断 保 护 ,也 许 是 这 个 问 题 导 致 吧

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-10 10:56:38
6楼

楼上的大师

如果一直OXFF就会返回不停的扫描自动 手动 有没有按下

那个地方是 当按下手动看关X4时 检测手动下的按钮有没有按下(X6 X7)

如果有按下就延时去抖动

我试过很多次只有那个延时会卡死其它延时很正常

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-11 09:43:11
7楼
高手们 大师们帮帮忙啊

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2008-12-11 10:06:29
8楼
换成52芯片试一下。一般编译软件默认256 byte RAM,51只有128 byte,你看是不是这个原因。

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-11 10:53:58
9楼

我是在线模拟的

写片的话那就看不出来了

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2008-12-11 17:18:47
10楼

写片的话看不出来了?——是不是就没有这个现象了?

请设置RAM大小。

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-12 08:05:10
11楼

谢谢周公的热心帮忙

我试试看

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-12 17:02:49
12楼

我现在用AT89S51的片子写好后

运行又正常了

但在线仿真还是不行

周公看看是否真是RAM的问题呢

还请教的低级的问题

RAM怎么设置大小啊

中原龙

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 831回
  • 年度积分:0
  • 历史总积分:1291
  • 注册:2007年7月09日
发表于:2008-12-12 17:50:28
13楼

你用的什么模拟软件?你可以在在线模拟软件中设置.

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2008-12-12 18:04:54
14楼
在线仿真还是不行 ——检查仿真器设置。

蠢猪

  • 精华:0帖
  • 求助:1帖
  • 帖子:7帖 | 50回
  • 年度积分:0
  • 历史总积分:82
  • 注册:2003年10月17日
发表于:2008-12-13 08:07:46
15楼

上面的两位大师

我用的是KEIL 2

再次感谢两位大师的热心帮助

想起时正是忘记

  • 精华:0帖
  • 求助:0帖
  • 帖子:42帖 | 1651回
  • 年度积分:0
  • 历史总积分:1960
  • 注册:2007年1月26日
发表于:2009-01-01 16:11:52
16楼

if(X4==0)
{
YANS(20); ///程序运行到这里就会卡主 去掉这个延时就好了
if(X4==0)

是不是在这几行设置中断监视了?或者,在延时后加上一个if(X4!=0)分支?

 

有些情况,中断监视无法完全模拟实际运行

leehom_na

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 30回
  • 年度积分:0
  • 历史总积分:34
  • 注册:2008年10月18日
发表于:2009-03-24 16:35:13
17楼
我昨天看了郭天祥的视频,也遇到你得这个问题,只要把YANS(20); 删掉就行了。具体原因不知道。

热门招聘
相关主题

官方公众号

智造工程师