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

📄 new_car.c

📁 常用经典小车程序常用经典小车程序常用经典小车程序
💻 C
字号:
//    头文件   //
//#pragma  OT(5,SIZE)
#include <reg52.h>
//   逻辑量
#define  TRUE         1
#define  FALSE        0
//    简写--数据类型   //  
#define  UCHAR  unsigned char
#define  UINT   unsigned int

//    简写--各口    //
sbit	 P_FIR_LEFT  = P0^0;	// high lever enable
sbit	 P_FIR_FRONT = P0^1;	// high lever enable
sbit	 P_FIR_RIGHT = P0^2;	// high lever enable

sbit	 P_MOTOR1A = P1^0;   //  电机数据输出口--P1低4位  (低电平有效)
sbit	 P_MOTOR1B = P1^1;
sbit	 P_MOTOR2A = P1^2;
sbit	 P_MOTOR2B = P1^3;

sbit	 P_PUMP = P2^0;		//电磁阀
sbit	 P_LED1 = P2^1;	//low lever enable
sbit	 P_LED2 = P2^2;
//
sbit	 MODE_FLAGE=P1^7; //  无线模块工作模式 
#define  RECEIVE_MODE  0  //  MODE_FLAGE  =0 (RECEIVE_MODE)为接收
#define  SEND_MODE     1  //  MODE_FLAGE  =1 (SEND_MODE)   为发送
//   T0-延时计时-初始值(T0)  //
#define	 T0_DELAY_H	  0XEE     // 0XEE=200Hz//0XDC=100Hz//0XB8=50Hz  XTAL=11.0592MHz 定时初值(方式1-16位)
#define	 T0_DELAY_L	  0x00

#define	 DELAY_RENEW  30  // 复位(T0=50Hz,100Hz,200Hz)=>(DELAY_RENEW=8,15,30)
#define  DELAY_02s	  40  //0.2S
#define	 DELAY_05s	  100 // 依次类推
#define	 DELAY_1s	  200		
#define	 DELAY_2s	  400
#define	 DELAY_4s	  800 // 依次类推

//   T1-波特率--初始值( SMOD 0;C/T=0; 模式 2)//
#define  TIMECOM_9600  0xfd  //XTAL=11.0592MHz 波特率=9600时初值
#define  CTRLCOM_9600  0X00

//   以下是为了方便通信定义的
//  1:系统通信协议
//  start_byte(0)    start_byte(1)   byte(2)   !byte(2)
//	     1				2				3			4
#define  Start_Byte  0X00
 // 操作1:前进  -> &H11
 // 操作2:后退  -> &H12
 // 操作3:左转  -> &H13
 // 操作4:右转  -> &H14
 // 操作5:停止  -> &H15
 // 操作6:灭火开始  -> &H16
 // 操作7:灭火结束  -> &H17

//  2: 小车运行方向  Command &0x0f
#define   GO_AHEAD   0x11      //  向前直行 
#define   GO_BACK    0x12      //  向后直行  
#define   GO_LEFT    0x13      //  左转停车 
#define   GO_RIGHT   0x14      //  右转停车 
#define   STOP       0x15      //  停车  

#define   WATER_ON   0x16      //  洒水灭火  
#define   WATER_OFF  0x17      //  停止洒水  

//*****    以上是为了方便通信定义的    **********     
// 5  自定义函数   //

//void Test_Moto(void);
void  InitDevice(void);      // 初始化  
void  GetCOM(void);          //主程序

void  COM_intermit(void);    // 串口中断
void  Timer0_intermit(void); // T1中断(20ms/50Hz)
void  Delay(UINT delay);     // 延时 
UCHAR  data      n5ms;		 // 5ms基准延时计数器
UINT   data      ndelay;     // 最大延时 65536/200=327.68s
 
//void  Send_to_PC(void);     // 发送状态数据

//  6 缓存数组       //
#define  MAX_SERIERS	  32   // 堆栈环的大小
#define  MAX_SERIERSTACK  31   // (2^n)-1
#define  MAX_COMMAND      4    // 命令字大小

