PS2——2.4G通讯(深夜学习——单片机)

一、接收器引脚及功能:

  1. 引脚:

  1. 功能:

二、通讯协议:

  1. 时序:

  1. 数据收发顺序:

  1. 最基本接收手柄信息思路:

CS拉低——》发送0x01——》发送0x42——》三个空指令周期——》四次分别接收摇杆信息——》CS拉高

三、参考代码:

用PS2控制单片机输出PWM控制电机驱动模块,进而控制电机

  1. 公共函数:

#ifndef PUBLIC_H
#define PUBLIC_H

#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int
#endif
  1. 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;
}
  1. 串口:

#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;
}
  1. 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;
}
  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]);
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值