⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pccommunicate.c

📁 智能车控制
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define uch unsigned char

extern void set_motor(unsigned short,unsigned short);
extern void set_DJ(unsigned short);
extern uch AD0_convert(uch);
extern uch AD1_convert(uch);

// Function put_char:put a char to SCI0
void put_char(uch c) {
  while((SCI0SR1&0x80)==0);
  SCI0DRL=c;
}

// Function get_char:wait for a char from SCI0
uch get_char(void) {
  while((SCI0SR1&0x20)==0);
  return(SCI0DRL);
}

// Funciton get_DEC:wait for a DEC number and change char to int
uch get_DEC(void) {
  uch d;
  do {
    d=get_char();
  }
  while(d<'0'||d>'9');
  put_char(d);
  return(d-0x30);
}

// Funciton get_HEX:wait for a HEX number and change char to int
uch get_HEX(void) {
  uch h;
  do {
    h=get_char();
  }
  while((h<'0'||h>'9')&&(h<'a'||h>'f')&&(h<'A'||h>'F'));
  if(h>='0'&&h<='9') {
    put_char(h);
    return(h-0x30);
  } else if(h>='a'&&h<='f') {
    put_char(h-32);
    return(h-0x57);
  } else if(h>='A'&&h<='F') {
    put_char(h);
    return(h-0x37);
  }
}

// Function put_HEX:change a int number to char and put
void put_HEX(uch c) {
  if(c<10)
    put_char(c+0x30);
  else
    put_char(c+0x37);
}

// Fuction print:print a string which ended by '#' or '$'
void print(signed char * c) {
  uch i;
  i=0;
  while(c[i]!='#'&&c[i]!='$')
    { put_char(c[i]);
	  i++;
	}
  if(c[i]=='#')
    { put_char(0x0D);
      put_char(0x0A);
	}
}

// Function print_help:print help text
void print_help(void) {
  put_char('H');
  put_char(0x0D);
  put_char(0x0A);
  print(" 按'Q'键退出通信模式#");
  put_char(0x0D);
  put_char(0x0A);
  print("        A -- AD转换测试#");
  print("        B -- 控制PB口LED#");
  print("        D -- 查看指定存储空间数据#");
  print("        M -- 控制电机转动#");
  print("        R -- 读取拨码开关状态#");
  print("        S -- 停止电机转动#");
  print("        W -- 测量后轴速度#");
  print("        Z -- 控制舵机转动#");
}

// Function stop_running:stop the car from running
void stop_running(void) {
  put_char('S');
  put_char(0x0D);
  put_char(0x0A);
  put_char(0x0D);
  put_char(0x0A);
  set_motor(0,0);
}

// Function controlDuoJi:set the direction
void control_DuoJi(void) {
  uch z3,z2,z1,z0;
  unsigned short z;
  print("Z    请输入舵机控制值(3000-6000):$");
  z3=get_DEC();
  z2=get_DEC();
  z1=get_DEC();
  z0=get_DEC();
  z=z3*1000+z2*100+z1*10+z0;
  put_char(0x0D);
  put_char(0x0A);
  if(z<6001&&z>2999)
    set_DJ(z);
  else
    print(" 输入范围错误!$");
  put_char(0x0D);
  put_char(0x0A);
}

// Function control_Motor:set the speed
void control_Motor(void) {
  uch speed,s1,s0,fb;
  unsigned int s;
  print("M    请设定速度:(0-99) $");
  s1=get_DEC();
  s0=get_DEC();
  speed=s1*10+s0;
  s=speed*5;
  put_char(0x0D);
  put_char(0x0A);
  print("      请选择方向:F--前进  B--后退 $");
  do {
    fb=get_char();
  }
  while(fb!='f'&&fb!='F'&&fb!='b'&&fb!='B');
  if(fb=='f'||fb=='F') {
    put_char('F');
    set_motor(s,0);
  } else{
    put_char('B');
    set_motor(0,s);
  }
  put_char(0x0D);
  put_char(0x0A);
}

// Function diplay:Display the memery
void display(void) {
  uch i,a3,a2,a1,a0,b3,b2,b1,b0;
  unsigned int mhead,mtail;
  uch *p;
  put_char('D');
  put_char(' ');
  a3=get_HEX();
  a2=get_HEX();
  a1=get_HEX();
  a0=get_HEX();
  put_char('-');
  b3=get_HEX();
  b2=get_HEX();
  b1=get_HEX();
  b0=get_HEX();
  put_char(13);
  put_char(10);
  put_char(13);
  put_char(10);
  mhead=a3*4096+a2*256+a1*16;
  mtail=b3*4096+b2*256+b1*16+16;
  while(mhead<mtail){
    print("    -$");
    a3=(uch)(mhead/4096);
    a2=(uch)((mhead-a3*4096)/256);
    a1=(uch)((mhead-a3*4096-a2*256)/16);
    a0=mhead-a3*4096-a2*256-a1*16;
    put_HEX(a3);
    put_HEX(a2);
    put_HEX(a1);
    put_HEX(a0);
    print("    $");
    p=(uch *)mhead;
    for(i=0;i<16;i++) {
      b3=*p;
      b1=(uch)(b3/16);
      b0=b3-b1*16;
      put_HEX(b1);
      put_HEX(b0);
      put_char(' ');
      p++;
    }
    mhead+=16;
    put_char(13);
    put_char(10);
  }
}

