Edson_LC 发表于 2013-1-3 22:32:11

求助:本人用89c52做了电梯模型在protues中仿真不出!!

求各位大哥大姐指教一下小弟,小弟实在是茫然了。
或者各位有更好的可以发到小弟的邮箱,lichao082010@126.com感激不尽啊
#include <reg52.h>
#include <intrins.h>       
#include "74HC595.H"
#define uchar unsigned char
#define uintunsigned int
uchar code FFW={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};   //步进电机1~2相励磁法正转
uchar code REV={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};    //步进电机反转
unsigned char code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};//共阴数码管显示0~6的段码表,电梯内部显示
unsigned char code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};       //LED显示字模,电梯外部显示
unsigned char code tab1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code digittab[]={0xE7,0xC3,0x81,0x00,0xC3,0xC3,0xC3,0xC3,0xff,0xff,0xE7,0xC3,0x81,0x00,0xC3,0xC3,0xC3} ;
unsigned char cnta,move,speed,i=0,f,k,c0,z0,x1,x2;
//    步进电机端口
sbitA=P0^0;
sbitB_X=P0^1;
sbitC=P0^2;
sbitD=P0^3;
//   电梯内部数码管显示位声明
sbit DAT=P3^7;
sbit CLK=P3^6;
//   电梯外部楼层数码管显示位声明
sbit DAT1=P0^5;
sbit CLK1=P0^4;
//   电梯内部按键位声明
sbitK1   = P1^0;       //一楼
sbitK2   = P1^1;       //二楼
sbitK3   = P1^2;       //三楼
sbitK4   = P1^3;       //四楼
sbitK5   = P1^4;       //五楼
sbitK6   = P1^5;       //六楼
//   电梯外部楼层按键位声明
sbitK11   = P2^0;       //一楼上
sbitK21   = P2^1;       //二楼上
sbitK22   = P2^2;       //二楼下
sbitK31   = P2^3;       //三楼上
sbitK32   = P2^4;       //三楼下
sbitK41   = P2^5;       //四楼上
sbitK42   = P2^6;       //四楼下
sbitK51   = P2^7;       //五楼上
sbitK52   = P3^0;       //五楼下
sbitK61   = P3^1;       //六楼下

sbitspeaker   = P3^5;                  //蜂鸣报警


uintn;   //楼层
uint c=1;//初始楼层
uint c1=0;
uint c2=0;

uchar n1;
uchar n2;
uchar n3;
uchar n4;
uchar n5;

uchar flag=0;
uchar flag1=0;
uchar flag2=0;
uchar flag3=0;
uchar flag4=0;
uchar flag5=0;
uchar z;
uchar temp;
uchar y;
// 步进电机驱动程序
voidmotor_ffw(n);
voidmotor_rev(n);
// 楼层检测程序
void check();
void check2();
void check3();
void check4();
void check5();
void check6();
// 延时程序
void delay(uint t);
void delay1ms(uint i);
// 串口程序
void UART_Init(void);       //串口初始化
void Uart_SendChar(uchar dat); //串口楼层选择
void dajyx(); //多人按键运行程序
void beep();       
// 楼层显示程序
void send(uchar da);//楼层外部显示
lattice_up();   //动态显示上移箭头
lattice_up_s();       //静态显示上移箭头
lattice_down();
lattice_down_s();

void delay500us()
{
uchar j;
for(j=0;j<57;j++)          //500us基准延时程序
{
;
}
}

/********************************************************/
/*                                                
/* 延时t毫秒
/* 11.0592MHz时钟,延时<1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uint k;
   while(t--)
   {
   for(k=0; k<90; k++)
   { }
   }
}
/********************************************************/
/*                                                
/* 延时t毫秒
/* 11.0592MHz时钟,延时1ms                                    
/*                                                      
/********************************************************/
void delay1ms(uint i)
{
    uchar j;
        while(i--)
        {
                for(j=0;j<115;j++)          //1ms基准延时程序
                {
                ;
                }
        }
}
/********************************************************/
/*                                                
/* 产生1KHZ频率声音的函数                                 
/*                                                      
/********************************************************/
void beep()        //产生1KHZ频率声音的函数
{
        uchar i;
        for (i=0; i<100; i++)
        { speaker=0;
          delay500us();
          speaker=1;
      delay500us();
   }
}

