微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何将以下俩个程序结合,实现按键更换程序

如何将以下俩个程序结合,实现按键更换程序

时间:10-02 整理:3721RD 点击:
各位大神,急求,谢谢
如何将以下俩个程序结合,实现按键更换程序
//                     按键中断查询演示程序                            //
//  本程序通过两个按键对数码管进行操作,分别向用户演示了查询与中断的操作//
//方式,中断中应用了对按键进行查询的方法来判断按键的键值,查询按键方法中 //
//则采用了键盘延迟的方法来消除按键重复输入.通过这两种方法的学习,让其理 //
//解中断的应用技巧.及对查询方法的理解.                                 //
//  程序运行效果:开机后数码管显示数字"1",当按S1不放时,数码管数字不变,松//
//开S1按键,数码减1.按S2键不放时,数码管数字会自动加1.并且数字遵守从0-9循//
//环操作.                                                              //
//---------------------------------------------------------------------//
//  开发日期: 2009/01/30                                               //
//  修改日期:                                                          //
//  程序备注: 此程序仅为表现本机功能而演示用,当用作实际工程时请慎用.   //
//=====================================================================//
#include <at89x51.h>                                //包含S51地址头文件
typedef unsigned char uchar;                        //重定义无符号字符型
typedef unsigned int uint;                          //重定义无符号整型
sbit S1=P3^2;                                       //定义S1变量
sbit S2=P3^4;                                       //定义S2变量
uchar DataCount=0;                                  //定义全局计数器
uchar code LedShowData[]={0x9F,0x25,0x0D,0x99,0x49, //定义固定存储显示字符
                          0x41,0x1F,0x01,0x19,0x03};//1,2,3,4,5,6,7,8,9,0
void KeyDelay()                                     //定义键盘防抖子程序
{ uint KeyTime=20000;                               //定义防抖时间变量
  while(KeyTime--);                                  //防抖延时开始
  return;
}
void S1_Break() interrupt 0                         //定义S1(INT0)外部中断0
{
while(0==S1);                                       //判断S1按键键值
DataCount--;                                        //计数器数值减1
if(DataCount>9)                                     //判断计数器是否到最小值
{
DataCount=9;                                       //显示数字0
}
return;
}
void main()                                         //主程序开始
{
ET0=1;                                             //设定外部中断触发方式(1->低电平触发)
EX0=1;                                             //开启外部中断0
EA=1;                                              //开记总中断
while(1)                                           //程序主循环
{
  if(0==S2)                                         //通过查询判断键值
  {
   KeyDelay();                                      //键盘防抖动开延时子程序开始
   DataCount++;                                     //计数器加1
  }
  if(DataCount>9)                                   //判断当前计数器
  {
   DataCount=0;                                     //将计数器置0
  }
  P2=LedShowData[DataCount];                        //通过端口显示计数器数值
}
}
  红外反射与直流电机驱动演示程序                 //
//  本程序通过前端,底端的红外发射头和接收头来判断小车的运行轨迹,当前与 //
//底端发生信号输入时,信号将被单片机接收,单片机来控制机器按照写好的程序 //
//开始运行.同时为达到好的效果,加入声音识别与蜂鸣器输入输出设备.使得此机//
//人的运动变得更加有趣.                                                //
//  程序效果: 打开本机电源开关,机器人开始向前运行(这要看当时的条件),在 //
//运动的过程中,如果前方有障碍物,机器人则开始向后后退一段时间后,向左运动//
//,在向左运行一段时间后.再开始向前运行.在整个调向的过程中,蜂鸣器闪响.并//
//且在机器人前进的过程中,你可以通过拍手来控制机器人的停止和运行.       //
//---------------------------------------------------------------------//
//  开发日期: 2009/01/30                                               //
//  修改日期:                                                          //
//  程序备注: 此程序仅为表现本机功能而演示用,当用作实际工程时请慎用.   //
//=====================================================================//
#include <at89x51.h>                      //包含51单片机相关的头文件
sbit LeftLed=P2^0;                        //定义前方左侧指示灯端口
sbit RightLed=P0^7;                       //定义前方右侧指示灯端口
sbit LeftIR=P3^5;                         //定义前方左侧红外探头端口
sbit RightIR=P3^6;                        //定义前方右侧红外探头端口
sbit FontIR=P3^7;                         //定义前方正前方红外探头端口
sbit M1A=P0^0;                            //定义左侧电机驱动A端
sbit M1B=P0^1;                            //定义左侧电机驱动B端
sbit M2A=P0^2;                            //定义右侧电机驱动A端
sbit M2B=P0^3;                            //定义右侧电机驱动B端
sbit B1=P0^4;                             //定义语音识识别传感器端口
sbit SB1=P0^6;                            //定义蜂鸣器端口
#define RunShow P1                        //定义数据显示端口
void Delay()                              //定义机器人调转子时间子程序
{ unsigned int DelayTime=50000;           //定义机器人转弯时间变量
  while(DelayTime--);                     //机器人转弯循环
  SB1=!SB1;                               //蜂鸣器闪响
  return;
}
void ControlCar(unsigned char ConType)    //定义电机控制子程序
{
M1A=0;                                   //将M1电机A端初始化为0
M1B=0;                                   //将M1电机B端初始化为0
M2A=0;                                   //将M2电机A端初始化为0
M2B=0;                                   //将M2电机B端初始化为0
switch(ConType)                          //判断用户设定电机形式
{
  case 1:  //前进                         //判断用户是否选择形式1
  { M1A=1;                                //M1电机正转
    M2A=1;                                //M2电机正转
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  { M1B=1;                                //M1电机反转
    M2B=1;                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  { M1B=1;                                //M1电机反转
    M2A=1;                                //M2电机正转
        break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  { M1A=1;                                //M1电机正转
    M2B=1;                                //M2电机反转
        break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    break;                                //退出当前选择
  }
}
}
void main()                               //主程序入口
{
  bit RunFlag=0;                          //定义小车运行标志位
  RunShow=0;                              //初始化显示状态
  ControlCar(1);                          //初始化小车运行状态
  while(1)                                //程序主循环
  {
   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   RunShow=FontIR;                        //数据显示窗口,指示前方红外探头状态
   if(FontIR==0 || LeftIR==1 ||           //判断前方,左侧,右侧是否有信号输入
      RightIR==1)
   {ControlCar(2);                        //让小车后退
        Delay();                              //开始小车后退延时子程序
        Delay();                              //决定了小车后退的步数
        Delay();                              //改变它可以改小车后退的距离
        Delay();                              //这里只是一个延时
    ControlCar(3);                        //改变小车为左转方向
        Delay();                              //开始小车左转延时子程序
        Delay();                              //改变它可以改变小车旋转的角度
        Delay();                              //同上
        Delay();                              //同上
        ControlCar(1);                        //改变小车为前进运行状态
        SB1=1;                                //这个多一步将蜂鸣器关闭
   }
   if(B1==0)                              //判断是否有声音信号输入
   {
    while(B1==0);                         //去除声音多余的杂波
        if(RunFlag==0)                        //判断小车当前的运行状态标志
        {RunFlag=1;                           //改变小车当前的运行状态标志
         ControlCar(8);                       //停止小车的运行
        }
        else                                  //否则执行的代码如下
        {RunFlag=0;                           //判断小车的运行状态标志
         ControlCar(1);                       //改变小车为前进的运行状态
        }
   }
  }
}

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

网站地图

Top