微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第25节:用LED灯和按键来模拟工业自动化设备的运动控制

第25节:用LED灯和按键来模拟工业自动化设备的运动控制

时间:11-22 来源:互联网 点击:
开场白:
前面三节讲了独立按键控制跑马灯的各种状态,这一节我们要做一个机械手控制程序,这个机械手可以左右移动,最左边有一个开关感应器,最右边也有一个开关感应器。它也可以上下移动,最下面有一个开关感应器。左右移动是通过一个气缸控制,上下移动也是通过一个气缸控制。而单片机控制气缸,本质上是通过三极管把信号放大,然后控制气缸上的电磁阀。这个系统机械手驱动部分的输出和输入信号如下:
2个输出IO口,分别控制2个气缸。对于左右移动的气缸,当IO口为0时往左边跑,当IO口为1时往右边跑。对于上下移动的气缸,当IO口为0时往上边跑,当IO口为1时往下边跑。
3个输入IO口,分别检测3个开关感应器。感应器没有被触发时,IO口检测为高电平1。被触发时,IO口检测为低电平0。
这一节继续要教会大家两个知识点:
第一点:如何用软件进行开关感应器的抗干扰处理。
第二点:如何用Switch语句搭建工业自动控制的程序框架。还是那句话,我们只要以Switch语句为支点,再复杂再繁琐的程序都可以轻松地编写出来。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。用矩阵键盘中的S1键作为启动独立按键,用S5按键模拟左边的开关感应器,用S9按键模拟右边的开关感应器,用S13按键模拟下边的开关感应器。记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。

(2)实现功能:
开机默认机械手在左上方的原点位置。按下启动按键后,机械手从左边开始往右边移动,当机械手移动到最右边时,机械手马上开始往下移动,最后机械手移动到最右下角的位置时,延时1秒,然后原路返回,一直返回到左上角的原点位置。注意:启动按键必须等机械手处于左上角原点位置时,启动按键的触发才有效。

(3)源代码讲解如下:
#include "REG52.H"

#define const_voice_short40 //蜂鸣器短叫的持续时间

#define const_key_time120 //按键去抖动延时的时间

#define const_sensor20 //开关感应器去抖动延时的时间

#define const_1s500//1秒钟大概的定时中断次数

void initial_myself();
void initial_peripheral();
void delay_short(unsigned int uiDelayShort);
void delay_long(unsigned int uiDelaylong);

void left_to_right();//从左边移动到右边
void right_to_left(); //从右边返回到左边
void up_to_dowm(); //从上边移动到下边
void down_to_up(); //从下边返回到上边

void run(); //设备自动控制程序
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
void led_update();//LED更新函数
void T0_time();//定时中断函数

void key_service(); //按键服务的应用程序
void key_scan(); //按键扫描函数 放在定时中断里
void sensor_scan(); //开关感应器软件抗干扰处理函数,放在定时中断里。

sbit hc595_sh_dr=P2^3;
sbit hc595_st_dr=P2^4;
sbit hc595_ds_dr=P2^5;

sbit beep_dr=P2^7; //蜂鸣器的驱动IO口

sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键

sbit left_sr=P0^1; //左边的开关感应器 对应朱兆祺学习板的S5键
sbit right_sr=P0^2; //右边的开关感应器 有对应朱兆祺学习板的S9键
sbit down_sr=P0^3; //下边的开关感应器 对应朱兆祺学习板的S13键

sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平

unsigned char ucKeySec=0; //被触发的按键编号

unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器
unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志

unsigned char ucLeftSr=0;//左边感应器经过软件抗干扰处理后的状态标志
unsigned char ucRightSr=0;//右边感应器经过软件抗干扰处理后的状态标志
unsigned char ucDownSr=0;//下边感应器经过软件抗干扰处理后的状态标志

unsigned intuiLeftCnt1=0;//左边感应器软件抗干扰所需的计数器变量
unsigned intuiLeftCnt2=0;

unsigned intuiRightCnt1=0;//右边感应器软件抗干扰所需的计数器变量
unsigned intuiRightCnt2=0;

unsigned intuiDownCnt1=0; //下边软件抗干扰所需的计数器变量
unsigned intuiDownCnt2=0;

unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器

unsigned char ucLed_dr1=0; //代表16个灯的亮灭状态,0代表灭,1代表亮
unsigned char ucLed_dr2=0;
unsigned char ucLed_dr3=0;
unsigned char ucLed_dr4=0;
unsigned char ucLed_dr5=0;
unsigned char ucLed_dr6=0;
unsigned char ucLed_dr7=0;
unsigned char ucLed_dr8=0;
unsigned char ucLed_dr9=0;
unsigned char ucLed_dr10=0;
unsigned char ucLed_dr11=0;
unsigned char ucLed_dr12=0;
unsigned char ucLed_dr13=0;
unsigned char ucLed_dr14=0;
unsigned char ucLed_dr15=0;
unsigned char ucLed_dr16=0;

unsigned char ucLed_update=1;//刷新变量。每次更改

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top