/*****************************************
    梯外 数码管
*****************************************/
void send(uchar da)
{
       uchar k;
          for(k=0;k<8;k++)
       {
         DAT1=da&0x01; //从低位开始逐一移出(与线路有关,这是段A对应QG),164的时序是从D0逐步到D7.移完8次后整体再向下(bit)
         da>>=1;
         CLK1=0;      //在时钟上升沿串行输入
         CLK1=1;
          }
}


/**********************************************************/
/*
/* 总函数名称: 电梯方向点阵
/*
/*********************************************************/

/**********************************************************/
/*
/* 显示 上移箭头
/*
/*********************************************************/
lattice_up()
{
for(n=0;n<1;n++)
{
   if(++speed>75)   //移动速度控制
   {
      speed=0;
      move++;   //移位
      if(move>7)//是否完成移位一个汉字
      move=0;   //从头开始
   }       
   for(cnta=0;cnta<8;cnta++)
          {
           Ser_IN(digittab);//8X8点阵 列送扫描数据
           Ser_IN(tab1);//8X8点阵行选
           Par_OUT();//74HC595输出显示       
       delay500us();
             }                               
}
}
/**********************************************************/
/*
/* 显示 静态上箭头
/*
/**********************************************************/

lattice_up_s()
{
        for(n=0;n<256;n++)
   {
       for(cnta=0;cnta<8;cnta++)
          {
           Ser_IN(digittab);//8X8点阵 列送扫描数据
           Ser_IN(tab1);//8X8点阵行选
           Par_OUT();//74HC595输出显示       
       delay500us();
             }
       }                                
}

/**********************************************************/
/*
/* 显示 下移箭头
/*
/*****************************************/
lattice_down()
{
for(n=0;n<1;n++)
{
   if(++speed>75)   //移动速度控制
   {
      speed=0;
      move++;    //移位
      if(move>7)//是否完成移位一个汉字
      move=0;//从头开始
   }       
   for(cnta=0;cnta<8;cnta++)
          {
           Ser_IN(digittab);//8X8点阵 列送扫描数据
           Ser_IN(tab1);//8X8点阵行选
           Par_OUT();//74HC595输出显示       
      delay500us();
             }                               
}
}

/**********************************************************/
/*
/* 显示 静态下箭头
/*
/*********************************************************/
lattice_down_s()
{
        for(n=0;n<256;n++)
   {
       for(cnta=0;cnta<8;cnta++)
          {
           Ser_IN(digittab);//8X8点阵 列送扫描数据
           Ser_IN(tab1);//8X8点阵行选
           Par_OUT();//74HC595输出显示       
       delay500us();
             }
       }                                
}       



/********************************************************/
/*
/*串口初始化
/*
/********************************************************/
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
/********************************************************/
/*
/*发送指令
/*
/********************************************************/
void Uart_SendChar(uchar dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}
/********************************************************/
/*
/* 接收指令
/*
/********************************************************/
void INT_UartRcv(void) interrupt 4
{
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0;               //接收标志位清零
temp=SBUF;
check4();
}
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
voidmotor_ffw(n)
{
   uchar i;
   uchar k;
   uchar r;
   uintj;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)            
    {for (i=0; i<8; i++)
         { P0 = FFW;         //取数据
         delay(1);            //调节转速
         }
          check2();
                  }
       c++;
       lattice_up();
       send(seg);
   check3();
    }
        }
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
voidmotor_rev(n)
{uchar i;
   uchar k;
   uchar r;
   uintj;
   for(k=0;k<n;k++)
   {
   for (r=0;r<64;r++)
   {
   for (j=0; j<8; j++)         //转1*n圈
    {   for (i=0; i<8; i++)
          {
                   P0 = REV;         //取数据   
         delay(1);            //调节转速         
          }
       check2();
                  }
        c--;
        lattice_down();
        send(seg);
    check3();
    }
        }   
}

/********************************************************/
/*
/* 总楼层检测程序
/*
/********************************************************/



/********************************************************/
/*
/*单人按键检测程序:判断上升或下降多少层,然后利用步进电
/*                                机进行驱动从一楼开始
/********************************************************/
void check()
{ if(n>c)
{motor_ffw(n-c);
P0 = 0xf0;}
else if(n<c)
{motor_rev(c-n);
P0 = 0xf0;}
else if(n==c)
{P0 = 0xf0;}
}

/********************************************************/
/*
/*多人按键检测程序:在电梯上升或者下降过程中有人按键如何
/*                                        实现。
/********************************************************/
void check2()
{ if(K1==0 && flag==0 && c1!=1)
      {n1=1;flag=1;}
if(K2==0 && flag==0 && c1!=2)
      {n1=2;flag=1;}
if(K3==0 && flag==0 && c1!=3)
      {n1=3;flag=1;}
if(K4==0 && flag==0 && c1!=4)
      {n1=4;flag=1;}
if(K5==0 && flag==0 && c1!=5)
      {n1=5;flag=1;}
if(K6==0 && flag==0 && c1!=6)
      {n1=6;flag=1;}

if(K1==0 && flag==1 && flag1==0 && n1!=1)
      {n2=1;flag1=1;}
if(K2==0 && flag==1 && flag1==0 && n1!=2)
      {n2=2;flag1=1;}
if(K3==0 && flag==1 && flag1==0 && n1!=3)
      {n2=3;flag1=1;}
if(K4==0 && flag==1 && flag1==0 && n1!=4)
      {n2=4;flag1=1;}
if(K5==0 && flag==1 && flag1==0 && n1!=5)
      {n2=5;flag1=1;}
if(K6==0 && flag==1 && flag1==0 && n1!=6)
      {n2=6;flag1=1;}

if(K1==0 && flag1==1 && flag2==0 && n2!=1)
      {n3=1;flag2=1;}
if(K2==0 && flag1==1 && flag2==0 && n2!=2)
      {n3=2;flag2=1;}
if(K3==0 && flag1==1 && flag2==0 && n2!=3)
      {n3=3;flag2=1;}
if(K4==0 && flag1==1 && flag2==0 && n2!=4)
      {n3=4;flag2=1;}
if(K5==0 && flag1==1 && flag2==0 && n2!=5)
      {n3=5;flag2=1;}
if(K6==0 && flag1==1 && flag2==0 && n2!=6)
      {n3=6;flag2=1;}

if(K1==0 && flag2==1 && flag3==0 && n3!=1)
      {n4=1;flag3=1;}
if(K2==0 && flag2==1 && flag3==0 && n3!=2)
      {n4=2;flag3=1;}
if(K3==0 && flag2==1 && flag3==0 && n3!=3)
      {n4=3;flag3=1;}
if(K4==0 && flag2==1 && flag3==0 && n3!=4)
      {n4=4;flag3=1;}
if(K5==0 && flag2==1 && flag3==0 && n3!=5)
      {n4=5;flag3=1;}
if(K6==0 && flag2==1 && flag3==0 && n3!=6)
      {n4=6;flag3=1;}

if(K1==0 && flag3==1 && flag4==0 && n4!=1)
      {n5=1;flag4=1;}
if(K2==0 && flag3==1 && flag4==0 && n4!=2)
      {n5=2;flag4=1;}
if(K3==0 && flag3==1 && flag4==0 && n4!=3)
      {n5=3;flag4=1;}
if(K4==0 && flag3==1 && flag4==0 && n4!=4)
      {n5=4;flag4=1;}
if(K5==0 && flag3==1 && flag4==0 && n4!=5)
      {n5=5;flag4=1;}
if(K6==0 && flag3==1 && flag4==0 && n4!=6)
      {n5=6;flag4=1;}                                                             
}
/********************************************************/
/*
/*多按键运行程序
/*
/********************************************************/
void dajyx()
{         do
    {if(flag==1)
    {n=n1;
       flag=0;
       delay(1000);
       check();
       c1=0;
       }
        if(flag1==1)
        {delay(1000);
       n=n2;
       flag1=0;
       check();
       }
       if(flag2==1)
        {delay(1000);
       n=n3;
       flag2=0;
       check();
       }
       if(flag3==1)
        {n=n4;
       flag3=0;
       check();
       delay(1000);
       }
       if(flag4==1)
        {delay(1000);
       n=n5;
       flag4=0;
       check();
       delay(1000);
       }
       }while        (flag==1 || flag1==1 || flag2==1 || flag3==1 || flag4==1);
       
}
/********************************************************/
/*
/*多按键运行检测程序
/*
/********************************************************/
void check3()
{   if(n1==c)
      {delay(1000);
           n1=0;
           flag=0;
           }
          if(n2==c)
      {delay(1000);
           n2=0;
          flag1=0;
           }
       if(n3==c)
      {delay(1000);
           n3=0;
          flag2=0;
           }
          if(n4==c)
      {delay(1000);
           n4=0;
          flag3=0;
          }
          if(n5==c)
      {delay(1000);
           n5=0;
          flag4=0;
          }
}
/********************************************************/
/*
/*通信按键比较检测程序
/*
/********************************************************/
void check4()
{c0=temp%10;
z0=temp/10;
if(z0==c)
{delay(1000);}
if(z0!=c)
{check5();
check6();
if(x1>x2 || x1==x2)
{n=z0;
check();}
else if(x1<x2)
{Uart_SendChar(z0);}
}
}
void check5()
{
if(z0>c0)
{x1=z0-c0;}
if(z0<c0)
{x1=c0-z0;}
}
void check6()
{
if(z0>c)
{x2=z0-c;}
if(z0<c)
{x2=c-z0;}
}

