⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 综合编程.c

📁 此例程为益芯科技为单片益智系列智能防撞机器人你的综合应用例程,全面包括了对LED灯,数码管,串口嗵信,中断/查询,声控,光敏,红外反射与接收等操作.是真正的一款不可多得的例程资料.
💻 C
📖 第 1 页 / 共 2 页
字号:
//=====================================================================//
//                       综合功能演示子程序                            //
//  本程序通过将以前所编写的分立程序能过有机结合,编制成一个大的应用系统//
//.小车在完成自动防撞,防县崖等动作外,还可以通过红外遥控器进行远成遥控. //
//如果你对电脑编程很有趣兴的话,当然也可以通过电脑对串口进行编程.以方便 //
//通过电脑来进行对小车控制.在正常的运特过程中,还可以通过声控(拍手声)来 //
//对小车进行控制,每一种控制小车都会完成相应的功能.为了更清晰的看到小车 //
//行过程状态,特将P1端口中的8个指示灯作为运行状态指示灯.以用来观察小车运//
//行中的每一步.                                                        //
//  程序运行效果: 将小车置于一个桌面上(桌面请不要使用黑色).打开电源的开//
//关,小车开始前进运行.同时运行指示灯闪亮.这时如果前方有障碍物(或走到县 //
//崖处).小车将会先进行后退一段时间,并有蜂鸣器报警.再向左转一段时间.最后//
//开始向前运行.左转,后退,右转,可以通过前方指示灯来观察.这时你可以能过声//
//控(如拍手声)来让小车停止和开启.同时你也可以用遥控来控制小车的运行.按 //
//"1",小车将向前运行,按"2"小车将后退,按"3"小车将左转,按"4"小车将右转. //
//按其它(0-9)键,小车数管码显示相应的数字符号.按电源键,小车将会停止运行.//
//同也可以用电脑将小车发送数字信号.其数码管也将显示相应的数字(0-9).并执//
//行相应的功能.当然S1,S2也是起作用,分别用于控制小车的停止和开启.(注意, //
//操作时应在小车前进时操作,后退,左转,右转等操作时,没有写相应的查询程序)//
//---------------------------------------------------------------------//
//  开发日期: 2009/01/30   编写综合功能演示子程序的最初代码确          //
//  修改日期:                                                          //
//  程序作者: guojun     邮箱:Guojun2008a@126.com                      //
//  程序备注: 此程序仅为表现本机功能而演示用,当用作实际工程时请慎用.   //
//=====================================================================//
#include <at89x51.h>                                  //包含51相关的头文件
typedef unsigned char uchar;                          //重定义char数据类型
typedef unsigned int uint;                            //重定义int数据类型
#define ShowPort P2                                   //定义数码管显示端口
uchar code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定义数码管显示数据
                            0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
