📄 new_car.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 + -