void ctl_ptb(void){
  uch b,b1,b2;
  put_char('B');
  put_char(13);
  put_char(10);
  print("  请输入想要实现的状态:$");
  b1=get_HEX();
  b2=get_HEX();
  b=b1*16+b2;
  PORTB=b;
  put_char(13);
  put_char(10);
}

void read_sw(void){
  uch s;
  put_char('R');
  put_char(13);
  put_char(10);
  print("  拨码开关返回值为:  $");
  s=PORTK;
  s=s&0x0F;
  put_char('0');
  put_HEX(s);
  put_char(13);
  put_char(10);
}

void AD_test(){
  uch ch,r,r1,r2;
  put_char('C');
  put_char(13);
  put_char(10);
  print("  要转换第几通道(0-F):$");
  ch=get_HEX();
  put_char(13);
  put_char(10);
  if(ch<8)
    r=AD0_convert(ch);
  else
    r=AD1_convert(ch-8);
  print("    转换结果为:$");
  r1=(uch)(r/16);
  r2=r-r1*16;
  put_HEX(r1);
  put_HEX(r2);
  put_char(13);
  put_char(10);
}

void AD_all(){
  uch ch,r,r1,r2;
  put_char('A');
  put_char(13);
  put_char(10);
  print("所有通道转换结果为:#");
  for(ch=0;ch<8;ch++){
    r=AD0_convert(ch);
    r1=(uch)(r/16);
    r2=r-r1*16;
    print("    $");
    put_HEX(r1);
    put_HEX(r2);
  }
  put_char(13);
  put_char(10);
  for(ch=0;ch<8;ch++){
    r=AD1_convert(ch);
    r1=(uch)(r/16);
    r2=r-r1*16;
    print("    $");
    put_HEX(r1);
    put_HEX(r2);
  }
  put_char(13);
  put_char(10);
}
  

void read_speed(){
  put_char('W');
  put_char(13);
  put_char(10);
  print("  此功能尚未完成#");
}
  
    
// Function PC:Control every command
void PCCommunicate(void) {
  uch op;
  put_char(0x0D);
  put_char(0x0A);
  print("****************************************************************#");
  print("*   西北工业大学智能车竞赛光电组控制类组委会硬件平台测试程序   *#");
  print("*                    版本:1.0   BY ZGC                        *#");
  print("*                    创建时间:2008.2.23                       *#");
  print("*                    西北工业大学智能车协会                    *#");
  print("*--------------------------------------------------------------*#");
  print("* 测试内容:                                                   *#");
  print("*    1. PB口LED状态显示;                                      *#");
  print("*    2. PK口拨码开关输入;                                     *#");
  print("*    3. 舵机控制;                                             *#");
  print("*    4. 电机控制;                                             *#");
  print("*    5. 查看 0000-FFFF 内存储空间的数据;                      *#");
  print("*    6. 测试16路AD转换;                                       *#");
  print("*    7. 测量后轴速度。                                         *#");
  print("*--------------------------------------------------------------*#");
  print("*具体操作请按'H'键。                                           *#");
  print("****************************************************************#");
  do{
    put_char('>');
    op=get_char();
    if(op==0x0D){
      put_char(0x0D);
      put_char(0x0A);
    }
    else if(op=='h'||op=='H')
      print_help();
    else if(op=='q'||op=='Q') {
      put_char('Q');
      put_char(0x0D);
      put_char(0x0A);
    } 
    else if(op=='s'||op=='S')
      stop_running();
    else if(op=='z'||op=='Z')
      control_DuoJi();
    else if(op=='m'||op=='M')
      control_Motor();
    else if(op=='d'||op=='D')
      display();
    else if(op=='b'||op=='B')
      ctl_ptb();
    else if(op=='r'||op=='R')
      read_sw();
    else if(op=='a'||op=='A')
      AD_all();
    else if(op=='c'||op=='C')
      AD_test();
    else if(op=='w'||op=='W')
      read_speed();
    else{
      put_char(op);
      put_char(0x0D);
      put_char(0x0A);
      print(" 错误命令,看帮助请按'H'键#");
    }
  }
  while(op!='q'&&op!='Q');
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -