一、接收器引脚及功能:
引脚:
功能:
二、通讯协议:
时序:
数据收发顺序:
最基本接收手柄信息思路:
CS拉低——》发送0x01——》发送0x42——》三个空指令周期——》四次分别接收摇杆信息——》CS拉高
三、参考代码:
用PS2控制单片机输出PWM控制电机驱动模块,进而控制电机
公共函数:
#ifndef PUBLIC_H
#define PUBLIC_H
#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int
#endif
PWM输出函数
#ifndef PWM_H
#define PWM_H
#include "public.h"
sbit temp1 = P1^0;
sbit pwm1 = P3^6;
sbit AIN1 = P2^0;
sbit AIN2 = P2^1;
void PMW0_Init(void) ;
#endif
#include "pwm.h"
void PMW0_Init(void)
{
//CCP1:P36 CCP2:P37
P_SW1 = P_SW1 & 0xcf | (0x02<<4);
CL = CH = 0;
CMOD = 0x08;
//CCP1:
PCA_PWM1 = 0x00;
CCAP1H = CCAP1L = 128;
CCAPM1 = 0X42;
//
CCON = 0X40;
}
串口:
#ifndef UART_H
#define UART_H
#include "public.h"
void UartInit(void);
#endif
#include <STC15F2K60S2.H>
#include "uart.h"
#include <stdio.h>
void UartInit(void) //9600bps@12MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
/*
重定义putchar函数
*/
char putchar (char c)
{
SBUF = c;
while(!TI);
TI = 0;
return c;
}
PS2:
#ifndef _IIC_H
#define _IIC_H
#include "public.h"
#include "intrins.h"
sbit CLK = P0^3;
sbit CS = P0^2;
sbit DO = P0^1;
sbit DI = P0^0;
void PS2_Simple_Recieve(u8 *r_data);
#endif
#include "ps2.h"
void Delay16us() //@12MHz
{
unsigned char i;
_nop_();
_nop_();
i = 45;
while (--i);
}
void Delay5us() //@12MHz
{
unsigned char i;
_nop_();
_nop_();
i = 12;
while (--i);
}
void send_to_ps2_byte(u8 s_byte)
{
u8 i;
for(i=0;i<8;i++)
{
DO = s_byte & 0x01;
s_byte>>=1;
CLK = 1;
Delay5us();
CLK = 0;
Delay5us();
CLK = 1;
}
Delay16us();
}
u8 Recieve_form_PS2_Byte()
{
u8 i,r_byte;
for(i=0;i<8;i++)
{
CLK = 1;
Delay5us();
CLK = 0;
Delay5us();
CLK = 1;
r_byte<<=1;
if(DI)
r_byte |= 0x01;
}
Delay16us();
return r_byte;
}
void PS2_Simple_Recieve(u8 *r_data)
{
CS = 0;
send_to_ps2_byte(0x01);
send_to_ps2_byte(0x42);
Recieve_form_PS2_Byte();
Recieve_form_PS2_Byte();
Recieve_form_PS2_Byte();
Recieve_form_PS2_Byte();
Recieve_form_PS2_Byte();
r_data[0] = Recieve_form_PS2_Byte();
r_data[1] = Recieve_form_PS2_Byte();
CS = 1;
}
主函数:
#include "public.h"
#include "uart.h"
#include <stdio.h>
#include "mpu6050.h"
#include "intrins.h"
#include "ps2.h"
#include "pwm.h"
u8 show_data[7]= {128,128};
void main()
{
UartInit();
PMW0_Init();
AIN1=0;AIN2=0;
while(1)
{
PS2_Simple_Recieve(show_data);
switch(show_data[1])
{
case 0xfe:AIN1=0;AIN2=0;;break;
case 0x00:AIN1=0;AIN2=1;;break;
case 0xff:AIN1=1;AIN2=0;;break;
}
printf("0x%x,0x%x\r\n\r\n",(u16)show_data[0],(u16)show_data[1]);
}
}