使用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);这条语句。使用中断方式没有这问题。
五、测试结果
按下按键上下左右,云台相应的动作,按下中间键云台停止转动。
|