2631|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求求大神帮帮忙啊,帮我看看程序和电路图哪里有问题,为什么仿真不出来? [复制链接]


4.3 源程序代码
//源程序
#include
#define MAXFLOOR 6
unsigned char code LED_CODES[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
//电梯外面的按键上下键
sbit F6D=P1^0;
sbit F1U=P1^1;
sbit F2D=P1^2;
sbit F2U=P1^3;
sbit F3D=P1^4;
sbit F3U=P1^5;
sbit F4D=P1^6;
sbit F4U=P1^7;
sbit F5D=P3^0;
sbit F5U=P3^1;
//电梯内的按键
sbit F1=P2^0;
sbit F2=P3^3;
sbit F3=P3^4;
sbit F4=P3^5;
sbit F5=P2^1;
sbit F6=P2^2;
//指示灯
sbit ledu=P3^7;
sbit ledd=P3^6;
sbit open=P2^3;   //开门键
sbit close=P0^7;  //关门键
//电动机的驱动接线
sbit a1=P2^4;
sbit a2=P2^5;
sbit a3=P2^6;
sbit a4=P2^7;
bit dir=1,stop=0; //dir表示1为向上,0为向下;stop表电梯是否停止
unsigned char nf=1;  //当前楼层
unsigned char cf=1;  //要去楼层
unsigned char df;  //楼层差(电梯停止依据):df=|cf-nf|
unsigned char tf;  //暂存当前楼层(显示码指针):tf=nf
unsigned char flag,count=0; //flag=1表示正在运行;count=乘坐时计数值
unsigned int timer1=0,timer2=0;  //timer1为楼层间运行时间计数值,timer2为等待计数值
unsigned char call_floor[7]={0,0,0,0,0,0,0}; //存储每层楼的信息,1为有人呼叫或者有人前往
//主程序
void select_next();
void step(bit dir);
void delay(unsigned int z);
void main(void)
{P0=LED_CODES[1];
TH0=0x3C;
TL0=0xB0;
TMOD=0x01;//工作方式1
ET0=1;//允许定时器中断
EA=1;//中断总允许
EX0=1;//允许外部0中断
IT0=1;//为脉冲触发方式,下降沿有效
  while(1)
   { if(!flag&&!stop)
      {select_next();        // 决定电梯去哪一层
       step(dir);           // 电梯启动
       }
     else if(stop)
     {timer2=0;
      TR0=1;  //启动定时器/计数器工作
       while(timer2<100&&stop);
       TR0=0;
       timer2=0;
       stop=0;}
  }  
}
//选择当前要去的楼层子程序
void select_next()
{ char i;
  if(nf==MAXFLOOR)
   {
    dir=0;
   }
  else if(nf==1)
   {
    dir=1;
        }
    if(dir==0)
    {
        if(call_floor[nf]==1)  //要去的为当前层,即只需延时5s
        {call_floor[nf]=0;
         stop=1;
         return;
         }
        for(i=nf-1;i>=1;i--)        //向下运行时查找下一个要去的楼层
           if(call_floor)
           {cf=i;return;}
        dir=1;
        for(i=nf+1;i<=MAXFLOOR;i++)           //没有向下走的人,即反向运行
            if(call_floor)
            {cf=i;return;}
            dir=0;
        cf=1;       //经过上面的判断此处表示电梯没有人,默认停在一楼
}
       if(call_floor[nf]==1)
         {
                 call_floor[nf]=0;
                 stop=1;
                 return;
                 }
       for(i=nf+1;i<=MAXFLOOR;i++)
          if(call_floor)
             {cf=i;return;}
          if(i==7)
           {dir=0;
                   }
}
//启动电梯子程序
void step(bit dir)
{
if(cf==nf)
   return;
else if(!flag)
  {flag=1;
   delay(50);
      if(dir==1)
       {ledu=0;
            ledd=1;
           }
      else
           {ledd=0;
            ledu=1;
           }
   timer1=0;
    TR0=1;
   }
}
void delay(unsigned int z)  //延时程序
{
unsigned int x,y;
for(x=z;x>0;x--)
   {
   for(y=125;y>0;y--)
   ;
   }
}
//定时0中断,可利用此发送电机PWM脉冲信号
void time0_int() interrupt 1
{
TH0=0x3C;
  TL0=0xB0;
  timer1++;
  timer2++;
  if(flag)
  {
     if(timer1==20)  //到达一个楼层延时1s
      { timer1=0;
        if(dir)
          nf++;
        else
                  nf--;
        call_floor[nf]=0;
        flag=0;
        TR0=0;
        P0=LED_CODES[nf];  //显示当前楼层
        if(cf==nf)                //到达呼叫楼层,关电机
          {TR0=0;
                   ledu=ledd=1;
                   stop=1;
                   return;
                   }       
       }
   }
}
//外部中断0服务子程序
void int0() interrupt 0{if(F6D==0)     call_floor[6]=1; else if(F1U==0)      call_floor[1]=1; else if(F2D==0||F2U==0)      call_floor[2]=1; else if(F3D==0||F3U==0)      call_floor[3]=1; else if(F4D==0||F4U==0)      call_floor[4]=1; else if(F5D==0||F5U==0)      call_floor[5]=1; else if(F6==0)    {call_floor[6]=1;stop=0;} else if(F1==0)    {call_floor[1]=1;stop=0;} else if(F2==0)    {call_floor[2]=1;stop=0;} else if(F3==0)    {call_floor[3]=1;stop=0;} else if(F4==0)    {call_floor[4]=1;stop=0;} else if(F5==0)    {call_floor[5]=1;stop=0;}}

新建 Microsoft Word 文档.docx

15.95 KB, 下载次数: 4

此帖出自51单片机论坛

最新回复

电路上并无本振、也无复位,从程序量上看也远远不够。  详情 回复 发表于 2017-4-20 21:56
点赞 关注
 

回复
举报

1万

帖子

141

TA的资源

版主

沙发
 
电路上并无本振、也无复位,从程序量上看也远远不够。
此帖出自51单片机论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表