打印
[活动专区]

【赛元95F】 + 12、SC95F8617 五方向键控制RS485云台

[复制链接]
1012|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2020-4-1 10:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    使用SC95F8617开发板的RS485控制摄像机云台上下左右运动和停止。

    一、电动云台

   电动云台使用的协议是:PELCO-D/P   电压:DC12V 波特率:2400  地址码:1
   

    二、连接图片

    开发板的RS485 A和B与云台的A和B连接。
   


    三、程序

   主要的程序部分:

   3.1、main.c
#include "config.h"

void main(void)
{
        uchar key;
        uint i=0;
        uint js=0;
        uint jsdat=0;
        uchar t;
        Init_led();
        Init_key();
        Init_uart(32, 2400);
        Init_rs485();
        uart_chl(RS485);   
        while(1)
        {
          key=Scan_key();
                if(key!=0)
                {
                        switch (key)
      {
              case UP_KEY:
                                        LED0=0;
                                        LED1=1;
                                        LED2=1;
                                        LED3=1;
                                        Fun_UpCmd();
                      break;
              case DOWN_KEY:
                                        LED0=1;
                                        LED1=0;
                                        LED2=1;
                                        LED3=1;
                                        Fun_DownCmd();
                      break;
                                case LEFT_KEY:
                                        LED0=1;
                                        LED1=1;
                                        LED2=0;
                                        LED3=1;
                                        Fun_LeftCmd();
                      break;
                                case RIGHT_KEY:
                                        LED0=1;
                                        LED1=1;
                                        LED2=1;
                                        LED3=0;
                                        Fun_RightCmd();
                      break;
                                case CENTER_KEY:
                                        LED0=1;
                                        LED1=1;
                                        LED2=1;
                                        LED3=1;
                                        Fun_StopCmd();
                      break;
              default:
                      break;
      }
                }
        }
}


3.2、uart.c
#include "config.h"

bit UartSendFlag = 0;
bit UartReceiveFlag = 0;

void uart_chl(uchar ul)
{
        switch (ul)
  {
          case 0:   //rs485
                        UART_CHA=0;
                  UART_CHB=0;
                  break;
          case 1:   //usb-ttl
                        UART_CHA=1;
                  UART_CHB=0;
                  break;
          default:
                  break;
  }
}

void Init_uart(uint Freq, unsigned long int baud)
{
        P2CON &= ~0x03;   
        P2PH  |= 0x03;
       
        P5CON &= ~0x14  ; //0001 0100
        P5CON |= 0x14  ;
        P5PH  |= 0x14;
       
        SCON  |= 0X50;   
        TMCON |= 0X02;
        TH1 = (Freq*1000000/baud)>>8;          
        TL1 = Freq*1000000/baud;
        TR1 = 0;
        ET1 = 0;
        EUART = 1;      
        EA = 1;
}

void uart_send_char(uchar ch)  
{
//        SBUF=ch;
//        while(TI==0);
//        TI=0;
                SBUF = ch;
                while(!UartSendFlag);
                UartSendFlag = 0;
}
void uart_send_string(uchar *str)
{
        while(*str )
        {
                uart_send_char(*str ++);
        }
}

////uartint
void UartInt(void) interrupt 4
{
        if(TI)
        {
                TI = 0;       
                UartSendFlag = 1;               
        }
        if(RI)
        {
                RI = 0;       
                //UartReceiveFlag = 1;
                //rs485_send_char(SBUF);
        }       
}



void Init_rs485(void)
{
        P5CON &= ~0x02 ;//0000 0010
        P5CON |= 0x02 ;
        RS485_RX();
}

void rs485_send_char(uchar dat)
{
        RS485_TX();
        uart_send_char(dat);
        RS485_RX();
}


//cmd:FF 01 00 10 00 10 21
void Fun_UpCmd(void)
{
        RS485_TX();
        uart_send_char(0xff);
        uart_send_char(0x01);
        uart_send_char(0x00);
        uart_send_char(0x10);
        uart_send_char(0x00);
        uart_send_char(0x10);
        uart_send_char(0x21);
        //RS485_RX();
}

//cmd:FF 01 00 08 00 10 19
void Fun_DownCmd(void)
{
        RS485_TX();
        uart_send_char(0xff);
        uart_send_char(0x01);
        uart_send_char(0x00);
        uart_send_char(0x08);
        uart_send_char(0x00);
        uart_send_char(0x10);
        uart_send_char(0x19);
        //RS485_RX();
}

//cmd:FF 01 00 00 00 00 01
void Fun_StopCmd(void)
{
        RS485_TX();
        uart_send_char(0xff);
        uart_send_char(0x01);
        uart_send_char(0x00);
        uart_send_char(0x00);
        uart_send_char(0x00);
        uart_send_char(0x00);
        uart_send_char(0x01);
        //RS485_RX();
}

//cmd:FF 01 00 04 00 00 05
void Fun_LeftCmd(void)
{
        RS485_TX();
        uart_send_char(0xff);
        uart_send_char(0x01);
        uart_send_char(0x00);
        uart_send_char(0x04);
        uart_send_char(0x00);
        uart_send_char(0x00);
        uart_send_char(0x05);
        //RS485_RX();
}

//cmd:FF 01 00 02 00 00 03
void Fun_RightCmd(void)
{
        RS485_TX();
        uart_send_char(0xff);
        uart_send_char(0x01);
        uart_send_char(0x00);
        uart_send_char(0x02);
        uart_send_char(0x00);
        uart_send_char(0x00);
        uart_send_char(0x03);
        //RS485_RX();
}


    四、调试过程中遇到的问题

    串口发送命令函数,使用查询TI标志位是否发送成功,会出现程序在while(TI==0);这条语句。使用中断方式没有这问题。

    五、测试结果

    按下按键上下左右,云台相应的动作,按下中间键云台停止转动。
   

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

129

主题

698

帖子

6

粉丝