static unsigned int RecvData;                         //定义接收红外数据变量
static unsigned char CountData;                       //定义红外个数计数变量
static unsigned char AddData;                         //定义自增变量
static unsigned int LedFlash;                         //定义闪动频率计数变量
unsigned char HeardData;                              //定义接收到数据的高位变量
bit RunFlag=0;                                        //定义运行标志位
bit EnableLight=0;                                    //定义指示灯使能位
/***********完成基本数据变量定义**************/
sbit S1State=P1^0;                                    //定义S1状态标志位
sbit S2State=P1^1;                                    //定义S2状态标志位
sbit B1State=P1^2;                                    //定义B1状态标志位
sbit IRState=P1^3;                                    //定义IR状态标志位
sbit RunStopState=P1^4;                               //定义运行停止标志位
sbit FontIRState=P1^5;                                //定义FontIR状态标志位
sbit LeftIRState=P1^6;                                //定义LeftIR状态标志位
sbit RightIRState=P1^7;                               //定义RightIRState状态标志位
/*************完成状态指示灯定义*************/
sbit S1=P3^2;                                         //定义S1按键端口
sbit S2=P3^4;                                         //定义S2按键端口
/*************完成按键端口的定义*************/       
sbit LeftLed=P2^0;                                    //定义前方左侧指示灯端口
sbit RightLed=P0^7;                                   //定义前方右侧指示灯端口
/*************完成前方指示灯端口定义*********/
sbit LeftIR=P3^5;                                     //定义前方左侧红外探头
sbit RightIR=P3^6;                                    //定义前主右侧红外探头
sbit FontIR=P3^7;                                     //定义正前方红外探头
/*************完成红外探头端口定义***********/
sbit M1A=P0^0;                                        //定义电机1正向端口
sbit M1B=P0^1;                                        //定义电机1反向端口
sbit M2A=P0^2;                                        //定义电机2正向端口
sbit M2B=P0^3;                                        //定义电机2反向端口
/*************完成电机端口定义***************/
sbit B1=P0^4;                                         //定义话筒传感器端口
sbit RL1=P0^5;                                        //定义光敏电阻端口
sbit SB1=P0^6;                                        //定义蜂鸣端口
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
sbit IR1=P3^3;                                        //定义红外接收端口
/*********完成红外接收端口的定义*************/
void Delay()                                          //定义延时子程序
{ uint DelayTime=30000;                               //定义延时时间变量
  while(DelayTime--);                                 //开始进行延时循环
  return;                                             //子程序返回
}
void ControlCar(uchar CarType)                        //定义小车控制子程序
{
 M1A=0;                                               //将电机1正向电平置低
 M1B=0;                                               //将电机1反向电平置低
 M2A=0;                                               //将电机2正向电平置低
 M2B=0;                                               //将电机2反向电平置低
 LeftLed=1;                                           //关闭前方左侧指示灯
 RightLed=1;                                          //关闭前方右侧指示灯
 Delay();                                             //将此状态延时一段时间
 switch(CarType)                                      //判断小车控制指令类型
 {  case 1: //前进                                    //判断是否是前进
    { M1A=1;                                          //将电机1正向端口置高
      M2A=1;                                          //将电机2正向端口置高
      ShowPort=LedShowData[1];                        //数码管显示前进状态
      break;                                          //退出判断
    }
    case 2: //后退                                    //判断是否是后退
    { M1B=1;                                          //将电机1反向端口置高
      M2B=1;                                          //将电机2反向端口置高                                 
      ShowPort=LedShowData[2];                        //数码管显示后退状态
      RightLed=0;                                     //将前方右侧指示灯置低(亮)
      LeftLed=0;                                      //将前方左侧指示灯置低(亮)
      break;                                          //退出判断
    }
    case 3: //左转                                    //判断是否是左转
    { M1B=1;                                          //将电机1反向端口置高
      M2A=1;                                          //将电机2正向端口置高
      ShowPort=LedShowData[3];                        //数码管显示左转状态
      LeftLed=0;                                      //将前方左侧指示灯置低(亮)
      break;                                          //退出判断
    }
    case 4: //右转                                    //判断是否是右转
    { M1A=1;                                          //将电机1正向端口置高
      M2B=1;                                          //将电机2反向端口置高
      ShowPort=LedShowData[4];                        //数码管显示右转状态
      RightLed=0;                                     //将前方右侧指示灯置低(亮)
      break;                                          //退出判断
    }
    default:                                          //默认情况下的判断
    {
     break;                                           //直接退出判断
    }
 } 
}
void Timer0_IR1() interrupt 1 using 3                 //定义红外定时器子程序
{ 
 TH0=0xFF;                                            //向定时器定时间寄存器填入高八位值
 TL0=0x19;                                            //向定时器定时间寄存器填入低八位值
 AddData++;                                           //自增变量加1
}
void Int1_IR1() interrupt 2                           //定义红外接收中断子程序
{
 TR1=0;                                               //将定时/计数器1关闭
 IRState=!IRState;                                    //将红外接收指示灯状态取反
 if(4==AddData) //0                                   //判断接收到的数据是0
 {
  RecvData=RecvData | 0;                              //判断到0就将当前位写0
  RecvData=RecvData << 1;                             //将当前位向左移动1位
 }
 else if(8==AddData)//1                               //判断接收到的数据是1
 {
  RecvData=RecvData | 1;                              //将当前位写1
  RecvData=RecvData << 1;                             //将当前位向左移动1位
 }
 CountData++;                                         //将红外接收位计数器加1
 if(CountData==8)                                     //判断是否接收到8位数据
 {
  HeardData=RecvData;                                 //是8位数据时,则将数据暂存到高位变量中
 }
 else if(CountData==16)                               //判断是否接收到16位数据
 {
  ET0=0;                                              //关闭红外定时器0
  EX1=0;                                              //关闭红外外部中断1
  TR1=1;                                              //打开定时/计数器1
  AddData=0;                                          //定时时间间隔变量清零
  if(HeardData==226 || HeardData==112)                //判断用户码是否正确
  {
    HeardData=RecvData;                               //取出接收到的低八位数据
    switch(HeardData)                                 //判断低八位数据的值下列那一位
    {
      case 32: //电源                                 //说明按下了电源键
	   { //在这里填写你自己的代码                     //根据你的功能自己写
	     ControlCar(8);                               //将小车停止
	     RunFlag==1;                                  //将运行标志位置1
	     break;                                       //返回
	   }
	  case 46: //TV/AV                                //说明按下了TV/AV键
	   { //在这里填写你自己的代码                     //根据你的功能自己写
	     break;                                       //返回
	   }
	  case 0: //1                                     //说明按下数字1键
	   {ShowPort= LedShowData[1];                     //数码管显示数字1
	    ControlCar(1);                                //将小车置于前进状态
	    break;                                        //返回
	   }
	  case 8: //2                                     //说明按下了数字2键
	   {ShowPort= LedShowData[2];                     //数码管显示数字2
	    ControlCar(2);                                //将小车置于后退状态
	    break;                                        //返回
	   }
      case 4: //3                                     //说明按下了数字3键
	   {ShowPort= LedShowData[3];                     //数码管显示数字3
	    ControlCar(3);                                //将小车置于左转状态
	    break;                                        //返回
	   }
	  case 12: //4                                    //说明按下了数字4键
	   {ShowPort= LedShowData[4];                     //数码管显示数字4
	    ControlCar(4);                                //将小车置于右转状态
	    break;                                        //返回
	   }
	  case 2: //5                                     //说明按下了数字5键
	   {ShowPort= LedShowData[5];                     //数码管显示数字5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -