求助:本人用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]