//UCHAR    data  flag_filter;   // 滤波器标志 TRUE=工作 FALSE=无效
//UCHAR    data  filter[3];     // 滤波器数组  
//UCHAR    data  filter_i;       // 滤波器数组下标  
UCHAR    data  sstk[MAX_SERIERS];   // 堆栈环数组  
UCHAR    data  nsstke;                  // 存入 堆栈环数据 指针
UCHAR    data  nsstks;                  // 取出 堆栈环数据 指针

UCHAR    data  datas[MAX_COMMAND];  // 实际运行数据缓冲数组
UCHAR    data  ndatas;      		    // 实际运行数据缓冲数组下标
	
//**********	1	主程序	***************
main()
{  
  InitDevice(); //初始化
  while(1) 
  { 
	   GetCOM();
  } 
}
//**********	2	主程序	***************
void  Getcom(void)
{ 

  if(nsstks == nsstke) return;
  datas[ndatas] = sstk[nsstks];
  nsstks++;			//堆栈环数组取出指针
  nsstks &=MAX_SERIERSTACK;
//  if (ndatas < MAX_COMMAND) //MAX_COMMAND=4 命令字大小
      ndatas++;
  //  1:系统通信协议
  //  start_byte(0)    start_byte(1)   byte(2)   !byte(2)
  //	     1				2				3			4
  if (ndatas) 
  {  
      if (ndatas==4)	//命令字大小=4
      { 
	  	ndatas=0;	// 数据指针回0
		//***  check data  ****//
	    if ((datas[0]==Start_Byte) && (datas[1]==Start_Byte))
		{
			switch (datas[2])   //提取运行速度   Command &0xf0
	     	{	   
				    case  GO_AHEAD:
						  P_MOTOR1A=1;								  
						  P_MOTOR1B=0;

						  P_MOTOR2A=0;								  
						  P_MOTOR2B=1;
                          break; 
                    case  GO_BACK:
						  P_MOTOR1A=0;								  
						  P_MOTOR1B=1;

						  P_MOTOR2A=1;								  
						  P_MOTOR2B=0;
                          break; 
			        case  GO_LEFT:
						  P_MOTOR1A=1;								  
						  P_MOTOR1B=0;

						  P_MOTOR2A=1;								  
						  P_MOTOR2B=0;
						   break;   
				    case  GO_RIGHT:
						  P_MOTOR1A=0;								  
						  P_MOTOR1B=1;

						  P_MOTOR2A=0;								  
						  P_MOTOR2B=1;   
                          break; 
                    case  STOP:
						  P_MOTOR1A=0;								  
						  P_MOTOR1B=0;

						  P_MOTOR2A=0;								  
						  P_MOTOR2B=0;
                          break; 
			        case  WATER_ON:
					      P_PUMP=1;	// high lever enable
						   break;  
				    case  WATER_OFF:
					      P_PUMP=0;	// high lever enable
						   break;  
                    default: 
						 
                          break;     
                    }
		}
      }      
  }
  else //if (ndatas !=0)  
  {
  }
}
//**********以上是主程序***************
//**********	3	初始化程序	***************
void  InitDevice(void)
{  // UCHAR temp;
// 1   初始化--各功能口     //
	   P_MOTOR1A=P_MOTOR1B=1;
	   P_MOTOR2A=P_MOTOR2B=1;// 电机 不 动   
	   P_FIR_LEFT=P_FIR_FRONT=P_FIR_RIGHT=0;	// high lever enable
	   P_PUMP=0;	// high lever enable
//  2  初始化--中断     //     
	   IE  = 0x12;     //只允许 串口,T0(此时EA=0)  0x12=0001 0010B    
       PS  = 1;        //串口中断定为 高优先级  
	   PT0 = 0;        //T0中断定为   低优先级 
//  3  初始化--串口     //    
       SCON = 0x50;    // 01010000B=50H (此时RI=TI=0 工作于方式 1  8位通信 允许接收)
       PCON = CTRLCOM_9600;      
       RI=0;     
       TI=0;       
//  4  初始化--波特率发生器 T1;延时器 T0    //    
       TMOD = 0x21;        //  00100001=21H   (此时 T1工作于方式2  8位自动重装;T0工作于方式1  16位定时 )       
       TH1=TIMECOM_9600;   //XTAL=11.0592MHz 波特率=9600时初值
       TL1=TIMECOM_9600;       
       TH0=T0_DELAY_H;     // 20ms 
       TL0=T0_DELAY_L;    
       TF1  = 0;          // 清标志位
       TF0  = 0;
//  5  初始化--各标志位 //  
       MODE_FLAGE =RECEIVE_MODE;    // 接收模块初始化为   接收状态  
       nsstks = nsstke = ndatas = 0;  //堆栈环数组取出指针//存入指针//取出后的缓冲数组下标                 
//******  6  初始化成功--转弯灯闪3下 ******// 
       TR1=1;           //产生波特率   
       TR0=1;           //定时器打开       
       EA=1;           //开总中断    	
	   P_LED1=P_LED2=0;//low lever enable
 //--------------
	   P_MOTOR1A=1;
	   P_MOTOR1B=0;		
	   P_MOTOR2A=0;
	   P_MOTOR2B=1;// 电机go front

	   Delay(DELAY_05s);

	   P_MOTOR1A=P_MOTOR1B=1;
	   P_MOTOR2A=P_MOTOR2B=1;// 电机 不 动   
	  
}
//**********	4	串口中断程序	***************
void COM_intermit(void) interrupt 4 using 1        
{   
if (RI)       //小车收到数据时  RI=1
   	{   
	 RI = 0;  
     sstk[nsstke]=SBUF;  // nsstke 存入 堆栈环数据 指针
     nsstke++;
     nsstke &= MAX_SERIERSTACK;
    } 
}//**********	7	T0中断程序	***************
void Timer0_intermit(void) interrupt 1 using 2   
{ 
  TF0=0;
  TR0=0;
  TH0=T0_DELAY_H;  // XTAL=11.0592MHz 定时初值
  TL0=T0_DELAY_L;
  TR0=1;

  n5ms++;		       //1--1s级延时 
  ndelay++;            //2--普通延时
}   
//**********	6	延时程序	***************
void  Delay(UINT delay)
{   ndelay=0;
	while (ndelay!=delay)	 
    {}
}
/*
//**********	7	电机测试程序	***************
void Test_Moto(void)
{
	static UCHAR mode;
	mode++;
	if (mode==8)
		mode=0;		   
	switch (mode+0x10)   //提取运行速度   Command &0xf0
 	{	   
		    case  GO_AHEAD:
				  P_MOTOR1A=1;								  
				  P_MOTOR1B=0;

				  P_MOTOR2A=0;								  
				  P_MOTOR2B=1;
                  break; 
            case  GO_BACK:
				  P_MOTOR1A=0;								  
				  P_MOTOR1B=1;

				  P_MOTOR2A=1;								  
				  P_MOTOR2B=0;
                  break; 
	        case  GO_LEFT:
				  P_MOTOR1A=1;								  
				  P_MOTOR1B=0;

				  P_MOTOR2A=1;								  
				  P_MOTOR2B=0;
				   break;   
		    case  GO_RIGHT:
				  P_MOTOR1A=0;								  
				  P_MOTOR1B=1;

				  P_MOTOR2A=0;								  
				  P_MOTOR2B=1;   
                  break; 
            case  STOP:
				  P_MOTOR1A=1;								  
				  P_MOTOR1B=1;

				  P_MOTOR2A=1;								  
				  P_MOTOR2B=1;
                  break; 
	        case  WATER_ON:
			      P_PUMP=0;	// high lever enable
				   break;  
		    case  WATER_OFF:
			      P_PUMP=1;	// high lever enable
				   break;  
            default: 
				 
                  break;     
            }
}
*/

⌨️ 快捷键说明

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