liuviking 发表于 2013-6-30 17:22
那么上位机发出来的指令是怎样的?用串口助手接一下,我看看。
king哥。已经搞定了。是干电池供电不住,我换了锂电池就好使了。
你帮我看下代码。这个是我现在用的下位机代码,在论坛上找的。
有1个看不懂的就是那个 向上位机传送字符 void Send_Data(uchar data type,uchar data cmd)
这个函数是不是可以去掉。我用的是tp-link 703N路由,单片机好像不需要发数据给上位机吧?- #include<reg52.h>
- #include<math.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint i=0,j=0,x=0;
- uchar data Tempdatatable[4],CommandDatatable[4];//数据包
- uint URTAReceivedCount=0,n=1;
- //uchar flag=0;
- uchar Buffer =0; //从串口接收的数据
- /******************************************************************
- 直流电机管脚配置
- ******************************************************************/
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- sbit Buzzle=P1^4; //蜂鸣器
- sbit MainLight1=P1^5; //主大灯
- sbit MainLight2=P1^6; //主大灯
- sbit MainLight3=P1^7; //主大灯
- void Delay_1ms(uint i)//1ms延时
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
- /********************************************************************
- 前进
- ***********************************************************************/
- void Moto_Forward()
- {
- IN1 = 1;
- IN2 = 0;
- IN3 = 1;
- IN4 = 0;
- Delay_1ms(100);
- }
- /********************************************************************
- 后退
- ***********************************************************************/
- void Moto_Backward()
- {
- IN1 = 0;
- IN2 = 1;
- IN3 = 0;
- IN4 = 1;
- Delay_1ms(100);
- }
- /********************************************************************
- 左转
- ***********************************************************************/
- void Moto_TurnLeft()
- {
- IN1 = 1;
- IN2 = 0;
- IN3 = 0;
- IN4 = 1;
- Delay_1ms(50);
- }
- /********************************************************************
- 右转
- ***********************************************************************/
- void Moto_TurnRight()
- {
- IN1 = 0;
- IN2 = 1;
- IN3 = 1;
- IN4 = 0;
- Delay_1ms(50);
- }
- /********************************************************************
- 停止
- ***********************************************************************/
- void Moto_Stop()
- {
- IN1 = 0;
- IN2 = 0;
- IN3 = 0;
- IN4 = 0;
- Delay_1ms(100);
- }
- /********************************************************************
- 前左转
- ***********************************************************************/
- void qianzuo()
- {
- IN1 = 1;
- IN2 = 0;
- IN3 = 0;
- IN4 = 0;
- Delay_1ms(100);
- }
- /********************************************************************
- 前右转
- ***********************************************************************/
- void qianyou()
- {
- IN1 = 0;
- IN2 = 0;
- IN3 = 1;
- IN4 = 0;
- Delay_1ms(100);
- }
- /********************************************************************
- 后左转
- ***********************************************************************/
- void houzuo()
- {
- IN1 = 0;
- IN2 = 1;
- IN3 = 0;
- IN4 = 0;
- Delay_1ms(100);
- }
- /********************************************************************
- 后右转
- ***********************************************************************/
- void houyou()
- {
- IN1 = 0;
- IN2 = 0;
- IN3 = 0;
- IN4 = 1;
- Delay_1ms(100);
- }
- /********************************************************************
- 向上位机传送字符
- ***********************************************************************/
- void Send_Data(uchar data type,uchar data cmd)
- {
- uchar data Buffer[4]; //构建数据包
- uchar *p;
- uint Send_Count=0;
- p = Buffer;
- Buffer[0]=0XFF;
- Buffer[1]=type;
- Buffer[2]=cmd;
- Buffer[3]=0XFF;
-
- while(1)
- {
- if(*p==0XFF)
- {
- Send_Count++; //0XFF标志统计位
- }
- SBUF = *p; //发送
- while(!TI) //如果发送完毕,硬件会置位TI=1,等待发送完毕
- {
- nop_(); //延迟
- }
- p++;
- TI = 0;
- if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
- {
- TI = 0;
- break;
- }
- }
- }
- /********************************************************************
- 串口中断子函数
- ***********************************************************************/
- void Com_Int(void) interrupt 4
- {
- uchar temp;
- ES=0; //关串口中断(上位机按下键就会产生中断,此时接受到中断后,就关闭中断,防止同时按下其他键,即一次只能处理1个动作)
- RI=0; //软件清除接收中断
- temp=SBUF;
- if(temp==0XFF && URTAReceivedCount<2)
- {
- Tempdatatable[0]==0XFF; //包头
- URTAReceivedCount++;
- }
- else
- {
- Tempdatatable[n]=temp;
- n++;
- }
- if(URTAReceivedCount==2)//包尾
- {
- Tempdatatable[0]=0XFF;
- Tempdatatable[3]=0XFF;
- n=1;
- URTAReceivedCount=0; //组包完毕
- temp="";
- //Send_Data(Tempdatatable[1],Tempdatatable[2]); //发送组成的数据包回去
- }
- CommandDatatable[0]=Tempdatatable[0];
- CommandDatatable[1]=Tempdatatable[1];
- CommandDatatable[2]=Tempdatatable[2];
- CommandDatatable[3]=Tempdatatable[3];
- ES=1;//开串口中断
- }
- /********************************************************************
- 串口初始化,晶振11.0592,波特率9600,使能串口中断
- ***********************************************************************/
- void Com_Init(void)
- {
- TMOD = 0x21;
- PCON = 0x00;
- SCON = 0x50;
- TH1 = 0xFd; //设置波特率 9600
- TL1 = 0xFd;
- TR1 = 1; //启动定时器1
-
- ES = 1; //开串口中断
- EA = 1; //开总中断
- IT0=0;
- EX0=1;
- }
- /********************************************************************
- 协议规定:
- 包头 类型位 命令位 数据位 结束位
- 0XFF 0X00 0X00 0X00 0XFF
- 各命令说明:
- 类型位 命令位 数据位 功能
- 0X00 0X01 0X00 前进
- 0X00 0X02 0X00 后退
- 0X00 0X03 0X00 左转
- 0X00 0X04 0X00 右转
- 0X00 0X00 0X00 停止
- 0X01 0X02 0X79 上
- 0X01 0X02 0X7B 下
- 0X01 0X01 0X60 左
- 0X01 0X01 0X5E 右
- 0X02 0X01 0X00 车灯亮
- 0X02 0X00 0X00 车灯灭
- ***********************************************************************/
- void yunxing(void)
- {
- if(CommandDatatable[0]==0XFF && CommandDatatable[3]==0XFF)
- {
- switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
- {
- case 0X00: //类型位0X00,表明是直流电机数据包,进入控制直流电机caes
- switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
- {
- case 0X00:Moto_Stop();break;
- case 0X01:Moto_Forward();break;
- case 0X02:Moto_Backward();break;
- case 0X03:Moto_TurnLeft();break;
- case 0X04:Moto_TurnRight();break;
- }
- break;
-
- case 0X01: //类型位0X01,表明是数据包,进入转向case
- switch(CommandDatatable[2])
- {
- case 0X01: //命令位0x01,左右运动
- switch(CommandDatatable[3])
- {
- case 0X60:qianzuo();break;
- case 0X5e:qianyou(); break;
- }
- break;
- case 0X02: //命令位0x02,上下运动
- switch(CommandDatatable[3])
- {
- case 0X79:houzuo();break;
- case 0X7b:houyou(); break;
- }
- break;
- }
- break;
- case 0X02: //类型位0X02,表明是大灯数据包,进入大灯case
- switch(CommandDatatable[2])
- {
- case 0X01:Buzzle=0;MainLight1=0;MainLight2=0;MainLight3=0;break;
- case 0X00:Buzzle=1;MainLight1=1;MainLight2=1;MainLight3=1;break;
- }
- break;
- default : /*TR0=0;TR2=0;*/ break;
- }
- }
- }
- void main()
- {
- Delay_1ms(200);
- Com_Init();//串口初始化
- Moto_Stop();
- while(1)
- {
- yunxing();
- }
- }
复制代码 |