[活动专区] 【赛元95F】 + 12、SC95F8617 五方向键控制RS485云台

[复制链接]
1177|0
 楼主| tlled 发表于 2020-4-1 10:05 | 显示全部楼层 |阅读模式
    使用SC95F8617开发板的RS485控制摄像机云台上下左右运动和停止。

    一、电动云台

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

    二、连接图片

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


    三、程序

   主要的程序部分:

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

  2. void main(void)
  3. {
  4.         uchar key;
  5.         uint i=0;
  6.         uint js=0;
  7.         uint jsdat=0;
  8.         uchar t;
  9.         Init_led();
  10.         Init_key();
  11.         Init_uart(32, 2400);
  12.         Init_rs485();
  13.         uart_chl(RS485);   
  14.         while(1)
  15.         {
  16.           key=Scan_key();
  17.                 if(key!=0)
  18.                 {
  19.                         switch (key)
  20.       {
  21.               case UP_KEY:
  22.                                         LED0=0;
  23.                                         LED1=1;
  24.                                         LED2=1;
  25.                                         LED3=1;
  26.                                         Fun_UpCmd();
  27.                       break;
  28.               case DOWN_KEY:
  29.                                         LED0=1;
  30.                                         LED1=0;
  31.                                         LED2=1;
  32.                                         LED3=1;
  33.                                         Fun_DownCmd();
  34.                       break;
  35.                                 case LEFT_KEY:
  36.                                         LED0=1;
  37.                                         LED1=1;
  38.                                         LED2=0;
  39.                                         LED3=1;
  40.                                         Fun_LeftCmd();
  41.                       break;
  42.                                 case RIGHT_KEY:
  43.                                         LED0=1;
  44.                                         LED1=1;
  45.                                         LED2=1;
  46.                                         LED3=0;
  47.                                         Fun_RightCmd();
  48.                       break;
  49.                                 case CENTER_KEY:
  50.                                         LED0=1;
  51.                                         LED1=1;
  52.                                         LED2=1;
  53.                                         LED3=1;
  54.                                         Fun_StopCmd();
  55.                       break;
  56.               default:
  57.                       break;
  58.       }
  59.                 }
  60.         }
  61. }


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

  2. bit UartSendFlag = 0;
  3. bit UartReceiveFlag = 0;

  4. void uart_chl(uchar ul)
  5. {
  6.         switch (ul)
  7.   {
  8.           case 0:   //rs485
  9.                         UART_CHA=0;
  10.                   UART_CHB=0;
  11.                   break;
  12.           case 1:   //usb-ttl
  13.                         UART_CHA=1;
  14.                   UART_CHB=0;
  15.                   break;
  16.           default:
  17.                   break;
  18.   }
  19. }

  20. void Init_uart(uint Freq, unsigned long int baud)
  21. {
  22.         P2CON &= ~0x03;   
  23.         P2PH  |= 0x03;
  24.        
  25.         P5CON &= ~0x14  ; //0001 0100
  26.         P5CON |= 0x14  ;
  27.         P5PH  |= 0x14;
  28.        
  29.         SCON  |= 0X50;   
  30.         TMCON |= 0X02;
  31.         TH1 = (Freq*1000000/baud)>>8;          
  32.         TL1 = Freq*1000000/baud;
  33.         TR1 = 0;
  34.         ET1 = 0;
  35.         EUART = 1;      
  36.         EA = 1;
  37. }

  38. void uart_send_char(uchar ch)  
  39. {
  40. //        SBUF=ch;
  41. //        while(TI==0);
  42. //        TI=0;
  43.                 SBUF = ch;
  44.                 while(!UartSendFlag);
  45.                 UartSendFlag = 0;
  46. }
  47. void uart_send_string(uchar *str)
  48. {
  49.         while(*str )
  50.         {
  51.                 uart_send_char(*str ++);
  52.         }
  53. }

  54. ////uartint
  55. void UartInt(void) interrupt 4
  56. {
  57.         if(TI)
  58.         {
  59.                 TI = 0;       
  60.                 UartSendFlag = 1;               
  61.         }
  62.         if(RI)
  63.         {
  64.                 RI = 0;       
  65.                 //UartReceiveFlag = 1;
  66.                 //rs485_send_char(SBUF);
  67.         }       
  68. }



  69. void Init_rs485(void)
  70. {
  71.         P5CON &= ~0x02 ;//0000 0010
  72.         P5CON |= 0x02 ;
  73.         RS485_RX();
  74. }

  75. void rs485_send_char(uchar dat)
  76. {
  77.         RS485_TX();
  78.         uart_send_char(dat);
  79.         RS485_RX();
  80. }


  81. //cmd:FF 01 00 10 00 10 21
  82. void Fun_UpCmd(void)
  83. {
  84.         RS485_TX();
  85.         uart_send_char(0xff);
  86.         uart_send_char(0x01);
  87.         uart_send_char(0x00);
  88.         uart_send_char(0x10);
  89.         uart_send_char(0x00);
  90.         uart_send_char(0x10);
  91.         uart_send_char(0x21);
  92.         //RS485_RX();
  93. }

  94. //cmd:FF 01 00 08 00 10 19
  95. void Fun_DownCmd(void)
  96. {
  97.         RS485_TX();
  98.         uart_send_char(0xff);
  99.         uart_send_char(0x01);
  100.         uart_send_char(0x00);
  101.         uart_send_char(0x08);
  102.         uart_send_char(0x00);
  103.         uart_send_char(0x10);
  104.         uart_send_char(0x19);
  105.         //RS485_RX();
  106. }

  107. //cmd:FF 01 00 00 00 00 01
  108. void Fun_StopCmd(void)
  109. {
  110.         RS485_TX();
  111.         uart_send_char(0xff);
  112.         uart_send_char(0x01);
  113.         uart_send_char(0x00);
  114.         uart_send_char(0x00);
  115.         uart_send_char(0x00);
  116.         uart_send_char(0x00);
  117.         uart_send_char(0x01);
  118.         //RS485_RX();
  119. }

  120. //cmd:FF 01 00 04 00 00 05
  121. void Fun_LeftCmd(void)
  122. {
  123.         RS485_TX();
  124.         uart_send_char(0xff);
  125.         uart_send_char(0x01);
  126.         uart_send_char(0x00);
  127.         uart_send_char(0x04);
  128.         uart_send_char(0x00);
  129.         uart_send_char(0x00);
  130.         uart_send_char(0x05);
  131.         //RS485_RX();
  132. }

  133. //cmd:FF 01 00 02 00 00 03
  134. void Fun_RightCmd(void)
  135. {
  136.         RS485_TX();
  137.         uart_send_char(0xff);
  138.         uart_send_char(0x01);
  139.         uart_send_char(0x00);
  140.         uart_send_char(0x02);
  141.         uart_send_char(0x00);
  142.         uart_send_char(0x00);
  143.         uart_send_char(0x03);
  144.         //RS485_RX();
  145. }


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

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

    五、测试结果

    按下按键上下左右,云台相应的动作,按下中间键云台停止转动。
    05.gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部