#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit smg=P3^6;
sbit SH_CP=P2^4; //串行寄存器时钟,上升沿有效
sbit DS=P2^5; //串行数据输入
sbit ST_CP=P2^6; //串行输入时钟,上升沿有效
sbit DS2=P2^7; //串行数据输入
uchar code LED_BIT[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar code stepper1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正时钟旋转相序表
uchar code stepper2[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //逆时钟旋转相序表
uchar Key_value=0;
uchar level=1,goal;
uchar level_flag=0,goal_flag=0,wait_flag=0;//楼层按钮:未按下0,上1,下2.
uchar step;
void Delay_ms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//************************************************************************/
// 描述: 反转法键盘扫描
//************************************************************************/
short keycheckdown() /* 反转法键盘扫描 */
{
short temp1,temp2,temp,a=0xff;
P1=0xf0; /* 输入行值(或列值) */
Delay_ms(20); /* 延时 */
temp1=P1; /* 读列值(或行值) */
P1=0xff;
Delay_ms(20); /* 延时 */
P1=0x0f; /* 输入列值(或行值) */
Delay_ms(20); /* 延时 */
temp2=P1; /* 读行值(或列值) */
P1=0xff;
temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */
switch(temp) /* 通过读入数据组合判断按键位置 */
{
case 0xee :a=0;break; // 按键一上
case 0xed :a=1;break; // 按键一下
case 0xde :a=2;break; // 按键二上
case 0xdd :a=3;break; // 按键二下
case 0xbe :a=4;break; // 按键三上
case 0xbd :a=5;break; // 按键三下
case 0x7e :a=6; break;// 按键四上
case 0x7d :a=7;break;// 按键四下
case 0xeb :a=8;break; // 按键1
case 0xdb :a=9;break; // 按键2
case 0xbb :a=10;break;// 按键3
case 0x7b :a=11; break;// 按键4
case 0xe7 :a=12;break;// 按键
case 0xd7 :a=13;break;// 按键
case 0xb7 :a=14; break;// 按键
case 0x77 :a=15;break;// 按键
default :a=0xff;
}
return a; /* 返回按键值 */
}
void HC595_Data(uchar sum,uchar wei)
{
uchar k;
_nop_();
ST_CP = 0;
for(k=0;k<8;k++)
{
SH_CP = 0; //先把SH_CP引脚拉低
if(wei==1)
{
DS = (sum&0x80); //取高位
DS2 = 0x00;
}
else
{
DS2 = (sum&0x80);
DS = 0x00;
}
SH_CP = 1;
sum<<= 1; //数据左移1位,把sum由高到低一位一位传输给74HC595
}
ST_CP = 1; //给ST_CP一个上升沿,把数据并行输出
}
void motor(uchar a,uchar b)//电机数,正反转
{
uchar i;
for(i=0;i<20;i++)
{
for(step=0;step<8;step++)
{
if(a==1&&b==1)//电机1正转
{
HC595_Data(LED_BIT[12],2);
P3=(P3&0xf0)|stepper1[step];
}
if(a==1&&b==2)//电机2反转
{
HC595_Data(LED_BIT[13],2);
P3=(P3&0xf0)|stepper2[step];
}
if(a==2&&b==1)//电机2正转
{
P2=(P2&0xf0)|stepper1[step];
}
if(a==2&&b==2)//电机2反转
{
P2=(P2&0xf0)|stepper2[step];
}
Delay_ms(8);
}
}
}
void elevator_up(uchar goal)
{
switch(level)
{
case 1:
motor(1,1);//电梯上
level=2;
P0=smgduan[level];
if(level==goal)break;
case 2:
motor(1,1);//电梯上
level=3;
P0=smgduan[level];
if(level==goal)break;
case 3:
motor(1,1);//电梯上
level=4;
P0=smgduan[level];
if(level==goal)break;
default:break;
}
}
void elevator_down(uchar goal)
{
switch(level)
{
case 4:
motor(1,2);//电梯下
level=3;
P0=smgduan[level];
if(level==goal)break;
case 3:
motor(1,2);//电梯下
level=2;
P0=smgduan[level];
if(level==goal)break;
case 2:
motor(1,2);//电梯下
level=1;
P0=smgduan[level];
if(level==goal)break;
default:break;
}
}
void Key_scan()
{
if(Key_value%2 == 0&&level_flag==0&&Key_value!=0xff&&Key_value<8)//上
{
level_flag=1;
goal_flag=0;
}
if(Key_value%2 == 1&&level_flag==0&&Key_value!=0xff&&Key_value<8)//下
{
level_flag=2;
goal_flag=0;
}
if(level_flag!=0&&wait_flag==0)//呼叫按钮按下
{
if(Key_value/2+1>level)//呼叫大于电梯
{
elevator_up(Key_value/2+1);//电梯上
}
else if(Key_value/2+1<level)
{
elevator_down(Key_value/2+1);//电梯下
}
motor(2,1);//开门
Delay_ms(2000);//延迟,进电梯
motor(2,2); //关门
wait_flag=1;
}
if(level_flag!=0&&goal_flag==0&&wait_flag==1&&(Key_value==8||Key_value==9||Key_value==10||Key_value==11))//楼层按钮
{
goal_flag=1;
if(level_flag==1&&level<Key_value-7)
{
elevator_up(Key_value-7);
}
else if(level_flag==2&&level>Key_value-7)
{
elevator_down(Key_value-7);
}
motor(2,1);//开门
Delay_ms(2000);//延迟,进电梯
motor(2,2); //关门
level_flag=0;
wait_flag=0;
}
}
void main()
{
smg=1;
level_flag=0;
goal_flag=0;
while(1)
{
P0=smgduan[level];
Key_value=keycheckdown();
if(Key_value>=8&&Key_value<=11)
{
HC595_Data(LED_BIT[Key_value],2);
Delay_ms(500);
}
else if(Key_value>=0&&Key_value<8)
{
HC595_Data(LED_BIT[Key_value],1);
Delay_ms(500);
}
Key_scan();
HC595_Data(LED_BIT[14],2);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
单片机-电梯运行系统设计
共19个文件
obj:2个
workspace:2个
lst:2个
需积分: 5 0 下载量 2 浏览量
2024-03-20
10:02:34
上传
评论
收藏 112KB ZIP 举报
温馨提示
一个电梯系统的输入和输出包括: 1、每层楼的呼叫按钮(上或下) 和对应的显示灯: 2、 电梯间内部的目标楼层按钮 (4 层)和对应的显示灯: 3 显示电梯的运行状态(上行、下行和停止),电梯当前楼层(数字) 4 电梯的驱动电机,用来控制电梯上行或下行。 5 电梯门的打开和闭合。 本设计中,可以使用如下器件来表示以上输入输出: 1、使用多个按键或键盘矩阵代表呼叫按钮和目标楼层按钮: 2 使用 LED 发光管表示上述按钮的状态; 使用7段数码管阵列显示电梯的运行状态和当前楼层,以及其他信息; 3 使用步进电机代表电梯的驱动电机,步进电机的正转和反转分别表示电梯的上行
资源推荐
资源详情
资源评论
收起资源包目录
电梯运行系统设计.zip (19个子文件)
电梯运行系统设计
Proteus
Last Loaded 电梯运行控制系统.pdsbak 25KB
Backup Of 电梯运行控制系统.pdsbak 25KB
电梯运行控制系统.pdsprj.LAPTOP-HLMPIF60.wang-kt.workspace 991B
电梯运行控制系统.pdsprj 25KB
电梯运行控制系统.pdsprj.LAPTOP-SB2RAHL6.Lenovo.workspace 2KB
Program
Project.uvopt 6KB
Objects
Project.build_log.htm 1KB
STARTUP.obj 828B
Project.hex 3KB
Project 11KB
main.obj 13KB
Project.lnp 121B
STARTUP.A51 6KB
Listings
Project.m51 16KB
main.lst 10KB
STARTUP.lst 14KB
main.c 5KB
Project.uvproj 14KB
Project.uvgui.Lenovo 88KB
共 19 条
- 1
资源评论
真*小白
- 粉丝: 18
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功