/********************************************************
/*                                                      
/*             主程序                                             
/*                                                      
*********************************************************/

main()
{         P2=0xfe;   //电梯留着一楼
        UART_Init();
while(1)
    {
/********************************************************
*                                                      
* 梯内按键                                             
*                                                      
*********************************************************/

      if(K1==0)
           {n=1;
          c1=1;beep();
          check();
          dajyx();
                }

          if(K2==0)
           {n=2;
          c1=2;beep();
           check();
           dajyx();
           }

          if(K3==0)
           {n=3;
          c1=3;beep();
          check();
           dajyx();
           }

          if(K4==0)
           {n=4;
           c1=4;beep();
           check();
           dajyx();
          }

          if(K5==0)
           {n=5;
           c1=5;beep();
           check();
           dajyx();
           }

   if(K6==0)
           {n=6;
           c1=6;beep();
           check();
           dajyx();
           }




/********************************************************
*                                                      
*   梯外按键                                             
*                                                      
*********************************************************/

/////////////一楼按键/////////////////////          
           if(K11==0)
   {
       delay1ms(20);
       if(K11==0)
       {
           z=1;beep();
           check4();
           if(flag5==0)
       {Uart_SendChar(z*10+c);}//发送数据
           }
       }
/////////////二楼按键/////////////////////              
          if(K21==0)
   {
      delay1ms(20);
      if(K21==0)
      {
          z=2;beep();
          check4();
          if(flag5==0)
   {Uart_SendChar(z*10+c);}//发送数据
          }
       }
           if(K22==0)
   {
       delay1ms(20);
       if(K22==0)
       {
           z=2;beep();
           check4();
           if(flag5==0)
       {Uart_SendChar(z*10+c);}//发送数据
           }
       }
////////////三楼按键/////////////////////              
          if(K31==0)
   {
      delay1ms(20);
      if(K31==0)
      {
          z=3;beep();
          check4();
          if(flag5==0)
   {Uart_SendChar(z*10+c);}//发送数据
          }
       }
           if(K32==0)
   {
       delay1ms(20);
       if(K32==0)
       {
           z=3;beep();
           check4();
           if(flag5==0)
       {Uart_SendChar(z*10+c);}//发送数据
           }
       }
/////////////四楼按键/////////////////////               
          if(K41==0)
   {
      delay1ms(20);
      if(K41==0)
      {
          z=4;beep();
          check4();
          if(flag5==0)
   {Uart_SendChar(z*10+c);}//发送数据
          }
       }
           if(K42==0)
   {
       delay1ms(20);
       if(K42==0)
       {
           z=4;beep();
           check4();
           if(flag5==0)
       {Uart_SendChar(z*10+c);}//发送数据
           }
       }
/////////////五楼按键/////////////////////               
          if(K51==0)
   {
      delay1ms(20);
      if(K51==0)
      {
          z=5;beep();
          check4();
          if(flag5==0)
   {Uart_SendChar(z*10+c);}//发送数据
          }
       }          

           if(K52==0)
   {
       delay1ms(20);
       if(K52==0)
       {
           z=5;beep();
           check4();
           if(flag5==0)
       {Uart_SendChar(z*10+c);}//发送数据
           }
       }
/////////////六楼按键/////////////////////               
          if(K61==0)
   {
      delay1ms(20);
      if(K61==0)
      {
          z=6;beep();
          check4();
          if(flag5==0)
   {Uart_SendChar(z*10+c);}//发送数据
          }
       }
        }
}
          
页: [1]
查看完整版本: 求助:本人用89c52做了电梯模型在protues中仿真不出!!